X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip_api.c;h=ce3ff79acfa22ab7d86536a15f1a1fb9111833b7;hb=9e2f915;hp=a8dbb3ae36c15b7899a5a8d153ede209de3fee38;hpb=4c53313cd7e9b866412ad3e04b2d91ac098c1398;p=vpp.git diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c index a8dbb3ae36c..ce3ff79acfa 100644 --- a/src/vnet/ip/ip_api.c +++ b/src/vnet/ip/ip_api.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -73,9 +74,12 @@ _(IP_NEIGHBOR_DUMP, ip_neighbor_dump) \ _(IP_MROUTE_ADD_DEL, ip_mroute_add_del) \ _(MFIB_SIGNAL_DUMP, mfib_signal_dump) \ _(IP_ADDRESS_DUMP, ip_address_dump) \ +_(IP_UNNUMBERED_DUMP, ip_unnumbered_dump) \ _(IP_DUMP, ip_dump) \ _(IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del) \ _(SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit) \ +_(IP_PROBE_NEIGHBOR, ip_probe_neighbor) \ +_(IP_SCAN_NEIGHBOR_ENABLE_DISABLE, ip_scan_neighbor_enable_disable) \ _(WANT_IP4_ARP_EVENTS, want_ip4_arp_events) \ _(WANT_IP6_ND_EVENTS, want_ip6_nd_events) \ _(WANT_IP6_RA_EVENTS, want_ip6_ra_events) \ @@ -1207,13 +1211,15 @@ mroute_add_del_handler (u8 is_add, dpo_proto_t nh_proto, u32 entry_flags, fib_rpf_id_t rpf_id, - u32 next_hop_sw_if_index, u32 itf_flags, u32 bier_imp) + u32 next_hop_sw_if_index, + ip46_address_t * nh, u32 itf_flags, u32 bier_imp) { stats_dslock_with_hint (1 /* release hint */ , 2 /* tag */ ); fib_route_path_t path = { .frp_sw_if_index = next_hop_sw_if_index, .frp_proto = nh_proto, + .frp_addr = *nh, }; if (is_local) @@ -1252,6 +1258,7 @@ api_mroute_add_del_t_handler (vl_api_ip_mroute_add_del_t * mp) { fib_protocol_t fproto; dpo_proto_t nh_proto; + ip46_address_t nh; u32 fib_index; int rv; @@ -1276,6 +1283,8 @@ api_mroute_add_del_t_handler (vl_api_ip_mroute_add_del_t * mp) sizeof (pfx.fp_grp_addr.ip4)); clib_memcpy (&pfx.fp_src_addr.ip4, mp->src_address, sizeof (pfx.fp_src_addr.ip4)); + memset (&nh.ip6, 0, sizeof (nh.ip6)); + clib_memcpy (&nh.ip4, mp->nh_address, sizeof (nh.ip4)); } else { @@ -1283,6 +1292,7 @@ api_mroute_add_del_t_handler (vl_api_ip_mroute_add_del_t * mp) sizeof (pfx.fp_grp_addr.ip6)); clib_memcpy (&pfx.fp_src_addr.ip6, mp->src_address, sizeof (pfx.fp_src_addr.ip6)); + clib_memcpy (&nh.ip6, mp->nh_address, sizeof (nh.ip6)); } return (mroute_add_del_handler (mp->is_add, @@ -1292,6 +1302,7 @@ api_mroute_add_del_t_handler (vl_api_ip_mroute_add_del_t * mp) ntohl (mp->entry_flags), ntohl (mp->rpf_id), ntohl (mp->next_hop_sw_if_index), + &nh, ntohl (mp->itf_flags), ntohl (mp->bier_imp))); } @@ -1385,8 +1396,11 @@ vl_api_ip_address_dump_t_handler (vl_api_ip_address_dump_t * mp) if (mp->is_ipv6) { /* *INDENT-OFF* */ - foreach_ip_interface_address (lm6, ia, sw_if_index, - 1 /* honor unnumbered */, + /* Do not send subnet details of the IP-interface for + * unnumbered interfaces. otherwise listening clients + * will be confused that the subnet is applied on more + * than one interface */ + foreach_ip_interface_address (lm6, ia, sw_if_index, 0, ({ r6 = ip_interface_address_get_address (lm6, ia); u16 prefix_length = ia->address_length; @@ -1398,8 +1412,7 @@ vl_api_ip_address_dump_t_handler (vl_api_ip_address_dump_t * mp) else { /* *INDENT-OFF* */ - foreach_ip_interface_address (lm4, ia, sw_if_index, - 1 /* honor unnumbered */, + foreach_ip_interface_address (lm4, ia, sw_if_index, 0, ({ r4 = ip_interface_address_get_address (lm4, ia); u16 prefix_length = ia->address_length; @@ -1411,6 +1424,74 @@ vl_api_ip_address_dump_t_handler (vl_api_ip_address_dump_t * mp) BAD_SW_IF_INDEX_LABEL; } +static void +send_ip_unnumbered_details (vpe_api_main_t * am, + vl_api_registration_t * reg, + u32 sw_if_index, u32 ip_sw_if_index, u32 context) +{ + vl_api_ip_unnumbered_details_t *mp; + + mp = vl_msg_api_alloc (sizeof (*mp)); + memset (mp, 0, sizeof (*mp)); + mp->_vl_msg_id = ntohs (VL_API_IP_UNNUMBERED_DETAILS); + + mp->context = context; + mp->sw_if_index = htonl (sw_if_index); + mp->ip_sw_if_index = htonl (ip_sw_if_index); + + vl_api_send_msg (reg, (u8 *) mp); +} + +static void +vl_api_ip_unnumbered_dump_t_handler (vl_api_ip_unnumbered_dump_t * mp) +{ + vnet_main_t *vnm = vnet_get_main (); + vnet_interface_main_t *im = &vnm->interface_main; + int rv __attribute__ ((unused)) = 0; + vpe_api_main_t *am = &vpe_api_main; + vl_api_registration_t *reg; + vnet_sw_interface_t *si; + u32 sw_if_index; + + sw_if_index = ntohl (mp->sw_if_index); + + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; + + if (~0 != sw_if_index) + { + VALIDATE_SW_IF_INDEX (mp); + + si = vnet_get_sw_interface (vnm, ntohl (mp->sw_if_index)); + + if (!(si->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)) + { + send_ip_unnumbered_details (am, reg, + sw_if_index, + si->unnumbered_sw_if_index, + mp->context); + } + } + else + { + /* *INDENT-OFF* */ + pool_foreach (si, im->sw_interfaces, + ({ + if ((si->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)) + { + send_ip_unnumbered_details(am, reg, + si->sw_if_index, + si->unnumbered_sw_if_index, + mp->context); + } + })); + /* *INDENT-ON* */ + } + + BAD_SW_IF_INDEX_LABEL; +} + static void vl_api_ip_dump_t_handler (vl_api_ip_dump_t * mp) { @@ -2253,6 +2334,7 @@ wc_arp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) ({ vl_api_registration_t *vl_reg; vl_reg = vl_api_client_index_to_registration (reg->client_index); + ASSERT (vl_reg != NULL); if (reg && vl_api_can_send_msg (vl_reg)) { vl_api_ip4_arp_event_t * event = vl_msg_api_alloc (sizeof *event); @@ -2314,6 +2396,10 @@ wc_arp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) ra_report_t *ra_events = event_data; for (i = 0; i < vec_len (ra_events); i++) { + ip6_neighbor_public_main_t *npm = &ip6_neighbor_public_main; + call_ip6_neighbor_callbacks (&ra_events[i], + npm->ra_report_functions); + vpe_client_registration_t *reg; /* *INDENT-OFF* */ pool_foreach(reg, vpe_api_main.ip6_ra_events_registrations, @@ -2603,8 +2689,6 @@ vl_api_want_ip6_ra_events_t_handler (vl_api_want_ip6_ra_events_t * mp) 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; } } @@ -2619,7 +2703,6 @@ vl_api_want_ip6_ra_events_t_handler (vl_api_want_ip6_ra_events_t * mp) 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); @@ -2683,6 +2766,55 @@ static void REPLY_MACRO (VL_API_PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY); } +static void +vl_api_ip_probe_neighbor_t_handler (vl_api_ip_probe_neighbor_t * mp) +{ + int rv = 0; + vlib_main_t *vm = vlib_get_main (); + vl_api_ip_probe_neighbor_reply_t *rmp; + clib_error_t *error; + + VALIDATE_SW_IF_INDEX (mp); + + u32 sw_if_index = ntohl (mp->sw_if_index); + + if (mp->is_ipv6) + error = ip6_probe_neighbor (vm, (ip6_address_t *) mp->dst_address, + sw_if_index); + else + error = ip4_probe_neighbor (vm, (ip4_address_t *) mp->dst_address, + sw_if_index); + + if (error) + { + clib_error_report (error); + rv = clib_error_get_code (error); + } + + BAD_SW_IF_INDEX_LABEL; + + REPLY_MACRO (VL_API_PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY); +} + +static void + vl_api_ip_scan_neighbor_enable_disable_t_handler + (vl_api_ip_scan_neighbor_enable_disable_t * mp) +{ + int rv = 0; + vl_api_ip_scan_neighbor_enable_disable_reply_t *rmp; + ip_neighbor_scan_arg_t arg; + + arg.mode = mp->mode; + arg.scan_interval = mp->scan_interval; + arg.max_proc_time = mp->max_proc_time; + arg.max_update = mp->max_update; + arg.scan_int_delay = mp->scan_int_delay; + arg.stale_threshold = mp->stale_threshold; + ip_neighbor_scan_enable_disable (&arg); + + REPLY_MACRO (VL_API_IP_SCAN_NEIGHBOR_ENABLE_DISABLE_REPLY); +} + static int ip4_reset_fib_t_handler (vl_api_reset_fib_t * mp) { @@ -2954,6 +3086,8 @@ ip_api_hookup (vlib_main_t * vm) */ setup_message_id_table (am); + ra_set_publisher_node (wc_arp_process_node.index, RA_REPORT); + return 0; }