问题描述
问题分析
通过抓包发现,网关B的OutBound模块之所以转发D->A的数据包是因为网关B用户侧的af_packet不仅仅抓取了用户A的数据包还抓了网关B发往用户A的包,所以会出现这种现象,解决的办法是,设置BPF,控制af_packet抓包的方向,只抓取InBound的包。策略失效的原因是因为RingBuff空间被无用包侵吞。在设计RingBuff的时候,定义RingBuff的长度为(channelLen + 1) * threadNum * frameSize,OutBound抓取一个包就轮询的分配给worker线程,但当出现杂包之后这个空间明显就不够用了。所以得严格按照生产一个包消费一个包来编写代码,对于杂包要约束其固定在一个buff里,待出现有用包之后再移动buffIndex。RingBuff空间被侵占的后果就是数据包的空间可能会出现错乱,新包会覆盖旧包。自然怜幽草,人间爱晚晴。