1个GAMC转3路网卡的关键在于:
发送时,对于GMAC发出的包,FPGA应该转到那个PHY口
接收时,从PHY口接收到的包应该给到那个netdev处理
A方案
在FPGA中保存三个netdev的mac,
发送时根据源mac决定要发给那个phy
接收时,根据目标mac决定input给那个netdev。
注意:三个netdev共用一份gmac驱动程序,每次初始化Init都调用一次pnetdev,
实际发生中断无论是TX还是RX,最终中断处理函数的入参pNetDev永远指向最后一个创建的netdev。
方案实现注意点:
1、每次上电时需要通知FPGA三个网卡的mac地址,实时改mac之后还要通知一次。
2、每个netdevx相对独立,当1个netdev执行到gmac的TX、RX处理时,不允许别的netdev同时使用gmac的TX、RX处理。
3、gmac的发送接收流程不允许被打断,所以gmac本身要加自旋锁。
4、gmac以千兆速率发包数量过多时,FPGA可能会存在来不及转发的现象,每发一帧数据要自旋170us。(不睡眠是因为不值得,任务调度切换在ms级别,170us自旋即可,170us是发1500B的帧数据所需时间,也可以根据每次发送帧数据的大小调整时间)
B方案
发送时:
根据源mac,为数据帧加头.(让FPGA知道应该向那个phy口转发)
接收时:
FPGA根据接收到的数据帧来自那个phy口加头,发给gmac控制器。Gmac收到后根据头部信息决定使用input提交给那个netdev处理。
对比
在收到广播时,目的mac为0xFFFF FFFF FF。
A方案会转发给3个netdev。
B方案在FPGA中会根据源phy,加头,这样就可以input到指定的netdev中。
对于广播包:正常的处理应该是发给同网段内的所有网卡设备,GMAC生成的3个netdev是在3个不同的网段。依次逻辑,明显易立的方案更合理一些。(A方案也不会发生错误,只是逻辑上不太合理,存在一定的安全风险)