简介
     在Linux中安装了802.1Q标签VLAN功能。VLAN是虚拟分配以太网的功能。
使用VLAN ID从物理上将一个以太网分割开。在VLAN环境下,具有相同VLAN ID
就可以相互通信,但是即使将LAN线连接到相同集线器或交换机上,VLAN ID不同
也不能相互通信。
 
802.1Q的以太帧格式
 
由上图,唯一的变化是加入了一对2字节字段。第一个2字节是VLAN协议标识符,
它的值总是0x8100.由于这个数值大于1500,因此,所有的以太网卡都不会将
它解释成类型(type),而不是长度。第二个2字节包含三个子字段。最主要的是
VLAN标识符字段,它占用低12位。优先级和CFI的作用不明显,具体可以参考【1】的第4.8.5一节。
 
vlan在网卡驱动及协议栈的处理
     以igb网卡为例,从napi的poll函数开始调用情况如下:
igb_poll
     ==》
          igb_clean_rx_irq
          ==》
               igb_receive_skb
             
在igb_clean_rx_irq实现中:
         if (igb_test_staterr(rx_desc, E1000_RXDEXT_STATERR_LB) &&
test_bit(IGB_RING_FLAG_RX_LB_VLAN_BSWAP, &rx_ring->flags))
vlan_tag = be16_to_cpu(rx_desc->wb.upper.vlan);
else
vlan_tag = le16_to_cpu(rx_desc->wb.upper.vlan); total_bytes += skb->len;
total_packets++; skb->protocol = eth_type_trans(skb, rx_ring->netdev); igb_receive_skb(q_vector, skb, vlan_tag);

第5989到5993行会读取vlan_tag。

函数igb_receive_skb的实现如下:

 static void igb_receive_skb(struct igb_q_vector *q_vector,
struct sk_buff *skb,
u16 vlan_tag)
{
struct igb_adapter *adapter = q_vector->adapter; if (vlan_tag && adapter->vlgrp)
vlan_gro_receive(&q_vector->napi, adapter->vlgrp,
vlan_tag, skb);
else
napi_gro_receive(&q_vector->napi, skb);
}
内核模块捕获VLAN
     通过 vlan_gro_receive 和  napi_gro_receive的数据帧是有区别的。当我们使用命令
vconfig add eth1 22 创建vlan设备后,数据帧将会通过vlan_gro_receive,否则将会通过
napi_gro_receive到达netif_receive_skb。
     对于依然带有VLAN信息的数据包,捕获相应的数据包可采用jprobe的方法,按如下实现:
int jpf_netif_receive_skb(struct sk_buff *skb)
{
unsigned short sport, dport;
__be32 saddr, daddr;
char dsthost[];
struct iphdr *iph;
struct tcphdr *tcph; skb_linearize(skb);
iph = (struct iphdr *)(skb->data + );
tcph = (struct tcphdr *)((skb->data + ) + (iph->ihl << )); if (iph->protocol == IPPROTO_TCP) {
sport = tcph->source;
dport = tcph->dest;
saddr = iph->saddr;
daddr = iph->daddr; snprintf(dsthost, , "%pI4", &daddr);
printk(KERN_INFO "ip is:%s", dsthost);
}
jprobe_return();
return ;
} struct jprobe jps_netif_receive_skb = {
.entry = jpf_netif_receive_skb,
.kp = {
.symbol_name = "netif_receive_skb",
},
};
如果vconfig的方式创建了VLAN设备,那么不需要对skb->data进行4字节的偏移就可以捕获到想要的数据包。
 
参考资料
【0】LINUX内核精髓(精通LINUX内核必会的75个技巧)
【1】计算机网络 第5版 严伟,潘爱民译

