机顶盒+AP 根据VLAN进行数据分流 技术实现

本文详细介绍了Linux内核如何处理VLAN数据,包括VLAN初始化、数据处理流程,重点解析了vlan_skb_recv函数,阐述了如何根据VLAN ID进行数据分流,并通过实例说明了对不同VLAN ID的数据包如何处理,实现数据的正确转发。
摘要由CSDN通过智能技术生成

一、 Linux对VLAN数据的处理

(1)VLAN初始化

static struct packet_type vlan_packet_type __read_mostly = {

.type =cpu_to_be16(ETH_P_8021Q),

.func = vlan_skb_recv, /*VLAN receive method */

};

 

vlan_proto_init调用dev_add_pack(&vlan_packet_type)函数进行VLAN的注册,把ETH_P_8021Q 处理函数挂在ptype_base下,即数据接收的VLAN的入口函数为vlan_skb_recv

 

(2)VLAN数据处理

     内核中的vlan模块就是工作在协议栈里,通过注册dev_add_pack注册了8021Q的协议类型,netif_receive_skb->__netif_receive_skb遍历所有的协议类型时发现了它,于是进入了vlan的接收函数vlan_skb_recv(vlan_dev.c),这个函数里剥离vlan层,重置以太网层的proto,重新调用netif_rx进入真正的协议栈处理流程。

对于Linux,无论什么数据包通过网卡驱动后都会进入__netif_receive_skb函数。该函数中对VLAN的处理如下:

static int__netif_receive_skb(struct sk_buff *skb)

{

     … …

 

     //遍历ptye_all链表

     list_for_each_entry_rcu(ptype, &ptype_all,list) {

         if (ptype->dev == null_or_orig || ptype->dev ==skb->dev ||

             ptype->dev ==orig_dev) {

              if (pt_prev)

                   ret = deliver_skb(skb, pt_prev, orig_dev);

              pt_prev = ptype;

         }

     }

 

… …

 

     // bridge逻辑

     /* Handle special case of bridge or macvlan */

     rx_handler = rcu_dereference(skb->dev->rx_handler);

     if (rx_handler) {

         if (pt_prev) {

              ret = deliver_skb(skb, pt_prev, orig_dev);

              pt_prev &

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值