diff options
author | Dave Barach <dbarach@cisco.com> | 2018-03-21 13:45:12 -0400 |
---|---|---|
committer | Chris Luke <chris_luke@comcast.com> | 2018-03-21 20:25:27 +0000 |
commit | 43ebe29b6ea1107c30311cfb3dbd8190282903d0 (patch) | |
tree | d5f9d5fd5d1410d319fafcc5c66be8e5719e008c /src/vnet/dhcp/client.c | |
parent | 43b1f44571fd6989d6442723433cad28a5ab244f (diff) |
VPP_1202: handle DHCP NAK packets
Change-Id: I469a734747099cef2d135d77e4db0244e24bf0bc
Signed-off-by: Dave Barach <dbarach@cisco.com>
Diffstat (limited to 'src/vnet/dhcp/client.c')
-rw-r--r-- | src/vnet/dhcp/client.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/vnet/dhcp/client.c b/src/vnet/dhcp/client.c index 330b38d1deb..2e47d6e6dca 100644 --- a/src/vnet/dhcp/client.c +++ b/src/vnet/dhcp/client.c @@ -271,7 +271,33 @@ dhcp_client_for_us (u32 bi, vlib_buffer_t * b, case DHCP_BOUND: case DHCP_REQUEST: - if (dhcp_message_type != DHCP_PACKET_ACK) + if (dhcp_message_type == DHCP_PACKET_NAK) + { + /* Probably never happens in bound state, but anyhow... */ + if (c->state == DHCP_BOUND) + { + ip4_add_del_interface_address (dcm->vlib_main, c->sw_if_index, + (void *) &c->leased_address, + c->subnet_mask_width, + 1 /*is_del */ ); + vnet_feature_enable_disable ("ip4-unicast", + "ip4-dhcp-client-detect", + c->sw_if_index, 1, 0, 0); + } + /* Wipe out any memory of the address we had... */ + c->state = DHCP_DISCOVER; + c->next_transmit = now; + c->retry_count = 0; + c->leased_address.as_u32 = 0; + c->subnet_mask_width = 0; + c->router_address.as_u32 = 0; + c->lease_renewal_interval = 0; + c->dhcp_server.as_u32 = 0; + break; + } + + if (dhcp_message_type != DHCP_PACKET_ACK && + dhcp_message_type != DHCP_PACKET_OFFER) { clib_warning ("sw_if_index %d state %U message type %d", c->sw_if_index, format_dhcp_client_state, |