Linux协议栈对vlan的处理

linux网络协议栈分析笔记7-VLAN的处理 这次先看看VLAN怎么处理的        主要代码目录linux/net/8021q dev_add_pack(&vlan_packet_type);         vlan-802.1q static struct packet_type vlan_packet_type __read_mostly = {      .type = cpu_to_be16(ETH_P_8021Q) 阅读详情
(基于linux-2.6.x)

从代码上看,Linux对VLAN的处理方式如下。


1. vlan的处理,主要是依靠网卡本身。
   有的网卡不支持vlan,如老的3com网卡3c501。
   intel的ixgb(PRO/10GbE)和e1000(PRO/1000)网卡是支持vlan的。
   其他的一些网卡驱动,从代码上来看,还未完整支持。
   例如,有个网卡驱动(源码文件:drivers\net\spider_net.c),
   vlan相关代码上的注释上说,/* further enhancement... yet to do */


2. 网卡对vlan的处理
   VLAN tag插入/移除 都是由网卡完成的。
   vlan报文的过滤也是由网卡完成的。
   Linux协议栈通过驱动中的接口,注册vlan相关信息。
   驱动再将这些信息写到芯片中。

   因此,网卡驱动从网卡接收队列中收到的报文,已经不带VLAN tag了。

下面是r8169.c网卡驱动收到报文后,做的部分处理。

由于驱动收到的报文,已经不带vlan tag,因此skb->protocol的值就是普通的以太网类型。

skb->protocol = eth_type_trans(skb, dev);

rtl8169_rx_vlan_tag(desc, skb);

if (likely(polling))
napi_gro_receive(&tp->napi, skb);
else
netif_rx(skb);

dev->stats.rx_bytes += pkt_size;
dev->stats.rx_packets++;

再看看rtl8169_rx_vlan_tag干了什么。下面贴出相关代码:

/**
 * __vlan_hwaccel_put_tag - hardware accelerated VLAN inserting
 * @skb: skbuff to tag
 * @vlan_tci: VLAN TCI to insert
 *
 * Puts the VLAN TCI in @skb->vlan_tci and lets the device do the rest
 */
static inline struct sk_buff *__vlan_hwaccel_put_tag(struct sk_buff *skb,
						     u16 vlan_tci)
{
	skb->vlan_tci = VLAN_TAG_PRESENT | vlan_tci;
	return skb;
}

static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)
{
	u32 opts2 = le32_to_cpu(desc->opts2);

	if (opts2 & RxVlanTag)
		__vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));

	desc->opts2 = 0;
}

从注释及代码可以看出,就是将vlan_tci记录到skb中,这样协议栈能知道这个报文的vlan信息,从而进行相应的处理。

因为vlan tag被硬件剥掉了,软件不知道vlan信息,因此这里的代码将剥掉的vlan信息记录到SKB中,供协议栈使用。





3. Linux对vlan报文的处理(VLAN tag已经剥掉了)


   上一步的工作完成后,接下来的工作有两种情况。


   a)报文不是vlan报文,则驱动程序调用netif_receive_skb对报文进行处理。
     其处理流程在《Linux协议栈代码阅读笔记(三)报文接收》中有描述。


   b)报文是vlan报文(不过已经不带VLAN tag了),则驱动程序调用vlan_hwaccel_receive_skb对报文进行处理,vlan tag通过     参数传递给vlan_hwaccel_receive_skb。
     vlan_hwaccel_receive_skb则简单的以如下形式调用__vlan_hwaccel_rx。
     __vlan_hwaccel_rx(skb, grp, vlan_tag, 1);


     __vlan_hwaccel_rx先根据vlan tag为报文做优先级赋值。
     然后将低层代码误以为vlan报文的目的mac不是本机的错误纠正过来。

     接下来,__vlan_hwaccel_rx调用netif_receive_skb。这就将处理流程收敛到与a)相同的路线上去了:)





