dpif-linux: Prevent a single port from monopolizing upcalls.
[openvswitch] / ofproto / ofproto-dpif-sflow.c
index d2da42b0409a910c92169428c00ebf196480399f..68eb804d6d4857c9f1d32fa3cc39e917e7132f46 100644 (file)
@@ -34,6 +34,7 @@
 #include "socket-util.h"
 #include "timeval.h"
 #include "vlog.h"
+#include "lib/odp-util.h"
 
 VLOG_DEFINE_THIS_MODULE(sflow);
 
@@ -41,7 +42,7 @@ struct dpif_sflow_port {
     struct hmap_node hmap_node; /* In struct dpif_sflow's "ports" hmap. */
     struct netdev *netdev;      /* Underlying network device, for stats. */
     SFLDataSource_instance dsi; /* sFlow library's notion of port number. */
-    uint16_t odp_port;          /* ODP port number. */
+    uint16_t odp_port;          /* Datapath port number. */
 };
 
 struct dpif_sflow {
@@ -235,7 +236,7 @@ sflow_choose_agent_address(const char *agent_device, const char *control_ip,
     if (agent_device) {
         struct netdev *netdev;
 
-        if (!netdev_open_default(agent_device, &netdev)) {
+        if (!netdev_open(agent_device, "system", &netdev)) {
             int error = netdev_get_in4(netdev, &in4, NULL);
             netdev_close(netdev);
             if (!error) {
@@ -337,7 +338,7 @@ dpif_sflow_add_port(struct dpif_sflow *ds, uint16_t odp_port,
     dpif_sflow_del_port(ds, odp_port);
 
     /* Open network device. */
-    error = netdev_open_default(netdev_name, &netdev);
+    error = netdev_open(netdev_name, "system", &netdev);
     if (error) {
         VLOG_WARN_RL(&rl, "failed to open network device \"%s\": %s",
                      netdev_name, strerror(error));
@@ -489,7 +490,8 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct dpif_upcall *upcall,
 
     /* Build a flow sample */
     memset(&fs, 0, sizeof fs);
-    fs.input = dpif_sflow_odp_port_to_ifindex(ds, flow->in_port);
+    fs.input = dpif_sflow_odp_port_to_ifindex(ds,
+                                ofp_port_to_odp_port(flow->in_port));
     fs.output = 0;              /* Filled in correctly below. */
     fs.sample_pool = upcall->sample_pool;
 
@@ -533,12 +535,12 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct dpif_upcall *upcall,
         ovs_be16 tci;
 
         switch (nl_attr_type(a)) {
-        case ODP_ACTION_ATTR_OUTPUT:
+        case OVS_ACTION_ATTR_OUTPUT:
             fs.output = dpif_sflow_odp_port_to_ifindex(ds, nl_attr_get_u32(a));
             n_outputs++;
             break;
 
-        case ODP_ACTION_ATTR_SET_DL_TCI:
+        case OVS_ACTION_ATTR_PUSH_VLAN:
             tci = nl_attr_get_be16(a);
             switchElem.flowType.sw.dst_vlan = vlan_tci_to_vid(tci);
             switchElem.flowType.sw.dst_priority = vlan_tci_to_pcp(tci);