VPP_1202: handle DHCP NAK packets 72/11272/2
authorDave Barach <dbarach@cisco.com>
Wed, 21 Mar 2018 17:45:12 +0000 (13:45 -0400)
committerChris Luke <chris_luke@comcast.com>
Wed, 21 Mar 2018 20:25:27 +0000 (20:25 +0000)
Change-Id: I469a734747099cef2d135d77e4db0244e24bf0bc
Signed-off-by: Dave Barach <dbarach@cisco.com>
src/vnet/dhcp/client.c
src/vnet/dhcp/dhcp4_packet.h

index 330b38d..2e47d6e 100644 (file)
@@ -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,
index 133a1e1..9fbeb02 100644 (file)
@@ -57,6 +57,7 @@ typedef enum
   DHCP_PACKET_OFFER,
   DHCP_PACKET_REQUEST,
   DHCP_PACKET_ACK = 5,
+  DHCP_PACKET_NAK,
 } dhcp_packet_type_t;
 
 typedef enum dhcp_packet_option_t_