X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fnetdev-vport.c;h=04c3344e75f2ec6312de618bd447ce3dc104db1a;hb=df67d7ae92f98e18d2478162fc7850b11530f0c0;hp=e93e5b4fed0713d2a04ac113af039671d1f03a48;hpb=7f804ea5a3e44b1831e5cfbd09eab46cc36a1459;p=sliver-openvswitch.git diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index e93e5b4fe..04c3344e7 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, 2012 Nicira, Inc. + * Copyright (c) 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,8 +81,6 @@ static int tnl_port_config_from_nlattr(const struct nlattr *options, size_t options_len, struct nlattr *a[OVS_TUNNEL_ATTR_MAX + 1]); -static const char *netdev_vport_get_tnl_iface(const struct netdev *netdev); - static bool is_vport_class(const struct netdev_class *class) { @@ -103,6 +101,12 @@ netdev_dev_vport_cast(const struct netdev_dev *netdev_dev) return CONTAINER_OF(netdev_dev, struct netdev_dev_vport, netdev_dev); } +static struct netdev_dev_vport * +netdev_vport_get_dev(const struct netdev *netdev) +{ + return netdev_dev_vport_cast(netdev_get_dev(netdev)); +} + static struct netdev_vport * netdev_vport_cast(const struct netdev *netdev) { @@ -406,11 +410,26 @@ netdev_vport_get_stats(const struct netdev *netdev, struct netdev_stats *stats) } static int -netdev_vport_get_drv_info(const struct netdev *netdev, struct smap *smap) +tunnel_get_status(const struct netdev *netdev, struct smap *smap) { - const char *iface = netdev_vport_get_tnl_iface(netdev); + struct netdev_dev_vport *ndv = netdev_vport_get_dev(netdev); + struct nlattr *a[OVS_TUNNEL_ATTR_MAX + 1]; + static char iface[IFNAMSIZ]; + ovs_be32 route; - if (iface) { + if (!ndv->options) { + /* Race condition when 'ndv' was created, but did not have it's + * configuration set yet. */ + return 0; + } + + if (tnl_port_config_from_nlattr(ndv->options->data, + ndv->options->size, a)) { + return 0; + } + route = nl_attr_get_be32(a[OVS_TUNNEL_ATTR_DST_IPV4]); + + if (route_table_get_name(route, iface)) { struct netdev *egress_netdev; smap_add(smap, "tunnel_egress_iface", iface); @@ -441,7 +460,7 @@ netdev_vport_update_flags(struct netdev *netdev OVS_UNUSED, static unsigned int netdev_vport_change_seq(const struct netdev *netdev) { - return netdev_dev_vport_cast(netdev_get_dev(netdev))->change_seq; + return netdev_vport_get_dev(netdev)->change_seq; } static void @@ -456,37 +475,12 @@ netdev_vport_wait(void) route_table_wait(); } -/* get_tnl_iface() implementation. */ -static const char * -netdev_vport_get_tnl_iface(const struct netdev *netdev) -{ - struct nlattr *a[OVS_TUNNEL_ATTR_MAX + 1]; - struct netdev_dev_vport *ndv; - static char name[IFNAMSIZ]; - - ndv = netdev_dev_vport_cast(netdev_get_dev(netdev)); - if (tnl_port_config_from_nlattr(ndv->options->data, ndv->options->size, - a)) { - return NULL; - } - if (a[OVS_TUNNEL_ATTR_DST_IPV4]) { - ovs_be32 route = nl_attr_get_be32(a[OVS_TUNNEL_ATTR_DST_IPV4]); - - if (route_table_get_name(route, name)) { - return name; - } - } - return NULL; -} - /* Helper functions. */ static void netdev_vport_poll_notify(const struct netdev *netdev) { - struct netdev_dev_vport *ndv; - - ndv = netdev_dev_vport_cast(netdev_get_dev(netdev)); + struct netdev_dev_vport *ndv = netdev_vport_get_dev(netdev); ndv->change_seq++; if (!ndv->change_seq) { @@ -931,27 +925,27 @@ netdev_vport_register(void) { static const struct vport_class vport_classes[] = { { OVS_VPORT_TYPE_GRE, - { "gre", VPORT_FUNCTIONS(netdev_vport_get_drv_info) }, + { "gre", VPORT_FUNCTIONS(tunnel_get_status) }, parse_tunnel_config, unparse_tunnel_config }, { OVS_VPORT_TYPE_GRE, - { "ipsec_gre", VPORT_FUNCTIONS(netdev_vport_get_drv_info) }, + { "ipsec_gre", VPORT_FUNCTIONS(tunnel_get_status) }, parse_tunnel_config, unparse_tunnel_config }, { OVS_VPORT_TYPE_GRE64, - { "gre64", VPORT_FUNCTIONS(netdev_vport_get_drv_info) }, + { "gre64", VPORT_FUNCTIONS(tunnel_get_status) }, parse_tunnel_config, unparse_tunnel_config }, { OVS_VPORT_TYPE_GRE64, - { "ipsec_gre64", VPORT_FUNCTIONS(netdev_vport_get_drv_info) }, + { "ipsec_gre64", VPORT_FUNCTIONS(tunnel_get_status) }, parse_tunnel_config, unparse_tunnel_config }, { OVS_VPORT_TYPE_CAPWAP, - { "capwap", VPORT_FUNCTIONS(netdev_vport_get_drv_info) }, + { "capwap", VPORT_FUNCTIONS(tunnel_get_status) }, parse_tunnel_config, unparse_tunnel_config }, { OVS_VPORT_TYPE_VXLAN, - { "vxlan", VPORT_FUNCTIONS(netdev_vport_get_drv_info) }, + { "vxlan", VPORT_FUNCTIONS(tunnel_get_status) }, parse_tunnel_config, unparse_tunnel_config }, { OVS_VPORT_TYPE_PATCH,