X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fgre%2Fgre_api.c;h=934fc661b47b208f94019695a62a8f1a5eba8210;hb=e5b94dded;hp=baccc5fa6015e2f97d08f2b352070c1d28f15b50;hpb=e86a8edd3c14fb41ace2a12efd17bc7772bf623f;p=vpp.git diff --git a/src/vnet/gre/gre_api.c b/src/vnet/gre/gre_api.c index baccc5fa601..934fc661b47 100644 --- a/src/vnet/gre/gre_api.c +++ b/src/vnet/gre/gre_api.c @@ -25,6 +25,8 @@ #include #include +#include +#include #include @@ -45,48 +47,95 @@ #include #define foreach_vpe_api_msg \ -_(GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel) \ +_(GRE_TUNNEL_ADD_DEL, gre_tunnel_add_del) \ _(GRE_TUNNEL_DUMP, gre_tunnel_dump) -static void vl_api_gre_add_del_tunnel_t_handler - (vl_api_gre_add_del_tunnel_t * mp) +static int +gre_tunnel_type_decode (vl_api_gre_tunnel_type_t in, gre_tunnel_type_t * out) { - vl_api_gre_add_del_tunnel_reply_t *rmp; - int rv = 0; - vnet_gre_add_del_tunnel_args_t _a, *a = &_a; - u32 sw_if_index = ~0; + switch (in) + { +#define _(n, v) \ + case GRE_API_TUNNEL_TYPE_##n: \ + *out = GRE_TUNNEL_TYPE_##n; \ + return (0); + foreach_gre_tunnel_type +#undef _ + } - /* Check src & dst are different */ - if ((mp->is_ipv6 && memcmp (mp->src_address, mp->dst_address, 16) == 0) || - (!mp->is_ipv6 && memcmp (mp->src_address, mp->dst_address, 4) == 0)) + return (VNET_API_ERROR_INVALID_VALUE); +} + +static vl_api_gre_tunnel_type_t +gre_tunnel_type_encode (gre_tunnel_type_t in) +{ + vl_api_gre_tunnel_type_t out = GRE_API_TUNNEL_TYPE_L3; + + switch (in) { - rv = VNET_API_ERROR_SAME_SRC_DST; - goto out; +#define _(n, v) \ + case GRE_TUNNEL_TYPE_##n: \ + out = GRE_API_TUNNEL_TYPE_##n; \ + break; + foreach_gre_tunnel_type +#undef _ } - memset (a, 0, sizeof (*a)); - a->is_add = mp->is_add; - a->teb = mp->teb; - a->is_ipv6 = mp->is_ipv6; + return (out); +} - /* ip addresses sent in network byte order */ - if (!mp->is_ipv6) +static void vl_api_gre_tunnel_add_del_t_handler + (vl_api_gre_tunnel_add_del_t * mp) +{ + vnet_gre_tunnel_add_del_args_t _a = { }, *a = &_a; + vl_api_gre_tunnel_add_del_reply_t *rmp; + tunnel_encap_decap_flags_t flags; + u32 sw_if_index = ~0; + ip46_type_t itype[2]; + int rv = 0; + + itype[0] = ip_address_decode (&mp->tunnel.src, &a->src); + itype[1] = ip_address_decode (&mp->tunnel.dst, &a->dst); + + if (itype[0] != itype[1]) { - clib_memcpy (&(a->src.ip4), mp->src_address, 4); - clib_memcpy (&(a->dst.ip4), mp->dst_address, 4); + rv = VNET_API_ERROR_INVALID_PROTOCOL; + goto out; } - else + + if (ip46_address_is_equal (&a->src, &a->dst)) { - clib_memcpy (&(a->src.ip6), mp->src_address, 16); - clib_memcpy (&(a->dst.ip6), mp->dst_address, 16); + rv = VNET_API_ERROR_SAME_SRC_DST; + goto out; } - a->outer_fib_id = ntohl (mp->outer_fib_id); - rv = vnet_gre_add_del_tunnel (a, &sw_if_index); + rv = gre_tunnel_type_decode (mp->tunnel.type, &a->type); + + if (rv) + goto out; + + rv = tunnel_mode_decode (mp->tunnel.mode, &a->mode); + + if (rv) + goto out; + + rv = tunnel_encap_decap_flags_decode (mp->tunnel.flags, &flags); + + if (rv) + goto out; + + a->is_add = mp->is_add; + a->is_ipv6 = (itype[0] == IP46_TYPE_IP6); + a->instance = ntohl (mp->tunnel.instance); + a->session_id = ntohs (mp->tunnel.session_id); + a->outer_table_id = ntohl (mp->tunnel.outer_table_id); + a->flags = flags; + + rv = vnet_gre_tunnel_add_del (a, &sw_if_index); out: /* *INDENT-OFF* */ - REPLY_MACRO2(VL_API_GRE_ADD_DEL_TUNNEL_REPLY, + REPLY_MACRO2(VL_API_GRE_TUNNEL_ADD_DEL_REPLY, ({ rmp->sw_if_index = ntohl (sw_if_index); })); @@ -94,50 +143,43 @@ out: } static void send_gre_tunnel_details - (gre_tunnel_t * t, svm_queue_t * q, u32 context) + (gre_tunnel_t * t, vl_api_registration_t * reg, u32 context) { vl_api_gre_tunnel_details_t *rmp; - u8 is_ipv6 = t->tunnel_dst.fp_proto == FIB_PROTOCOL_IP6 ? 1 : 0; - fib_table_t *ft; rmp = vl_msg_api_alloc (sizeof (*rmp)); - memset (rmp, 0, sizeof (*rmp)); - rmp->_vl_msg_id = ntohs (VL_API_GRE_TUNNEL_DETAILS); - if (!is_ipv6) - { - clib_memcpy (rmp->src_address, &(t->tunnel_src.ip4.as_u8), 4); - clib_memcpy (rmp->dst_address, &(t->tunnel_dst.fp_addr.ip4.as_u8), 4); - ft = fib_table_get (t->outer_fib_index, FIB_PROTOCOL_IP4); - rmp->outer_fib_id = ft->ft_table_id; - } - else - { - clib_memcpy (rmp->src_address, &(t->tunnel_src.ip6.as_u8), 16); - clib_memcpy (rmp->dst_address, &(t->tunnel_dst.fp_addr.ip6.as_u8), 16); - ft = fib_table_get (t->outer_fib_index, FIB_PROTOCOL_IP6); - rmp->outer_fib_id = ft->ft_table_id; - } - rmp->teb = (GRE_TUNNEL_TYPE_TEB == t->type); - rmp->sw_if_index = htonl (t->sw_if_index); + clib_memset (rmp, 0, sizeof (*rmp)); + rmp->_vl_msg_id = htons (VL_API_GRE_TUNNEL_DETAILS); + + ip_address_encode (&t->tunnel_src, IP46_TYPE_ANY, &rmp->tunnel.src); + ip_address_encode (&t->tunnel_dst.fp_addr, IP46_TYPE_ANY, &rmp->tunnel.dst); + + rmp->tunnel.outer_table_id = + htonl (fib_table_get_table_id + (t->outer_fib_index, t->tunnel_dst.fp_proto)); + + rmp->tunnel.type = gre_tunnel_type_encode (t->type); + rmp->tunnel.mode = tunnel_mode_encode (t->mode); + rmp->tunnel.instance = htonl (t->user_instance); + rmp->tunnel.sw_if_index = htonl (t->sw_if_index); + rmp->tunnel.session_id = htons (t->session_id); + rmp->context = context; - rmp->is_ipv6 = is_ipv6; - vl_msg_api_send_shmem (q, (u8 *) & rmp); + vl_api_send_msg (reg, (u8 *) rmp); } static void vl_api_gre_tunnel_dump_t_handler (vl_api_gre_tunnel_dump_t * mp) { - svm_queue_t *q; + vl_api_registration_t *reg; 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; - } + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; sw_if_index = ntohl (mp->sw_if_index); @@ -146,7 +188,7 @@ vl_api_gre_tunnel_dump_t_handler (vl_api_gre_tunnel_dump_t * mp) /* *INDENT-OFF* */ pool_foreach (t, gm->tunnels, ({ - send_gre_tunnel_details(t, q, mp->context); + send_gre_tunnel_details(t, reg, mp->context); })); /* *INDENT-ON* */ } @@ -158,14 +200,14 @@ vl_api_gre_tunnel_dump_t_handler (vl_api_gre_tunnel_dump_t * mp) return; } t = &gm->tunnels[gm->tunnel_index_by_sw_if_index[sw_if_index]]; - send_gre_tunnel_details (t, q, mp->context); + send_gre_tunnel_details (t, reg, mp->context); } } /* * gre_api_hookup * Add vpe's API message handlers to the table. - * vlib has alread mapped shared memory and + * vlib has already mapped shared memory and * added the client registration handlers. * See .../vlib-api/vlibmemory/memclnt_vlib.c:memclnt_process() */ @@ -184,7 +226,7 @@ setup_message_id_table (api_main_t * am) static clib_error_t * gre_api_hookup (vlib_main_t * vm) { - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); #define _(N,n) \ vl_msg_api_set_handlers(VL_API_##N, #n, \