作者简介
赵伟
intel软件工程师
主要从事DPDK开发与测试工作。
使用TestPMD时,我们经常需要将包放入指定队列中。ixgbe网卡已经提供了此种可能,相信下面关于ixgbe filter 的一些背景知识也会有所帮助。ixgbe支持多种型号的网卡,例如82599、x540、x550和x552等等。不同型号网卡的filter类型不同,filter的类型决定了接受包的目的队列,下面将一一讲解。目前,DPDK已通过rte_flowAPI在 pf口号中使用这些filter,用户可使用TestPMD应用进行体验。该应用通过rte_flowAPI创建或删除这些ixgbe filter 。当然,API在filter 配置中还另有作用,但不属于本文的讨论范围。
▼
《TestpmdApplication User Guide》的4.12部分提供了关于TestPMD中使用rte_flow的基本信息,请参照其中的介绍。本文将重点分析在rte_flow指令和API的使用中,一些限制ixgbefilter 的关键参数。
ixgbe网卡在收包时会根据上述标准及以下的顺序将包分配至相应队列:
•L2 EtherType filter (如果匹配)
此类filter 识别的是包的L2Ethertype,识别后将它们分配到接受队列。
•L3/L4 5-tuple filter (如果匹配)
此类filter 识别的是某些或成组的L3/L4 flow。filter由5-tuple(协议、IP的源地址和目的地址、TCP、UDP和SCTP的源端口号和目的端口号)构成,识别后将包分配到一个Rx队列中。82599和x540型号的网卡中有128个此类filter ,而 X550和X552中则没有.
•SYN filter (如果匹配)
导流TCP包,同时将包的SYN标志设置成独立的队列。
•flow director filter (如果匹配)
此类filter 识别的是某些或几组flow,并将它们分配至特定队列中。X550和X552型号支持三种不同模式的flowdirector (PERFECT、MAC_VLAN和TUNNEL),但82599和x540型号只支持PERFECT模式.
PERFECT:5-tuple filter
MAC_VLAN:MAC, VLAN 过滤
TUNNEL:NVGRE或者VXLAN 过滤
•RSS (如果匹配)
RSS(接收方扩展)将包分配至不同的描述符队列中,包处理在多个处理器内核上进行。
• 分配至零队列
PART 1
Ethertype
(x540、x552、x550 和 82599可以支持)
****PATTERN****
第一个非void的item必须为ETH.
源MAC地址必须进行掩码; 目标MAC地址也必须被完全掩码. 也就是被掩码的说源MAC地址应为{0x00, 0x00, 0x00, 0x00, 0x00, 0x00};被掩码的目标MAC地址应为{0x00, 0x00, 0x00, 0x00, 0x00, 0x00} .
ETH的EtherType 字段的值不应是0x0800和0x86DD;
接下来的非void item必须是END.
****ACTIONS****
第一个非void action应为QUEUE. 如果是QUEUE, queue id < queue number.
接下来的非void action应为END.
PART 2
n-tuple
(x540和82599可以支持)
****PATTERN****第一个非void item可以是ETH或IPV4.
如果第一个是ETH,第二个非void的item必须是IPV4.
第三个非void item必须是UDP、TCP或者SCTP,只有src_port和dst_port不需掩码,其他的字段需要掩码.
接下来的非void item必须是END.
****ACTIONS****
第一个非void action应为QUEUE. 如果QUEUE, queue id < queue number.
接下来的非void action 应为END.
PART 3
SYN
(x540、x552、x550和82599可以支持)
****PATTERN****
第一个非void item必须是ETH.
第二个非void item必须是IPV4 or IPV6.
第三个非void item 必须是TCP, 只有tcp_flags不需掩码, 其他字段需要掩码.
接下来的非void item 必须是END.
****ACTIONS****
第一个非void action应为QUEUE. 如果QUEUE, queue id < queue number.
接下来的非void action应为END.
PART 4
Flow directory
****UDP/TCP/SCTPPATTERN****
(82599、x540、x552和x550可以支持)\
第一个非void item可以是ETH或IPV4.
如果第一个是ETH,则第二个非void item必须是IPV4.
第三个非void item必须是UDP、TCP或者SCTP, 只有src_port和dst_port不需要掩码,其他字段需要掩码.
接下来的非void item必须是END.
****MACVLAN PATTERN****
(x552和x550可以支持)
第一个非void item必须是ETH.
第二个非void item必须是MAC VLAN.
接下来的非void item必须是END.
****VxLAN PATTERN****
(x552和x550可以支持)
第一个非void item 必须是ETH.
第二个非void item 必须是ipv4或ipv6
第三个非void item 必须是vxlan.
接下来的非void item 必须是ETH.
接下来的非void item 必须是VLAN.
接下来的非void item 必须是END.
**** NVGRE PATTERN****
(x552和x550可以支持)
第一个非void item 必须是 ETH.
第二个非void item 必须是 IPV4或 IPV6.
第三个非void item 必须是 NVGRE.
接下来的非void item 必须是 ETH.
接下来的非void item 必须是 VLAN.
接下来的非void item 必须是 END.
****ACTIONS****
第一个非void action 应为QUEUE或DROP. 如果是QUEUE, queue id < queue number.
NIC 82599只支持DROP for TCP/UDP packet, and x550/552support DROP for for TCP/UDP/SCTP packet.
82599/x550/x552 support QUEUEfor TCP/UDP/ SCTP packet.
第二个非void action应为MARK, mark_id is a uint32_t number.
接下来的非void action应为END.
****flexiblePATTERN****
(x552和x550可以支持)
第一个非void item必须是ETH或IPV4.
如果第一个是ETH,则第二个非void item 必须是 IPV4.
接下来的非void item可以是UDP、TCP 或SCTP, 只有src_port和dst_port不需掩码, 其他字段需要掩码. (不强制)
接下来的非void item可以是RAW (对于flex byte不强制)
要求:
spec.relative=0 mask.relative=0x1
spec.search=0 mask.search=0x1
spec.reserved = 0 mask.reserved = 0x3fffffff
spec.offset <= 62 mask.offset = 0xffffffff
spec.limit = 0 mask.limit= 0xffff
spec.length = 2 mask.length= 0xffff
5.接下来的非void item 必须是 END.
PART 5
举例说明
Syn:
./usertools/dpdk-devbind.py -b igb_uio 07:00.0
./x86_64-native-linuxapp-gcc/app/testpmd -c ff -n 4 – -i--rxq=8 --txq=8
n-tuple:
./usertools/dpdk-devbind.py -b igb_uio 03:00.0
testpmd> start
testpme> flow create 0 ingresspattern eth / ipv4 src is 192.168.0.1 dst is 192.168.0.2 proto is 17 / udp srcis 22 dst is 23 / end actions queue index 1 / end
vxlan:
./usertools/dpdk-devbind.py -b igb_uio 03:00.0
关于flexible filter
目前,flexible filter 配置格式并不是十分友好,因为用户需要给出5 tuple 参数和2 byte pattern的配置,所以相应的命令应为:
flowcreate 0 ingress pattern eth / ipv4 src is 192.168.0.3 dst is 192.168.0.4 / tcpsrc is 22 dst is 23 / raw relative spec 0 relative mask 1 search spec 0 searchmask 1 offset spec 54 offset mask 0xffffffff limit spec 0 limit mask 0xffffpattern is ab pattern is cd / end actions queue index 2 / end
之后的DPDK19.08版本中,会有新增的补丁,支持不受5 tuple参数影响、相对独立的flexible filter ,如下:
flowcreate 0 ingress pattern raw relative spec 0 relative mask 1 search spec 0search mask 1 offset spec 54 offset mask 0xffffffff limit spec 0 limit mask0xffff pattern is 0xab / end actions queue index 2 / end
FDIR flexible filter用户将会有更加自由灵活的使用体验。
转载须知