diff options
author | Fabian Kurtz <fabian.kurtz@udo.edu> | 2021-08-18 17:12:48 +0000 |
---|---|---|
committer | Kevin Bowling <kbowling@FreeBSD.org> | 2021-08-18 17:15:28 +0000 |
commit | 0a539a0f005e8acbe4974ede30aa928099c988b9 (patch) | |
tree | 2df28d9c2838dbd88db3d4da5380047498e100bc /sbin | |
parent | bb250fae9e9e278b681cf3a71ced718700ecf74c (diff) | |
download | src-0a539a0f005e8acbe4974ede30aa928099c988b9.tar.gz src-0a539a0f005e8acbe4974ede30aa928099c988b9.zip |
dhclient: support supersede statement for option 54
PR: 217978
Reported by: Franco Fichtner <franco@opnsense.org>
Reviewed by: markj
Obtained from: OPNsense
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D31503
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/dhclient/dhclient.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c index 8c2615e4c3dc..a1628f0ee22f 100644 --- a/sbin/dhclient/dhclient.c +++ b/sbin/dhclient/dhclient.c @@ -931,6 +931,8 @@ void state_bound(void *ipp) { struct interface_info *ip = ipp; + u_int8_t *dp = NULL; + int len; ASSERT_STATE(state, S_BOUND); @@ -938,10 +940,17 @@ state_bound(void *ipp) make_request(ip, ip->client->active); ip->client->xid = ip->client->packet.xid; - if (ip->client->active->options[DHO_DHCP_SERVER_IDENTIFIER].len == 4) { - memcpy(ip->client->destination.iabuf, ip->client->active-> - options[DHO_DHCP_SERVER_IDENTIFIER].data, 4); - ip->client->destination.len = 4; + if (ip->client->config->default_actions[DHO_DHCP_SERVER_IDENTIFIER] == + ACTION_SUPERSEDE) { + dp = ip->client->config->defaults[DHO_DHCP_SERVER_IDENTIFIER].data; + len = ip->client->config->defaults[DHO_DHCP_SERVER_IDENTIFIER].len; + } else { + dp = ip->client->active->options[DHO_DHCP_SERVER_IDENTIFIER].data; + len = ip->client->active->options[DHO_DHCP_SERVER_IDENTIFIER].len; + } + if (len == 4) { + memcpy(ip->client->destination.iabuf, dp, len); + ip->client->destination.len = len; } else ip->client->destination = iaddr_broadcast; |