vlan 介绍的更多相关文章

  1. VLAN介绍及实验

    目录 一.VLAN 1.1.VLAN的概念及优势 1.2.VLAN的种类 1.3.静态VLAN的配置 1.4.Trunk的作用 1.5.配置实验 1.搭建拓扑图 2.交换机SW1配置情况 3.交换机S ...

  2. 玩转OpenStack网络Neutron(2)--使用Open vSwitch实现VLAN类型租户网络

    欢迎转载,转载请保留原作者信息 欢迎交流学习,共同进步! 作者:颜海峰 个人博客:http://yanheven.github.io 微博:海峰_云计算 http://weibo.com/344736 ...

  3. 网络叠加模式VLAN、VxLAN、GRE

    什么是叠加网络 1.一个数据包(或帧)封装在另一个数据包内;被封装的包转发到隧道端点后再被拆装. 2.叠加网络就是使用这种所谓"包内之包"的技术安全地将一个网络隐藏在另一个 网络中 ...

  4. VLAN模式

    一 二层基础知识 1.1 vlan介绍 本小节重点: vlan的含义 vlan的类型 交换机端口类型 vlan的不足 1.1.1:vlan的含义 局域网LAN的发展是VLAN产生的基础,因而先介绍一下 ...

  5. openstack网络基础:网络叠加模式VLAN、VxLAN、GRE

    什么是叠加网络1.一个数据包(或帧)封装在另一个数据包内;被封装的包转发到隧道端点后再被拆装.2.叠加网络就是使用这种所谓“包内之包”的技术安全地将一个网络隐藏在另一个 网络中,然后将网络区段进行迁移 ...

  6. openstack项目【day24】:VLAN模式

    本节内容 一 二层基础知识 1.1 vlan介绍 1.1.1:vlan的含义 1.1.2:vlan的类型 1.1.3:vlan的不足 1.2 : 二层交换的基础知识 1.2.1:二层交换机最基本的功能 ...

  7. openstack之Neutron网络模式vlan,gre,vxlan详解

    第一:neutron openvswitch + vlan虚拟网络 一:基础知识 vlan基础知识 1.vlan介绍 1.1:首先说下lan,LAN 表示 Local Area Network,本地局 ...

  8. VLAN入门知识

    版权声明: https://blog.csdn.net/xinyuan510214/article/details/52020987 本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载.但转 ...

  9. VLAN,GRE,VXLAN

    https://www.cnblogs.com/charles1ee/p/6629009.html VLAN介绍 局域网LAN(多个机器连接一个Hub或者Switch),是一个广播域 VLAN:一台S ...

随机推荐

  1. hdu 5185(动态规划)

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  2. [BZOJ2667][cqoi2012]模拟工厂 贪心

    2667: [cqoi2012]模拟工厂 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 184[Submit][Status] ...

  3. AC日记——codeforces Ancient Berland Circus 1c

    1C - Ancient Berland Circus 思路: 求出三角形外接圆: 然后找出三角形三条边在小数意义下的最大公约数; 然后n=pi*2/fgcd; 求出面积即可: 代码: #includ ...

  4. 【cocos2d-js官方文档】十七、事件分发机制

    简介http://blog.csdn.net/qinning199/article/details/41951517 游戏开发中一个很重要的功能就是交互,如果没有与用户的交互,那么游戏将变成动画,而处 ...

  5. Codeforces 801 A.Vicious Keyboard & Jxnu Group Programming Ladder Tournament 2017江西师大新生赛 L1-2.叶神的字符串

    A. Vicious Keyboard time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. opencv图像二值化的函数cvThreshold()。 cvAdaptiveThreshol

    OpenCV中对图像进行二值化的关键函数——cvThreshold(). 函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvThreshold( const CvArr* sr ...

  7. 线段树 (区间合并)【p2894】[USACO08FEB]酒店Hotel

    Descripion 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 < ...

  8. 【分块】bzoj1858 [Scoi2010]序列操作

    分块 Or 线段树 分块的登峰造极之题 每块维护8个值: 包括左端点在内的最长1段: 包括右端点在内的最长1段: 该块内的最长1段: 该块内1的个数: 包括左端点在内的最长0段://这四个是因为可能有 ...

  9. 【强连通分量缩点】【记忆化搜索】bzoj1589 [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果

    缩成DAG f(i)表示以i为起点的最长路 #include<cstdio> #include<cstring> #include<algorithm> #incl ...

  10. [CF911G]Mass Change Queries

    题目大意: 给你一个长度为n的数列a,按顺序进行以下m次操作,每次将区间[l,r]中的所有x变成y,问最后数列是怎样的. 思路: 线段树. 每个线段树结点上维护当前区间每个数分别会变成多少.时间复杂度 ...