上一篇文章中,我们对PFE的功能及特性进行了简单介绍,本篇文章将演示如何在Linux下通过PFE控制接口libfci配置PFE硬件路由功能。
上一篇文章中,我们对PFE的功能及特性进行了简单介绍,本篇文章将演示如何在Linux下通过PFE控制接口libfci配置PFE硬件路由功能。
上一篇文章中,我们对PFE的功能及特性进行了简单介绍,本篇文章将演示如何在Linux下通过PFE控制接口libfci配置PFE硬件路由功能。
PFE硬件路由配置流程
当一个新的连接到主机后,通过以下步骤配置该连接由PFE硬件转发:
收到新连接后,由于PFE路由表中不存在匹配该连接的条目,数据包会被转发到主机CPU(慢速路径)。
主机CPU根据数据包头将Conntrack(五元组信息)Route(转发使用的MAC地址及MAC接口)配置到PFE。
后续收到的包将匹配到对应的PFE路由表条目,由PFE直接转发(快速路径)。
PFE硬件路由实验
NXP S32G BSP33.0 auto镜像
NXP S32G BSP33.0 yocto开发环境
PC x2
SEED-S32G开发套件(也可使用NXP S32G-VNP-RDB2)
两台PC分别连接到S32G的PFE_MAC0口与PFE_MAC2口,由于SEED-S32G的PFE_MAC0口连接到NXP SJA1110汽车以太网交换机,所以PC1可连接到SJA1110下的任何端口。(注意:需正确配置SJA1110,或使用默认固件。)
两台主机分别配置ip地址为10.7.0.2和10.11.0.5,配置路由表并记录mac地址以备配置PFE Route。
Linux系统主机
请注意将命令中eth1替换为实际使用的网口名
将主机1 IP地址配置为10.7.0.2
将主机2 IP地址配置为10.11.0.5
Windows系统主机
请注意将命令中“以太网 1”替换为实际网口名
将主机1 IP地址配置为10.7.0.2
netsh interface ip set address name="以太网 1" source=static addr=10.7.0.2 mask=255.255.255.0 gateway=10.7.0.1
route add 10.11.0.0 mask 255.255.255.0 10.7.0.1
# 允许ICMP入站
netsh advfirrwall firewall add rule name="ICMP Allow incoming V4 echo request" protocol=icmpv4:8,any dir=in action=allow
将主机2 IP地址配置为10.11.0.5
netsh interface ip set address name="以太网 1" source=static addr=10.11.0.5 mask=255.255.255.0 gateway=10.11.0.1
route add 10.7.0.0 mask 255.255.255.0 10.11.0.1
# 允许ICMP入站
netsh advfirrwall firewall add rule name="ICMP Allow incoming V4 echo request" protocol=icmpv4:8,any dir=in action=allow
确认S32G 运行的Linux未开启网络转发
若为1需修改/etc/sysctl.conf
文件中行net.ipv4.ip_forward=1
为net.ipv4.ip_forward=0
配置逻辑端口地址
ifconfig pfe0 10.7.0.1 netmask 255.255.255.0 up
ifconfig pfe2 10.11.0.1 netmask 255.255.255.0 up
在S32G文档AN12951: Packet Forwarding Engine (PFE) FCI Library Usage on the S32G2 Vehicle Network Processor Application Note中提供的pfe_rte程序在BSP33.0中已无法使用,我们将使用libfic_cli demo-feature-print
命令可显示所有的demo名,libfic_cli demo-feature-run --feature ${feature_name}
可运行对应的demo。
libfci_cli demo的配置被硬编码在程序中,如果使用的网口或主机的IP、MAC地址与demo程序中的配置不同则无法测试对应demo,本文将演示通过修改libfic_cil代码和在Linux shell中使用libfci_cli配置PFE。
假设主机10.7.0.2 MAC地址为00:e0:4c:68:02:1e,10.11.0.5 MAC地址为6c:0b:84:67:cd:28
创建routes (路径)
添加conntrack (五元组信息)
配置网口为路由模式
至此两台主机可ping通
bitbake -c devshell libfci
命令可切换到libfci源码目录。sw/libfci_cli/src/libfci_demo/demo_feature_router_simple.c
文件,我们需要根据使用开发板的网口与主机的IP、MAC地址修改此文件的部分字段。此文件的101~102行配置一条route,该route配置了连接到pfe0网口主机的MAC地址,用于将数据转发到连接到pfe0端口的主机。
我们需根据实际连接到pfe0主机的MAC地址修改代码,假设我们连接到pfe0主机的MAC地址为00:e0:4c:68:02:1e
,需将101行修改为。
114~115行配置了一条pfe1网口的route。
s32g274a-RDB2与ARROW s32g274a devkit中pfe1网口默认被禁用,我们需将它修改为pfe2。并根据实际情况修改MAC地址,假设我们连接到pfe2的主机MAC地址为6c:0b:84:67:cd:28
。
148~150行配置了一条conntrack,包使一条连接的五元组信息与route,我们无需修改。
191~201行将pfe1口配置为router模式。
我们需将其更改为配置pfe2口。
编译修改后的代码,在配置好的yocto构建环境中运行以下命令
编译后可执行文件位于libfci源码目录下sw/libfci_cli/libfic_cli
,在S32G上以参数demo-feature-run --feature router_simple
运行该文件后,主机10.7.0.2和10.11.0.5可ping通。
参考资料