-vl_api_ip6nd_proxy_dump_t_handler (vl_api_ip6nd_proxy_dump_t * mp)
-{
- ip6_main_t *im6 = &ip6_main;
- fib_table_t *fib_table;
- api_ip6nd_proxy_fib_table_walk_ctx_t ctx = {
- .indices = NULL,
- };
- fib_node_index_t *feip;
- const fib_prefix_t *pfx;
- vl_api_registration_t *reg;
-
- reg = vl_api_client_index_to_registration (mp->client_index);
- if (!reg)
- return;
-
- /* *INDENT-OFF* */
- pool_foreach (fib_table, im6->fibs,
- ({
- fib_table_walk(fib_table->ft_index,
- FIB_PROTOCOL_IP6,
- api_ip6nd_proxy_fib_table_walk,
- &ctx);
- }));
- /* *INDENT-ON* */
-
- vec_sort_with_function (ctx.indices, fib_entry_cmp_for_sort);
-
- vec_foreach (feip, ctx.indices)
- {
- pfx = fib_entry_get_prefix (*feip);
-
- send_ip6nd_proxy_details (reg,
- mp->context,
- &pfx->fp_addr,
- fib_entry_get_resolving_interface (*feip));
- }
-
- vec_free (ctx.indices);
-}
-
-static void
-vl_api_ip6nd_proxy_add_del_t_handler (vl_api_ip6nd_proxy_add_del_t * mp)
-{
- vl_api_ip6nd_proxy_add_del_reply_t *rmp;
- int rv = 0;
-
- VALIDATE_SW_IF_INDEX (mp);
-
- rv = ip6_neighbor_proxy_add_del (ntohl (mp->sw_if_index),
- (ip6_address_t *) mp->address, mp->is_del);
-
- BAD_SW_IF_INDEX_LABEL;
- REPLY_MACRO (VL_API_IP6ND_PROXY_ADD_DEL_REPLY);
-}
-
-static void
- vl_api_ip6nd_send_router_solicitation_t_handler
- (vl_api_ip6nd_send_router_solicitation_t * mp)
-{
- vl_api_ip6nd_send_router_solicitation_reply_t *rmp;
- icmp6_send_router_solicitation_params_t params;
- vlib_main_t *vm = vlib_get_main ();
- int rv = 0;
-
- VALIDATE_SW_IF_INDEX (mp);
-
- BAD_SW_IF_INDEX_LABEL;
- REPLY_MACRO (VL_API_IP6ND_SEND_ROUTER_SOLICITATION_REPLY);
-
- if (rv != 0)
- return;
-
- params.irt = ntohl (mp->irt);
- params.mrt = ntohl (mp->mrt);
- params.mrc = ntohl (mp->mrc);
- params.mrd = ntohl (mp->mrd);
-
- icmp6_send_router_solicitation (vm, ntohl (mp->sw_if_index), mp->stop,
- ¶ms);
-}
-
-static void
- vl_api_sw_interface_ip6_enable_disable_t_handler
- (vl_api_sw_interface_ip6_enable_disable_t * mp)
-{
- vlib_main_t *vm = vlib_get_main ();
- vl_api_sw_interface_ip6_enable_disable_reply_t *rmp;
- vnet_main_t *vnm = vnet_get_main ();
- int rv = 0;
- clib_error_t *error;
-
- vnm->api_errno = 0;
-
- VALIDATE_SW_IF_INDEX (mp);
-
- error =
- (mp->enable == 1) ? enable_ip6_interface (vm,
- ntohl (mp->sw_if_index)) :
- disable_ip6_interface (vm, ntohl (mp->sw_if_index));
-
- if (error)
- {
- clib_error_report (error);
- rv = VNET_API_ERROR_UNSPECIFIED;
- }
- else
- {
- rv = vnm->api_errno;
- }
-
- BAD_SW_IF_INDEX_LABEL;
-
- REPLY_MACRO (VL_API_SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY);
-}
-
-static void
- vl_api_sw_interface_ip6_set_link_local_address_t_handler
- (vl_api_sw_interface_ip6_set_link_local_address_t * mp)
-{
- vlib_main_t *vm = vlib_get_main ();
- vl_api_sw_interface_ip6_set_link_local_address_reply_t *rmp;
- int rv = 0;
- clib_error_t *error;
- vnet_main_t *vnm = vnet_get_main ();
-
- vnm->api_errno = 0;
-
- VALIDATE_SW_IF_INDEX (mp);
-
- error = set_ip6_link_local_address (vm,
- ntohl (mp->sw_if_index),
- (ip6_address_t *) mp->address);
- if (error)
- {
- clib_error_report (error);
- rv = VNET_API_ERROR_UNSPECIFIED;
- }
- else
- {
- rv = vnm->api_errno;
- }
-
- BAD_SW_IF_INDEX_LABEL;
-
- REPLY_MACRO (VL_API_SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY);
-}
-
-void
-vl_mfib_signal_send_one (vl_api_registration_t * reg,
- u32 context, const mfib_signal_t * mfs)
-{
- vl_api_mfib_signal_details_t *mp;
- mfib_prefix_t prefix;
- mfib_table_t *mfib;
- mfib_itf_t *mfi;
-
- mp = vl_msg_api_alloc (sizeof (*mp));
-
- memset (mp, 0, sizeof (*mp));
- mp->_vl_msg_id = ntohs (VL_API_MFIB_SIGNAL_DETAILS);
- mp->context = context;
-
- mfi = mfib_itf_get (mfs->mfs_itf);
- mfib_entry_get_prefix (mfs->mfs_entry, &prefix);
- mfib = mfib_table_get (mfib_entry_get_fib_index (mfs->mfs_entry),
- prefix.fp_proto);
- mp->table_id = ntohl (mfib->mft_table_id);
- mp->sw_if_index = ntohl (mfi->mfi_sw_if_index);
-
- if (FIB_PROTOCOL_IP4 == prefix.fp_proto)
- {
- mp->grp_address_len = ntohs (prefix.fp_len);
-
- memcpy (mp->grp_address, &prefix.fp_grp_addr.ip4, 4);
- if (prefix.fp_len > 32)
- {
- memcpy (mp->src_address, &prefix.fp_src_addr.ip4, 4);
- }
- }
- else
- {
- mp->grp_address_len = ntohs (prefix.fp_len);
-
- ASSERT (0);
- }
-
- if (0 != mfs->mfs_buffer_len)
- {
- mp->ip_packet_len = ntohs (mfs->mfs_buffer_len);
-
- memcpy (mp->ip_packet_data, mfs->mfs_buffer, mfs->mfs_buffer_len);
- }
- else
- {
- mp->ip_packet_len = 0;
- }
-
- vl_api_send_msg (reg, (u8 *) mp);
-}
-
-static void
-vl_api_mfib_signal_dump_t_handler (vl_api_mfib_signal_dump_t * mp)
-{
- vl_api_registration_t *reg;
-
- reg = vl_api_client_index_to_registration (mp->client_index);
- if (!reg)
- return;
-
- while (vl_api_can_send_msg (reg) && mfib_signal_send_one (reg, mp->context))
- ;
-}
-
-static void
- vl_api_ip_container_proxy_add_del_t_handler
- (vl_api_ip_container_proxy_add_del_t * mp)
-{
- vl_api_ip_container_proxy_add_del_reply_t *rmp;
- vnet_ip_container_proxy_args_t args;
- int rv = 0;
- clib_error_t *error;
-
- memset (&args, 0, sizeof (args));
- ip_set (&args.prefix.fp_addr, mp->ip, mp->is_ip4);
- args.prefix.fp_len = mp->plen ? mp->plen : (mp->is_ip4 ? 32 : 128);
- args.sw_if_index = clib_net_to_host_u32 (mp->sw_if_index);
- args.is_add = mp->is_add;
- if ((error = vnet_ip_container_proxy_add_del (&args)))
- {
- rv = clib_error_get_code (error);
- clib_error_report (error);
- }
-
- REPLY_MACRO (VL_API_IP_CONTAINER_PROXY_ADD_DEL_REPLY);
-}
-
-typedef struct ip_container_proxy_walk_ctx_t_
-{
- vl_api_registration_t *reg;
- u32 context;
-} ip_container_proxy_walk_ctx_t;
-
-static int
-ip_container_proxy_send_details (const fib_prefix_t * pfx, u32 sw_if_index,
- void *args)
-{
- vl_api_ip_container_proxy_details_t *mp;
- ip_container_proxy_walk_ctx_t *ctx = args;
-
- mp = vl_msg_api_alloc (sizeof (*mp));
- if (!mp)
- return 1;
-
- memset (mp, 0, sizeof (*mp));
- mp->_vl_msg_id = ntohs (VL_API_IP_CONTAINER_PROXY_DETAILS);
- mp->context = ctx->context;
-
- mp->sw_if_index = ntohl (sw_if_index);
- ip_prefix_encode (pfx, &mp->prefix);
-
- vl_api_send_msg (ctx->reg, (u8 *) mp);
-
- return 1;
-}
-
-static void
-vl_api_ip_container_proxy_dump_t_handler (vl_api_ip_container_proxy_dump_t *
- mp)