本篇分析OVS_ACTION_ATTR_POP_VLAN action的处理函数pop_vlan。
1、pop_vlan函数
static int pop_vlan(struct sk_buff *skb, struct sw_flow_key *key)
{
int err;
err = skb_vlan_pop(skb);
if (skb_vlan_tag_present(skb)) //如果还存在vlan,则设置key的报文类型为0
invalidate_flow_key(key);
else
key->eth.tci = 0; //设置key的tci为0
return err;
}
2、skb_vlan_pop函数
#define skb_vlan_pop rpl_skb_vlan_pop
int rpl_skb_vlan_pop(struct sk_buff *skb)
{
u16 vlan_tci;
__be16 vlan_proto;
int err;
if (likely(skb_vlan_tag_present(skb))) { //如果skb的vlan_tci非0,直接设置该值为0
skb->vlan_tci = 0;
} else {
if (unlikely((skb->protocol != htons(ETH_P_8021Q) &&
skb->protocol != htons(ETH_P_8021AD)) ||
skb->len < VLAN_ETH_HLEN))
return 0;
err = __skb_vlan_pop(skb, &vlan_tci); //skb报文pop vlan,修改报文数据
if (err)
return err;