{
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;
uint16_t port_no)
{
struct dp_netdev_port *port;
- struct netdev_options netdev_options;
struct netdev *netdev;
bool internal;
int mtu;
}
/* 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);