diff options
Diffstat (limited to 'src/vnet')
-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 511b23cb248..330b38d1deb 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_acquire_address (dhcp_client_main_t * dcm, dhcp_client_t * c) { @@ -296,6 +319,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) @@ -474,6 +498,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 @@ -532,6 +569,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 = { @@ -549,7 +587,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; @@ -560,6 +598,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; @@ -664,6 +711,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* */ |