免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8357 | 回复: 5
打印 上一主题 下一主题

[网络子系统] 8021q中的VLAN_FLAG_REORDER_HDR表示什么含义呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-29 23:42 |只看该作者 |倒序浏览
本帖最后由 lofeng410 于 2012-05-29 23:43 编辑

内核版本:2.6.32

对于vlan,有这么两种flag
enum vlan_flags {
        VLAN_FLAG_REORDER_HDR        = 0x1,
        VLAN_FLAG_GVRP                = 0x2,
};


对于VLAN_FLAG_GVRP,网上搜集到资料表示其用于GVRP实现动态分发、注册和传播VLAN属性,从而达到减少网络管理员的手工配置量及保证VLAN配置正确的目
的。

但是对于VLAN_FLAG_REORDER_HDR这个标志,就很困惑其作用。
在vconfig add添加vlan设备时,vlan_flag默认被设置为VLAN_FLAG_REORDER_HDR,而在vlan发送函数中,如果发现vlan_flag为该值,则就添加vlan tag,而不管该报文是否已经包含vlan tag。这个是为何呢?不太明白这样处理的原因。还请大侠解惑,多谢。


static int vlan_ioctl_handler(struct net *net, void __user *arg)
{
。。。。。。
        case ADD_VLAN_CMD:
                err = -EPERM;
                if (!capable(CAP_NET_ADMIN))
                        break;
                err = register_vlan_device(dev, args.u.VID);
                break;
。。。。。。
}
static int register_vlan_device(struct net_device *real_dev, u16 vlan_id)
{
。。。。。
        vlan_dev_info(new_dev)->flags = VLAN_FLAG_REORDER_HDR;
。。。。。。
}
而在发送时,vlan_dev_hard_start_xmit函数中:
static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
                                            struct net_device *dev)
{
。。。。。。
        /* Handle non-VLAN frames if they are sent to us, for example by DHCP.
         *
         * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING
         * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...
         */
        if (veth->h_vlan_proto != htons(ETH_P_8021Q) ||
            vlan_dev_info(dev)->flags & VLAN_FLAG_REORDER_HDR)
{//就算已经包含了vlan tag,但是还是会被再次添加vlan tag。或的第一个条件都可以直接删除了
                unsigned int orig_headroom = skb_headroom(skb);
                u16 vlan_tci;

                vlan_dev_info(dev)->cnt_encap_on_xmit++;

                vlan_tci = vlan_dev_info(dev)->vlan_id;
                vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
                skb = __vlan_put_tag(skb, vlan_tci);
                if (!skb) {
                        txq->tx_dropped++;
                        return NETDEV_TX_OK;
                }

                if (orig_headroom < VLAN_HLEN)
                        vlan_dev_info(dev)->cnt_inc_headroom_on_tx++;
        }
。。。。。。
}

论坛徽章:
0
2 [报告]
发表于 2012-05-30 22:26 |只看该作者
        if (veth->h_vlan_proto != htons(ETH_P_8021Q) ||
            vlan_dev_info(dev)->flags & VLAN_FLAG_REORDER_HDR) {//就算已经包含了vlan tag,但是还是会被再次添加vlan tag。或的第一个条件都可以直接删除了


不是很明显了吗 如果不是VLAN  或是 FLAG 有被设定成VLAN_FLAG_REORDER_HDR  就贴VLAN TAG
已经有TAG 在进来这里 当然就贴两次??

论坛徽章:
0
3 [报告]
发表于 2012-05-31 10:23 |只看该作者
回复 2# dspecialtwo
    关键是这个flag添加vlan就被设置为VLAN_FLAG_REORDER_HDR,都这样设置了这里if条件中加判断有何意义呢

论坛徽章:
0
4 [报告]
发表于 2012-06-01 23:22 |只看该作者
用vconfig可以改变vlan接口上的VLAN_FLAG_REORDER_HDR标志。

论坛徽章:
0
5 [报告]
发表于 2012-06-02 21:57 |只看该作者
回复 4# MoWaters

我使用的2.6.32内核,不行的呀,只有add时默认设置这个标识,其他地方都没有赋值操作了
   

论坛徽章:
0
6 [报告]
发表于 2012-06-03 09:29 |只看该作者
回复 5# lofeng410

可以的呀,用vconfig set_flag 可以改变,内核对应处理函数vlan_dev_change_flags,你再仔细看看。

下面是个例子,看REORDER_HDR 字段的值。
root@chao-machine:/# cat /proc/net/vlan/eth1.100
eth1.100  VID: 100       REORDER_HDR: 1  dev->priv_flags: 1 

root@chao-machine:/# vconfig set_flag eth1.100 1 0
Set flag on device -:eth1.100:- Should be visible in /proc/net/vlan/eth1.100

root@chao-machine:/# cat /proc/net/vlan/eth1.100  
eth1.100  VID: 100       REORDER_HDR: 0  dev->priv_flags: 1


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP