@@ -561,10 +561,6 @@ netdev_ports_insert(struct netdev *netdev, const char *dpif_type,
struct port_to_netdev_data *data;
int ifindex = netdev_get_ifindex(netdev);
- if (ifindex < 0) {
- return ENODEV;
- }
-
ovs_rwlock_wrlock(&netdev_hmap_rwlock);
if (netdev_ports_lookup(dpif_port->port_no, dpif_type)) {
ovs_rwlock_unlock(&netdev_hmap_rwlock);
@@ -574,13 +570,18 @@ netdev_ports_insert(struct netdev *netdev, const char *dpif_type,
data = xzalloc(sizeof *data);
data->netdev = netdev_ref(netdev);
dpif_port_clone(&data->dpif_port, dpif_port);
- data->ifindex = ifindex;
+
+ if (ifindex >= 0) {
+ data->ifindex = ifindex;
+ hmap_insert(&ifindex_to_port, &data->ifindex_node, ifindex);
+ } else {
+ data->ifindex = -1;
+ }
netdev_set_dpif_type(netdev, dpif_type);
hmap_insert(&port_to_netdev, &data->portno_node,
netdev_ports_hash(dpif_port->port_no, dpif_type));
- hmap_insert(&ifindex_to_port, &data->ifindex_node, ifindex);
ovs_rwlock_unlock(&netdev_hmap_rwlock);
netdev_init_flow_api(netdev);
@@ -616,7 +617,9 @@ netdev_ports_remove(odp_port_t port_no, const char *dpif_type)
dpif_port_destroy(&data->dpif_port);
netdev_close(data->netdev); /* unref and possibly close */
hmap_remove(&port_to_netdev, &data->portno_node);
- hmap_remove(&ifindex_to_port, &data->ifindex_node);
+ if (data->ifindex >= 0) {
+ hmap_remove(&ifindex_to_port, &data->ifindex_node);
+ }
free(data);
ret = 0;
}