vlan处理


struct sk_buff *vlan_untag(struct sk_buff *skb)
{
    struct vlan_hdr *vhdr;
    u16 vlan_tci; 

    // 检查VLAN_TAG_PRESENT标志 
    // 如果已经设置,说明VLAN已被处理 
    // 本函数最后也会设置此标志
    if (unlikely(vlan_tx_tag_present(skb))) {
        /* vlan_tci is already set-up so leave this for another time */
        return skb;
    }
 
    // 检查skb是否被共享,如果是,克隆一份
    skb = skb_share_check(skb, GFP_ATOMIC);
    if (unlikely(!skb))
        goto err_free; 

    // 长度检查
    if (unlikely(!pskb_may_pull(skb, VLAN_HLEN)))
        goto err_free; 

    // vhdr赋值
    vhdr = (struct vlan_hdr *)skb->data;
    vlan_tci = ntohs(vhdr->h_vlan_TCI); 

    // 设置VLAN_TAG_PRESENT标志及skb->vlan_tci
    __vlan_hwaccel_put_tag(skb, vlan_tci); 

    // 提取vlan头部并更新接收校验和
    skb_pull_rcsum(skb, VLAN_HLEN); 

    // 将skb的协议字段设置为h_vlan_encapsulated_proto
    vlan_set_encap_proto(skb, vhdr); 

    // 修改skb->data/mac_header/mac_header_len,移除vlan
    skb = vlan_reorder_header(skb);
    if (unlikely(!skb))
        goto err_free; 

    // network_header = skb->data
    skb_reset_network_header(skb);
    skb_reset_transport_header(skb);

    return skb;

err_free:
    kfree_skb(skb);
    return NULL;
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值