summaryrefslogtreecommitdiffstats
path: root/src/vnet
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2018-02-14 17:58:33 -0500
committerDave Barach <openvpp@barachs.net>2018-02-15 11:59:07 +0000
commitb704f49bb6ce1f816b86ae0e8930b4652d2860d2 (patch)
tree2fe692da535ab8397b601cf2b170bc8a2cf7383a /src/vnet
parentf13bac295d7be78f5c02024ea1f285a8bd6760e9 (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')
-rw-r--r--src/vnet/dhcp/client.c51
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* */