本篇分析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 change back to
* original

本文聚焦于OVS2.5.0中OVS_ACTION_ATTR_PUSH_VLAN行动的详细分析,探讨了push_vlan处理函数的作用及其实现过程。
最低0.47元/天 解锁文章
546

被折叠的 条评论
为什么被折叠?



