diff options
author | Klement Sekera <ksekera@cisco.com> | 2019-06-25 11:19:22 +0000 |
---|---|---|
committer | Ole Trøan <otroan@employees.org> | 2019-09-26 14:12:07 +0000 |
commit | de34c35fc73226943538149fae9dbc5cfbdc6e75 (patch) | |
tree | ab354210305403bc29a3effc7c002f947422cb9f /src/vnet/ip/ip_api.c | |
parent | 33538a15087eea7c994b6f3d8a952c4b6ea98ee4 (diff) |
ip: add shallow virtual reassembly functionality
Type: feature
Change-Id: Ibc8334e26c7e6f6120696c3e313b6e11d73dab99
Signed-off-by: Klement Sekera <ksekera@cisco.com>
Diffstat (limited to 'src/vnet/ip/ip_api.c')
-rw-r--r-- | src/vnet/ip/ip_api.c | 134 |
1 files changed, 101 insertions, 33 deletions
diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c index 3e04b9f740c..dd1d1dcaf6c 100644 --- a/src/vnet/ip/ip_api.c +++ b/src/vnet/ip/ip_api.c @@ -43,7 +43,9 @@ #include <vnet/fib/ip6_fib.h> #include <vnet/fib/fib_path_list.h> #include <vnet/ip/ip6_hop_by_hop.h> +#include <vnet/ip/reass/ip4_sv_reass.h> #include <vnet/ip/reass/ip4_full_reass.h> +#include <vnet/ip/reass/ip6_sv_reass.h> #include <vnet/ip/reass/ip6_full_reass.h> #include <vnet/ethernet/arp.h> #include <vnet/ip/ip_types_api.h> @@ -2736,23 +2738,51 @@ 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_full_reass_set (clib_net_to_host_u32 (mp->timeout_ms), - clib_net_to_host_u32 (mp->max_reassemblies), - clib_net_to_host_u32 - (mp->max_reassembly_length), - clib_net_to_host_u32 - (mp->expire_walk_interval_ms)); - } - else + switch ((vl_api_ip_reass_type_t) clib_net_to_host_u32 (mp->type)) { - rv = ip4_full_reass_set (clib_net_to_host_u32 (mp->timeout_ms), - clib_net_to_host_u32 (mp->max_reassemblies), - clib_net_to_host_u32 - (mp->max_reassembly_length), - clib_net_to_host_u32 - (mp->expire_walk_interval_ms)); + case IP_REASS_TYPE_FULL: + if (mp->is_ip6) + { + rv = ip6_full_reass_set (clib_net_to_host_u32 (mp->timeout_ms), + clib_net_to_host_u32 + (mp->max_reassemblies), + clib_net_to_host_u32 + (mp->max_reassembly_length), + clib_net_to_host_u32 + (mp->expire_walk_interval_ms)); + } + else + { + rv = ip4_full_reass_set (clib_net_to_host_u32 (mp->timeout_ms), + clib_net_to_host_u32 + (mp->max_reassemblies), + clib_net_to_host_u32 + (mp->max_reassembly_length), + clib_net_to_host_u32 + (mp->expire_walk_interval_ms)); + } + break; + case IP_REASS_TYPE_SHALLOW_VIRTUAL: + if (mp->is_ip6) + { + rv = + ip6_sv_reass_set (clib_net_to_host_u32 (mp->timeout_ms), + clib_net_to_host_u32 (mp->max_reassemblies), + clib_net_to_host_u32 + (mp->max_reassembly_length), + clib_net_to_host_u32 + (mp->expire_walk_interval_ms)); + } + else + { + rv = ip4_sv_reass_set (clib_net_to_host_u32 (mp->timeout_ms), + clib_net_to_host_u32 (mp->max_reassemblies), + clib_net_to_host_u32 + (mp->max_reassembly_length), + clib_net_to_host_u32 + (mp->expire_walk_interval_ms)); + } + break; } REPLY_MACRO (VL_API_IP_REASSEMBLY_SET_REPLY); @@ -2772,19 +2802,42 @@ vl_api_ip_reassembly_get_t_handler (vl_api_ip_reassembly_get_t * mp) rmp->_vl_msg_id = ntohs (VL_API_IP_REASSEMBLY_GET_REPLY); rmp->context = mp->context; rmp->retval = 0; - if (mp->is_ip6) + u32 timeout_ms; + u32 max_reassemblies; + u32 max_reassembly_length; + u32 expire_walk_interval_ms; + switch ((vl_api_ip_reass_type_t) clib_net_to_host_u32 (mp->type)) { - rmp->is_ip6 = 1; - ip6_full_reass_get (&rmp->timeout_ms, &rmp->max_reassemblies, - &rmp->max_reassembly_length, - &rmp->expire_walk_interval_ms); - } - else - { - rmp->is_ip6 = 0; - ip4_full_reass_get (&rmp->timeout_ms, &rmp->max_reassemblies, - &rmp->max_reassembly_length, - &rmp->expire_walk_interval_ms); + case IP_REASS_TYPE_FULL: + if (mp->is_ip6) + { + rmp->is_ip6 = 1; + ip6_full_reass_get (&timeout_ms, &max_reassemblies, + &max_reassembly_length, + &expire_walk_interval_ms); + } + else + { + rmp->is_ip6 = 0; + ip4_full_reass_get (&timeout_ms, &max_reassemblies, + &max_reassembly_length, + &expire_walk_interval_ms); + } + break; + case IP_REASS_TYPE_SHALLOW_VIRTUAL: + if (mp->is_ip6) + { + rmp->is_ip6 = 1; + ip6_sv_reass_get (&timeout_ms, &max_reassemblies, + &max_reassembly_length, &expire_walk_interval_ms); + } + else + { + rmp->is_ip6 = 0; + ip4_sv_reass_get (&timeout_ms, &max_reassemblies, + &max_reassembly_length, &expire_walk_interval_ms); + } + break; } rmp->timeout_ms = clib_host_to_net_u32 (rmp->timeout_ms); rmp->max_reassemblies = clib_host_to_net_u32 (rmp->max_reassemblies); @@ -2799,13 +2852,28 @@ void { vl_api_ip_reassembly_enable_disable_reply_t *rmp; int rv = 0; - rv = ip4_full_reass_enable_disable (clib_net_to_host_u32 (mp->sw_if_index), - mp->enable_ip4); - if (0 == rv) + switch ((vl_api_ip_reass_type_t) clib_net_to_host_u32 (mp->type)) { + case IP_REASS_TYPE_FULL: rv = - ip6_full_reass_enable_disable (clib_net_to_host_u32 (mp->sw_if_index), - mp->enable_ip6); + ip4_full_reass_enable_disable (clib_net_to_host_u32 (mp->sw_if_index), + mp->enable_ip4); + if (0 == rv) + rv = + ip6_full_reass_enable_disable (clib_net_to_host_u32 + (mp->sw_if_index), mp->enable_ip6); + break; + case IP_REASS_TYPE_SHALLOW_VIRTUAL: + rv = + ip4_sv_reass_enable_disable (clib_net_to_host_u32 (mp->sw_if_index), + mp->enable_ip4); + if (0 == rv) + { + rv = + ip6_sv_reass_enable_disable (clib_net_to_host_u32 + (mp->sw_if_index), mp->enable_ip6); + } + break; } REPLY_MACRO (VL_API_IP_REASSEMBLY_ENABLE_DISABLE_REPLY); |