Hi jiangheng,
For TCP rules, it should be flow director. I remember i40e supports 8K
flow director rules.
When the rule number is greater than 8K, only 8k rules can be created
successfully.
BR,
Beilei
*From:*jiangheng (G) <[email protected]>
*Sent:* Wednesday, October 18, 2023 10:19 AM
*To:* Xing, Beilei <[email protected]>; [email protected]; Stephen
Hemminger <[email protected]>
*Cc:* Fanbin(Kira,2012 Blue Lab.) <[email protected]>
*Subject:* 答复: Whether the creatation of flow rules of i40e NIC
support tcp port mask
Hi Beilei:
What is the maximum number of flow rules supported by the i40e?
What about that situation: numbers of tcp connection is greater than
the maximum number of flow rules.
*发件人**:*Xing, Beilei <[email protected]>
*发送时间:* 2023年10月18日 9:55
*收件人:* jiangheng (G) <[email protected]>; [email protected]
*抄送:* Fanbin(Kira,2012 Blue Lab.) <[email protected]>
*主题:* RE: Whether the creatation of flow rules of i40e NIC support tcp
port mask
Hi Jiangheng,
That’s because i40e only supports perfect match.
BR,
Beilei
*From:*jiangheng (G) <[email protected]>
*Sent:* Tuesday, October 17, 2023 4:52 PM
*To:* Xing, Beilei <[email protected]>; [email protected]
*Cc:* Fanbin(Kira,2012 Blue Lab.) <[email protected]>
*Subject:* Whether the creatation of flow rules of i40e NIC support
tcp port mask
Hi beilei,
I would like to create flows using tcp port mask, but it seems *only
mask 0xffff or 0x0 work*, Does flow rlue can be created using other mask?
I40e dirver was using now.
Here is my code:
struct rte_flow_attr attr;
struct rte_flow_item pattern[MAX_PATTERN_NUM];
struct rte_flow_action action[MAX_ACTION_NUM];
struct rte_flow *flow = NULL;
struct rte_flow_action_queue queue = { .index = queue_id };
struct rte_flow_item_ipv4 ip_spec;
struct rte_flow_item_ipv4 ip_mask;
struct rte_flow_item_tcp tcp_spec;
struct rte_flow_item_tcp tcp_mask;
int res;
memset_s(pattern, sizeof(pattern), 0, sizeof(pattern));
memset_s(action, sizeof(action), 0, sizeof(action));
/*
* set the rule attribute.
* in this case only ingress packets will be checked.
*/
memset_s(&attr, sizeof(struct rte_flow_attr), 0, sizeof(struct
rte_flow_attr));
attr.ingress = 1;
/*
* create the action sequence.
* one action only, move packet to queue
*/
action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE;
action[0].conf = &queue;
action[1].type = RTE_FLOW_ACTION_TYPE_END;
// not limit eth header
pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
// ip header
memset_s(&ip_spec, sizeof(struct rte_flow_item_ipv4), 0,
sizeof(struct rte_flow_item_ipv4));
memset_s(&ip_mask, sizeof(struct rte_flow_item_ipv4), 0,
sizeof(struct rte_flow_item_ipv4));
ip_spec.hdr.dst_addr = dst_ip;
ip_mask.hdr.dst_addr = EMPTY_MASK;
ip_spec.hdr.src_addr = src_ip;
ip_mask.hdr.src_addr = EMPTY_MASK;
pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4;
pattern[1].spec = &ip_spec;
pattern[1].mask = &ip_mask;
// tcp header, full mask 0xffff
memset_s(&tcp_spec, sizeof(struct rte_flow_item_tcp), 0,
sizeof(struct rte_flow_item_tcp));
memset_s(&tcp_mask, sizeof(struct rte_flow_item_tcp), 0,
sizeof(struct rte_flow_item_tcp));
pattern[2].type = RTE_FLOW_ITEM_TYPE_TCP; // 2: pattern 2 is tcp
header
tcp_spec.hdr.src_port = src_port;
tcp_spec.hdr.dst_port = dst_port;
*tcp_mask.hdr.src_port = 0xffff; // only 0xffff and 0x0 work*
*tcp_mask.hdr.dst_port = 0xffff; // only 0xffff and 0x0 work*
pattern[2].spec = &tcp_spec;
pattern[2].mask = &tcp_mask;
/* the final level must be always type end */
pattern[3].type = RTE_FLOW_ITEM_TYPE_END;
res = rte_flow_validate(port_id, &attr, pattern, action, error);
if (!res) {
flow = rte_flow_create(port_id, &attr, pattern, action, error);
} else {
LSTACK_LOG(ERR, PORT, "rte_flow_create.rte_flow_validate
error, res %d \n", res);
}
Looking forward to your favourable reply.