-void
-dhcp_compl_event_callback (u32 client_index, u32 pid, u8 * hostname,
- u8 mask_width, u8 is_ipv6, u8 * host_address,
- u8 * router_address, u8 * host_mac)
+static void
+dhcp_client_lease_encode (vl_api_dhcp_lease_t * lease,
+ const dhcp_client_t * client)
+{
+ size_t len;
+
+ lease->is_ipv6 = 0; // only support IPv6 clients
+ lease->sw_if_index = ntohl (client->sw_if_index);
+ lease->state = client->state;
+ len = clib_min (sizeof (lease->hostname) - 1, vec_len (client->hostname));
+ clib_memcpy (&lease->hostname, client->hostname, len);
+ lease->hostname[len] = 0;
+
+ lease->mask_width = client->subnet_mask_width;
+ clib_memcpy (&lease->host_address[0], (u8 *) & client->leased_address, 4);
+ clib_memcpy (&lease->router_address[0], (u8 *) & client->router_address, 4);
+
+ if (NULL != client->l2_rewrite)
+ clib_memcpy (&lease->host_mac[0], client->l2_rewrite + 6, 6);
+}
+
+static void
+dhcp_client_data_encode (vl_api_dhcp_client_t * vclient,
+ const dhcp_client_t * client)
+{
+ size_t len;
+
+ vclient->sw_if_index = ntohl (client->sw_if_index);
+ len = clib_min (sizeof (vclient->hostname) - 1, vec_len (client->hostname));
+ clib_memcpy (&vclient->hostname, client->hostname, len);
+ vclient->hostname[len] = 0;
+
+ len = clib_min (sizeof (vclient->id) - 1,
+ vec_len (client->client_identifier));
+ clib_memcpy (&vclient->id, client->client_identifier, len);
+ vclient->id[len] = 0;
+
+ if (NULL != client->event_callback)
+ vclient->want_dhcp_event = 1;
+ else
+ vclient->want_dhcp_event = 0;
+ vclient->set_broadcast_flag = client->set_broadcast_flag;
+ vclient->pid = client->pid;
+}
+
+static void
+dhcp_compl_event_callback (u32 client_index, const dhcp_client_t * client)