官方文档查看地址:
http://doc.dpdk.org/guides/sample_app_ug/ip_pipeline.html
PDF下载地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-sample-applications-user-guide.html?eu-cookie-notice
本篇难度系数:
翻译:☆☆☆☆☆
理解:★★☆☆☆
40.1.应用程序概述
因特网协议(IP)管道应用旨在成为在多核cpu上快速开发包处理应用程序的载体。
遵循OpenFlow和P4设计原则,可以使用该应用程序以模块化的方式从输入/输出端口、表和操作创建名为管道的功能块。多个管道可以通过包队列相互连接,从而创建完整的应用程序(超级管道)。
管道映射到应用程序线程,每个管道由一个线程执行,每个线程能够运行一个或多个管道。从端口、表和操作创建管道、将多个管道连接在一起并将管道映射到执行线程的可能性是无穷无尽的,因此这个应用程序可以看作是一个真正的应用程序生成器。
管道通过命令行接口(CLI)创建和管理:
任何标准TCP客户机(例如telnet、netcat、自定义脚本等)通常都能够连接到应用程序,通过网络发送命令,并等待响应,然后再执行下一个命令。
所有的应用对象都是通过CLI命令创建和管理的:
用于创建管道端口的“基本”对象:内存池、链接(即网络接口)、SW队列、流量管理器等。
操作概要:用于定义管道输入/输出端口和表要执行的操作。
管道组件:输入/输出端口、表、管道、管道到执行线程的映射。
40.2.运行应用程序
应用程序启动命令行为:
ip_pipeline [EAL_ARGS] -- [-s SCRIPT_FILE] [-h HOST] [-p PORT]
应用程序启动参数是:
-s SCRIPT_FILE
-h Host
-p Port
有关运行应用程序和环境抽象层(EAL)选项的一般信息,请参阅DPDK入门指南(DPDK Getting Started Guide)。
下面是一个示例命令,用于运行为第2层转发配置的ip管道应用程序:
$ ./build/ip_pipeline -c 0x3 -- -s examples/route_ecmp.cli
应用程序应成功启动并显示如下:
EAL: Detected 40 lcore(s)
EAL: Detected 2 NUMA nodes
EAL: Multi-process socket /var/run/.rte_unix
EAL: Probing VFIO support...
EAL: PCI device 0000:02:00.0 on NUMA socket 0
EAL: probe driver: 8086:10fb net_ixgbe
...
运行远程客户端(例如telnet)与ip管道应用程序通信:
$ telnet 127.0.0.1 8086
当运行上述telnet客户端时,会显示命令提示符:
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Welcome to IP Pipeline!
pipeline>
一旦应用程序和telnet客户机开始运行,消息就可以从客户机发送到应用程序。在任何阶段,都可以使用quit命令终止telnet客户机。
40.3.应用程序阶段
40.3.1初始化
在此阶段,初始化EAL层并解析特定于应用程序的参数。此外,应用程序对象的数据结构(即链表)也被初始化。在任何初始化错误的情况下,将显示一条错误消息并终止应用程序。
40.3.2运行时
主线程根据CLI输入创建和管理所有应用程序对象。
每个数据平面线程运行一个或多个以前按循环顺序分配给它的管道。每个数据平面线程在分时模式下执行两项任务:
1.包处理任务:处理从管道输入端口读取的输入包的突发事件。
2.消息处理任务:数据平面线程周期性地暂停包处理任务,并轮询主线程发送的请求消息。例如:从当前数据平面线程中添加/删除管道,从当前数据平面线程拥有的特定管道的给定表中添加/删除规则,读取统计信息等。
40.4.例子
Name | Table(s) | Actions | Messages |
---|---|---|---|
L2fwd | Stub | Forward | Mempool create Link create Pipeline create Pipeline port in/out Pipeline table Pipeline port in table Pipeline enable Pipeline table rule add |
Flow classification | Exact match Key = byte array (16 bytes) Offset = 278 Table size = 64K | Forward | 1.Mempool create 2.Link create 3.Pipeline create 4.Pipeline port in/out 5.Pipeline table 6.Pipeline port in table 7.Pipeline enable 8.Pipeline table rule add default 9.Pipeline table rule add |
KNI | Stub | Forward | Mempool create Link create Pipeline create Pipeline port in/out Pipeline table Pipeline port in table Pipeline enable Pipeline table rule add |
Firewall | ACL Key = n-tuple Offset = 270 Table size = 4K | Allow/Drop | Mempool create Link create Pipeline create Pipeline port in/out Pipeline table Pipeline port in table Pipeline enable Pipeline table rule add default Pipeline table rule add |
IP routing | LPM (IPv4) Key = IP dest addr Offset = 286 Table size = 4K | Forward | Mempool Create Link create Pipeline creat Pipeline port in/out Pipeline table Pipeline port in table Pipeline enable Pipeline table rule add default Pipeline table rule add |
Equal-cost multi-path routing (ECMP) | LPM (IPv4) Key = IP dest addr Offset = 286 Table size = 4K Array Key = Array index Offset = 256 Size = 4K | Forward, load balance, encap ether | Mempool Create Link create Pipeline create Pipeline port in/out Pipeline table (LPM) Pipeline table (Array) Pipeline port in table (LPM) Pipeline enable Pipeline table rule add default Pipeline table rule add(LPM) Pipeline table rule add(Array) |
40.5.Command Line Interface (CLI)
40.5.1. Link
link配置
link
dev |port
rxq
txq promiscuous on | off
[rss ... ]
注意:PCI设备名称必须用Domain:Bus:Device.Function格式。
40.5.2. Mempool
Mempool 创建
mempool buffer
pool cache cpu
40.5.3. Software queue
创建软件队列
swq size cpu
40.5.4. Traffic manager(流量管理器TM)
添加流量管理器子端口配置文件
tmgr subport profile
添加流量管理器管道配置文件
tmgr pipe profile
创建流量管理器端口
tmgr
rate
spp
pps
qsize
fo mtu cpu
配置流量管理器子端口
tmgr
subport
profile
配置流量管理器管道
tmgr
subport
pipe from to
profile
40.5.5. Tap
Create tap port
tap
40.5.6. Kni
创建kni端口
kni
link
mempool
[thread ]
40.5.7. Cryptodev
Create cryptodev port
cryptodev
dev
queue
40.5.8操作配置文件
为管道输入端口创建操作概要文件
port in action profile
[filter match | mismatch offset mask key port ]
[balance offset mask port ... ]
为pipeline表创建操作概要文件
table action profile
ipv4 | ipv6
offset
fwd
[balance offset mask outoffset ]
[meter srtcm | trtcm
tc
stats none | pkts | bytes | both]
[tm spp pps ]
[encap ether | vlan | qinq | mpls | pppoe]
[nat src | dst
proto udp | tcp]
[ttl drop | fwd
stats none | pkts]
[stats pkts | bytes | both]
[sym_crypto cryptodev
mempool_create mempool_init ]
[time]
40.5.9. Pipeline
创建管道
pipeline
period
offset_port_id
cpu
创建管道输入端口
pipeline port in
bsz
link rxq
| swq
| tmgr
| tap mempool mtu
| kni
| source mempool file bpp
[action ]
[disabled]
创建管道输出端口
pipeline port out
bsz
link txq
| swq
| tmgr
| tap
| kni
| sink [file pkts ]
创建管道表
pipeline table
match
acl
ipv4 | ipv6
offset
size
| array
offset
size
| hash
ext | lru
key
mask
offset
buckets
size
| lpm
ipv4 | ipv6
offset
size
| stub
[action ]
将管道输入端口连接到表
pipeline port in table
显示特定管道输入端口、输出端口或表的统计信息
pipeline port in stats read [clear]
pipeline port out stats read [clear]
pipeline table stats read [clear]
为特定管道实例启用给定的输入端口
pipeline port out disable
禁用特定管道实例的给定输入端口
pipeline port out disable
将特定管道实例的默认规则添加到表中
pipeline table rule add
match
default
action
fwd
drop
| port
| meta
| table
为特定管道实例向表中添加规则
pipeline table rule add
match
acl
priority
ipv4 | ipv6
| array
| hash
raw
| ipv4_5tuple
| ipv6_5tuple
| ipv4_addr
| ipv6_addr
| qinq
| lpm
ipv4 | ipv6
action
fwd
drop
| port
| meta
| table
[balance ... ]
[meter
tc0 meter policer g y r
[tc1 meter policer g y r
tc2 meter policer g y r
tc3 meter policer g y r ]]
[tm subport pipe ]
[encap
ether
| vlan
| qinq
| mpls unicast | multicast
label0
为特定管道实例向表中添加批量规则
pipeline table rule add bulk
Where:
- file_name = path to file
- File line format = match action
删除特定管道实例的表规则
pipeline table rule delete
match
删除特定管道实例的默认表规则
pipeline table rule delete
match
default
为特定管道实例向表中添加仪表配置文件
pipeline table meter profile
add srtcm cir cbs ebs
| trtcm cir pir cbs pbs
从表中删除特定管道实例的仪表配置文件
pipeline table
meter profile delete
为特定管道实例的表或流量管理器操作更新dscp表
pipeline table dscp
Where:
- file_name = path to file
- exactly 64 lines
- File line format = , with as: g | y | r
40.5.10管道启用/禁用
为特定的数据平面线程启用给定的管道实例
thread pipeline enable
禁用特定数据平面线程的给定管道实例
thread pipeline disable