- 论坛徽章:
- 0
|
原帖由 xie_minix 于 2006-6-1 17:08 发表
在驱动程序中会对他进行处理,如:vr_rxeof中
ifp->if_ipackets++;
我也曾怀疑过这个方向,但由于代码不熟,就只能做点简单的“考证”了:
毕竟if_bridge.c中对其加1,bridge.c中没有对其加1。如果if_xxxx.c和桥代码是前后关系,就能解释bridge.c的情况,但不能解释if_bridge.c的情况。如果if_xxxx.c和桥代码是二选一的关系,就能解释if_bridge.c的情况,但不能解释bridge.c的情况。除非if_bridge.c和bridge.c并不是简单的替换关系,它们和驱动的处理接口有所不同?
查看了一下桥代码和以太网代码的接口,是在if_ethersubr.c文件的ether_input()函数中:
- /*
- * Tap the packet off here for a bridge. bridge_input()
- * will return NULL if it has consumed the packet, otherwise
- * it gets processed as normal. Note that bridge_input()
- * will always return the original packet if we need to
- * process it locally.
- */
- if (ifp->if_bridge) {
- BRIDGE_INPUT(ifp, m);
- if (m == NULL)
- return;
- }
- /* Check for bridging mode */
- if (BDG_ACTIVE(ifp) )
- if ((m = bridge_in_ptr(ifp, m)) == NULL)
- return;
复制代码
其中,后面的bridge_in_ptr()调用就是原来的bridge的处理,而前面的BRIDGE_INPUT()调用则是(2005年6月5号)新加的if_bridge的处理。从这儿看来,bridge和if_bridge的处理代码从以太网处理流程中“截获”的地点是一样的。因此似乎没有道理if_bridge对if_ipackets的加一操作在其自身代码内部进行,而bridge对if_ipackets的加1操作则放到其它地方或是根本就没有进行呢?
[ 本帖最后由 雨丝风片 于 2006-6-1 17:37 编辑 ] |
|