From bdf60627ca55845d183a05f32fc0bac7af9c375f Mon Sep 17 00:00:00 2001 From: Antonio Huete Jimenez Date: Tue, 31 Jul 2012 22:29:29 +0200 Subject: [PATCH] dhclient - Add 6-byte MAC address to the log entries for DHCP ACK/NAK/OFFER. - Log the packets before checking the client state. Makes it easy to find MACs for 'surprise' DHCP servers. - Swap ifi status check logic to be the first one. --- sbin/dhclient/dhclient.c | 11 +---------- sbin/dhclient/dhcpd.h | 3 ++- sbin/dhclient/dispatch.c | 5 ++--- sbin/dhclient/options.c | 12 ++++++++++-- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c index fad1df24ff..a409730c4a 100644 --- a/sbin/dhclient/dhclient.c +++ b/sbin/dhclient/dhclient.c @@ -1,4 +1,4 @@ -/* $OpenBSD: src/sbin/dhclient/dhclient.c,v 1.120 2008/06/07 03:22:26 deraadt Exp $ */ +/* $OpenBSD: src/sbin/dhclient/dhclient.c,v 1.124 2009/03/10 23:19:36 krw Exp $ */ /* * Copyright 2004 Henning Brauer @@ -589,8 +589,6 @@ dhcpack(struct iaddr client_addr, struct option_data *options) { struct client_lease *lease; - if (client->xid != client->packet.xid) - return; if (client->state != S_REBOOTING && client->state != S_REQUESTING && @@ -598,7 +596,6 @@ dhcpack(struct iaddr client_addr, struct option_data *options) client->state != S_REBINDING) return; - note("DHCPACK from %s", piaddr(client_addr)); lease = packet_to_lease(options); if (!lease) { @@ -731,13 +728,10 @@ dhcpoffer(struct iaddr client_addr, struct option_data *options) char *name = options[DHO_DHCP_MESSAGE_TYPE].len ? "DHCPOFFER" : "BOOTREPLY"; - if (client->xid != client->packet.xid) - return; if (client->state != S_SELECTING) return; - note("%s from %s", name, piaddr(client_addr)); /* If this lease doesn't supply the minimum required parameters, blow it off. */ @@ -909,8 +903,6 @@ packet_to_lease(struct option_data *options) void dhcpnak(struct iaddr client_addr, struct option_data *options) { - if (client->xid != client->packet.xid) - return; if (client->state != S_REBOOTING && client->state != S_REQUESTING && @@ -918,7 +910,6 @@ dhcpnak(struct iaddr client_addr, struct option_data *options) client->state != S_REBINDING) return; - note("DHCPNAK from %s", piaddr(client_addr)); if (!client->active) { note("DHCPNAK with no active lease."); diff --git a/sbin/dhclient/dhcpd.h b/sbin/dhclient/dhcpd.h index 7d8601c82f..db7ac74ec4 100644 --- a/sbin/dhclient/dhcpd.h +++ b/sbin/dhclient/dhcpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: src/sbin/dhclient/dhcpd.h,v 1.67 2008/05/26 03:11:48 deraadt Exp $ */ +/* $OpenBSD: src/sbin/dhclient/dhcpd.h,v 1.68 2009/03/10 23:19:36 krw Exp $ */ /* * Copyright (c) 2004 Henning Brauer @@ -51,6 +51,7 @@ #include #include #include +#include #include #include diff --git a/sbin/dhclient/dispatch.c b/sbin/dhclient/dispatch.c index 1057966a7f..38461c7a16 100644 --- a/sbin/dhclient/dispatch.c +++ b/sbin/dhclient/dispatch.c @@ -1,4 +1,4 @@ -/* $OpenBSD: src/sbin/dhclient/dispatch.c,v 1.42 2008/05/26 03:11:49 deraadt Exp $ */ +/* $OpenBSD: src/sbin/dhclient/dispatch.c,v 1.43 2009/02/19 03:29:21 krw Exp $ */ /* * Copyright 2004 Henning Brauer @@ -183,8 +183,7 @@ another: } if ((fds[0].revents & (POLLIN | POLLHUP))) { - if (ifi->linkstat && - ifi && ifi->rfdesc != -1) + if (ifi && ifi->linkstat && ifi->rfdesc != -1) got_one(); } if ((fds[1].revents & (POLLIN | POLLHUP))) { diff --git a/sbin/dhclient/options.c b/sbin/dhclient/options.c index d56ee2e2d0..c77e315b3e 100644 --- a/sbin/dhclient/options.c +++ b/sbin/dhclient/options.c @@ -1,5 +1,4 @@ -/* $OpenBSD: options.c,v 1.36 2007/06/02 01:29:11 pvalchev Exp $ */ -/* $DragonFly: src/sbin/dhclient/options.c,v 1.1 2008/08/30 16:07:58 hasso Exp $ */ +/* $OpenBSD: src/sbin/dhclient/options.c,v 1.37 2009/03/10 23:19:36 krw Exp $ */ /* DHCP options parsing and reassembly. */ @@ -491,6 +490,15 @@ do_packet(int len, unsigned int from_port, struct iaddr from, type = "BOOTREPLY"; } + if (handler && client->xid == client->packet.xid) { + if (hfrom->hlen == 6) + note("%s from %s (%s)", type, piaddr(from), + ether_ntoa((struct ether_addr *)hfrom->haddr)); + else + note("%s from %s", type, piaddr(from)); + } else + handler = NULL; + for (ap = config->reject_list; ap && handler; ap = ap->next) if (addr_eq(from, ap->addr)) { note("%s from %s rejected.", type, piaddr(from)); -- 2.11.4.GIT