llhao86 发表于 2011-11-10 16:29

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

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

lyl19 发表于 2011-11-10 16:49

ip_finish_output
{
        struct net_device *dev = skb->dst->dev;

        skb->dev = dev;
      ..........
}

skb->dst->dev这个是路由模块设置的

yanhaofeng 发表于 2011-11-10 20:07

楼上正解

llhao86 发表于 2011-11-11 08:43

本帖最后由 llhao86 于 2011-11-11 09:39 编辑

谢谢lyl19!
我还想再问一下,路由里面是怎么确定这个dev的?
假如一开始,路由表为空的时候,主机上有两个dev(dev1,dev2)时,这时候要发送一个包,那么它会从默认端口发送,这个默认端口会是哪个dev呀?

九阳神功爱喝茶 发表于 2015-10-23 10:17

问题解决了吗?我也有这个问题回复 4# llhao86


   

nswcfd 发表于 2015-10-23 21:57

路由表为空的时候报文根本就不会到达dev_queue_xmit

ken1980 发表于 2015-11-16 17:34

本帖最后由 ken1980 于 2015-11-16 17:40 编辑

路由子系统根据路由表查询来设置dst_entry,这个dev就是经过路由查询到的路由输出设备接口,另外只要在网络设备上设置IP了地址,系统都会自动添加同网段的接口路由表,路由表为空的情况是啥网络信息也没有,这时还发送啥数据啊?
如果对互联网发送数据,默认路由这个东西,就是你说的系统怎么知道从两个设备的哪一个发出去
    struct dst_entry
    {
      struct dst_entry      *next;
      atomic_t    __refcnt;
      int         __use;
      struct dst_entry    *child;
       struct net_device   *dev;
      ...
    }

woshipanlaoda 发表于 2015-11-21 21:45

可以使用原始套接字,通过指定sockaddr_ll的 ifindex就可以指定你想使用的虚接口(netdev)发送报文
页: [1]
查看完整版本: 发送IP包时,skb->dev是在哪里被设置的