Linux 网络协议栈开发代码分析篇之VLAN(二)—— Linux下VLAN功能的实现概述 1.Linux网络栈下两层实现 1.1简介     VLAN是网络栈的一个附加功能,且位于下两层。首先来学习Linux中网络栈下两层的实现,再去看如何把VLAN这个功能附加上去。下两层涉及到具体的硬件设备,日趋完善的Linux内核已经做到了很好的代码隔离,对网络设备驱动也是如此,如下图所示: 这里要注意的是,Linux下的网络设备net_dev并不 阅读详情

相关推荐

【Linux4.1.12源码分析】协议栈报文接收之netif_receive_skb函数分析

netif_receive_skb函数是协议栈报文接收的入口,一般由驱动调用,把报文送入协议栈,4.1.12内核做了对sk的封装,目的是什么没还未搞清楚。 1、netif_receive_skb函数 static inline int netif_receive_skb(struct sk_buff *skb) { return netif_receive_skb_sk(skb->sk, s

one_clouder的专栏 1万+

vlan收发处理

转自:http://blog.chinaunix.net/uid/28541347/year-201606-list-1.html VLAN报文格式    基于802.1Q的VLAN帧格式如下: Type:长度为2字节,取值为0x8100,表示此帧的类型为802.1Q Tag帧。 PRI:长度为3比特,可取0~7之间的值,表示帧的优先级,值越...

u014044624的博客 1458

网桥、vlan、源目MAC地址的链路层处理

L2隧道处理则根据所属隧道的目的IP寻找路由,并根据路由结果指示的出接口转发报文;需要注意对于网桥和vlan的上本机的报文,会更新报文的输入接口,由从网卡驱动接收接口改为对应的桥端口或vlan子接口(vlan报文还会去除vlan头),这是因为事实上上层协议栈关心报文的“逻辑”输入接口,而不是“物理”输入接口,这些报文的反向报文也是由上层协议栈发送到桥端口或vlan子接口,再继而转换为其原始的报文输入接口通往网卡驱动,简单的说就是网桥、vlan报文对于上层协议栈可见的是桥端口、vlan子接口。

j简说Linux的博客 1157

Linux VLAN框架及其在Intel网卡I350的实现

一、 科普:什么是VLAN 常提到的VLAN是依据IEEE802.1Q标准定义的,其最核心的概念是所谓的TAG。我们经常提到的TAG,本质上是VLAN字段的VID字段。下面贴出VLAN的字段含义:

sordyz的专栏 3664

linux网络协议栈__netif_receive_skb_core

static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc) { struct packet_type *ptype, *pt_prev; rx_handler_func_t *rx_handler; struct net_device *orig_dev; bool deliver_exact = false; int ret = NET_RX_DROP; __be16 type; net_timest.

徐维溢的博客 2191

linux内核协议栈 协议栈收包入口 netif_receive_skb

目录 1 协议栈入口__netif_receive_skb_core() 2 vlan 操作 2.1 vlan报文信息struct vlan_hdr 2.2 vlan 剥离 vlan_untag() 2.3 vlan 添加eth_type_trans() 3 三层协议处理钩子注册 3.1 各种三层协议处理函数注册过程 3.2桥处理函数注册 网络收包流程从网卡驱动开始,一直往上,涉及NAPI、GRO、RPS等特性,通常是经过硬件中断后在经由软中断处理,在内核软中断的最后一步就是调用...

4591

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

使用vconfig或者ip命令创建的802.1q虚拟设备,并不会负责vlan标签的剥离和添加。其操作位于数据包的接收和发送流程中。vconfig add eth0 10或者ip link add link eth0 eth0.10 type vlan id 10vlan标签的剥离是在数据包接收函数__netif_receive_skb_core中处理,skb_vlan_untag函数最终执行unt...

redwingz的博客 1万+

kernel网络之协议栈入口

kernel网络协议栈入口

fengcai_ke的博客 1139

linux中vlan隔离网络原理

Linux 内核通过VLAN 虚拟设备802.1Q 标签处理和桥接过滤实现 VLAN 隔离。核心代码分布在net/8021q/和接收路径:通过 VLAN ID 匹配目标虚拟设备。发送路径:插入 VLAN 标签后通过物理设备发送。隔离机制:不同 VLAN 的虚拟设备和过滤规则确保广播域隔离。

我觉得你很6 2161

Linux 操作系统原理 — 内核协议栈收包/发包流程

INET socket 层会调用具体传输层协议的 write 函数,该函数是通过调用本层的 inet_send() 来实现的,inet_send() 的 UDP 协议对应的函数为 udp_write()。:udp_write() 调用本层的 udp_sendto() 完成功能。在具体的实现中,poll() 会轮训检查 BDT Entries 的状态,如果发现当前 BDT 指针指向的 Entry Ready,则将该 Entry 对应的 sk_buff 取出来,并恢复该 Entry 的空闲状态。

烟云的计算 3436

顺序功能图基本结构

顺序功能图(Sequential Function Chart,SFC)是一种用于描述工业控制系统中顺序控制流程的图形化编程语言,广泛应用于PLC(可编程逻辑控制器)编程。其核心思想是将复杂的控制流程分解为多个有序的步骤,通过逻辑条件实现步骤间的切换。顺序功能图通过图形化的方式简化了复杂控制逻辑的设计,尤其适用于需要严格顺序控制的工业自动化场景。[初始步] → 转换条件1 → [步1] → 转换条件2 → [步2] → ...[步X] → → [步B] → 转换条件B → → [合并步]

ayingqin1的博客 1227

Linux vlan 功能模块分析

Vlan即虚拟局域网,一个vlan能够模拟一个常规的交换网络,实现了将一个物理的交换机划分成多个逻辑的交换网络。而不同的vlan之间如果要进行通信就要通过三层协议来实现。   在linux中vlan的配置使用vconfig,使用vconfig配置一个交换网络,大致的流程如下:   #  # vconfig add eth0 100 #  # ifconfig eth0.100 up

lickylin的专栏 1万+

【脑电信号处理与特征提取】P2-夏晓磊:脑电的神经起源与测量

ElectroEncephaloGraphyTherefore, EEG produces a graphed representation of the electrical activity occurring in a person’s brain.(把一个人的大脑中的电活动画出来)脑电头皮表面记录到的大脑活动产生的电信号(微伏)。(记录位置:硬脑膜/大脑皮层表面- ECoG,神经元群- LFP与MUR/MUA:活动位置:心电、眼电、肌电等)脑电图电压随时间变化的波形图。

m0_51474171的博客 1895

Linux 网络协议栈开发代码分析篇之VLAN(三)—— VLAN收发处理

转自:http://blog.chinaunix.net/uid/28541347/year-201606-list-1.html VLAN报文格式    基于802.1Q的VLAN帧格式如下: Type:长度为2字节,取值为0x8100,表示此帧的类型为802.1Q Tag帧。 PRI:长度为3比特,可取0~7之间的值,表示帧的优先级,值越大优

知秋一叶 1万+

从STM32F411到华大HC32F460:一个真实项目移植的踩坑与填坑全记录

本文详细记录了从STM32F411移植到华大HC32F460芯片的全过程,包括开发环境搭建、时钟树配置、中断处理、外设驱动、看门狗陷阱、Flash操作和低功耗设计等关键坑点及解决方案。特别针对HC32F460的200MHz主频、双PLL架构和HSRUN模式等特性进行了深入分析,为工程师提供实用的移植指南,帮助节省大量调试时间。

weixin_33691817的博客 420

AI开发提效10倍:从需求到部署的全流程实战指南(附Prompt模板)

用AI开发不是“偷懒”,而是把时间花在更有价值的地方——原来花80%时间写重复代码,现在用AI搞定后,能把精力放在“优化用户体验”“提升系统性能”这些核心工作上,这才是AI给开发者的真正红利。如果你还没开始用AI做开发,建议从“写一个简单接口”“补一段注释”开始尝试,先用起来再优化方法。记住:AI是工具,不是对手,学会驾驭它,你会发现开发效率提升的同时,还能告别无效加班。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1532

linux网络协议栈(四)链路层 (5)vlan处理

4.6、VLAN处理: 4.6.1、vlan原理 对于带vlan的以太网报文,其以太网类型为0x8100,所以链路层中对于带vlan报文的处理就是对于以太网类型为0x8100的报文的处理; vlan,用于在链路层划分广播域,实现数据在链路层分流,在二层交换机中,vlan实际行使其功能是体现在uni端口上,通过在端口上配置能通过哪些vlan,实现不同的端口可以通行不同的数据流,比如二层交换机的

u010246947的专栏 3167

直流电源EMI滤波器设计实战:从器件选型到PCB布局的完整指南

本文提供了一份直流电源EMI滤波器的完整实战设计指南。针对EMI噪声超标问题,文章深入剖析了差模与共模噪声的抑制原理,详细讲解了从电路拓扑、核心器件(如X/Y电容、共模电感)的选型计算,到决定性能成败的PCB布局艺术。重点强调了低阻抗路径、干净接地及输入输出隔离等关键布局原则,并分享了常见的调试坑点与排查方法,旨在帮助硬件工程师设计出真正有效的滤波器,确保电源系统通过EMC测试。

q9r0s的博客 644

linux网络协议栈(四)链路层 vlan处理

转:http://blog.youkuaiyun.com/u010246947/article/details/18224517 4.6、VLAN处理: 4.6.1、vlan原理 对于带vlan的以太网报文,其以太网类型为0x8100,所以链路层中对于带vlan报文的处理就是对于以太网类型为0x8100的报文的处理; vlan,用于在链路层划分广播域,实现数据在链路层分流,在二层交换机中,vlan实际...

weixin_30344131的博客 277

一文搞定学术英语写作 (斯坦福SCI论文写作课程笔记)

0.前言: 本文基于斯坦福Kristin Sainani 教授的学术论文写作公开课——SCI论文写作(Writing in the Sciences)。在此基础上进行章节顺序的重排及部分内容的删减,以方便第一次进行英语学术论文写作的同学快速上手。 时间充足和想要系统学习英文学术写作的同学,十分建议观看完整课程视频,一定会受益匪浅!课程地址如下: 课程B站地址:https://www.bilibili.com/video/BV1zv41177JQ 1.论...

Ogmx的博客 3万+

Adams Car——Adams car与Simulink联合仿真

Adams与simulink悬架联合仿真

Mr.邹的博客 2127

Linux VLAN

Linux下VLAN功能的实现概述 数据包VLAN标签的剥离和添加 VLAN数据包接收流程 linux内核中VLAN收发处理

u014044624的博客 335

CH7034B显示模块原理图设计,已量产

显示桥接板的价值,不在于简单把 RGB 排线换成另一种接口,而在于能否把并行视频、时钟、显示控制、模拟输出和辅助配置同时组织成稳定系统。当前这张 CH7034B 原理图就是这种思路:U3 CH7034B 作为核心桥接芯片,输入侧是 LCD_R0~R7、LCD_G0~G7、LCD_B0~B7、LCD_DE、LCD_HSYNC、LCD_VSYNC、LCD_CLK 与 LCD_BL,输出侧则通过 DAC0~DAC2 和 DDC_SC/DDC_SD 形成模拟显示接口边界。

不脱发的程序猿 165

linux 内核 vlan,Linux内核vlan学习笔记

一、前言前几天做协议划分vlan的时候看了一些linux内核,了解不深,整理了下vlan相关部分的学习笔记,如果有理解上的错误,欢迎指正,以下代码来自于2.6.14-triny(PPC架构)。VLAN(Virtual Local Area Network)的中文名为"虚拟局域网"。VLAN是一种将局域网设备从逻辑上划分成一个个网段,从而实现虚拟工作组的新兴数据交换技术。IEEE于1999年颁布了用...

weixin_30980893的博客 622

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

vlan 介绍

简介 在Linux中安装了802.1Q标签VLAN功能。VLAN是虚拟分配以太网的功能。 使用VLAN ID从物理上将一个以太网分割开。在VLAN环境下,具有相同VLAN ID 就可以相互通信,但是即使将LAN线连接到相同集线器或交换机上,VLAN ID不同 也不能相互通信。 802.1Q的以太帧格式 由上图,唯一的变化是加入了一对2字节字段。第一个2字节...

weixin_33965305的博客 149

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: Linux协议栈代码阅读笔记(三)报文接收
下一篇: 用户态程序如何判断一段虚地址空间是否有效
无忧老猪
博客等级 码龄18年 200粉丝 112原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值