本篇分析OVS_ACTION_ATTR_PUSH_VLAN action,该action的处理函数为push_vlan。
1、push_vlan函数
static int push_vlan(struct sk_buff *skb, struct sw_flow_key *key,
const struct ovs_action_push_vlan *vlan)
{
if (skb_vlan_tag_present(skb)) //如果报文已经包含vlan
invalidate_flow_key(key); //设置key的以太报文类型为0
else
key->eth.tci = vlan->vlan_tci; //设置key的报文tci值
return skb_vlan_push(skb, vlan->vlan_tpid, //添加vlan信息
ntohs(vlan->vlan_tci) & ~VLAN_TAG_PRESENT);
}
2、skb_vlan_push函数
#define skb_vlan_push rpl_skb_vlan_push
int rpl_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci)
{
if (skb_vlan_tag_present(skb)) { //如果报文已经有vlan信息
unsigned int offset = skb->data - skb_mac_header(skb); //计算data与mac之间的offset
int err;
/* __vlan_insert_tag expect skb->data pointing to mac header.
* So change skb->data before calling it and cha