[dpdk-dev] [RFC 2/3] testpmd: add an example to show packet filter flow
Rahul Lakkireddy
rahul.lakkireddy at chelsio.com
Thu Dec 10 15:01:03 CET 2015
Extend the existing flow_director_filter to add support for packet
filter flow. Also shows how to pass the extra behavior arguments
to rewrite fields in matched filter rules.
Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy at chelsio.com>
Signed-off-by: Kumar Sanghvi <kumaras at chelsio.com>
---
app/test-pmd/cmdline.c | 435 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 427 insertions(+), 8 deletions(-)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 73298c9..488eddc 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -641,7 +641,7 @@ static void cmd_help_long_parsed(void *parsed_result,
" flow (ipv4-other|ipv4-frag|ipv6-other|ipv6-frag)"
" src (src_ip_address) dst (dst_ip_address)"
" vlan (vlan_value) flexbytes (flexbytes_value)"
- " (drop|fwd) pf|vf(vf_id) queue (queue_id)"
+ " (drop|fwd|switch) pf|vf(vf_id) queue (queue_id)"
" fd_id (fd_id_value)\n"
" Add/Del an IP type flow director filter.\n\n"
@@ -650,7 +650,7 @@ static void cmd_help_long_parsed(void *parsed_result,
" src (src_ip_address) (src_port)"
" dst (dst_ip_address) (dst_port)"
" vlan (vlan_value) flexbytes (flexbytes_value)"
- " (drop|fwd) pf|vf(vf_id) queue (queue_id)"
+ " (drop|fwd|switch) pf|vf(vf_id) queue (queue_id)"
" fd_id (fd_id_value)\n"
" Add/Del an UDP/TCP type flow director filter.\n\n"
@@ -659,16 +659,37 @@ static void cmd_help_long_parsed(void *parsed_result,
" src (src_ip_address) (src_port)"
" dst (dst_ip_address) (dst_port)"
" tag (verification_tag) vlan (vlan_value)"
- " flexbytes (flexbytes_value) (drop|fwd)"
+ " flexbytes (flexbytes_value) (drop|fwd|switch)"
" pf|vf(vf_id) queue (queue_id) fd_id (fd_id_value)\n"
" Add/Del a SCTP type flow director filter.\n\n"
"flow_director_filter (port_id) mode IP (add|del|update)"
" flow l2_payload ether (ethertype)"
- " flexbytes (flexbytes_value) (drop|fwd)"
+ " flexbytes (flexbytes_value) (drop|fwd|switch)"
" pf|vf(vf_id) queue (queue_id) fd_id (fd_id_value)\n"
" Add/Del a l2 payload type flow director filter.\n\n"
+ "flow_director_filter (port_id) mode IP (add|del|update)"
+ " flow (ipv4-tcp-pkt-filter|ipv4-udp-pkt-filter|"
+ " ipv6-tcp-pkt-filter|ipv6-udp-pkt-filter)"
+ " ingress-port (port_id) (port_id_mask)"
+ " ether (ethertype) (ethertype_mask)"
+ " inner-vlan (inner_vlan_value) (inner_vlan_mask)"
+ " outer-vlan (outer_vlan_value) (outer_vlan_mask)"
+ " tos (tos_value) (tos_mask)"
+ " proto (proto_value) (proto_mask)"
+ " src (src_ip) (src_ip_mask) (src_port) (src_port_mask)"
+ " dst (dst_ip) (dst_ip_mask) (dst_port) (dst_port_mask)"
+ " flexbytes (flexbytes_value) (drop|fwd|switch)"
+ " pf|vf(vf_id) queue (queue_id)"
+ " port-arg none|port-redirect (dst-port-id)"
+ " mac-arg none|mac-rewrite (src-mac) (dst-mac)"
+ " vlan-arg none|vlan-rewrite|vlan-del (vlan_value)"
+ " nat-arg none|nat-rewrite"
+ " src (src_ip) (src_port) dst (dst_ip) (dst_port)"
+ " fd_id (fd_id_value)\n"
+ " Add/Del a packet filter type flow director filter.\n\n"
+
"flow_director_filter (port_id) mode MAC-VLAN (add|del|update)"
" mac (mac_address) vlan (vlan_value)"
" flexbytes (flexbytes_value) (drop|fwd)"
@@ -7973,14 +7994,34 @@ struct cmd_flow_director_result {
cmdline_fixed_string_t ops;
cmdline_fixed_string_t flow;
cmdline_fixed_string_t flow_type;
+ cmdline_fixed_string_t iport;
+ uint8_t iport_id;
+ uint8_t iport_id_mask;
cmdline_fixed_string_t ether;
uint16_t ether_type;
+ uint16_t ether_type_mask;
+ cmdline_fixed_string_t ivlan;
+ uint16_t ivlan_value;
+ uint16_t ivlan_mask;
+ cmdline_fixed_string_t ovlan;
+ uint16_t ovlan_value;
+ uint16_t ovlan_mask;
+ cmdline_fixed_string_t tos;
+ uint8_t tos_value;
+ uint8_t tos_mask;
+ cmdline_fixed_string_t proto;
+ uint8_t proto_value;
+ uint8_t proto_mask;
cmdline_fixed_string_t src;
cmdline_ipaddr_t ip_src;
+ cmdline_ipaddr_t ip_src_mask;
uint16_t port_src;
+ uint16_t port_src_mask;
cmdline_fixed_string_t dst;
cmdline_ipaddr_t ip_dst;
+ cmdline_ipaddr_t ip_dst_mask;
uint16_t port_dst;
+ uint16_t port_dst_mask;
cmdline_fixed_string_t verify_tag;
uint32_t verify_tag_value;
cmdline_fixed_string_t vlan;
@@ -7999,6 +8040,26 @@ struct cmd_flow_director_result {
cmdline_fixed_string_t tunnel_type;
cmdline_fixed_string_t tunnel_id;
uint32_t tunnel_id_value;
+
+ /* Extra arguments for behavior taken */
+ cmdline_fixed_string_t port_arg;
+ cmdline_fixed_string_t port_arg_op;
+ uint8_t port_arg_port_id;
+ cmdline_fixed_string_t mac_arg;
+ cmdline_fixed_string_t mac_arg_op;
+ struct ether_addr mac_arg_src_mac;
+ struct ether_addr mac_arg_dst_mac;
+ cmdline_fixed_string_t vlan_arg;
+ cmdline_fixed_string_t vlan_arg_op;
+ uint16_t vlan_arg_vlan;
+ cmdline_fixed_string_t nat_arg;
+ cmdline_fixed_string_t nat_arg_op;
+ cmdline_fixed_string_t nat_arg_src;
+ cmdline_ipaddr_t nat_arg_ip_src;
+ uint16_t nat_arg_port_src;
+ cmdline_fixed_string_t nat_arg_dst;
+ cmdline_ipaddr_t nat_arg_ip_dst;
+ uint16_t nat_arg_port_dst;
};
static inline int
@@ -8061,6 +8122,10 @@ str2flowtype(char *string)
{"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP},
{"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER},
{"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD},
+ {"ipv4-tcp-pkt-filter", RTE_ETH_FLOW_PKT_FILTER_IPV4_TCP},
+ {"ipv4-udp-pkt-filter", RTE_ETH_FLOW_PKT_FILTER_IPV4_UDP},
+ {"ipv6-tcp-pkt-filter", RTE_ETH_FLOW_PKT_FILTER_IPV6_TCP},
+ {"ipv6-udp-pkt-filter", RTE_ETH_FLOW_PKT_FILTER_IPV6_UDP},
};
for (i = 0; i < RTE_DIM(flowtype_str); i++) {
@@ -8090,6 +8155,30 @@ str2fdir_tunneltype(char *string)
return RTE_FDIR_TUNNEL_TYPE_UNKNOWN;
}
+static uint16_t
+str2fdir_behavior_sub_op(char *string)
+{
+ uint16_t i = 0;
+
+ static const struct {
+ char str[32];
+ enum rte_eth_fdir_behavior_sub_op op;
+ } behavior_sub_op_str[] = {
+ {"port-redirect", RTE_FDIR_BEHAVIOR_SUB_OP_INSERT},
+ {"mac-rewrite", RTE_FDIR_BEHAVIOR_SUB_OP_INSERT},
+ {"vlan-rewrite", RTE_FDIR_BEHAVIOR_SUB_OP_INSERT},
+ {"vlan-del", RTE_FDIR_BEHAVIOR_SUB_OP_DELETE},
+ {"nat-rewrite", RTE_FDIR_BEHAVIOR_SUB_OP_INSERT},
+ };
+
+ for (i = 0; i < RTE_DIM(behavior_sub_op_str); i++) {
+ if (!strcmp(behavior_sub_op_str[i].str, string))
+ return behavior_sub_op_str[i].op;
+ }
+
+ return RTE_FDIR_BEHAVIOR_SUB_OP_UNKNOWN;
+}
+
#define IPV4_ADDR_TO_UINT(ip_addr, ip) \
do { \
if ((ip_addr).family == AF_INET) \
@@ -8119,6 +8208,7 @@ cmd_flow_director_filter_parsed(void *parsed_result,
{
struct cmd_flow_director_result *res = parsed_result;
struct rte_eth_fdir_filter entry;
+ struct rte_eth_pkt_filter_flow *pflow;
uint8_t flexbytes[RTE_ETH_FDIR_MAX_FLEXLEN];
char *end;
unsigned long vf_id;
@@ -8218,6 +8308,89 @@ cmd_flow_director_filter_parsed(void *parsed_result,
entry.input.flow.l2_flow.ether_type =
rte_cpu_to_be_16(res->ether_type);
break;
+ case RTE_ETH_FLOW_PKT_FILTER_IPV4_TCP:
+ case RTE_ETH_FLOW_PKT_FILTER_IPV4_UDP:
+ pflow = &entry.input.flow.pkt_filter_flow;
+
+ pflow->pkt.port_id = res->iport_id;
+ pflow->mask.port_id = res->iport_id_mask;
+
+ pflow->pkt.l2_flow.ether_type =
+ rte_cpu_to_be_16(res->ether_type);
+ pflow->mask.l2_flow.ether_type =
+ rte_cpu_to_be_16(res->ether_type_mask);
+
+ pflow->pkt.vlan_flow.inner_vlan =
+ rte_cpu_to_be_16(res->ivlan_value);
+ pflow->pkt.vlan_flow.outer_vlan = res->ovlan_value;
+ rte_cpu_to_be_16(res->ovlan_value);
+ pflow->mask.vlan_flow.inner_vlan = res->ivlan_mask;
+ rte_cpu_to_be_16(res->ivlan_mask);
+ pflow->mask.vlan_flow.outer_vlan = res->ovlan_mask;
+ rte_cpu_to_be_16(res->ovlan_mask);
+
+ pflow->pkt.ntuple_flow.tcp4.ip.tos = res->tos_value;
+ pflow->pkt.ntuple_flow.tcp4.ip.proto = res->proto_value;
+ pflow->mask.ntuple_flow.tcp4.ip.tos = res->tos_mask;
+ pflow->mask.ntuple_flow.tcp4.ip.proto = res->proto_mask;
+
+ IPV4_ADDR_TO_UINT(res->ip_src,
+ pflow->pkt.ntuple_flow.tcp4.ip.src_ip);
+ IPV4_ADDR_TO_UINT(res->ip_dst,
+ pflow->pkt.ntuple_flow.tcp4.ip.dst_ip);
+ IPV4_ADDR_TO_UINT(res->ip_src_mask,
+ pflow->mask.ntuple_flow.tcp4.ip.src_ip);
+ IPV4_ADDR_TO_UINT(res->ip_dst_mask,
+ pflow->mask.ntuple_flow.tcp4.ip.dst_ip);
+
+ pflow->pkt.ntuple_flow.tcp4.src_port =
+ rte_cpu_to_be_16(res->port_src);
+ pflow->pkt.ntuple_flow.tcp4.dst_port =
+ rte_cpu_to_be_16(res->port_dst);
+ pflow->mask.ntuple_flow.tcp4.src_port =
+ rte_cpu_to_be_16(res->port_src_mask);
+ pflow->mask.ntuple_flow.tcp4.dst_port =
+ rte_cpu_to_be_16(res->port_dst_mask);
+ break;
+ case RTE_ETH_FLOW_PKT_FILTER_IPV6_TCP:
+ case RTE_ETH_FLOW_PKT_FILTER_IPV6_UDP:
+ pflow = &entry.input.flow.pkt_filter_flow;
+
+ pflow->pkt.port_id = res->iport_id;
+ pflow->mask.port_id = res->iport_id_mask;
+
+ pflow->pkt.l2_flow.ether_type =
+ rte_cpu_to_be_16(res->ether_type);
+ pflow->mask.l2_flow.ether_type =
+ rte_cpu_to_be_16(res->ether_type_mask);
+
+ pflow->pkt.vlan_flow.inner_vlan =
+ rte_cpu_to_be_16(res->ivlan_value);
+ pflow->pkt.vlan_flow.outer_vlan = res->ovlan_value;
+ rte_cpu_to_be_16(res->ovlan_value);
+ pflow->mask.vlan_flow.inner_vlan = res->ivlan_mask;
+ rte_cpu_to_be_16(res->ivlan_mask);
+ pflow->mask.vlan_flow.outer_vlan = res->ovlan_mask;
+ rte_cpu_to_be_16(res->ovlan_mask);
+
+ IPV6_ADDR_TO_ARRAY(res->ip_src,
+ pflow->pkt.ntuple_flow.tcp6.ip.src_ip);
+ IPV6_ADDR_TO_ARRAY(res->ip_dst,
+ pflow->pkt.ntuple_flow.tcp6.ip.dst_ip);
+ IPV6_ADDR_TO_ARRAY(res->ip_src_mask,
+ pflow->mask.ntuple_flow.tcp6.ip.src_ip);
+ IPV6_ADDR_TO_ARRAY(res->ip_dst_mask,
+ pflow->mask.ntuple_flow.tcp6.ip.dst_ip);
+
+ pflow->pkt.ntuple_flow.tcp6.src_port =
+ rte_cpu_to_be_16(res->port_src);
+ pflow->pkt.ntuple_flow.tcp6.dst_port =
+ rte_cpu_to_be_16(res->port_dst);
+ pflow->mask.ntuple_flow.tcp6.src_port =
+ rte_cpu_to_be_16(res->port_src_mask);
+ pflow->mask.ntuple_flow.tcp6.dst_port =
+ rte_cpu_to_be_16(res->port_dst_mask);
+ break;
default:
break;
}
@@ -8244,10 +8417,68 @@ cmd_flow_director_filter_parsed(void *parsed_result,
entry.input.flow_ext.vlan_tci = rte_cpu_to_be_16(res->vlan_value);
entry.action.flex_off = 0; /*use 0 by default */
- if (!strcmp(res->drop, "drop"))
+ if (!strcmp(res->drop, "switch")) {
+ struct rte_eth_behavior_arg_nat *nat_arg;
+
+ entry.action.behavior = RTE_ETH_FDIR_SWITCH;
+
+ /* Extra port arguments */
+ entry.action.behavior_arg.port_arg.op =
+ str2fdir_behavior_sub_op(res->port_arg_op);
+ entry.action.behavior_arg.port_arg.port_id =
+ res->port_arg_port_id;
+
+ /* Extra mac arguments */
+ entry.action.behavior_arg.mac_arg.op =
+ str2fdir_behavior_sub_op(res->mac_arg_op);
+ (void)rte_memcpy(&entry.action.behavior_arg.mac_arg.src_mac,
+ &res->mac_arg_src_mac,
+ sizeof(struct ether_addr));
+ (void)rte_memcpy(&entry.action.behavior_arg.mac_arg.dst_mac,
+ &res->mac_arg_dst_mac,
+ sizeof(struct ether_addr));
+
+ /* Extra vlan arguments */
+ entry.action.behavior_arg.vlan_arg.op =
+ str2fdir_behavior_sub_op(res->vlan_arg_op);
+ entry.action.behavior_arg.vlan_arg.vlan_tci =
+ rte_cpu_to_be_16(res->vlan_arg_vlan);
+
+ /* Extra nat arguments */
+ nat_arg = &entry.action.behavior_arg.nat_arg;
+
+ nat_arg->op = str2fdir_behavior_sub_op(res->nat_arg_op);
+ switch (entry.input.flow_type) {
+ case RTE_ETH_FLOW_NONFRAG_IPV4_TCP:
+ case RTE_ETH_FLOW_PKT_FILTER_IPV4_TCP:
+ IPV4_ADDR_TO_UINT(res->nat_arg_ip_src,
+ nat_arg->nat.tcp4.ip.src_ip);
+ IPV4_ADDR_TO_UINT(res->nat_arg_ip_dst,
+ nat_arg->nat.tcp4.ip.dst_ip);
+ nat_arg->nat.tcp4.src_port =
+ rte_cpu_to_be_16(res->nat_arg_port_src);
+ nat_arg->nat.tcp4.dst_port =
+ rte_cpu_to_be_16(res->nat_arg_port_dst);
+ break;
+ case RTE_ETH_FLOW_NONFRAG_IPV6_TCP:
+ case RTE_ETH_FLOW_PKT_FILTER_IPV6_TCP:
+ IPV6_ADDR_TO_ARRAY(res->nat_arg_ip_src,
+ nat_arg->nat.tcp6.ip.src_ip);
+ IPV6_ADDR_TO_ARRAY(res->nat_arg_ip_dst,
+ nat_arg->nat.tcp6.ip.dst_ip);
+ nat_arg->nat.tcp6.src_port =
+ rte_cpu_to_be_16(res->nat_arg_port_src);
+ nat_arg->nat.tcp6.dst_port =
+ rte_cpu_to_be_16(res->nat_arg_port_dst);
+ break;
+ default:
+ break;
+ }
+ } else if (!strcmp(res->drop, "drop")) {
entry.action.behavior = RTE_ETH_FDIR_REJECT;
- else
+ } else {
entry.action.behavior = RTE_ETH_FDIR_ACCEPT;
+ }
if (!strcmp(res->pf_vf, "pf"))
entry.input.flow_ext.is_vf = 0;
@@ -8302,31 +8533,93 @@ cmdline_parse_token_string_t cmd_flow_director_flow =
cmdline_parse_token_string_t cmd_flow_director_flow_type =
TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
flow_type, "ipv4-other#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#"
- "ipv6-other#ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#l2_payload");
+ "ipv6-other#ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#l2_payload#"
+ "ipv4-tcp-pkt-filter#ipv4-udp-pkt-filter#ipv6-tcp-pkt-filter#"
+ "ipv6-udp-pkt-filter");
+cmdline_parse_token_string_t cmd_flow_director_iport =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ iport, "ingress-port");
+cmdline_parse_token_num_t cmd_flow_director_iport_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ iport_id, UINT8);
+cmdline_parse_token_num_t cmd_flow_director_iport_id_mask =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ iport_id_mask, UINT8);
cmdline_parse_token_string_t cmd_flow_director_ether =
TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
ether, "ether");
cmdline_parse_token_num_t cmd_flow_director_ether_type =
TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
ether_type, UINT16);
+cmdline_parse_token_num_t cmd_flow_director_ether_type_mask =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ ether_type_mask, UINT16);
+cmdline_parse_token_string_t cmd_flow_director_ivlan =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ ivlan, "inner-vlan");
+cmdline_parse_token_num_t cmd_flow_director_ivlan_value =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ ivlan_value, UINT16);
+cmdline_parse_token_num_t cmd_flow_director_ivlan_mask =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ ivlan_mask, UINT16);
+cmdline_parse_token_string_t cmd_flow_director_ovlan =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ ovlan, "outer-vlan");
+cmdline_parse_token_num_t cmd_flow_director_ovlan_value =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ ovlan_value, UINT16);
+cmdline_parse_token_num_t cmd_flow_director_ovlan_mask =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ ovlan_mask, UINT16);
+cmdline_parse_token_string_t cmd_flow_director_tos =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ tos, "tos");
+cmdline_parse_token_num_t cmd_flow_director_tos_value =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ tos_value, UINT8);
+cmdline_parse_token_num_t cmd_flow_director_tos_mask =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ tos_mask, UINT8);
+cmdline_parse_token_string_t cmd_flow_director_proto =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ proto, "proto");
+cmdline_parse_token_num_t cmd_flow_director_proto_value =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ proto_value, UINT8);
+cmdline_parse_token_num_t cmd_flow_director_proto_mask =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ proto_mask, UINT8);
cmdline_parse_token_string_t cmd_flow_director_src =
TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
src, "src");
cmdline_parse_token_ipaddr_t cmd_flow_director_ip_src =
TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result,
ip_src);
+cmdline_parse_token_ipaddr_t cmd_flow_director_ip_src_mask =
+ TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result,
+ ip_src_mask);
cmdline_parse_token_num_t cmd_flow_director_port_src =
TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
port_src, UINT16);
+cmdline_parse_token_num_t cmd_flow_director_port_src_mask =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ port_src_mask, UINT16);
cmdline_parse_token_string_t cmd_flow_director_dst =
TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
dst, "dst");
cmdline_parse_token_ipaddr_t cmd_flow_director_ip_dst =
TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result,
ip_dst);
+cmdline_parse_token_ipaddr_t cmd_flow_director_ip_dst_mask =
+ TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result,
+ ip_dst_mask);
cmdline_parse_token_num_t cmd_flow_director_port_dst =
TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
port_dst, UINT16);
+cmdline_parse_token_num_t cmd_flow_director_port_dst_mask =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ port_dst_mask, UINT16);
cmdline_parse_token_string_t cmd_flow_director_verify_tag =
TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
verify_tag, "verify_tag");
@@ -8347,7 +8640,7 @@ cmdline_parse_token_string_t cmd_flow_director_flexbytes_value =
flexbytes_value, NULL);
cmdline_parse_token_string_t cmd_flow_director_drop =
TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
- drop, "drop#fwd");
+ drop, "drop#fwd#switch");
cmdline_parse_token_string_t cmd_flow_director_pf_vf =
TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
pf_vf, NULL);
@@ -8395,6 +8688,61 @@ cmdline_parse_token_num_t cmd_flow_director_tunnel_id_value =
TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
tunnel_id_value, UINT32);
+cmdline_parse_token_string_t cmd_flow_director_port_arg =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ port_arg, "port-arg");
+cmdline_parse_token_string_t cmd_flow_director_port_arg_op =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ port_arg_op, "none#port-redirect");
+cmdline_parse_token_num_t cmd_flow_director_port_arg_port_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ port_arg_port_id, UINT8);
+cmdline_parse_token_string_t cmd_flow_director_mac_arg =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ mac_arg, "mac-arg");
+cmdline_parse_token_string_t cmd_flow_director_mac_arg_op =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ mac_arg_op, "none#mac-rewrite");
+cmdline_parse_token_etheraddr_t cmd_flow_director_mac_arg_src_mac =
+ TOKEN_ETHERADDR_INITIALIZER(struct cmd_flow_director_result,
+ mac_arg_src_mac);
+cmdline_parse_token_etheraddr_t cmd_flow_director_mac_arg_dst_mac =
+ TOKEN_ETHERADDR_INITIALIZER(struct cmd_flow_director_result,
+ mac_arg_dst_mac);
+cmdline_parse_token_string_t cmd_flow_director_vlan_arg =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ vlan_arg, "vlan-arg");
+cmdline_parse_token_string_t cmd_flow_director_vlan_arg_op =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ vlan_arg_op, "none#vlan-rewrite#vlan-del");
+cmdline_parse_token_num_t cmd_flow_director_vlan_arg_vlan =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ vlan_arg_vlan, UINT16);
+cmdline_parse_token_string_t cmd_flow_director_nat_arg =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ nat_arg, "nat-arg");
+cmdline_parse_token_string_t cmd_flow_director_nat_arg_op =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ nat_arg_op, "none#nat-rewrite");
+cmdline_parse_token_string_t cmd_flow_director_nat_arg_src =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ nat_arg_src, "src");
+cmdline_parse_token_ipaddr_t cmd_flow_director_nat_arg_ip_src =
+ TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result,
+ nat_arg_ip_src);
+cmdline_parse_token_num_t cmd_flow_director_nat_arg_port_src =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ nat_arg_port_src, UINT16);
+cmdline_parse_token_string_t cmd_flow_director_nat_arg_dst =
+ TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+ nat_arg_dst, "dst");
+cmdline_parse_token_ipaddr_t cmd_flow_director_nat_arg_ip_dst =
+ TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result,
+ nat_arg_ip_dst);
+cmdline_parse_token_num_t cmd_flow_director_nat_arg_port_dst =
+ TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+ nat_arg_port_dst, UINT16);
+
cmdline_parse_inst_t cmd_add_del_ip_flow_director = {
.f = cmd_flow_director_filter_parsed,
.data = NULL,
@@ -8517,6 +8865,76 @@ cmdline_parse_inst_t cmd_add_del_l2_flow_director = {
},
};
+cmdline_parse_inst_t cmd_add_del_pkt_filter_flow_director = {
+ .f = cmd_flow_director_filter_parsed,
+ .data = NULL,
+ .help_str = "add or delete a packet filter flow director entry on NIC",
+ .tokens = {
+ (void *)&cmd_flow_director_filter,
+ (void *)&cmd_flow_director_port_id,
+ (void *)&cmd_flow_director_mode,
+ (void *)&cmd_flow_director_mode_ip,
+ (void *)&cmd_flow_director_ops,
+ (void *)&cmd_flow_director_flow,
+ (void *)&cmd_flow_director_flow_type,
+ (void *)&cmd_flow_director_iport,
+ (void *)&cmd_flow_director_iport_id,
+ (void *)&cmd_flow_director_iport_id_mask,
+ (void *)&cmd_flow_director_ether,
+ (void *)&cmd_flow_director_ether_type,
+ (void *)&cmd_flow_director_ether_type_mask,
+ (void *)&cmd_flow_director_ivlan,
+ (void *)&cmd_flow_director_ivlan_value,
+ (void *)&cmd_flow_director_ivlan_mask,
+ (void *)&cmd_flow_director_ovlan,
+ (void *)&cmd_flow_director_ovlan_value,
+ (void *)&cmd_flow_director_ovlan_mask,
+ (void *)&cmd_flow_director_tos,
+ (void *)&cmd_flow_director_tos_value,
+ (void *)&cmd_flow_director_tos_mask,
+ (void *)&cmd_flow_director_proto,
+ (void *)&cmd_flow_director_proto_value,
+ (void *)&cmd_flow_director_proto_mask,
+ (void *)&cmd_flow_director_src,
+ (void *)&cmd_flow_director_ip_src,
+ (void *)&cmd_flow_director_ip_src_mask,
+ (void *)&cmd_flow_director_port_src,
+ (void *)&cmd_flow_director_port_src_mask,
+ (void *)&cmd_flow_director_dst,
+ (void *)&cmd_flow_director_ip_dst,
+ (void *)&cmd_flow_director_ip_dst_mask,
+ (void *)&cmd_flow_director_port_dst,
+ (void *)&cmd_flow_director_port_dst_mask,
+ (void *)&cmd_flow_director_flexbytes,
+ (void *)&cmd_flow_director_flexbytes_value,
+ (void *)&cmd_flow_director_drop,
+ (void *)&cmd_flow_director_pf_vf,
+ (void *)&cmd_flow_director_queue,
+ (void *)&cmd_flow_director_queue_id,
+ (void *)&cmd_flow_director_port_arg,
+ (void *)&cmd_flow_director_port_arg_op,
+ (void *)&cmd_flow_director_port_arg_port_id,
+ (void *)&cmd_flow_director_mac_arg,
+ (void *)&cmd_flow_director_mac_arg_op,
+ (void *)&cmd_flow_director_mac_arg_src_mac,
+ (void *)&cmd_flow_director_mac_arg_dst_mac,
+ (void *)&cmd_flow_director_vlan_arg,
+ (void *)&cmd_flow_director_vlan_arg_op,
+ (void *)&cmd_flow_director_vlan_arg_vlan,
+ (void *)&cmd_flow_director_nat_arg,
+ (void *)&cmd_flow_director_nat_arg_op,
+ (void *)&cmd_flow_director_nat_arg_src,
+ (void *)&cmd_flow_director_nat_arg_ip_src,
+ (void *)&cmd_flow_director_nat_arg_port_src,
+ (void *)&cmd_flow_director_nat_arg_dst,
+ (void *)&cmd_flow_director_nat_arg_ip_dst,
+ (void *)&cmd_flow_director_nat_arg_port_dst,
+ (void *)&cmd_flow_director_fd_id,
+ (void *)&cmd_flow_director_fd_id_value,
+ NULL,
+ },
+};
+
cmdline_parse_inst_t cmd_add_del_mac_vlan_flow_director = {
.f = cmd_flow_director_filter_parsed,
.data = NULL,
@@ -9756,6 +10174,7 @@ cmdline_parse_ctx_t main_ctx[] = {
(cmdline_parse_inst_t *)&cmd_add_del_udp_flow_director,
(cmdline_parse_inst_t *)&cmd_add_del_sctp_flow_director,
(cmdline_parse_inst_t *)&cmd_add_del_l2_flow_director,
+ (cmdline_parse_inst_t *)&cmd_add_del_pkt_filter_flow_director,
(cmdline_parse_inst_t *)&cmd_add_del_mac_vlan_flow_director,
(cmdline_parse_inst_t *)&cmd_add_del_tunnel_flow_director,
(cmdline_parse_inst_t *)&cmd_flush_flow_director,
--
2.5.3
More information about the dev
mailing list