Merge commit '4b60911067a82fbdfa87b7c2824412da20287ed8'
[sliver-openvswitch.git] / lib / dpif-netdev.c
index b945052..a37933d 100644 (file)
@@ -106,6 +106,7 @@ struct dp_netdev_port {
     int port_no;                /* Index into dp_netdev's 'ports'. */
     struct list node;           /* Element in dp_netdev's 'port_list'. */
     struct netdev *netdev;
+    struct netdev_saved_flags *sf;
     char *type;                 /* Port type as requested by user. */
 };
 
@@ -382,6 +383,7 @@ static int
 do_add_port(struct dp_netdev *dp, const char *devname, const char *type,
             uint32_t port_no)
 {
+    struct netdev_saved_flags *sf;
     struct dp_netdev_port *port;
     struct netdev *netdev;
     const char *open_type;
@@ -408,7 +410,7 @@ do_add_port(struct dp_netdev *dp, const char *devname, const char *type,
         return error;
     }
 
-    error = netdev_turn_flags_on(netdev, NETDEV_PROMISC, false);
+    error = netdev_turn_flags_on(netdev, NETDEV_PROMISC, &sf);
     if (error) {
         netdev_close(netdev);
         return error;
@@ -417,6 +419,7 @@ do_add_port(struct dp_netdev *dp, const char *devname, const char *type,
     port = xmalloc(sizeof *port);
     port->port_no = port_no;
     port->netdev = netdev;
+    port->sf = sf;
     port->type = xstrdup(type);
 
     error = netdev_get_mtu(netdev, &mtu);
@@ -513,6 +516,7 @@ do_del_port(struct dp_netdev *dp, uint32_t port_no)
     dp->serial++;
 
     netdev_close(port->netdev);
+    netdev_restore_flags(port->sf);
     free(port->type);
     free(port);