broadcom Knet 功能调试记录
broadcom部分交换芯片集成了CPU,CPU模块和交换模块通过DMA通道进行数据的通信,broadcom把该通道通过knet虚接口的方式提供CPU的网口功能,和sdk提供的rxtx模块功能有下面区别:
rxtx功能只是一种发送和接收报文的处理方式,最终仍是调用驱动层面的发送和接收接口。Knet虚接口相当于底层驱动,把DMA通道封装成一个接口的形式,屏蔽上层应用感知底层DMA方式实现收发包。
Knet在应用上需要在make.local文件中定义FEATURE_LIST=KNET,把knet功能开关打开,KNET驱动的实现在sdk的kernel层,源码路径:\systems\linux\kernel\modules\bcm-knet\bcm-knet.c
对于BCM 534XX的greyhound系列芯片,在\systems\linux\user\iproc-3\下进行编译,编译结果会生成linux-kernel-bde.ko,linux-user-bde.ko, linux-uk-proxy.ko, linux-bcm-knet.ko这几个ko文件和bcm.user执行文件;
生成的几个ko文件和bcm.user文件加载到目标板中,在linux系统命令行下先对几个模块使用mknod添加相应的字符设备文件;然后进行insmod,处理如下:
mknod /dev/linux-kernel-bde c 125 0
mknod /dev/linux-user-bde c 125 0
mknod /dev/linux-uk-proxy. c 125 0
mknod /dev/linux-kernel-bde c 125 0
insmod linux-kernel-bde.ko
insmod linux-user-bde.ko
insmod linux-uk-proxy.ko
insmod linux-bcm-knet.ko use_rx_skb=”1” num_rx_prio=”2” mac_addr=”00:11:22:33:44:55”rx_buffer_size=”9238” rcpu_mode=”1” rcpu_dmac=”00:01:02:03:04:05” rcpu_smac=”00:00:33:44:55:66”rcpu_ethertype=”de08” rcpu_vlan=”4094”
安装好驱动模块后,运行应用程序,如bcm.user;
在bcm shell命令行界面下执行下面命令:
sc arprequersttocpu=1 //设置arp请求报文送cpu处理
sc arpreplytocpu=1 //设置arp应答报文送cpu处理
sc l3egressmode=1 //启用三层出接口管理
l3 intf add vlan=1 mac=00:11:22:33:44:55 intf=3 //三层出接口封装信息
l3 egrss add intf=3 copytocpu=true //三层接口object信息创建
l3 l3table add ip 192.168.4.10 intf=$egr_object_id //添加一条静态表项
knet netif create type=mete vlan=0 ifname=vintf0 rcpu=yes //创建knet虚接口
knet fileter create desttype=netif destid=1 prio=127 striptag=no //创建knet虚接口
使用bcm 提供的rx /tx应用验证收发包,使用pc连接网口进行ping验证收发包;
需要注意的是不同支持knet的芯片对应的cpu报文头格式可能是不相同的,移植代码时要注意;