X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vpp%2Fapi%2Fapi.c;h=52616cce821726a683d5dd7035a4be76cb80ebe2;hb=21c33bb3078d323893834fe9897ea8ec1fbcbe59;hp=1b6d52be28de584b57117224f3ccee040b402da3;hpb=99cb335ac1209d5bb7ede754f59d7df898ae0e81;p=vpp.git diff --git a/vpp/api/api.c b/vpp/api/api.c index 1b6d52be28d..52616cce821 100644 --- a/vpp/api/api.c +++ b/vpp/api/api.c @@ -42,6 +42,7 @@ #include #include +#include // alagalah TODO : committers please pay note, is this ok? #include #include #include @@ -64,6 +65,7 @@ #include #include #include +#include #include #include #include @@ -272,6 +274,8 @@ _(L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key) \ _(SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump) \ _(VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel) \ _(VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump) \ +_(GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel) \ +_(GRE_TUNNEL_DUMP, gre_tunnel_dump) \ _(L2_FIB_CLEAR_TABLE, l2_fib_clear_table) \ _(L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter) \ _(L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite) \ @@ -326,7 +330,8 @@ _(LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface) \ _(LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump) \ _(LISP_LOCAL_EID_TABLE_DUMP, lisp_local_eid_table_dump) \ _(LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump) \ -_(LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump) +_(LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump) \ +_(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del) #define QUOTE_(x) #x #define QUOTE(x) QUOTE_(x) @@ -3386,7 +3391,15 @@ static void vl_api_sr_tunnel_add_del_t_handler a->is_del = (mp->is_add == 0); a->rx_table_id = ntohl(mp->outer_vrf_id); a->tx_table_id = ntohl(mp->inner_vrf_id); - + + a->name = format(0, "%s", mp->name); + if (!(vec_len(a->name))) + a->name = 0; + + a->policy_name = format(0, "%s", mp->policy_name); + if (!(vec_len(a->policy_name))) + a->policy_name = 0; + /* Yank segments and tags out of the API message */ this_address = (ip6_address_t *)mp->segs_and_tags; for (i = 0; i < mp->n_segments; i++) { @@ -3411,6 +3424,101 @@ out: #endif } +static void vl_api_sr_policy_add_del_t_handler +(vl_api_sr_policy_add_del_t *mp) +{ +#if IPV6SR == 0 + clib_warning ("unimplemented"); +#else + ip6_sr_add_del_policy_args_t _a, *a=&_a; + int rv = 0; + vl_api_sr_policy_add_del_reply_t * rmp; + int i; + + memset (a, 0, sizeof (*a)); + a->is_del = (mp->is_add == 0); + + a->name = format(0, "%s", mp->name); + if (!(vec_len(a->name))) + { + rv = VNET_API_ERROR_NO_SUCH_NODE2; + goto out; + } + + if (!(mp->tunnel_names)) + { + rv = VNET_API_ERROR_NO_SUCH_NODE2; + goto out; + } + + // start deserializing tunnel_names + int num_tunnels = mp->tunnel_names[0]; //number of tunnels + u8 * deser_tun_names = mp->tunnel_names; + deser_tun_names += 1; //moving along + + u8 * tun_name = 0; + int tun_name_len = 0; + + for (i=0; i < num_tunnels; i++) + { + tun_name_len= *deser_tun_names; + deser_tun_names += 1; + vec_resize (tun_name, tun_name_len); + memcpy(tun_name, deser_tun_names, tun_name_len); + vec_add1 (a->tunnel_names, tun_name); + deser_tun_names += tun_name_len; + tun_name = 0; + } + + rv = ip6_sr_add_del_policy (a); + +out: + + REPLY_MACRO(VL_API_SR_POLICY_ADD_DEL_REPLY); +#endif +} + +static void vl_api_sr_multicast_map_add_del_t_handler +(vl_api_sr_multicast_map_add_del_t *mp) +{ +#if IPV6SR == 0 + clib_warning ("unimplemented"); +#else + ip6_sr_add_del_multicastmap_args_t _a, *a=&_a; + int rv = 0; + vl_api_sr_multicast_map_add_del_reply_t * rmp; + + memset (a, 0, sizeof (*a)); + a->is_del = (mp->is_add == 0); + + a->multicast_address = (ip6_address_t *)&mp->multicast_address; + a->policy_name = format(0, "%s", mp->policy_name); + + if (a->multicast_address == 0) + { + rv = -1 ; + goto out; + } + + if (!(a->policy_name)) + { + rv = -2 ; + goto out; + } + +#if DPDK > 0 /* Cannot call replicate without DPDK */ + rv = ip6_sr_add_del_multicastmap (a); +#else + clib_warning ("multicast replication without DPDK not implemented"); + rv = VNET_API_ERROR_UNIMPLEMENTED; +#endif /* DPDK */ + +out: + + REPLY_MACRO(VL_API_SR_MULTICAST_MAP_ADD_DEL_REPLY); +#endif +} + #define foreach_classify_add_del_table_field \ _(table_index) \ _(nbuckets) \ @@ -4286,6 +4394,95 @@ static void vl_api_vxlan_tunnel_dump_t_handler } } +static void vl_api_gre_add_del_tunnel_t_handler +(vl_api_gre_add_del_tunnel_t * mp) +{ + vl_api_gre_add_del_tunnel_reply_t * rmp; + int rv = 0; + vnet_gre_add_del_tunnel_args_t _a, *a = &_a; + u32 outer_table_id; + uword * p; + ip4_main_t * im = &ip4_main; + u32 sw_if_index = ~0; + + p = hash_get (im->fib_index_by_table_id, ntohl(mp->outer_table_id)); + if (! p) { + rv = VNET_API_ERROR_NO_SUCH_FIB; + goto out; + } + outer_table_id = p[0]; + + /* Check src & dst are different */ + if (memcmp(&mp->src_address, &mp->dst_address, 4) == 0) { + rv = VNET_API_ERROR_SAME_SRC_DST; + goto out; + } + + memset (a, 0, sizeof (*a)); + + a->is_add = mp->is_add; + + /* ip addresses sent in network byte order */ + a->src.as_u32 = mp->src_address; + a->dst.as_u32 = mp->dst_address; + + a->outer_table_id = outer_table_id; + rv = vnet_gre_add_del_tunnel (a, &sw_if_index); + +out: + REPLY_MACRO2(VL_API_GRE_ADD_DEL_TUNNEL_REPLY, + ({ + rmp->sw_if_index = ntohl (sw_if_index); + })); +} + +static void send_gre_tunnel_details +(gre_tunnel_t * t, unix_shared_memory_queue_t * q) +{ + vl_api_gre_tunnel_details_t * rmp; + ip4_main_t * im = &ip4_main; + + rmp = vl_msg_api_alloc (sizeof (*rmp)); + memset (rmp, 0, sizeof (*rmp)); + rmp->_vl_msg_id = ntohs(VL_API_GRE_TUNNEL_DETAILS); + rmp->src_address = t->tunnel_src.data_u32; + rmp->dst_address = t->tunnel_dst.data_u32; + rmp->outer_table_id = htonl(im->fibs[t->outer_fib_index].table_id); + rmp->sw_if_index = htonl(t->sw_if_index); + + vl_msg_api_send_shmem (q, (u8 *)&rmp); +} + +static void vl_api_gre_tunnel_dump_t_handler +(vl_api_gre_tunnel_dump_t * mp) +{ + unix_shared_memory_queue_t * q; + gre_main_t * gm = &gre_main; + gre_tunnel_t * t; + u32 sw_if_index; + + q = vl_api_client_index_to_input_queue (mp->client_index); + if (q == 0) { + return; + } + + sw_if_index = ntohl(mp->sw_if_index); + + if (~0 == sw_if_index) { + pool_foreach (t, gm->tunnels, + ({ + send_gre_tunnel_details(t, q); + })); + } else { + if ((sw_if_index >= vec_len(gm->tunnel_index_by_sw_if_index)) || + (~0 == gm->tunnel_index_by_sw_if_index[sw_if_index])) { + return; + } + t = &gm->tunnels[gm->tunnel_index_by_sw_if_index[sw_if_index]]; + send_gre_tunnel_details(t, q); + } +} + static void vl_api_l2_patch_add_del_t_handler (vl_api_l2_patch_add_del_t *mp) { @@ -4583,7 +4780,7 @@ vl_api_lisp_add_del_local_eid_t_handler( prefp = &gid_address_ippref(&eid); ip_eid = &ip_prefix_addr(prefp); - gid_address_type (&eid) = IP_PREFIX; + gid_address_type (&eid) = GID_ADDR_IP_PREFIX; if (mp->is_ipv6) { clib_memcpy(&ip_addr_v6(ip_eid), mp->ip_address, @@ -4802,7 +4999,7 @@ send_lisp_local_eid_table_details (mapping_t *mapit, gid = &mapit->eid; type = gid_address_type(gid); - if (type != IP_PREFIX) { + if (type != GID_ADDR_IP_PREFIX) { return; } @@ -4860,7 +5057,6 @@ send_lisp_gpe_tunnel_details (lisp_gpe_tunnel_t *tunnel, { vl_api_lisp_gpe_tunnel_details_t *rmp; lisp_gpe_main_t * lgm = &lisp_gpe_main; - ip4_address_t *ip4 = NULL; rmp = vl_msg_api_alloc (sizeof (*rmp)); memset (rmp, 0, sizeof (*rmp)); @@ -4868,12 +5064,9 @@ send_lisp_gpe_tunnel_details (lisp_gpe_tunnel_t *tunnel, rmp->tunnels = tunnel - lgm->tunnels; - /*list_gpe_tunnel now support only IPv4*/ - rmp->is_ipv6 = 0; - ip4 = &tunnel->src; - clib_memcpy(rmp->source_ip, ip4, sizeof(*ip4)); - ip4 = &tunnel->dst; - clib_memcpy(rmp->destination_ip, ip4, sizeof(*ip4)); + rmp->is_ipv6 = ip_addr_version(&tunnel->src) == IP6 ? 1 : 0; + ip_address_copy_addr(rmp->source_ip, &tunnel->src); + ip_address_copy_addr(rmp->destination_ip, &tunnel->dst); rmp->encap_fib_id = htonl(tunnel->encap_fib_index); rmp->decap_fib_id = htonl(tunnel->decap_fib_index); @@ -5739,6 +5932,19 @@ vpe_api_hookup (vlib_main_t *vm) vl_api_sr_tunnel_add_del_t_print, 256, 1); + + /* + * Manually register the sr policy add del msg, so we trace + * enough bytes to capture a typical tunnel name list + */ + vl_msg_api_set_handlers (VL_API_SR_POLICY_ADD_DEL, + "sr_policy_add_del", + vl_api_sr_policy_add_del_t_handler, + vl_noop_handler, + vl_api_sr_policy_add_del_t_endian, + vl_api_sr_policy_add_del_t_print, + 256, 1); + /* * Trace space for 8 MPLS encap labels, classifier mask+match */