dpif-netdev: delete lost packets in dp_execute_cb()
[cascardo/ovs.git] / lib / dpif-netdev.c
index 87d1eb5..fdf1af4 100644 (file)
@@ -811,13 +811,12 @@ static void
 port_unref(struct dp_netdev_port *port)
 {
     if (port && ovs_refcount_unref(&port->ref_cnt) == 1) {
-        int n_rxq;
+        int n_rxq = netdev_n_rxq(port->netdev);
         int i;
 
         netdev_close(port->netdev);
         netdev_restore_flags(port->sf);
 
-        n_rxq = netdev_n_rxq(port->netdev);
         for (i = 0; i < n_rxq; i++) {
             netdev_rxq_close(port->rxq[i]);
         }
@@ -1340,6 +1339,7 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
         }
     }
     ovs_mutex_unlock(&dp->flow_mutex);
+    miniflow_destroy(&miniflow);
 
     return error;
 }
@@ -2114,7 +2114,10 @@ dp_execute_cb(void *aux_, struct ofpbuf *packet,
         p = dp_netdev_lookup_port(aux->dp, u32_to_odp(nl_attr_get_u32(a)));
         if (p) {
             netdev_send(p->netdev, packet, may_steal);
+        } else if (may_steal) {
+            ofpbuf_delete(packet);
         }
+
         break;
 
     case OVS_ACTION_ATTR_USERSPACE: {
@@ -2170,6 +2173,9 @@ dp_execute_cb(void *aux_, struct ofpbuf *packet,
 
             break;
         } else {
+            if (may_steal) {
+                ofpbuf_delete(packet);
+            }
             VLOG_WARN("Packet dropped. Max recirculation depth exceeded.");
         }
         break;