if (ether_addr_equal_64bits(vlan->dev->dev_addr, addr)) return vlan; } return NULL; } 发送报文 MACVlan 的发送报文过程也是从子设备接收到 ndo_start_xmit 回调函数开始,它的入口是 macvlan_start_xmit,整体的内核代码流程如下: 1. 当数据包进入 macvlan_start_xmit 后,主要执行数据包发送操作的是 ma...
} 数据发送 VLAN 子设备的数据发送的入口是 vlan_dev_hard_start_xmit,相比于收包流程,其实发送的流程简单很多,内核在发送时的流程如下: 在硬件发送时,VLAN 子设备会进入 vlan_dev_hard_start_xmit 方法,这个方法实现了 ndo_start_xmit 接口,它通过__vlan_hwaccel_put_tag 方法填充 VLAN 相关的以太网信息到报...
VLAN 子设备的数据发送的入口是 vlan_dev_hard_start_xmit,相比于收包流程,其实发送的流程简单很多,内核在发送时的流程如下: 在硬件发送时,VLAN 子设备会进入 vlan_dev_hard_start_xmit 方法,这个方法实现了 ndo_start_xmit 接口,它通过__vlan_hwaccel_put_tag 方法填充 VLAN 相关的以太网信息到报文中,然后修...
vlan驱动的发包函数是vlan_dev_hard_start_xmit,下面简要分析这个函数,代码只展示最关键的流程。 staticnetdev_tx_tvlan_dev_hard_start_xmit(structsk_buff*skb,structnet_device*dev){structvlan_dev_priv vlan=vlan_dev_priv(dev);skb->dev=vlan->real_dev;vlan_tci=vlan->vlan_id;vlan_tci|=vlan_dev_...
在硬件发送时,VLAN 子设备会进入 vlan_dev_hard_start_xmit 方法,这个方法实现了 ndo_start_xmit 接口,它通过__vlan_hwaccel_put_tag 方法填充 VLAN 相关的以太网信息到报文中,然后修改了报文的设备为主设备,调用主设备的 dev_queue_xmit 方法重新进入主设备的发送队列进行发送,我们截取关键的一部分来分析: ...
然后在dev_hard_start_xmit(skb,dev)中,对skb进行检查,发现是虚拟设备的数据,则做相应操作(如vlan_untag(),其它的都安正常发送流程走),接着就调用虚拟设备的ops->ndo_start_xmit()函数,在这个函数中,进行设备重定向。最后以real_dev重启发送流程(vlan是这样的,因为real_dev可能被多个vlan_dev使用,必须重新进行...
VLAN 子设备的数据发送的入口是 vlan_dev_hard_start_xmit,相比于收包流程,其实发送的流程简单很多,内核在发送时的流程如下: 在硬件发送时,VLAN 子设备会进入 vlan_dev_hard_start_xmit 方法,这个方法实现了 ndo_start_xmit 接口,它通过__vlan_hwaccel_put_tag 方法填充 VLAN 相关的以太网信息到报文中,然后修...
Vlan_dev.c :vlan设备相关的处理函数,比如设备上的报文发送、接收与报文头处理函数vlan_dev_hard_start_xmit,vlan_skb_recv,vlan_dev_rebuild_header;设备的ioctl配置vlan_dev_ioctl函数等。 Vlan.c:vlan模块初始化,vlan设备的注册register_vlan_device、注销unregister_vlan_device,ioctl入口函数vlan_ioctl_handler等...
首先来看对vlan的检查,参见dev.c中的hard_dev_start_xmit(skb)函数,其实很简单,检查skb中的vlan标志,若有,则插入vlan_tag,并修改skb->proto=802.1q,最后去除skb中的vlan标志。skb中为什么会有vlan标志,因为上层选择vlan_dev后,根据它的priv_flags(见上一节)可知道它是一个vlan设备,因此给它打上一个vlan标志...
然后在dev_hard_start_xmit(skb,dev)中,对skb进行检查,发现是虚拟设备的数据,则做相应操作(如vlan_untag(),其它的都安正常发送流程走),接着就调用虚拟设备的ops->ndo_start_xmit()函数,在这个函数中,进行设备重定向。最后以real_dev重启发送流程(vlan是这样的,因为real_dev可能被多个vlan_dev使用,必须重新进行...