openvswitch: Add support for matching on OAM packets.
Some tunnel formats have mechanisms for indicating that packets are OAM frames that should be handled specially (either as high priority or not forwarded beyond an endpoint). This provides support for allowing those types of packets to be matched. Signed-off-by: Jesse Gross <jesse@nicira.com> Signed-off-by: Andy Zhou <azhou@nicira.com> Acked-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0714812134
commit
67fa034194
3 changed files with 14 additions and 5 deletions
|
@ -309,6 +309,7 @@ enum ovs_tunnel_key_attr {
|
|||
OVS_TUNNEL_KEY_ATTR_TTL, /* u8 Tunnel IP TTL. */
|
||||
OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT, /* No argument, set DF. */
|
||||
OVS_TUNNEL_KEY_ATTR_CSUM, /* No argument. CSUM packet. */
|
||||
OVS_TUNNEL_KEY_ATTR_OAM, /* No argument. OAM frame. */
|
||||
__OVS_TUNNEL_KEY_ATTR_MAX
|
||||
};
|
||||
|
||||
|
|
|
@ -369,6 +369,7 @@ static size_t key_attr_size(void)
|
|||
+ nla_total_size(1) /* OVS_TUNNEL_KEY_ATTR_TTL */
|
||||
+ nla_total_size(0) /* OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT */
|
||||
+ nla_total_size(0) /* OVS_TUNNEL_KEY_ATTR_CSUM */
|
||||
+ nla_total_size(0) /* OVS_TUNNEL_KEY_ATTR_OAM */
|
||||
+ nla_total_size(4) /* OVS_KEY_ATTR_IN_PORT */
|
||||
+ nla_total_size(4) /* OVS_KEY_ATTR_SKB_MARK */
|
||||
+ nla_total_size(12) /* OVS_KEY_ATTR_ETHERNET */
|
||||
|
|
|
@ -346,6 +346,7 @@ static int ipv4_tun_from_nlattr(const struct nlattr *attr,
|
|||
[OVS_TUNNEL_KEY_ATTR_TTL] = 1,
|
||||
[OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT] = 0,
|
||||
[OVS_TUNNEL_KEY_ATTR_CSUM] = 0,
|
||||
[OVS_TUNNEL_KEY_ATTR_OAM] = 0,
|
||||
};
|
||||
|
||||
if (type > OVS_TUNNEL_KEY_ATTR_MAX) {
|
||||
|
@ -390,6 +391,9 @@ static int ipv4_tun_from_nlattr(const struct nlattr *attr,
|
|||
case OVS_TUNNEL_KEY_ATTR_CSUM:
|
||||
tun_flags |= TUNNEL_CSUM;
|
||||
break;
|
||||
case OVS_TUNNEL_KEY_ATTR_OAM:
|
||||
tun_flags |= TUNNEL_OAM;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -431,21 +435,24 @@ static int ipv4_tun_to_nlattr(struct sk_buff *skb,
|
|||
nla_put_be64(skb, OVS_TUNNEL_KEY_ATTR_ID, output->tun_id))
|
||||
return -EMSGSIZE;
|
||||
if (output->ipv4_src &&
|
||||
nla_put_be32(skb, OVS_TUNNEL_KEY_ATTR_IPV4_SRC, output->ipv4_src))
|
||||
nla_put_be32(skb, OVS_TUNNEL_KEY_ATTR_IPV4_SRC, output->ipv4_src))
|
||||
return -EMSGSIZE;
|
||||
if (output->ipv4_dst &&
|
||||
nla_put_be32(skb, OVS_TUNNEL_KEY_ATTR_IPV4_DST, output->ipv4_dst))
|
||||
nla_put_be32(skb, OVS_TUNNEL_KEY_ATTR_IPV4_DST, output->ipv4_dst))
|
||||
return -EMSGSIZE;
|
||||
if (output->ipv4_tos &&
|
||||
nla_put_u8(skb, OVS_TUNNEL_KEY_ATTR_TOS, output->ipv4_tos))
|
||||
nla_put_u8(skb, OVS_TUNNEL_KEY_ATTR_TOS, output->ipv4_tos))
|
||||
return -EMSGSIZE;
|
||||
if (nla_put_u8(skb, OVS_TUNNEL_KEY_ATTR_TTL, output->ipv4_ttl))
|
||||
return -EMSGSIZE;
|
||||
if ((output->tun_flags & TUNNEL_DONT_FRAGMENT) &&
|
||||
nla_put_flag(skb, OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT))
|
||||
nla_put_flag(skb, OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT))
|
||||
return -EMSGSIZE;
|
||||
if ((output->tun_flags & TUNNEL_CSUM) &&
|
||||
nla_put_flag(skb, OVS_TUNNEL_KEY_ATTR_CSUM))
|
||||
nla_put_flag(skb, OVS_TUNNEL_KEY_ATTR_CSUM))
|
||||
return -EMSGSIZE;
|
||||
if ((output->tun_flags & TUNNEL_OAM) &&
|
||||
nla_put_flag(skb, OVS_TUNNEL_KEY_ATTR_OAM))
|
||||
return -EMSGSIZE;
|
||||
|
||||
nla_nest_end(skb, nla);
|
||||
|
|
Loading…
Reference in a new issue