[ovs-dev] [PATCH 2/4] user-space datapath: Add basic MPLS support to kernel

Isaku Yamahata yamahata at valinux.co.jp
Wed Oct 10 02:59:26 UTC 2012


On Tue, Oct 09, 2012 at 04:08:33PM +0900, Simon Horman wrote:
> This is to match the kernel implementation in the
> patch "datapath: Add basic MPLS support to kernel"
> by Leo Alterman.
> 
> Cc: Leo Alterman <lalterman at nicira.com>
> Signed-off-by: Simon Horman <horms at verge.net.au>
> 
> ---
> 
> v2.2
> * No change
> 
> v2.1
> * Initial post
> ---
>  lib/dpif-netdev.c |   13 +++++++++++++
>  lib/odp-util.c    |   43 +++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 56 insertions(+)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index c9e3210..6deb9ff 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -1212,6 +1212,7 @@ execute_set_action(struct ofpbuf *packet, const struct nlattr *a)
>       case OVS_KEY_ATTR_ICMPV6:
>       case OVS_KEY_ATTR_ARP:
>       case OVS_KEY_ATTR_ND:
> +     case OVS_KEY_ATTR_MPLS:
>       case __OVS_KEY_ATTR_MAX:
>       default:
>          NOT_REACHED();
> @@ -1249,6 +1250,18 @@ dp_netdev_execute_actions(struct dp_netdev *dp,
>              eth_pop_vlan(packet);
>              break;
>  
> +        case OVS_ACTION_ATTR_PUSH_MPLS:
> +            push_mpls(packet, nl_attr_get_be16(a));
> +            break;
> +
> +        case OVS_ACTION_ATTR_POP_MPLS:
> +             pop_mpls(packet, nl_attr_get_be16(a));
> +             break;
> +
> +        case OVS_ACTION_ATTR_SET_MPLS:
> +             set_mpls_lse(packet, nl_attr_get_be32(a));
> +             break;
> +
>          case OVS_ACTION_ATTR_SET:
>              execute_set_action(packet, nl_attr_get(a));
>              break;
> diff --git a/lib/odp-util.c b/lib/odp-util.c
> index 257d7a7..13b3248 100644
> --- a/lib/odp-util.c
> +++ b/lib/odp-util.c
> @@ -73,6 +73,9 @@ odp_action_len(uint16_t type)
>      case OVS_ACTION_ATTR_USERSPACE: return -2;
>      case OVS_ACTION_ATTR_PUSH_VLAN: return sizeof(struct ovs_action_push_vlan);
>      case OVS_ACTION_ATTR_POP_VLAN: return 0;
> +    case OVS_ACTION_ATTR_PUSH_MPLS: return sizeof(struct ovs_action_push_mpls);
> +    case OVS_ACTION_ATTR_POP_MPLS: return sizeof(ovs_be16);
> +    case OVS_ACTION_ATTR_SET_MPLS: return sizeof(ovs_be32);
>      case OVS_ACTION_ATTR_SET: return -2;
>      case OVS_ACTION_ATTR_SAMPLE: return -2;
>  
> @@ -106,6 +109,7 @@ ovs_key_attr_to_string(enum ovs_key_attr attr)
>      case OVS_KEY_ATTR_ARP: return "arp";
>      case OVS_KEY_ATTR_ND: return "nd";
>      case OVS_KEY_ATTR_TUN_ID: return "tun_id";
> +    case OVS_KEY_ATTR_MPLS: return "mpls";
>  
>      case __OVS_KEY_ATTR_MAX:
>      default:
> @@ -273,6 +277,17 @@ format_vlan_tci(struct ds *ds, ovs_be16 vlan_tci)
>  }
>  
>  static void
> +format_mpls_lse(struct ds *ds, ovs_be32 mpls_lse)
> +{
> +    ds_put_format(ds, "label=%"PRIu32",tc=%d,ttl=%d,bos=%d",
> +                  mpls_lse_to_label(mpls_lse),
> +                  mpls_lse_to_tc(mpls_lse),
> +                  mpls_lse_to_ttl(mpls_lse),
> +                  mpls_lse_to_stack(mpls_lse));
> +}
> +
> +
> +static void
>  format_odp_action(struct ds *ds, const struct nlattr *a)
>  {
>      int expected_len;
> @@ -311,6 +326,25 @@ format_odp_action(struct ds *ds, const struct nlattr *a)
>      case OVS_ACTION_ATTR_POP_VLAN:
>          ds_put_cstr(ds, "pop_vlan");
>          break;
> +    case OVS_ACTION_ATTR_PUSH_MPLS: {
> +        const struct ovs_action_push_mpls *mpls = nl_attr_get(a);
> +        ds_put_cstr(ds, "push_mpls(");
> +        format_mpls_lse(ds, mpls->mpls_label);
> +        ds_put_format(ds, "eth_type=0x%"PRIx16")", ntohs(mpls->mpls_ethertype));
> +        break;
> +    }
> +    case OVS_ACTION_ATTR_POP_MPLS: {
> +        ovs_be16 ethertype = nl_attr_get_be16(a);
> +        ds_put_format(ds, "pop_mpls(eth_type=0x%"PRIx16")", ntohs(ethertype));
> +        break;
> +                                   }

Minor nitpick. the position of '}'

thanks,

> +    case OVS_ACTION_ATTR_SET_MPLS: {
> +        ovs_be32 label = nl_attr_get_be32(a);
> +        ds_put_cstr(ds, "set_mpls(");
> +        format_mpls_lse(ds, label);
> +        ds_put_char(ds, ')');
> +        break;
> +    }
>      case OVS_ACTION_ATTR_SAMPLE:
>          format_odp_sample_action(ds, a);
>          break;
> @@ -606,6 +640,7 @@ odp_flow_key_attr_len(uint16_t type)
>      case OVS_KEY_ATTR_ETHERNET: return sizeof(struct ovs_key_ethernet);
>      case OVS_KEY_ATTR_VLAN: return sizeof(ovs_be16);
>      case OVS_KEY_ATTR_ETHERTYPE: return 2;
> +    case OVS_KEY_ATTR_MPLS: return sizeof(struct ovs_key_mpls);
>      case OVS_KEY_ATTR_IPV4: return sizeof(struct ovs_key_ipv4);
>      case OVS_KEY_ATTR_IPV6: return sizeof(struct ovs_key_ipv6);
>      case OVS_KEY_ATTR_TCP: return sizeof(struct ovs_key_tcp);
> @@ -715,6 +750,14 @@ format_odp_key_attr(const struct nlattr *a, struct ds *ds)
>          ds_put_char(ds, ')');
>          break;
>  
> +    case OVS_KEY_ATTR_MPLS: {
> +        const struct ovs_key_mpls *mpls_key = nl_attr_get(a);
> +        ds_put_char(ds, '(');
> +        format_mpls_lse(ds, mpls_key->mpls_top_label);
> +        ds_put_char(ds, ')');
> +        break;
> +    }
> +
>      case OVS_KEY_ATTR_ETHERTYPE:
>          ds_put_format(ds, "(0x%04"PRIx16")",
>                        ntohs(nl_attr_get_be16(a)));
> -- 
> 1.7.10.4
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
> 

-- 
yamahata



More information about the dev mailing list