发送IP包时,skb->dev是在哪里被设置的
我想在linux下实现一个虚拟的网卡设备,自己实现一个struct net_device,从IP层接收IP包.我知道ip向下层发送数据时,是调用dev_queue_xmit(struct sk_buff *skb)来实现的,但在调用这个函数前,skb中的dev已经被设置好了,我想请教一下,这个skb->dev是在什么时候被设置的,如果我要让这个包发送到我的虚拟设备上,需要怎么做?
谢谢! ip_finish_output
{
struct net_device *dev = skb->dst->dev;
skb->dev = dev;
..........
}
skb->dst->dev这个是路由模块设置的 楼上正解 本帖最后由 llhao86 于 2011-11-11 09:39 编辑
谢谢lyl19!
我还想再问一下,路由里面是怎么确定这个dev的?
假如一开始,路由表为空的时候,主机上有两个dev(dev1,dev2)时,这时候要发送一个包,那么它会从默认端口发送,这个默认端口会是哪个dev呀? 问题解决了吗?我也有这个问题回复 4# llhao86
路由表为空的时候报文根本就不会到达dev_queue_xmit 本帖最后由 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;
...
} 可以使用原始套接字,通过指定sockaddr_ll的 ifindex就可以指定你想使用的虚接口(netdev)发送报文
页:
[1]