ofp-util: Rename struct flow_mod to struct ofputil_flow_mod.
[openvswitch] / lib / dpif-netdev.c
index d48d7ae1f030568656608a9426316a6e1746a659..9f281c26632ebebb6d35c8c0fd2421b45b67d3f0 100644 (file)
@@ -302,6 +302,7 @@ dpif_netdev_get_stats(const struct dpif *dpif, struct odp_stats *stats)
 {
     struct dp_netdev *dp = get_dp_netdev(dpif);
     memset(stats, 0, sizeof *stats);
+    stats->n_flows = hmap_count(&dp->flow_table);
     stats->n_frags = dp->n_frags;
     stats->n_hit = dp->n_hit;
     stats->n_missed = dp->n_missed;
@@ -330,7 +331,6 @@ do_add_port(struct dp_netdev *dp, const char *devname, const char *type,
             uint16_t port_no)
 {
     struct dp_netdev_port *port;
-    struct netdev_options netdev_options;
     struct netdev *netdev;
     bool internal;
     int mtu;
@@ -347,22 +347,27 @@ do_add_port(struct dp_netdev *dp, const char *devname, const char *type,
     }
 
     /* Open and validate network device. */
-    memset(&netdev_options, 0, sizeof netdev_options);
-    netdev_options.name = devname;
-    netdev_options.ethertype = NETDEV_ETH_TYPE_ANY;
     if (dp->class == &dpif_dummy_class) {
-        netdev_options.type = "dummy";
+        type = "dummy";
     } else if (internal) {
-        netdev_options.type = "tap";
+        type = "tap";
     }
 
-    error = netdev_open(&netdev_options, &netdev);
+    error = netdev_open(devname, type, &netdev);
     if (error) {
         return error;
     }
     /* XXX reject loopback devices */
     /* XXX reject non-Ethernet devices */
 
+    error = netdev_listen(netdev);
+    if (error) {
+        VLOG_ERR("%s: cannot receive packets on this network device (%s)",
+                 devname, strerror(errno));
+        netdev_close(netdev);
+        return error;
+    }
+
     error = netdev_turn_flags_on(netdev, NETDEV_PROMISC, false);
     if (error) {
         netdev_close(netdev);