数据包VLAN标签的剥离和添加

网桥子系统 专栏收录该内容
17 篇文章 0 订阅
使用vconfig或者ip命令创建的802.1q虚拟设备, 并不会负责vlan标签的剥离和添加。其操作位于数据包的接收和发送流程中。

vconfig add eth0 10
或者
ip link add link eth0 eth0.10 type vlan id 10


vlan标签的剥离是在数据包接收函数__netif_receive_skb_core中处理,skb_vlan_untag函数最终执行untag标签剥离操作。首先将vlan协议类型(ETH_P_8021Q/ETH_P_8021AD)保存在skb的vlan_proto中,将vlan_tci(标签控制信息)保存在skb的vlan_tci中,之后将skb的data跳过VLAN信息字段(VLAN_HLEN - 4字节),即进行vlan标签剥离。


static inline void __vlan_hwaccel_put_tag(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci)
{
    skb->vlan_proto = vlan_proto;
    skb->vlan_tci = VLAN_TAG_PRESENT | vlan_tci;
}
struct sk_buff *skb_vlan_untag(struct sk_buff *skb)
{
    vhdr = (struct vlan_hdr *)skb->data;
    vlan_tci = ntohs(vhdr->h_vlan_TCI);
    __vlan_hwaccel_put_tag(skb, skb->protocol, vlan_tci);
	skb_pull_rcsum(skb, VLAN_HLEN);
}


数据包发送过程中,__dev_queue_xmit函数在执行发送操作的时候调用validate_xmit_skb添加vlan标签。sch_direct_xmit函数同样会调用validate_xmit_skb验证函数,但是由于vlan设备在创建的时候IFF_NO_QUEUE标志,不会进入流控系统,所以vlan数据包最终是由__dev_queue_xmit直接发送。__vlan_hwaccel_push_inside函数将vlan标签插入到数据包中。


void vlan_setup(struct net_device *dev)
{
    dev->priv_flags     |= IFF_802_1Q_VLAN | IFF_NO_QUEUE;
}

static inline struct sk_buff *__vlan_hwaccel_push_inside(struct sk_buff *skb)
{
    skb = vlan_insert_tag_set_proto(skb, skb->vlan_proto, skb_vlan_tag_get(skb));
}

static struct sk_buff *validate_xmit_vlan(...)
{
    skb = __vlan_hwaccel_push_inside(skb);
}
static struct sk_buff *validate_xmit_skb(struct sk_buff *skb, struct net_device *dev)
{
    skb = validate_xmit_vlan(skb, features);
}


内核版本  linux-4.14.4



  • 0
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

VLAN讲解(重点难点详解) 里面有经典案例 完整配置命令 一下是部分内容 什么是VLANVLAN(Virtual LAN),翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成网络, 也可以是数以百计计算机构成企业网络。VLAN所指LAN特指使用路由器分割网络——也就是广 播域。 在此让我们先复习一下广播域概念。广播域,指是广播帧(目标MAC地址全部为1)所能传递到范 围,亦即能够直接通信范围。严格地说,并不仅仅是广播帧,多播帧(Multicast Frame)目标不明 单播帧(Unknown Unicast Frame)也能在同一个广播域中畅行无阻。 本来,二层交换机只能构建单一广播域,不过使用VLAN功能后,它能够将网络分割成多个广播域。 未分割广播域时…… 那么,为什么需要分割广播域呢?那是因为,如果仅有一个广播域,有可能会影响到网络整体传输性 能。具体原因,请参看附图加深理解。 图中,是一个由5台二层交换机(交换机1~5)连接了大量客户机构成网络。假设这时,计算机A需要与 计算机B通信。在基于以太网通信中,必须在数据帧中指定目标MAC地址才能正常通信,因此计算机A 必须先广播“ARP请求(ARP Request)信息”,来尝试获取计算机BMAC地址。 交换机1收到广播帧(ARP请求)后,会将它转发给除接收端口外其他所有端口,也就是Flooding了。接 着,交换机2收到广播帧后也会Flooding。交换机3、4、5也还会Flooding。最终ARP请求会被转发到同一网 络中所有客户机上。 交
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值