WEB开发网
开发学院软件开发Java 网桥在内核的实现 阅读

网桥在内核的实现

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: 加一个新端口到一个网桥使用br_add_if方法,这里就不详细介绍这个方法了,网桥在内核的实现(5),不过这里要注意,他会在sys文件系统下,他则会再次调用handle_bridge,而此时由于设备已经替换为虚拟的网桥设备,因此就会直接将包发往下层正确的协议处理,生成一些相关的东西,要看sysf

加一个新端口到一个网桥使用br_add_if方法。这里就不详细介绍这个方法了,不过这里要注意,他会在sys文件系统下,生成一些相关的东西。要看sysfs的介绍,去看kernel的文档。

最后来看一下网桥的子系统在这个网络子系统的位置:

网桥在内核的实现

图片看不清楚?请点击这里查看原图(大图)。 

可以看到这里有很多的hook在ip层,基本都是netfilter子系统的东西。

这里网桥的输入帧的处理是通过br_handle_frame来处理的。而网桥的输出帧是通过br_dev_xmit来处理的。

当网络帧通过NIC的设备驱动被接收了之后,skb->dev被实例化为真实的设备,然后这个帧被放入网络栈,然后当be_handle_frame_finish之后调用br_pass_frame_up。我们来看这个函数的实现:

引用

static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb)
{
struct net_device *indev, *brdev = br->dev;

brdev->stats.rx_packets++;
brdev->stats.rx_bytes += skb->len;

indev = skb->dev;
///这步将真实的物理设备替换为虚拟的网桥设备。因此对3层来说就完全不知道物理设备的存在了。
skb->dev = brdev;
///调用netfiltel的相关hook。
NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,
netif_receive_skb);
}

当这个函数执行完毕后,会再次调用netif_receive_skb,他则会再次调用handle_bridge,而此时由于设备已经替换为虚拟的网桥设备,因此就会直接将包发往下层正确的协议处理。

网桥在内核的实现

图片看不清楚?请点击这里查看原图(大图)。 

上一页  1 2 3 4 5 

Tags:网桥 内核 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接