diff options
Diffstat (limited to 'src/vnet')
-rw-r--r-- | src/vnet/flow/flow.h | 8 | ||||
-rw-r--r-- | src/vnet/flow/flow_cli.c | 17 |
2 files changed, 23 insertions, 2 deletions
diff --git a/src/vnet/flow/flow.h b/src/vnet/flow/flow.h index c0aa9119ce1..5def01a08ef 100644 --- a/src/vnet/flow/flow.h +++ b/src/vnet/flow/flow.h @@ -21,10 +21,15 @@ #include <vnet/l3_types.h> #include <vnet/ip/ip4_packet.h> #include <vnet/ip/ip6_packet.h> +#include <vnet/ethernet/packet.h> #define foreach_flow_type \ + /* l2 flow*/ \ + _(ETHERNET, ethernet, "ethernet") \ + /* l4 flow*/ \ _(IP4_N_TUPLE, ip4_n_tuple, "ipv4-n-tuple") \ _(IP6_N_TUPLE, ip6_n_tuple, "ipv6-n-tuple") \ + /* L4 tunnel flow*/ \ _(IP4_VXLAN, ip4_vxlan, "ipv4-vxlan") \ _(IP6_VXLAN, ip6_vxlan, "ipv6-vxlan") \ _(IP4_GTPC, ip4_gtpc, "ipv4-gtpc") \ @@ -36,6 +41,9 @@ _(IP6_GTPU_IP4, ip6_gtpu_ip4, "ipv6-gtpu-ipv4") \ _(IP6_GTPU_IP6, ip6_gtpu_ip6, "ipv6-gtpu-ipv6") +#define foreach_flow_entry_ethernet \ + _fe(ethernet_header_t, eth_hdr) + #define foreach_flow_entry_ip4_n_tuple \ _fe(ip4_address_and_mask_t, src_addr) \ _fe(ip4_address_and_mask_t, dst_addr) \ diff --git a/src/vnet/flow/flow_cli.c b/src/vnet/flow/flow_cli.c index 1c09b2b6149..500f16b883b 100644 --- a/src/vnet/flow/flow_cli.c +++ b/src/vnet/flow/flow_cli.c @@ -294,6 +294,8 @@ test_flow (vlib_main_t * vm, unformat_input_t * input, ip6_address_and_mask_t inner_ip6d = { }; ip_port_and_mask_t sport = { }; ip_port_and_mask_t dport = { }; + u16 eth_type; + bool ethernet_set = false; clib_memset (&flow, 0, sizeof (vnet_flow_t)); flow.index = ~0; @@ -312,6 +314,9 @@ test_flow (vlib_main_t * vm, unformat_input_t * input, action = FLOW_ENABLE; else if (unformat (line_input, "disable")) action = FLOW_DISABLE; + else if (unformat (line_input, "eth-type %U", + unformat_ethernet_type_host_byte_order, ð_type)) + ethernet_set = true; else if (unformat (line_input, "src-ip %U", unformat_ip4_address_and_mask, &ip4s)) outer_ip4_set = true; @@ -336,7 +341,6 @@ test_flow (vlib_main_t * vm, unformat_input_t * input, else if (unformat (line_input, "inner-ip6-dst-ip %U", unformat_ip6_address_and_mask, &inner_ip6d)) inner_ip6_set = true; - else if (unformat (line_input, "src-port %U", unformat_ip_port_and_mask, &sport)) ; @@ -390,6 +394,8 @@ test_flow (vlib_main_t * vm, unformat_input_t * input, return clib_error_return (0, "Please specify at least one action"); /* Adjust the flow type */ + if (ethernet_set == true) + outer_type = VNET_FLOW_TYPE_ETHERNET; if (outer_ip4_set == true) outer_type = VNET_FLOW_TYPE_IP4_N_TUPLE; else if (outer_ip6_set == true) @@ -402,7 +408,9 @@ test_flow (vlib_main_t * vm, unformat_input_t * input, if (outer_type == VNET_FLOW_TYPE_UNKNOWN) return clib_error_return (0, "Please specify a supported flow type"); - if (outer_type == VNET_FLOW_TYPE_IP4_N_TUPLE) + if (outer_type == VNET_FLOW_TYPE_ETHERNET) + type = VNET_FLOW_TYPE_ETHERNET; + else if (outer_type == VNET_FLOW_TYPE_IP4_N_TUPLE) { type = VNET_FLOW_TYPE_IP4_N_TUPLE; @@ -450,6 +458,11 @@ test_flow (vlib_main_t * vm, unformat_input_t * input, //assign specific field values per flow type switch (type) { + case VNET_FLOW_TYPE_ETHERNET: + memset (&flow.ethernet, 0, sizeof (flow.ethernet)); + flow.ethernet.eth_hdr.type = eth_type; + break; + case VNET_FLOW_TYPE_IP4_N_TUPLE: case VNET_FLOW_TYPE_IP4_GTPC: case VNET_FLOW_TYPE_IP4_GTPU: |