diff options
author | 2018-02-14 17:58:33 -0500 | |
---|---|---|
committer | 2018-02-15 11:59:07 +0000 | |
commit | b704f49bb6ce1f816b86ae0e8930b4652d2860d2 (patch) | |
tree | 2fe692da535ab8397b601cf2b170bc8a2cf7383a /src/vnet/dhcp | |
parent | f13bac295d7be78f5c02024ea1f285a8bd6760e9 (diff) |
VPP-1169: reenable dhcp client detect when lease expires
We disable the client detect feature when we bind a DHCP address. Turn
it back on again when the lease expires. Otherwise, if the DHCP
server replies after an outage, we'll never see the reply.
Add dhcp packet tx counters, by packet type
Change-Id: Id54b05647d5d7bd8d3ab99e6584ee86d9e4ff7f9
Signed-off-by: Dave Barach <dave@barachs.net>
(cherry picked from commit 4941fcc23ab01f5ca918e56489d404b92d8bde90)
Diffstat (limited to 'src/vnet/dhcp')
-rw-r--r-- | src/vnet/dhcp/client.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/src/vnet/dhcp/client.c b/src/vnet/dhcp/client.c index 8043bf22d43..e2cbc3281ca 100644 --- a/src/vnet/dhcp/client.c +++ b/src/vnet/dhcp/client.c @@ -21,6 +21,29 @@ dhcp_client_main_t dhcp_client_main; static u8 *format_dhcp_client_state (u8 * s, va_list * va); static vlib_node_registration_t dhcp_client_process_node; +#define foreach_dhcp_client_process_stat \ +_(DISCOVER, "DHCP discover packets sent") \ +_(OFFER, "DHCP offer packets sent") \ +_(REQUEST, "DHCP request packets sent") \ +_(ACK, "DHCP ack packets sent") + +typedef enum +{ +#define _(sym,str) DHCP_STAT_##sym, + foreach_dhcp_client_process_stat +#undef _ + DHCP_STAT_UNKNOWN, + DHCP_STAT_N_STAT, +} sample_error_t; + +static char *dhcp_client_process_stat_strings[] = { +#define _(sym,string) string, + foreach_dhcp_client_process_stat +#undef _ + "DHCP unknown packets sent", +}; + + static void dhcp_client_add_rx_address (dhcp_client_main_t * dcm, dhcp_client_t * c) { @@ -335,6 +358,7 @@ send_dhcp_pkt (dhcp_client_main_t * dcm, dhcp_client_t * c, vlib_frame_t *f; dhcp_option_t *o; u16 udp_length, ip_length; + u32 counter_index; /* Interface(s) down? */ if ((hw->flags & VNET_HW_INTERFACE_FLAG_LINK_UP) == 0) @@ -511,6 +535,19 @@ send_dhcp_pkt (dhcp_client_main_t * dcm, dhcp_client_t * c, udp_length = ip_length - (sizeof (*ip)); udp->length = clib_host_to_net_u16 (udp_length); + + switch (type) + { +#define _(a,b) case DHCP_PACKET_##a: {counter_index = DHCP_STAT_##a; break;} + foreach_dhcp_client_process_stat +#undef _ + default: + counter_index = DHCP_STAT_UNKNOWN; + break; + } + + vlib_node_increment_counter (vm, dhcp_client_process_node.index, + counter_index, 1); } static int @@ -569,6 +606,7 @@ dhcp_bound_state (dhcp_client_main_t * dcm, dhcp_client_t * c, f64 now) if (now > c->lease_expires) { + /* Remove the default route */ if (c->router_address.as_u32) { fib_prefix_t all_0s = { @@ -586,7 +624,7 @@ dhcp_bound_state (dhcp_client_main_t * dcm, dhcp_client_t * c, f64 now) DPO_PROTO_IP4, &nh, c->sw_if_index, ~0, 1, FIB_ROUTE_PATH_FLAG_NONE); } - + /* Remove the interface address */ dhcp_client_release_address (dcm, c); c->state = DHCP_DISCOVER; c->next_transmit = now; @@ -597,6 +635,15 @@ dhcp_bound_state (dhcp_client_main_t * dcm, dhcp_client_t * c, f64 now) c->router_address.as_u32 = 0; c->lease_renewal_interval = 0; c->dhcp_server.as_u32 = 0; + /* + * We disable the client detect feature when we bind a + * DHCP address. Turn it back on again here. + * Otherwise, if the DHCP server replies after an outage, + * we'll never see it. + */ + vnet_feature_enable_disable ("ip4-unicast", + "ip4-dhcp-client-detect", + c->sw_if_index, 1, 0, 0); return 1; } return 0; @@ -702,6 +749,8 @@ VLIB_REGISTER_NODE (dhcp_client_process_node,static) = { .type = VLIB_NODE_TYPE_PROCESS, .name = "dhcp-client-process", .process_log2_n_stack_bytes = 16, + .n_errors = ARRAY_LEN(dhcp_client_process_stat_strings), + .error_strings = dhcp_client_process_stat_strings, }; /* *INDENT-ON* */ |