datapath: Move all fwd_save_skb() calls into a single location.
authorBen Pfaff <blp@nicira.com>
Fri, 30 Jan 2009 18:58:50 +0000 (10:58 -0800)
committerBen Pfaff <blp@nicira.com>
Sat, 31 Jan 2009 01:15:48 +0000 (17:15 -0800)
datapath/datapath.c
datapath/datapath.h
datapath/dp_act.c
datapath/forward.c

index 6d6ea9ec04aaa4f6ba0959684f80258524d414d3..7cdea6a7d3238fe72b26b306b88d4efefadbdcd3 100644 (file)
@@ -757,8 +757,7 @@ int dp_output_port(struct datapath *dp, struct sk_buff *skb, int out_port,
                return output_all(dp, skb, 0);
 
        case OFPP_CONTROLLER:
-               return dp_output_control(dp, skb, fwd_save_skb(skb), 0,
-                                                 OFPR_ACTION);
+               return dp_output_control(dp, skb, 0, OFPR_ACTION);
 
        case OFPP_LOCAL: {
                struct net_device *dev = dp->netdev;
@@ -801,23 +800,24 @@ bad_port:
        return -ENOENT;
 }
 
-/* Takes ownership of 'skb' and transmits it to 'dp''s control path.  If
- * 'buffer_id' != -1, then only the first 64 bytes of 'skb' are sent;
- * otherwise, all of 'skb' is sent.  'reason' indicates why 'skb' is being
- * sent. 'max_len' sets the maximum number of bytes that the caller
- * wants to be sent; a value of 0 indicates the entire packet should be
- * sent. */
+/* Takes ownership of 'skb' and transmits it to 'dp''s control path.  'reason'
+ * indicates why 'skb' is being sent. 'max_len' sets the maximum number of
+ * bytes that the caller wants to be sent; a value of 0 indicates the entire
+ * packet should be sent. */
 int
 dp_output_control(struct datapath *dp, struct sk_buff *skb,
-                          uint32_t buffer_id, size_t max_len, int reason)
+                 size_t max_len, int reason)
 {
        /* FIXME?  Can we avoid creating a new skbuff in the case where we
         * forward the whole packet? */
        struct sk_buff *f_skb;
        struct ofp_packet_in *opi;
        size_t fwd_len, opi_len;
+       uint32_t buffer_id;
        int err;
 
+       buffer_id = fwd_save_skb(skb);
+
        fwd_len = skb->len;
        if ((buffer_id != (uint32_t) -1) && max_len)
                fwd_len = min(fwd_len, max_len);
index 84eb5dc28520b652a2f0a8f52698a7cbb3dccd10..babf10e078e72f238ebe293090cfb0be37ba046b 100644 (file)
@@ -94,8 +94,7 @@ int dp_del_switch_port(struct net_bridge_port *);
 int dp_xmit_skb(struct sk_buff *skb);
 int dp_output_port(struct datapath *, struct sk_buff *, int out_port,
                   int ignore_no_fwd);
-int dp_output_control(struct datapath *, struct sk_buff *, uint32_t, 
-                       size_t, int);
+int dp_output_control(struct datapath *, struct sk_buff *, size_t, int);
 void dp_set_origin(struct datapath *, uint16_t, struct sk_buff *);
 int dp_send_features_reply(struct datapath *, const struct sender *);
 int dp_send_config_reply(struct datapath *, const struct sender *);
index 379af11700064f564afb09cd6736a0133f242a7d..dcc93b93a5d73a76d33cd49c6a4e5617a2bbb474 100644 (file)
@@ -41,8 +41,7 @@ do_output(struct datapath *dp, struct sk_buff *skb, size_t max_len,
                return -ENOMEM;
        return (likely(out_port != OFPP_CONTROLLER)
                ? dp_output_port(dp, skb, out_port, ignore_no_fwd)
-               : dp_output_control(dp, skb, fwd_save_skb(skb),
-                                        max_len, OFPR_ACTION));
+               : dp_output_control(dp, skb, max_len, OFPR_ACTION));
 }
 
 
index d8662397686b0d50402e716b8e76cbd838de27bd..14b88972fbfdb34353c1b84e6eed2dd237cd810a 100644 (file)
@@ -71,8 +71,7 @@ void fwd_port_input(struct sw_chain *chain, struct sk_buff *skb,
        WARN_ON_ONCE(skb_shared(skb));
        WARN_ON_ONCE(skb->destructor);
        if (run_flow_through_tables(chain, skb, p))
-               dp_output_control(chain->dp, skb, fwd_save_skb(skb), 
-                                 chain->dp->miss_send_len,
+               dp_output_control(chain->dp, skb, chain->dp->miss_send_len,
                                  OFPR_NO_MATCH);
 }