- 论坛徽章:
- 0
|
本帖最后由 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++;
}
。。。。。。
} |
|