History

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.

Jesse Gross committed 12 years ago

Commit 67fa0341 parent 07148123 files · +14 −5Browse files

Unified · Split

3 files
  1. include/uapi/linux/openvswitch.h +1 −0
  2. net/openvswitch/datapath.c +1 −0
  3. net/openvswitch/flow_netlink.c +12 −5
include/uapi/linux/openvswitch.h+1−0
@@ -309,6 +309,7 @@ enum ovs_tunnel_key_attr { · 308 unmodified lines
309 OVS_TUNNEL_KEY_ATTR_TTL, /* u8 Tunnel IP TTL. */309 OVS_TUNNEL_KEY_ATTR_TTL, /* u8 Tunnel IP TTL. */
310 OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT, /* No argument, set DF. */310 OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT, /* No argument, set DF. */
311 OVS_TUNNEL_KEY_ATTR_CSUM, /* No argument. CSUM packet. */311 OVS_TUNNEL_KEY_ATTR_CSUM, /* No argument. CSUM packet. */
312 OVS_TUNNEL_KEY_ATTR_OAM, /* No argument. OAM frame. */
312 __OVS_TUNNEL_KEY_ATTR_MAX313 __OVS_TUNNEL_KEY_ATTR_MAX
313};314};
314 315
net/openvswitch/datapath.c+1−0
@@ -369,6 +369,7 @@ static size_t key_attr_size(void) · 368 unmodified lines
369 + nla_total_size(1) /* OVS_TUNNEL_KEY_ATTR_TTL */369 + nla_total_size(1) /* OVS_TUNNEL_KEY_ATTR_TTL */
370 + nla_total_size(0) /* OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT */370 + nla_total_size(0) /* OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT */
371 + nla_total_size(0) /* OVS_TUNNEL_KEY_ATTR_CSUM */371 + nla_total_size(0) /* OVS_TUNNEL_KEY_ATTR_CSUM */
372 + nla_total_size(0) /* OVS_TUNNEL_KEY_ATTR_OAM */
372 + nla_total_size(4) /* OVS_KEY_ATTR_IN_PORT */373 + nla_total_size(4) /* OVS_KEY_ATTR_IN_PORT */
373 + nla_total_size(4) /* OVS_KEY_ATTR_SKB_MARK */374 + nla_total_size(4) /* OVS_KEY_ATTR_SKB_MARK */
374 + nla_total_size(12) /* OVS_KEY_ATTR_ETHERNET */375 + nla_total_size(12) /* OVS_KEY_ATTR_ETHERNET */
net/openvswitch/flow_netlink.c+12−5
@@ -346,6 +346,7 @@ static int ipv4_tun_from_nlattr(const struct nlattr *attr, · 345 unmodified lines
346 [OVS_TUNNEL_KEY_ATTR_TTL] = 1,346 [OVS_TUNNEL_KEY_ATTR_TTL] = 1,
347 [OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT] = 0,347 [OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT] = 0,
348 [OVS_TUNNEL_KEY_ATTR_CSUM] = 0,348 [OVS_TUNNEL_KEY_ATTR_CSUM] = 0,
349 [OVS_TUNNEL_KEY_ATTR_OAM] = 0,
349 };350 };
350 351
351 if (type > OVS_TUNNEL_KEY_ATTR_MAX) {352 if (type > OVS_TUNNEL_KEY_ATTR_MAX) {
@@ -390,6 +391,9 @@ static int ipv4_tun_from_nlattr(const struct nlattr *attr, · 38 unmodified lines
390 case OVS_TUNNEL_KEY_ATTR_CSUM:391 case OVS_TUNNEL_KEY_ATTR_CSUM:
391 tun_flags |= TUNNEL_CSUM;392 tun_flags |= TUNNEL_CSUM;
392 break;393 break;
394 case OVS_TUNNEL_KEY_ATTR_OAM:
395 tun_flags |= TUNNEL_OAM;
396 break;
393 default:397 default:
394 return -EINVAL;398 return -EINVAL;
395 }399 }
@@ -431,21 +435,24 @@ static int ipv4_tun_to_nlattr(struct sk_buff *skb, · 35 unmodified lines
431 nla_put_be64(skb, OVS_TUNNEL_KEY_ATTR_ID, output->tun_id))435 nla_put_be64(skb, OVS_TUNNEL_KEY_ATTR_ID, output->tun_id))
432 return -EMSGSIZE;436 return -EMSGSIZE;
433 if (output->ipv4_src &&437 if (output->ipv4_src &&
434 nla_put_be32(skb, OVS_TUNNEL_KEY_ATTR_IPV4_SRC, output->ipv4_src))438 nla_put_be32(skb, OVS_TUNNEL_KEY_ATTR_IPV4_SRC, output->ipv4_src))
435 return -EMSGSIZE;439 return -EMSGSIZE;
436 if (output->ipv4_dst &&440 if (output->ipv4_dst &&
437 nla_put_be32(skb, OVS_TUNNEL_KEY_ATTR_IPV4_DST, output->ipv4_dst))441 nla_put_be32(skb, OVS_TUNNEL_KEY_ATTR_IPV4_DST, output->ipv4_dst))
438 return -EMSGSIZE;442 return -EMSGSIZE;
439 if (output->ipv4_tos &&443 if (output->ipv4_tos &&
440 nla_put_u8(skb, OVS_TUNNEL_KEY_ATTR_TOS, output->ipv4_tos))444 nla_put_u8(skb, OVS_TUNNEL_KEY_ATTR_TOS, output->ipv4_tos))
441 return -EMSGSIZE;445 return -EMSGSIZE;
442 if (nla_put_u8(skb, OVS_TUNNEL_KEY_ATTR_TTL, output->ipv4_ttl))446 if (nla_put_u8(skb, OVS_TUNNEL_KEY_ATTR_TTL, output->ipv4_ttl))
443 return -EMSGSIZE;447 return -EMSGSIZE;
444 if ((output->tun_flags & TUNNEL_DONT_FRAGMENT) &&448 if ((output->tun_flags & TUNNEL_DONT_FRAGMENT) &&
445 nla_put_flag(skb, OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT))449 nla_put_flag(skb, OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT))
446 return -EMSGSIZE;450 return -EMSGSIZE;
447 if ((output->tun_flags & TUNNEL_CSUM) &&451 if ((output->tun_flags & TUNNEL_CSUM) &&
448 nla_put_flag(skb, OVS_TUNNEL_KEY_ATTR_CSUM))452 nla_put_flag(skb, OVS_TUNNEL_KEY_ATTR_CSUM))
453 return -EMSGSIZE;
454 if ((output->tun_flags & TUNNEL_OAM) &&
455 nla_put_flag(skb, OVS_TUNNEL_KEY_ATTR_OAM))
449 return -EMSGSIZE;456 return -EMSGSIZE;
450 457
451 nla_nest_end(skb, nla);458 nla_nest_end(skb, nla);