int test_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) { struct net_device *dev = (struct net_device *)ptr; switch(event) { caseNETDEV_UP: if(dev && dev->name) printk("dev[%s] is up\n",dev->name); break; caseNETDEV_DOWN: if(dev && dev->name)...
1.分配一个网络设备函数,即分配一个struct net_device结构体: alloc_netdev(sizeof_priv, name, setup); 这个alloc_netdev()函数本质上是一个宏定义: #define alloc_netdev(sizeof_priv, name, setup) \ alloc_netdev_mq(sizeof_priv, name, setup, 1) struct net_device *alloc_netdev_mq(int size...
iph->tos, skb->dev); ... } ... returndst_input(skb); } 其中ip_route_input_noref 就是在进行路由查找。 //file: net/ipv4/route.c intip_route_input_noref(struct sk_buff *skb, __be32 daddr, __be32 saddr, u8 tos, struct net_device *dev) { ... res = ip_route_input_slow(...
nf_hook(proto, hooknum, net, skb, dev, in, out) staticinlineintnf_hook(u_int8_tpf,unsignedinthook, struct net *net,struct sock *sk, struct sk_buff *skb,struct net_device *indev, struct net_device *outdev,int(*okfn)(struct net *, struct sock *, struct sk_buff *)) { structnf...
1. 首先创建一个 Linux 通用的 net_device 结构体保存设备的配置信息,进入 vlan_newlink 之后,会进行 vlan_check_real_dev 检查传入的 VLAN id 是否是可用的,这其中会调用到 vlan_find_dev 方法,这个方法用于针对一个主设备查找到符合条件的子设备,后面还会用到,我们截取一部分代码观察一下: ...
int(*ndo_init)(struct net_device *dev); void(*ndo_uninit)(struct net_device *dev); int(*ndo_open)(struct net_device *dev); int(*ndo_stop)(struct net_device *dev); netdev_tx_t(*ndo_start_xmit) (struct sk_buff *skb,
int eth_header(struct sk_buff *skb, struct net_device *dev,u16 type, void *daddr, void *saddr, unsigned len) EXPORT_SYMBOL(eth_header); skb : 将要去修改的struct sk_buff; dev : 原网络设备 type: 网络层的协议类型 daddr:目的MAC地址 ...
sk_buff->dev 这个变量的类型是net_device,net_device它代表一个网络设备。dev的作用与这个包是准备发出的包还是刚接收的包有关。当收到一个包时,设备驱动会把sk_buff的dev指针指向收到这个包的网络设备;当一个包被发送时,这个变量代表将要发送这个包的设备。在发送网络包时设置这个值的代码要比接收网络包时设置...
dev : 原网络设备 type: 网络层的协议类型 daddr:目的MAC地址 saddr:源MAC地址 len :一般可为0 inteth_header(structsk_buff*skb,structnet_device*dev,u16 type,void*daddr,void*saddr,intlen){//将skb->data = skb->data + ETH_ALEN;structethhdr*eth=(structethhdr*)skb_push(skb,ETH_ALEN);if(...
struct net_device *dev; struct dst_entry *dst; struct sec_path *sp; /* * This is the control buffer. It is free to use for every * layer. Please put your private variables there. If you * want to keep them across layers you have to do a skb_clone() ...