Implement OFPC_FRAG_DROP fragment handling policy.
[openvswitch] / switch / datapath.c
index 15cca50afa4038b5105aab776e53f7452b2f6512..4391634bdb78614abaff27535dc881af8f33b2cd 100644 (file)
@@ -757,7 +757,13 @@ int run_flow_through_tables(struct datapath *dp, struct buffer *buffer,
     struct sw_flow *flow;
 
     key.wildcards = 0;
-    flow_extract(buffer, in_port, &key.flow);
+    if (flow_extract(buffer, in_port, &key.flow)
+        && (dp->flags & OFPC_FRAG_MASK) == OFPC_FRAG_DROP) {
+        /* Drop fragment. */
+        buffer_delete(buffer);
+        return 0;
+    }
+
     flow = chain_lookup(dp->chain, &key);
     if (flow != NULL) {
         flow_used(flow, buffer);