+ -
当前位置:首页 → 问答吧 → 发送IP包时,skb->dev是在哪里被设置的

发送IP包时,skb->dev是在哪里被设置的

时间:2011-11-10

来源:互联网

我想在linux下实现一个虚拟的网卡设备,自己实现一个struct net_device,从IP层接收IP包.
我知道ip向下层发送数据时,是调用dev_queue_xmit(struct sk_buff *skb)来实现的,但在调用这个函数前,skb中的dev已经被设置好了,我想请教一下,这个skb->dev是在什么时候被设置的,如果我要让这个包发送到我的虚拟设备上,需要怎么做?
谢谢

作者: llhktv1986   发布时间: 2011-11-10

这个是在ip层的时候,检查路由的时候设置上去的,应该是系统检测目标ip,根据路由表查找需要从哪个device出去,然后就设置这里的路由;
C/C++ code

 308int ip_output(struct sk_buff *skb)
 309{
 310        struct net_device *dev = skb_dst(skb)->dev;
 311
 312        IP_UPD_PO_STATS(dev_net(dev), IPSTATS_MIB_OUT, skb->len);
 313
 314        skb->dev = dev;
 315        skb->protocol = htons(ETH_P_IP);
 316
 317        return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, skb, NULL, dev,
 318                            ip_finish_output,
 319                            !(IPCB(skb)->flags & IPSKB_REROUTED));
 320}





如果仅仅是为了测试,可以用 route 命令设置一下路由,让指定的目标ip的包从你的device出去。

然后随便 ping一下指定ip就可以测试了。 

作者: lvyinghong   发布时间: 2011-11-10