X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip_api.c;h=0a0551187328b1f3d25545101bb1ee26231a4ee4;hb=4b9669dc116f6c9be5ef124e4aff7b201404b6ea;hp=2ea1e411764ca99ef284b52355585e8c456804ca;hpb=6c4dae27e75fc668f86c9cca0f3f58273b680621;p=vpp.git diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c index 2ea1e411764..0a055118732 100644 --- a/src/vnet/ip/ip_api.c +++ b/src/vnet/ip/ip_api.c @@ -42,6 +42,8 @@ #include #include #include +#include +#include #include @@ -76,6 +78,7 @@ _(IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del) \ _(SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit) \ _(WANT_IP4_ARP_EVENTS, want_ip4_arp_events) \ _(WANT_IP6_ND_EVENTS, want_ip6_nd_events) \ +_(WANT_IP6_RA_EVENTS, want_ip6_ra_events) \ _(PROXY_ARP_ADD_DEL, proxy_arp_add_del) \ _(PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable) \ _(RESET_FIB, reset_fib) \ @@ -88,6 +91,7 @@ _(SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config) \ _(SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix) \ _(IP6ND_PROXY_ADD_DEL, ip6nd_proxy_add_del) \ _(IP6ND_PROXY_DUMP, ip6nd_proxy_dump) \ +_(IP6ND_SEND_ROUTER_SOLICITATION, ip6nd_send_router_solicitation) \ _(SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable ) \ _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS, \ sw_interface_ip6_set_link_local_address) \ @@ -97,7 +101,9 @@ _(IOAM_DISABLE, ioam_disable) \ _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL, \ ip_source_and_port_range_check_add_del) \ _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL, \ - ip_source_and_port_range_check_interface_add_del) + ip_source_and_port_range_check_interface_add_del) \ +_(IP_REASSEMBLY_SET, ip_reassembly_set) \ +_(IP_REASSEMBLY_GET, ip_reassembly_get) extern void stats_dslock_with_hint (int hint, int tag); extern void stats_dsunlock (void); @@ -173,33 +179,6 @@ vl_api_ip_neighbor_dump_t_handler (vl_api_ip_neighbor_dump_t * mp) } } - -void -copy_fib_next_hop (fib_route_path_encode_t * api_rpath, void *fp_arg) -{ - int is_ip4; - vl_api_fib_path_t *fp = (vl_api_fib_path_t *) fp_arg; - - if (api_rpath->rpath.frp_proto == DPO_PROTO_IP4) - fp->afi = IP46_TYPE_IP4; - else if (api_rpath->rpath.frp_proto == DPO_PROTO_IP6) - fp->afi = IP46_TYPE_IP6; - else - { - is_ip4 = ip46_address_is_ip4 (&api_rpath->rpath.frp_addr); - if (is_ip4) - fp->afi = IP46_TYPE_IP4; - else - fp->afi = IP46_TYPE_IP6; - } - if (fp->afi == IP46_TYPE_IP4) - memcpy (fp->next_hop, &api_rpath->rpath.frp_addr.ip4, - sizeof (api_rpath->rpath.frp_addr.ip4)); - else - memcpy (fp->next_hop, &api_rpath->rpath.frp_addr.ip6, - sizeof (api_rpath->rpath.frp_addr.ip6)); -} - static void send_ip_fib_details (vpe_api_main_t * am, vl_api_registration_t * reg, @@ -230,38 +209,7 @@ send_ip_fib_details (vpe_api_main_t * am, fp = mp->path; vec_foreach (api_rpath, api_rpaths) { - memset (fp, 0, sizeof (*fp)); - switch (api_rpath->dpo.dpoi_type) - { - case DPO_RECEIVE: - fp->is_local = true; - break; - case DPO_DROP: - fp->is_drop = true; - break; - case DPO_IP_NULL: - switch (api_rpath->dpo.dpoi_index) - { - case IP_NULL_ACTION_NONE: - fp->is_drop = true; - break; - case IP_NULL_ACTION_SEND_ICMP_UNREACH: - fp->is_unreach = true; - break; - case IP_NULL_ACTION_SEND_ICMP_PROHIBIT: - fp->is_prohibit = true; - break; - default: - break; - } - break; - default: - break; - } - fp->weight = api_rpath->rpath.frp_weight; - fp->preference = api_rpath->rpath.frp_preference; - fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index); - copy_fib_next_hop (api_rpath, fp); + fib_api_path_encode (api_rpath, fp); fp++; } @@ -273,14 +221,14 @@ typedef struct vl_api_ip_fib_dump_walk_ctx_t_ fib_node_index_t *feis; } vl_api_ip_fib_dump_walk_ctx_t; -static int +static fib_table_walk_rc_t vl_api_ip_fib_dump_walk (fib_node_index_t fei, void *arg) { vl_api_ip_fib_dump_walk_ctx_t *ctx = arg; vec_add1 (ctx->feis, fei); - return (1); + return (FIB_TABLE_WALK_CONTINUE); } static void @@ -358,38 +306,7 @@ send_ip6_fib_details (vpe_api_main_t * am, fp = mp->path; vec_foreach (api_rpath, api_rpaths) { - memset (fp, 0, sizeof (*fp)); - switch (api_rpath->dpo.dpoi_type) - { - case DPO_RECEIVE: - fp->is_local = true; - break; - case DPO_DROP: - fp->is_drop = true; - break; - case DPO_IP_NULL: - switch (api_rpath->dpo.dpoi_index) - { - case IP_NULL_DPO_ACTION_NUM + IP_NULL_ACTION_NONE: - fp->is_drop = true; - break; - case IP_NULL_DPO_ACTION_NUM + IP_NULL_ACTION_SEND_ICMP_UNREACH: - fp->is_unreach = true; - break; - case IP_NULL_DPO_ACTION_NUM + IP_NULL_ACTION_SEND_ICMP_PROHIBIT: - fp->is_prohibit = true; - break; - default: - break; - } - break; - default: - break; - } - fp->weight = api_rpath->rpath.frp_weight; - fp->preference = api_rpath->rpath.frp_preference; - fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index); - copy_fib_next_hop (api_rpath, fp); + fib_api_path_encode (api_rpath, fp); fp++; } @@ -460,6 +377,10 @@ vl_api_ip6_fib_dump_t_handler (vl_api_ip6_fib_dump_t * mp) /* *INDENT-OFF* */ pool_foreach (fib_table, im6->fibs, ({ + /* don't send link locals */ + if (fib_table->ft_flags & FIB_TABLE_FLAG_IP6_LL) + continue; + api_ip6_fib_table_get_all(reg, mp, fib_table); })); /* *INDENT-ON* */ @@ -501,11 +422,7 @@ send_ip_mfib_details (vl_api_registration_t * reg, fp = mp->path; vec_foreach (api_rpath, api_rpaths) { - memset (fp, 0, sizeof (*fp)); - - fp->weight = 0; - fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index); - copy_fib_next_hop (api_rpath, fp); + fib_api_path_encode (api_rpath, fp); fp++; } vec_free (api_rpaths); @@ -597,11 +514,7 @@ send_ip6_mfib_details (vpe_api_main_t * am, fp = mp->path; vec_foreach (api_rpath, api_rpaths) { - memset (fp, 0, sizeof (*fp)); - - fp->weight = 0; - fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index); - copy_fib_next_hop (api_rpath, fp); + fib_api_path_encode (api_rpath, fp); fp++; } @@ -863,7 +776,7 @@ add_del_route_t_handler (u8 is_multipath, u16 next_hop_weight, u16 next_hop_preference, mpls_label_t next_hop_via_label, - mpls_label_t * next_hop_out_label_stack) + fib_mpls_label_t * next_hop_out_label_stack) { vnet_classify_main_t *cm = &vnet_classify_main; fib_route_path_flags_t path_flags = FIB_ROUTE_PATH_FLAG_NONE; @@ -1022,23 +935,11 @@ add_del_route_check (fib_protocol_t table_proto, { vnet_main_t *vnm = vnet_get_main (); - /* Temporaray whilst I do the CSIT dance */ - u8 create_missing_tables = 1; - *fib_index = fib_table_find (table_proto, ntohl (table_id)); if (~0 == *fib_index) { - if (create_missing_tables) - { - *fib_index = fib_table_find_or_create_and_lock (table_proto, - ntohl (table_id), - FIB_SOURCE_API); - } - else - { - /* No such VRF, and we weren't asked to create one */ - return VNET_API_ERROR_NO_SUCH_FIB; - } + /* No such VRF, and we weren't asked to create one */ + return VNET_API_ERROR_NO_SUCH_FIB; } if (!is_rpf_id && ~0 != ntohl (next_hop_sw_if_index)) @@ -1067,26 +968,8 @@ add_del_route_check (fib_protocol_t table_proto, if (~0 == *next_hop_fib_index) { - if (create_missing_tables) - { - if (is_rpf_id) - *next_hop_fib_index = - mfib_table_find_or_create_and_lock (fib_nh_proto, - ntohl - (next_hop_table_id), - MFIB_SOURCE_API); - else - *next_hop_fib_index = - fib_table_find_or_create_and_lock (fib_nh_proto, - ntohl - (next_hop_table_id), - FIB_SOURCE_API); - } - else - { - /* No such VRF, and we weren't asked to create one */ - return VNET_API_ERROR_NO_SUCH_FIB; - } + /* No such VRF, and we weren't asked to create one */ + return VNET_API_ERROR_NO_SUCH_FIB; } } @@ -1097,7 +980,7 @@ static int ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp) { u32 fib_index, next_hop_fib_index; - mpls_label_t *label_stack = NULL; + fib_mpls_label_t *label_stack = NULL; int rv, ii, n_labels;; rv = add_del_route_check (FIB_PROTOCOL_IP4, @@ -1123,13 +1006,19 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp) n_labels = mp->next_hop_n_out_labels; if (n_labels == 0) ; - else if (1 == n_labels) - vec_add1 (label_stack, ntohl (mp->next_hop_out_label_stack[0])); else { vec_validate (label_stack, n_labels - 1); for (ii = 0; ii < n_labels; ii++) - label_stack[ii] = ntohl (mp->next_hop_out_label_stack[ii]); + { + label_stack[ii].fml_value = + ntohl (mp->next_hop_out_label_stack[ii].label); + label_stack[ii].fml_ttl = mp->next_hop_out_label_stack[ii].ttl; + label_stack[ii].fml_exp = mp->next_hop_out_label_stack[ii].exp; + label_stack[ii].fml_mode = + (mp->next_hop_out_label_stack[ii].is_uniform ? + FIB_MPLS_LSP_MODE_UNIFORM : FIB_MPLS_LSP_MODE_PIPE); + } } return (add_del_route_t_handler (mp->is_multipath, @@ -1159,8 +1048,8 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp) static int ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp) { + fib_mpls_label_t *label_stack = NULL; u32 fib_index, next_hop_fib_index; - mpls_label_t *label_stack = NULL; int rv, ii, n_labels;; rv = add_del_route_check (FIB_PROTOCOL_IP6, @@ -1186,13 +1075,19 @@ ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp) n_labels = mp->next_hop_n_out_labels; if (n_labels == 0) ; - else if (1 == n_labels) - vec_add1 (label_stack, ntohl (mp->next_hop_out_label_stack[0])); else { vec_validate (label_stack, n_labels - 1); for (ii = 0; ii < n_labels; ii++) - label_stack[ii] = ntohl (mp->next_hop_out_label_stack[ii]); + { + label_stack[ii].fml_value = + ntohl (mp->next_hop_out_label_stack[ii].label); + label_stack[ii].fml_ttl = mp->next_hop_out_label_stack[ii].ttl; + label_stack[ii].fml_exp = mp->next_hop_out_label_stack[ii].exp; + label_stack[ii].fml_mode = + (mp->next_hop_out_label_stack[ii].is_uniform ? + FIB_MPLS_LSP_MODE_UNIFORM : FIB_MPLS_LSP_MODE_PIPE); + } } return (add_del_route_t_handler (mp->is_multipath, @@ -1688,7 +1583,7 @@ typedef struct api_ip6nd_proxy_fib_table_walk_ctx_t_ u32 *indices; } api_ip6nd_proxy_fib_table_walk_ctx_t; -static int +static fib_table_walk_rc_t api_ip6nd_proxy_fib_table_walk (fib_node_index_t fei, void *arg) { api_ip6nd_proxy_fib_table_walk_ctx_t *ctx = arg; @@ -1698,7 +1593,7 @@ api_ip6nd_proxy_fib_table_walk (fib_node_index_t fei, void *arg) vec_add1 (ctx->indices, fei); } - return (1); + return (FIB_TABLE_WALK_CONTINUE); } static void @@ -1757,6 +1652,32 @@ vl_api_ip6nd_proxy_add_del_t_handler (vl_api_ip6nd_proxy_add_del_t * mp) 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) @@ -1824,7 +1745,7 @@ static void } void -vl_mfib_signal_send_one (svm_queue_t * q, +vl_mfib_signal_send_one (vl_api_registration_t * reg, u32 context, const mfib_signal_t * mfs) { vl_api_mfib_signal_details_t *mp; @@ -1873,21 +1794,19 @@ vl_mfib_signal_send_one (svm_queue_t * q, mp->ip_packet_len = 0; } - vl_msg_api_send_shmem (q, (u8 *) & mp); + vl_api_send_msg (reg, (u8 *) mp); } static void vl_api_mfib_signal_dump_t_handler (vl_api_mfib_signal_dump_t * mp) { - svm_queue_t *q; + vl_api_registration_t *reg; - q = vl_api_client_index_to_input_queue (mp->client_index); - if (q == 0) - { - return; - } + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; - while (q->cursize < q->maxsize && mfib_signal_send_one (q, mp->context)) + while (vl_api_can_send_msg (reg) && mfib_signal_send_one (reg, mp->context)) ; } @@ -2107,7 +2026,7 @@ handle_ip4_arp_event (u32 pool_index) vlib_main_t *vm = vam->vlib_main; vl_api_ip4_arp_event_t *event; vl_api_ip4_arp_event_t *mp; - svm_queue_t *q; + vl_api_registration_t *reg; /* Client can cancel, die, etc. */ if (pool_is_free_index (vam->arp_events, pool_index)) @@ -2115,8 +2034,8 @@ handle_ip4_arp_event (u32 pool_index) event = pool_elt_at_index (vam->arp_events, pool_index); - q = vl_api_client_index_to_input_queue (event->client_index); - if (!q) + reg = vl_api_client_index_to_registration (event->client_index); + if (!reg) { (void) vnet_add_del_ip4_arp_change_event (vnm, arp_change_delete_callback, @@ -2126,11 +2045,11 @@ handle_ip4_arp_event (u32 pool_index) return; } - if (q->cursize < q->maxsize) + if (vl_api_can_send_msg (reg)) { mp = vl_msg_api_alloc (sizeof (*mp)); clib_memcpy (mp, event, sizeof (*mp)); - vl_msg_api_send_shmem (q, (u8 *) & mp); + vl_api_send_msg (reg, (u8 *) mp); } else { @@ -2156,7 +2075,7 @@ handle_ip6_nd_event (u32 pool_index) vlib_main_t *vm = vam->vlib_main; vl_api_ip6_nd_event_t *event; vl_api_ip6_nd_event_t *mp; - svm_queue_t *q; + vl_api_registration_t *reg; /* Client can cancel, die, etc. */ if (pool_is_free_index (vam->nd_events, pool_index)) @@ -2164,8 +2083,8 @@ handle_ip6_nd_event (u32 pool_index) event = pool_elt_at_index (vam->nd_events, pool_index); - q = vl_api_client_index_to_input_queue (event->client_index); - if (!q) + reg = vl_api_client_index_to_registration (event->client_index); + if (!reg) { (void) vnet_add_del_ip6_nd_change_event (vnm, nd_change_delete_callback, @@ -2175,11 +2094,11 @@ handle_ip6_nd_event (u32 pool_index) return; } - if (q->cursize < q->maxsize) + if (vl_api_can_send_msg (reg)) { mp = vl_msg_api_alloc (sizeof (*mp)); clib_memcpy (mp, event, sizeof (*mp)); - vl_msg_api_send_shmem (q, (u8 *) & mp); + vl_api_send_msg (reg, (u8 *) mp); } else { @@ -2290,7 +2209,7 @@ nd_change_delete_callback (u32 pool_index, u8 * notused) static vlib_node_registration_t wc_arp_process_node; enum -{ WC_ARP_REPORT, WC_ND_REPORT }; +{ WC_ARP_REPORT, WC_ND_REPORT, RA_REPORT, REPORT_MAX }; static uword wc_arp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) @@ -2331,9 +2250,9 @@ wc_arp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) /* *INDENT-OFF* */ pool_foreach(reg, vpe_api_main.wc_ip4_arp_events_registrations, ({ - svm_queue_t *q; - q = vl_api_client_index_to_input_queue (reg->client_index); - if (q && q->cursize < q->maxsize) + vl_api_registration_t *vl_reg; + vl_reg = vl_api_client_index_to_registration (reg->client_index); + if (reg && vl_api_can_send_msg (vl_reg)) { vl_api_ip4_arp_event_t * event = vl_msg_api_alloc (sizeof *event); memset (event, 0, sizeof *event); @@ -2344,7 +2263,7 @@ wc_arp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) event->address = arp_events[i].ip4; event->sw_if_index = htonl(arp_events[i].sw_if_index); memcpy(event->new_mac, arp_events[i].mac, sizeof event->new_mac); - vl_msg_api_send_shmem (q, (u8 *) &event); + vl_api_send_msg (vl_reg, (u8 *) event); } })); /* *INDENT-ON* */ @@ -2370,9 +2289,9 @@ wc_arp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) /* *INDENT-OFF* */ pool_foreach(reg, vpe_api_main.wc_ip6_nd_events_registrations, ({ - svm_queue_t *q; - q = vl_api_client_index_to_input_queue (reg->client_index); - if (q && q->cursize < q->maxsize) + vl_api_registration_t *vl_reg; + vl_reg = vl_api_client_index_to_registration (reg->client_index); + if (vl_reg && vl_api_can_send_msg (vl_reg)) { vl_api_ip6_nd_event_t * event = vl_msg_api_alloc (sizeof *event); memset (event, 0, sizeof *event); @@ -2383,12 +2302,80 @@ wc_arp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) memcpy(event->address, nd_events[i].ip6.as_u8, sizeof event->address); event->sw_if_index = htonl(nd_events[i].sw_if_index); memcpy(event->new_mac, nd_events[i].mac, sizeof event->new_mac); - vl_msg_api_send_shmem (q, (u8 *) &event); + vl_api_send_msg (vl_reg, (u8 *) event); } })); /* *INDENT-ON* */ } } + else if (event_type == RA_REPORT) + { + ra_report_t *ra_events = event_data; + for (i = 0; i < vec_len (ra_events); i++) + { + vpe_client_registration_t *reg; + /* *INDENT-OFF* */ + pool_foreach(reg, vpe_api_main.ip6_ra_events_registrations, + ({ + vl_api_registration_t *vl_reg; + vl_reg = + vl_api_client_index_to_registration (reg->client_index); + if (vl_reg && vl_api_can_send_msg (vl_reg)) + { + u32 event_size = + sizeof (vl_api_ip6_ra_event_t) + + vec_len (ra_events[i].prefixes) * + sizeof (vl_api_ip6_ra_prefix_info_t); + vl_api_ip6_ra_event_t *event = + vl_msg_api_alloc (event_size); + memset (event, 0, event_size); + event->_vl_msg_id = htons (VL_API_IP6_RA_EVENT); + event->client_index = reg->client_index; + event->pid = reg->client_pid; + + event->sw_if_index = clib_host_to_net_u32 (ra_events[i].sw_if_index); + + memcpy (event->router_address, ra_events[i].router_address, 16); + + event->current_hop_limit = ra_events[i].current_hop_limit; + event->flags = ra_events[i].flags; + event->router_lifetime_in_sec = + clib_host_to_net_u16 (ra_events + [i].router_lifetime_in_sec); + event->neighbor_reachable_time_in_msec = + clib_host_to_net_u32 (ra_events + [i].neighbor_reachable_time_in_msec); + event->time_in_msec_between_retransmitted_neighbor_solicitations + = + clib_host_to_net_u32 (ra_events + [i].time_in_msec_between_retransmitted_neighbor_solicitations); + + event->n_prefixes = + clib_host_to_net_u32 (vec_len (ra_events[i].prefixes)); + vl_api_ip6_ra_prefix_info_t *prefix = + (typeof (prefix)) event->prefixes; + u32 j; + for (j = 0; j < vec_len (ra_events[i].prefixes); j++) + { + ra_report_prefix_info_t *info = + &ra_events[i].prefixes[j]; + memcpy (prefix->dst_address, info->dst_address.as_u8, + 16); + prefix->dst_address_length = info->dst_address_length; + prefix->flags = info->flags; + prefix->valid_time = + clib_host_to_net_u32 (info->valid_time); + prefix->preferred_time = + clib_host_to_net_u32 (info->preferred_time); + prefix++; + } + + vl_api_send_msg (vl_reg, (u8 *) event); + } + })); + /* *INDENT-ON* */ + } + } vlib_process_put_event_data (vm, event_data); } @@ -2454,7 +2441,7 @@ vl_api_want_ip4_arp_events_t_handler (vl_api_want_ip4_arp_events_t * mp) hash_unset (am->wc_ip4_arp_events_registration_hash, mp->client_index); if (pool_elts (am->wc_ip4_arp_events_registrations) == 0) - wc_arp_set_publisher_node (~0, WC_ARP_REPORT); + wc_arp_set_publisher_node (~0, REPORT_MAX); goto reply; } } @@ -2539,7 +2526,7 @@ vl_api_want_ip6_nd_events_t_handler (vl_api_want_ip6_nd_events_t * mp) hash_unset (am->wc_ip6_nd_events_registration_hash, mp->client_index); if (pool_elts (am->wc_ip6_nd_events_registrations) == 0) - wc_nd_set_publisher_node (~0, 2); + wc_nd_set_publisher_node (~0, REPORT_MAX); goto reply; } } @@ -2593,6 +2580,50 @@ reply: REPLY_MACRO (VL_API_WANT_IP6_ND_EVENTS_REPLY); } +static void +vl_api_want_ip6_ra_events_t_handler (vl_api_want_ip6_ra_events_t * mp) +{ + vpe_api_main_t *am = &vpe_api_main; + vl_api_want_ip6_ra_events_reply_t *rmp; + int rv = 0; + + uword *p = hash_get (am->ip6_ra_events_registration_hash, mp->client_index); + vpe_client_registration_t *rp; + if (p) + { + if (mp->enable_disable) + { + clib_warning ("pid %d: already enabled...", ntohl (mp->pid)); + rv = VNET_API_ERROR_INVALID_REGISTRATION; + goto reply; + } + else + { + rp = pool_elt_at_index (am->ip6_ra_events_registrations, p[0]); + pool_put (am->ip6_ra_events_registrations, rp); + hash_unset (am->ip6_ra_events_registration_hash, mp->client_index); + if (pool_elts (am->ip6_ra_events_registrations) == 0) + ra_set_publisher_node (~0, REPORT_MAX); + goto reply; + } + } + if (mp->enable_disable == 0) + { + clib_warning ("pid %d: already disabled...", ntohl (mp->pid)); + rv = VNET_API_ERROR_INVALID_REGISTRATION; + goto reply; + } + pool_get (am->ip6_ra_events_registrations, rp); + rp->client_index = mp->client_index; + rp->client_pid = ntohl (mp->pid); + hash_set (am->ip6_ra_events_registration_hash, rp->client_index, + rp - am->ip6_ra_events_registrations); + ra_set_publisher_node (wc_arp_process_node.index, RA_REPORT); + +reply: + REPLY_MACRO (VL_API_WANT_IP6_RA_EVENTS_REPLY); +} + static void vl_api_proxy_arp_add_del_t_handler (vl_api_proxy_arp_add_del_t * mp) { @@ -2818,6 +2849,61 @@ vl_api_set_arp_neighbor_limit_t_handler (vl_api_set_arp_neighbor_limit_t * mp) REPLY_MACRO (VL_API_SET_ARP_NEIGHBOR_LIMIT_REPLY); } +void +vl_api_ip_reassembly_set_t_handler (vl_api_ip_reassembly_set_t * mp) +{ + vl_api_ip_reassembly_set_reply_t *rmp; + int rv = 0; + if (mp->is_ip6) + { + rv = ip6_reass_set (clib_net_to_host_u32 (mp->timeout_ms), + clib_net_to_host_u32 (mp->max_reassemblies), + clib_net_to_host_u32 (mp->expire_walk_interval_ms)); + } + else + { + rv = ip4_reass_set (clib_net_to_host_u32 (mp->timeout_ms), + clib_net_to_host_u32 (mp->max_reassemblies), + clib_net_to_host_u32 (mp->expire_walk_interval_ms)); + } + + REPLY_MACRO (VL_API_IP_REASSEMBLY_SET_REPLY); +} + +void +vl_api_ip_reassembly_get_t_handler (vl_api_ip_reassembly_get_t * mp) +{ + unix_shared_memory_queue_t *q; + + q = vl_api_client_index_to_input_queue (mp->client_index); + + if (q == 0) + return; + + vl_api_ip_reassembly_get_reply_t *rmp = vl_msg_api_alloc (sizeof (*rmp)); + memset (rmp, 0, sizeof (*rmp)); + rmp->_vl_msg_id = ntohs (VL_API_IP_REASSEMBLY_GET_REPLY); + rmp->context = mp->context; + rmp->retval = 0; + if (mp->is_ip6) + { + rmp->is_ip6 = 1; + ip6_reass_get (&rmp->timeout_ms, &rmp->max_reassemblies, + &rmp->expire_walk_interval_ms); + } + else + { + rmp->is_ip6 = 0; + ip4_reass_get (&rmp->timeout_ms, &rmp->max_reassemblies, + &rmp->expire_walk_interval_ms); + } + rmp->timeout_ms = clib_host_to_net_u32 (rmp->timeout_ms); + rmp->max_reassemblies = clib_host_to_net_u32 (rmp->max_reassemblies); + rmp->expire_walk_interval_ms = + clib_host_to_net_u32 (rmp->expire_walk_interval_ms); + vl_msg_api_send_shmem (q, (u8 *) & rmp); +} + #define vl_msg_name_crc_list #include #undef vl_msg_name_crc_list