+static u8 *
+format_dhcp_client_state (u8 * s, va_list * va)
+{
+ dhcp_client_state_t state = va_arg (*va, dhcp_client_state_t);
+ char *str = "BOGUS!";
+
+ switch (state)
+ {
+#define _(a) \
+ case a: \
+ str = #a; \
+ break;
+ foreach_dhcp_client_state;
+#undef _
+ default:
+ break;
+ }
+
+ s = format (s, "%s", str);
+ return s;
+}
+
+static u8 *
+format_dhcp_client (u8 * s, va_list * va)
+{
+ dhcp_client_main_t *dcm = va_arg (*va, dhcp_client_main_t *);
+ dhcp_client_t *c = va_arg (*va, dhcp_client_t *);
+ int verbose = va_arg (*va, int);
+ ip4_address_t *addr;
+
+ s = format (s, "[%d] %U state %U installed %d", c - dcm->clients,
+ format_vnet_sw_if_index_name, dcm->vnet_main, c->sw_if_index,
+ format_dhcp_client_state, c->state, c->addresses_installed);
+
+ if (0 != c->dscp)
+ s = format (s, " dscp %d", c->dscp);
+
+ if (c->installed.leased_address.as_u32)
+ {
+ s = format (s, " addr %U/%d gw %U server %U",
+ format_ip4_address, &c->installed.leased_address,
+ c->installed.subnet_mask_width,
+ format_ip4_address, &c->installed.router_address,
+ format_ip4_address, &c->installed.dhcp_server);
+
+ vec_foreach (addr, c->domain_server_address)
+ s = format (s, " dns %U", format_ip4_address, addr);
+ }
+ else
+ {
+ s = format (s, " no address");
+ }
+
+ if (verbose)
+ {
+ s =
+ format (s,
+ "\n lease: lifetime:%d renewal-interval:%d expires:%.2f (now:%.2f)",
+ c->lease_lifetime, c->lease_renewal_interval,
+ c->lease_expires, vlib_time_now (dcm->vlib_main));
+ s =
+ format (s, "\n retry-count:%d, next-xmt:%.2f", c->retry_count,
+ c->next_transmit);
+ s =
+ format (s, "\n adjacencies:[unicast:%d broadcast:%d]", c->ai_ucast,
+ c->ai_bcast);
+ }
+ return s;
+}
+