全部
  • 全部
  • 解决方案
  • 技术问答
  • 视频中心
  • 知识分享
  • 技术资讯
  • SEED产品
400-048-1230
订阅
  • 首页
  • 解决方案
  • 技术问答
  • 视频中心
  • 知识分享
  • 技术资讯
  • SEED产品
【连载二】NXP S32G — PFE路由功能实验
来源:Arrow 发布:2023/05/11 浏览量:463

上一篇文章中,我们对PFE的功能及特性进行了简单介绍,本篇文章将演示如何在Linux下通过PFE控制接口libfci配置PFE硬件路由功能。

 

上一篇文章中,我们对PFE的功能及特性进行了简单介绍,本篇文章将演示如何在Linux下通过PFE控制接口libfci配置PFE硬件路由功能。

 

PFE硬件路由配置流程 

 

当一个新的连接到主机后,通过以下步骤配置该连接由PFE硬件转发:

 

  1. 收到新连接后,由于PFE路由表中不存在匹配该连接的条目,数据包会被转发到主机CPU(慢速路径)。

  2. 主机CPU根据数据包头将Conntrack(五元组信息)Route(转发使用的MAC地址及MAC接口)配置到PFE。

  3. 后续收到的包将匹配到对应的PFE路由表条目,由PFE直接转发(快速路径)。   

    Image

 

 

 

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,或使用默认固件。)

Image

 

PC配置  

 

两台主机分别配置ip地址为10.7.0.2和10.11.0.5,配置路由表并记录mac地址以备配置PFE Route。

 

  • Linux系统主机

 

请注意将命令中eth1替换为实际使用的网口名

 

将主机1 IP地址配置为10.7.0.2

sudo ifconfig eth1 10.7.0.2 netmask 255.255.255.0 up
sudo route add -net 10.7.0.0 netmask 255.255.255.0 dev eth1
sudo route add -net 10.11.0.0 netmask 255.255.255.0  gw 10.7.0.1

将主机2 IP地址配置为10.11.0.5

sudo ifconfig eth1 10.11.0.5 netmask 255.255.255.0 up

sudo route add -net 10.11.0.0 netmask 255.255.255.0 dev eth1

sudo route add -net 10.7.0.0 netmask 255.255.255.0 gw 10.11.0.1

  

  • 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配置   

确认S32G 运行的Linux未开启网络转发

cat /proc/sys/net/ipv4/ip_forward

若为1需修改/etc/sysctl.conf文件中行net.ipv4.ip_forward=1net.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

  

  • PFE配置  

 

在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。

 

  • 在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 (路径)

libfci_cli route-add --rt2-4--dmac00:e0:4c:68:02:1e -i emac0

libfci_cli route-add --rt5-4--dmac 6c:0b:84:67:cd:28 -i emac2

添加conntrack (五元组信息)

libfci_cli cntk-timeout -p0-w4294967295

libfci_cli cntk-add -s10.7.0.2 -d10.11.0.5 -p ICMP --rt5--sport0--dport0--r-rt2

 

配置网口为路由模式

libfci_cli phyif-update -i emac0 --mode ROUTER

libfci_cli phyif-update -i emac2 --mode ROUTER

至此两台主机可ping通

 

  • 修改libfci_cil demo代码配置PFE   

 

在配置好的yocto构建环境中使用bitbake -c devshell libfci命令可切换到libfci源码目录。
PFE Route对应的代码为libfic源码目录中sw/libfci_cli/src/libfci_demo/demo_feature_router_simple.c 文件,我们需要根据使用开发板的网口与主机的IP、MAC地址修改此文件的部分字段。

此文件的101~102行配置一条route,该route配置了连接到pfe0网口主机的MAC地址,用于将数据转发到连接到pfe0端口的主机。

demo_rt_ld_set_dst_mac(&rt, (const uint8_t[6]){0x0A,0x01,0x23,0x45,0x67,0x89});
demo_rt_ld_set_egress_phyif(&rt, "emac0");

我们需根据实际连接到pfe0主机的MAC地址修改代码,假设我们连接到pfe0主机的MAC地址为00:e0:4c:68:02:1e,需将101行修改为。

demo_rt_ld_set_dst_mac(&rt, (const uint8_t[6]){0x00,0xE0,0x4C,0x68,0x02,0x1E});

114~115行配置了一条pfe1网口的route。

demo_rt_ld_set_dst_mac(&rt, (const uint8_t[6]){0x0A,0xFE,0xDC,0xBA,0x98,0x76});
demo_rt_ld_set_egress_phyif(&rt, "emac1");

s32g274a-RDB2与ARROW s32g274a devkit中pfe1网口默认被禁用,我们需将它修改为pfe2。并根据实际情况修改MAC地址,假设我们连接到pfe2的主机MAC地址为6c:0b:84:67:cd:28

demo_rt_ld_set_dst_mac(&rt, (const uint8_t[6]){0x6C,0x0B,0x84,0x67,0xcd,0x28});
demo_rt_ld_set_egress_phyif(&rt, "emac2");

148~150行配置了一条conntrack,包使一条连接的五元组信息与route,我们无需修改。

demo_ct_ld_set_protocol(&ct, 1u);  /* 1 == ICMP */
demo_ct_ld_set_orig_dir(&ct,  0x0A070002u,0x0A0B0005u,0u,0u, 0u,11uL, false);
demo_ct_ld_set_reply_dir(&ct, 0x0A0B0005u,0x0A070002u,0u,0u, 0u, 7uL, false);

191~201行将pfe1口配置为router模式。

rtn = demo_phy_if_get_by_name(p_cl, &phyif, "emac1");
if (FPP_ERR_OK == rtn)
{
    /* modify locally stored data */
    demo_phy_if_ld_enable(&phyif);
    demo_phy_if_ld_set_promisc(&phyif, false);
    demo_phy_if_ld_set_mode(&phyif, FPP_IF_OP_ROUTER);
 
    /* update data in PFE */
    rtn = demo_phy_if_update(p_cl, &phyif);
}

我们需将其更改为配置pfe2口。

rtn = demo_phy_if_get_by_name(p_cl, &phyif, "emac2");
if (FPP_ERR_OK == rtn)
{
    /* modify locally stored data */
    demo_phy_if_ld_enable(&phyif);
    demo_phy_if_ld_set_promisc(&phyif, false);
    demo_phy_if_ld_set_mode(&phyif, FPP_IF_OP_ROUTER);
 
    /* update data in PFE */
    rtn = demo_phy_if_update(p_cl, &phyif);
}

编译修改后的代码,在配置好的yocto构建环境中运行以下命令

bitbake -C compile libfci-cli

编译后可执行文件位于libfci源码目录下sw/libfci_cli/libfic_cli在S32G上以参数demo-feature-run --feature router_simple运行该文件后,主机10.7.0.2和10.11.0.5可ping通。

root@s32g274adevkit:~# ./libfci_cli demo-feature-run --feature router_simple    
DISCLAIMER: This is a DEMO application. It is not part of the production code deliverables.                                                                    
Command successfully executed.

                  

参考资料

FCI_Reference_Manual

PFE_S32G_A53_LNX_UserManual

NXP
请使用浏览器分享功能 请点击右上角,进行分享