X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fnetdev.c;h=8ff78821987c5677f87bc13a4b6310b2fccb8b0d;hb=7bcffeb41298e34e2864bec9c52d687eb858d433;hp=4be806d186c478c7774fa154892edab498514d41;hpb=8e2b26562c2e82fd4492d4a27aa24238e47b022a;p=cascardo%2Fovs.git diff --git a/lib/netdev.c b/lib/netdev.c index 4be806d18..8ff788219 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -281,6 +281,21 @@ netdev_enumerate_types(struct sset *types) } } +static const char * +netdev_vport_type_from_name(const char *name) +{ + struct netdev_registered_class *rc; + const char *type; + CMAP_FOR_EACH (rc, cmap_node, &netdev_classes) { + const char *dpif_port = netdev_vport_class_get_dpif_port(rc->class); + if (dpif_port && !strncmp(name, dpif_port, strlen(dpif_port))) { + type = rc->class->type; + return type; + } + } + return NULL; +} + /* Check that the network device name is not the same as any of the registered * vport providers' dpif_port name (dpif_port is NULL if the vport provider * does not define it) or the datapath internal port name (e.g. ovs-system). @@ -1759,9 +1774,14 @@ netdev_get_vports(size_t *size) const char * netdev_get_type_from_name(const char *name) { - struct netdev *dev = netdev_from_name(name); - const char *type = dev ? netdev_get_type(dev) : NULL; - netdev_close(dev); + struct netdev *dev; + const char *type; + type = netdev_vport_type_from_name(name); + if (type == NULL) { + dev = netdev_from_name(name); + type = dev ? netdev_get_type(dev) : NULL; + netdev_close(dev); + } return type; }