aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-plugin/src/punt.c
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-plugin/src/punt.c')
-rw-r--r--hicn-plugin/src/punt.c142
1 files changed, 83 insertions, 59 deletions
diff --git a/hicn-plugin/src/punt.c b/hicn-plugin/src/punt.c
index ea553bf76..68c0bafb9 100644
--- a/hicn-plugin/src/punt.c
+++ b/hicn-plugin/src/punt.c
@@ -89,11 +89,11 @@ ip_version_t ipv66 = {
.ip_version = 0x60,
};
-#define _(NAME, BASE, LAYER, FIELD, PUNT_ID) \
- field_t NAME = { \
- .offset = BASE + offsetof(LAYER, FIELD), \
- .len = STRUCT_SIZE_OF(LAYER, FIELD), \
- .punt_id = PUNT_ID, \
+#define _(NAME, BASE, LAYER, FIELD, PUNT_ID) \
+ field_t NAME = { \
+ .offset = BASE + offsetof(LAYER, FIELD), \
+ .len = STRUCT_SIZE_OF(LAYER, FIELD), \
+ .punt_id = PUNT_ID, \
};
foreach_field
#undef _
@@ -108,7 +108,6 @@ foreach_field
#define NEXT_MAPME_ACK4 hicn_punt_glb.next_hit_data_ipv4
#define NEXT_MAPME_CTRL6 hicn_punt_glb.next_hit_interest_ipv6
#define NEXT_MAPME_ACK6 hicn_punt_glb.next_hit_data_ipv6
-
/* Maximum number of vector allowed in match. Value hardcoded in vnet_classify_hash_packet_inline in vnet_classify.h */
#define MAX_MATCH_SIZE 5
/**
@@ -117,7 +116,7 @@ foreach_field
*
*
*/
-hicn_punt_glb_t hicn_punt_glb;
+ hicn_punt_glb_t hicn_punt_glb;
/**
* We use the function build_bit_array to populate an initially empty buffer
@@ -371,28 +370,29 @@ hicn_punt_add_del_vnettbl (ip_version_t * ip, field_t * field, u8 mask,
int
hicn_punt_add_del_vnettbl_udp (ip_version_t * outer, ip_version_t * inner,
field_t * field, u8 mask, u32 next_tbl_index,
- u32 intfc, u8 base_offset, int is_add)
+ u32 intfc, u8 base_offset, u8 use_current_data,
+ int is_add)
{
u8 udp_mask[inner->addr_len_bits];
build_ip_address_mask (mask, udp_mask, sizeof (udp_mask));
u16 port_value = 0xffff;
u8 protocol_value = 0xff;
-
+
return _hicn_punt_add_del_vnettbl (outer, field->punt_id, mask,
next_tbl_index, intfc, base_offset,
is_add,
- HICN_CLASSIFY_NO_CURRENT_DATA_FLAG,
+ use_current_data,
outer->protocol_field, &protocol_value,
outer->udp_sport, &port_value,
outer->udp_dport, &port_value, field,
udp_mask, NULL);
}
-#define hicn_punt_add_vnettbl_udp(outer, inner, field, mask, next_tbl_index, intfc, base_offset) \
- (hicn_punt_add_del_vnettbl_udp(outer, inner, field, mask, next_tbl_index, intfc, base_offset, OP_ADD))
+#define hicn_punt_add_vnettbl_udp(outer, inner, field, mask, next_tbl_index, intfc, base_offset, use_current_data) \
+ (hicn_punt_add_del_vnettbl_udp(outer, inner, field, mask, next_tbl_index, intfc, base_offset, use_current_data, OP_ADD))
-#define hicn_punt_del_vnettbl_udp(outer, inner, field, mask, next_tbl_index, intfc, base_offset) \
- (hicn_punt_add_del_vnettbl_udp(outer, inner, field, mask, next_tbl_index, intfc, base_offset, OP_DEL))
+#define hicn_punt_del_vnettbl_udp(outer, inner, field, mask, next_tbl_index, intfc, base_offset, use_current_data) \
+ (hicn_punt_add_del_vnettbl_udp(outer, inner, field, mask, next_tbl_index, intfc, base_offset, use_current_data, OP_DEL))
/**
* @brief Add or remove a vnet session matching the list of fields/values passed
@@ -481,7 +481,7 @@ hicn_punt_add_del_vnetssn_udp (ip_version_t * outer, ip_version_t * inner,
u8 mask, u32 next_hit_index, u32 intfc,
u8 base_offset, u8 protocol, u16 sport,
u16 dport, int is_add)
-{
+{
return _hicn_punt_add_del_vnetssn (outer, field->punt_id, mask,
next_hit_index, intfc, base_offset,
is_add, outer->protocol_field, &protocol,
@@ -520,7 +520,7 @@ hicn_punt_enable_disable_vnet_ip4_table_on_intf (vlib_main_t * vm,
int
hicn_punt_remove_ip4_address (vlib_main_t * vm, ip4_address_t * addr,
u8 mask, int skip, u32 sw_if_index,
- int is_enable)
+ int is_enable, u8 with_l2)
{
vnet_classify_main_t *cm = &vnet_classify_main;
@@ -528,7 +528,7 @@ hicn_punt_remove_ip4_address (vlib_main_t * vm, ip4_address_t * addr,
u32 table_index = ~0;
- u32 base_offset = (skip ? ETH_L2 : NO_L2);
+ u32 base_offset = (with_l2 ? ETH_L2 : NO_L2);
ip46_address_t addr46;
ip46_address_set_ip4 (&addr46, addr);
@@ -562,7 +562,7 @@ hicn_punt_remove_ip4_address (vlib_main_t * vm, ip4_address_t * addr,
int
hicn_punt_remove_ip6_address (vlib_main_t * vm, ip6_address_t * addr,
u8 mask, int skip, u32 sw_if_index,
- int is_enable)
+ int is_enable, u8 with_l2)
{
vnet_classify_main_t *cm = &vnet_classify_main;
@@ -570,7 +570,7 @@ hicn_punt_remove_ip6_address (vlib_main_t * vm, ip6_address_t * addr,
u32 table_index = ~0;
- u32 base_offset = (skip ? ETH_L2 : NO_L2);
+ u32 base_offset = (with_l2 ? ETH_L2 : NO_L2);
hicn_punt_del_vnetssn (&ipv6, &ipv6_src, (ip46_address_t *) addr, mask,
hicn_punt_glb.next_hit_data_ipv6, sw_if_index,
@@ -763,10 +763,16 @@ hicn_punt_init (vlib_main_t * vm)
u32
hicn_punt_interest_data_for_udp (vlib_main_t * vm,
ip46_address_t * prefix, u8 mask,
- u32 swif, u8 punt_type, u16 sport, u16 dport)
+ u32 swif, u8 punt_type, u16 sport, u16 dport,
+ u8 with_l2)
{
int skip = 1;
u32 table_index;
+ // If we want l2 then we punt from data (and not current)
+ u8 use_current_data =
+ with_l2 ? HICN_CLASSIFY_NO_CURRENT_DATA_FLAG :
+ HICN_CLASSIFY_CURRENT_DATA_FLAG;
+ u8 base_offset = with_l2 ? ETH_L2 : NO_L2;
if (punt_type != HICN_PUNT_IP_TYPE && punt_type != HICN_PUNT_UDP4_TYPE
&& punt_type != HICN_PUNT_UDP6_TYPE)
@@ -779,16 +785,18 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
if (punt_type == HICN_PUNT_UDP4_TYPE)
{
- skip = 2;
+ //If we consider ethernet we can skip 32 bytes, otherwise only 16
+ skip = 1 + with_l2;
/* Create Vnet table for a given mask */
hicn_punt_add_vnettbl_udp (&ipv44, &ipv4, &udp44_src, mask, ~0,
- swif, ETH_L2);
+ swif, base_offset, use_current_data);
table_index =
hicn_punt_glb.udp44_vnet_tbl_idx[swif][skip][HICN_PUNT_SRC][mask];
hicn_punt_add_vnettbl_udp (&ipv44, &ipv4, &udp44_dst, mask,
- table_index, swif, ETH_L2);
+ table_index, swif, base_offset,
+ use_current_data);
/*
* Add a session for the specified ip address and
* subnet mask
@@ -796,28 +804,32 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
hicn_punt_add_vnetssn_udp (&ipv44, &ipv4, &udp44_src,
prefix, mask,
hicn_punt_glb.next_hit_data_udp4,
- swif, ETH_L2, IPPROTO_UDP, sport, dport);
+ swif, base_offset, IPPROTO_UDP, sport,
+ dport);
hicn_punt_add_vnetssn_udp (&ipv44, &ipv4, &udp44_dst,
prefix, mask,
hicn_punt_glb.next_hit_interest_udp4,
- swif, ETH_L2, IPPROTO_UDP, sport, dport);
+ swif, base_offset, IPPROTO_UDP, sport,
+ dport);
hicn_punt_enable_disable_vnet_ip4_table_on_intf (vm, swif,
OP_ENABLE);
}
else //PUNTING is UDP6
{
- skip = 3;
+ //If we consider ethernet we can skip 48 bytes, otherwise only 32
+ skip = 2 + with_l2;
/* Create Vnet table for a given mask */
hicn_punt_add_vnettbl_udp (&ipv64, &ipv6, &udp64_src, mask, ~0,
- swif, ETH_L2);
+ swif, base_offset, use_current_data);
table_index =
hicn_punt_glb.udp64_vnet_tbl_idx[swif][skip][HICN_PUNT_SRC][mask];
hicn_punt_add_vnettbl_udp (&ipv64, &ipv6, &udp64_dst, mask,
- table_index, swif, ETH_L2);
+ table_index, swif, base_offset,
+ use_current_data);
/*
* Add a session for the specified ip address and
@@ -826,12 +838,14 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
hicn_punt_add_vnetssn_udp (&ipv64, &ipv4, &udp64_src,
prefix, mask,
hicn_punt_glb.next_hit_data_udp6,
- swif, ETH_L2, IPPROTO_UDP, sport, dport);
+ swif, base_offset, IPPROTO_UDP, sport,
+ dport);
hicn_punt_add_vnetssn_udp (&ipv64, &ipv4, &udp64_dst,
prefix, mask,
hicn_punt_glb.next_hit_interest_udp6,
- swif, ETH_L2, IPPROTO_UDP, sport, dport);
+ swif, base_offset, IPPROTO_UDP, sport,
+ dport);
hicn_punt_enable_disable_vnet_ip6_table_on_intf (vm, swif,
OP_ENABLE);
@@ -841,18 +855,20 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
{
if (punt_type == HICN_PUNT_UDP4_TYPE)
{
- skip = 2;
+ //If we consider ethernet we can skip 32 bytes, otherwise only 16
+ skip = 1 + with_l2;
/* Create Vnet table for a given mask */
if (mask > 96)
return HICN_ERROR_PUNT_INVAL;
hicn_punt_add_vnettbl_udp (&ipv46, &ipv4, &udp46_src, mask, ~0,
- swif, ETH_L2);
+ swif, base_offset, use_current_data);
table_index =
hicn_punt_glb.udp46_vnet_tbl_idx[swif][skip][HICN_PUNT_SRC][mask];
hicn_punt_add_vnettbl_udp (&ipv46, &ipv4, &udp46_dst, mask,
- table_index, swif, ETH_L2);
+ table_index, swif, base_offset,
+ use_current_data);
/*
* Add a session for the specified ip address and
@@ -861,11 +877,12 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
hicn_punt_add_vnetssn_udp (&ipv46, &ipv4, &udp46_src,
prefix, mask,
hicn_punt_glb.next_hit_data_udp4,
- swif, ETH_L2, IPPROTO_UDP, sport, dport);
- hicn_punt_add_vnetssn_udp (&ipv46, &ipv4, &udp46_dst,
- prefix, mask,
+ swif, base_offset, IPPROTO_UDP, sport,
+ dport);
+ hicn_punt_add_vnetssn_udp (&ipv46, &ipv4, &udp46_dst, prefix, mask,
hicn_punt_glb.next_hit_interest_udp4,
- swif, ETH_L2, IPPROTO_UDP, sport, dport);
+ swif, base_offset, IPPROTO_UDP, sport,
+ dport);
hicn_punt_enable_disable_vnet_ip4_table_on_intf (vm, swif,
OP_ENABLE);
@@ -874,15 +891,17 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
{
if (mask > 122)
return HICN_ERROR_PUNT_INVAL;
-
- skip = 3;
+
+ //If we consider ethernet we can skip 48 bytes, otherwise only 32
+ skip = 2 + with_l2;
hicn_punt_add_vnettbl_udp (&ipv66, &ipv6, &udp66_src, mask, ~0,
- swif, ETH_L2);
+ swif, base_offset, use_current_data);
table_index =
hicn_punt_glb.udp66_vnet_tbl_idx[swif][skip][HICN_PUNT_SRC][mask];
hicn_punt_add_vnettbl_udp (&ipv66, &ipv6, &udp66_dst, mask,
- table_index, swif, ETH_L2);
+ table_index, swif, base_offset,
+ use_current_data);
/*
* Add a session for the specified ip address and
@@ -891,11 +910,12 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
hicn_punt_add_vnetssn_udp (&ipv66, &ipv6, &udp66_src,
prefix, mask,
hicn_punt_glb.next_hit_data_udp6,
- swif, ETH_L2, IPPROTO_UDP, sport, dport);
- hicn_punt_add_vnetssn_udp (&ipv66, &ipv6, &udp66_dst,
- prefix, mask,
+ swif, base_offset, IPPROTO_UDP, sport,
+ dport);
+ hicn_punt_add_vnetssn_udp (&ipv66, &ipv6, &udp66_dst, prefix, mask,
hicn_punt_glb.next_hit_interest_udp6,
- swif, ETH_L2, IPPROTO_UDP, sport, dport);
+ swif, base_offset, IPPROTO_UDP, sport,
+ dport);
hicn_punt_enable_disable_vnet_ip6_table_on_intf (vm, swif,
OP_ENABLE);
@@ -908,13 +928,17 @@ hicn_punt_interest_data_for_udp (vlib_main_t * vm,
u32
-hicn_punt_interest_data_for_ethernet (vlib_main_t * vm,
- ip46_address_t * prefix, u8 mask,
- u32 swif, u8 punt_type)
+hicn_punt_interest_data_for_ip (vlib_main_t * vm,
+ ip46_address_t * prefix, u8 mask,
+ u32 swif, u8 punt_type, u8 with_l2)
{
int skip = 1;
u32 table_index;
- u8 use_current_data = HICN_CLASSIFY_NO_CURRENT_DATA_FLAG;
+ // If we want l2 then we punt from data (and not current)
+ u8 use_current_data =
+ with_l2 ? HICN_CLASSIFY_NO_CURRENT_DATA_FLAG :
+ HICN_CLASSIFY_CURRENT_DATA_FLAG;
+ u8 base_offset = with_l2 ? ETH_L2 : NO_L2;
if (punt_type != HICN_PUNT_IP_TYPE && punt_type != HICN_PUNT_UDP4_TYPE
&& punt_type != HICN_PUNT_UDP6_TYPE)
@@ -928,14 +952,14 @@ hicn_punt_interest_data_for_ethernet (vlib_main_t * vm,
if (punt_type == HICN_PUNT_IP_TYPE)
{
/* Create Vnet table for a given mask */
- hicn_punt_add_vnettbl (&ipv4, &ipv4_src, mask, ~0, swif, ETH_L2,
- use_current_data);
+ hicn_punt_add_vnettbl (&ipv4, &ipv4_src, mask, ~0, swif,
+ base_offset, use_current_data);
table_index =
hicn_punt_glb.ip4_vnet_tbl_idx[swif][skip][HICN_PUNT_SRC][mask];
hicn_punt_add_vnettbl (&ipv4, &ipv4_dst, mask, table_index, swif,
- ETH_L2, use_current_data);
+ base_offset, use_current_data);
/*
* Add a session for the specified ip address and
@@ -944,11 +968,11 @@ hicn_punt_interest_data_for_ethernet (vlib_main_t * vm,
hicn_punt_add_vnetssn (&ipv4, &ipv4_src,
prefix, mask,
hicn_punt_glb.next_hit_data_ipv4, swif,
- ETH_L2);
+ base_offset);
hicn_punt_add_vnetssn (&ipv4, &ipv4_dst,
prefix, mask,
hicn_punt_glb.next_hit_interest_ipv4, swif,
- ETH_L2);
+ base_offset);
hicn_punt_enable_disable_vnet_ip4_table_on_intf (vm, swif,
OP_ENABLE);
@@ -966,14 +990,14 @@ hicn_punt_interest_data_for_ethernet (vlib_main_t * vm,
return HICN_ERROR_PUNT_INVAL;
/* Create Vnet table for a given mask */
- hicn_punt_add_vnettbl (&ipv6, &ipv6_src, mask, ~0, swif, ETH_L2,
- use_current_data);
+ hicn_punt_add_vnettbl (&ipv6, &ipv6_src, mask, ~0, swif,
+ base_offset, use_current_data);
table_index =
hicn_punt_glb.ip6_vnet_tbl_idx[swif][skip][HICN_PUNT_SRC][mask];
hicn_punt_add_vnettbl (&ipv6, &ipv6_dst, mask, table_index, swif,
- ETH_L2, use_current_data);
+ base_offset, use_current_data);
/*
* Add a session for the specified ip address and
@@ -981,10 +1005,10 @@ hicn_punt_interest_data_for_ethernet (vlib_main_t * vm,
*/
hicn_punt_add_vnetssn (&ipv6, &ipv6_src, prefix,
mask, hicn_punt_glb.next_hit_data_ipv6, swif,
- ETH_L2);
+ base_offset);
hicn_punt_add_vnetssn (&ipv6, &ipv6_dst, prefix,
mask, hicn_punt_glb.next_hit_interest_ipv6,
- swif, ETH_L2);
+ swif, base_offset);
hicn_punt_enable_disable_vnet_ip6_table_on_intf (vm, swif,
OP_ENABLE);