Here's another version of the patch which takes into account your comments.
---

This will make the memory ownership clearer when future patches
make more extensive use of ofputil_packet_in.

Signed-off-by: Ethan Jackson <et...@nicira.com>
---
 lib/ofp-util.c         |    9 ++++-----
 lib/ofp-util.h         |    4 +++-
 ofproto/connmgr.c      |   11 +++++++----
 ofproto/ofproto-dpif.c |    6 ++++--
 4 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 42dab87..0268614 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -1549,7 +1549,7 @@ ofputil_encode_flow_removed(const struct 
ofputil_flow_removed *fr,
  * returned ofpbuf.
  *
  * If 'rw_packet' is nonnull, then it must contain the same data as
- * pin->packet.  'rw_packet' is allowed to be the same ofpbuf as pin->packet.
+ * pin->packet.  'rw_packet'->data is allowed to be the same as pin->packet.
  * It is modified in-place into an OFPT_PACKET_IN message according to 'pin',
  * and then ofputil_encode_packet_in() returns 'rw_packet'.  If 'rw_packet' has
  * enough headroom to insert a "struct ofp_packet_in", this is more efficient
@@ -1557,9 +1557,8 @@ ofputil_encode_flow_removed(const struct 
ofputil_flow_removed *fr,
  * payload. */
 struct ofpbuf *
 ofputil_encode_packet_in(const struct ofputil_packet_in *pin,
-                        struct ofpbuf *rw_packet)
+                         struct ofpbuf *rw_packet)
 {
-    int total_len = pin->packet->size;
     struct ofp_packet_in opi;
 
     if (rw_packet) {
@@ -1568,7 +1567,7 @@ ofputil_encode_packet_in(const struct ofputil_packet_in 
*pin,
         }
     } else {
         rw_packet = ofpbuf_clone_data_with_headroom(
-            pin->packet->data, MIN(pin->send_len, pin->packet->size),
+            pin->packet, MIN(pin->send_len, pin->packet_len),
             offsetof(struct ofp_packet_in, data));
     }
 
@@ -1576,7 +1575,7 @@ ofputil_encode_packet_in(const struct ofputil_packet_in 
*pin,
     memset(&opi, 0, sizeof opi);
     opi.header.version = OFP_VERSION;
     opi.header.type = OFPT_PACKET_IN;
-    opi.total_len = htons(total_len);
+    opi.total_len = htons(pin->packet_len);
     opi.in_port = htons(pin->in_port);
     opi.reason = pin->reason;
     opi.buffer_id = htonl(pin->buffer_id);
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index 8fa729e..5f7f454 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -214,7 +214,9 @@ struct ofpbuf *ofputil_encode_flow_removed(const struct 
ofputil_flow_removed *,
 
 /* Abstract packet-in message. */
 struct ofputil_packet_in {
-    struct ofpbuf *packet;
+    const void *packet;
+    size_t packet_len;
+
     uint16_t in_port;
     uint8_t reason;             /* One of OFPR_*. */
 
diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c
index 6caad06..44352d2 100644
--- a/ofproto/connmgr.c
+++ b/ofproto/connmgr.c
@@ -1154,8 +1154,8 @@ connmgr_send_flow_removed(struct connmgr *mgr,
  * necessary according to their individual configurations.
  *
  * 'rw_packet' may be NULL.  Otherwise, 'rw_packet' must contain the same data
- * as pin->packet.  (rw_packet == pin->packet is also valid.)  Ownership of
- * 'rw_packet' is transferred to this function. */
+ * as pin->packet.  Ownership of 'rw_packet' is transferred to this function.
+ */
 void
 connmgr_send_packet_in(struct connmgr *mgr,
                        const struct ofputil_packet_in *pin,
@@ -1210,12 +1210,15 @@ schedule_packet_in(struct ofconn *ofconn, struct 
ofputil_packet_in pin,
     } else if (!ofconn->pktbuf) {
         pin.buffer_id = UINT32_MAX;
     } else {
-        pin.buffer_id = pktbuf_save(ofconn->pktbuf, pin.packet, flow->in_port);
+        struct ofpbuf packet;
+
+        ofpbuf_use_const(&packet, pin.packet, pin.packet_len);
+        pin.buffer_id = pktbuf_save(ofconn->pktbuf, &packet, flow->in_port);
     }
 
     /* Figure out how much of the packet to send. */
     if (pin.reason == OFPR_NO_MATCH) {
-        pin.send_len = pin.packet->size;
+        pin.send_len = pin.packet_len;
     } else {
         /* Caller should have initialized 'send_len' to 'max_len' specified in
          * struct ofp_action_output. */
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 7b793b6..fbebada 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -2406,7 +2406,8 @@ send_packet_in_miss(struct ofproto_dpif *ofproto, struct 
ofpbuf *packet,
 {
     struct ofputil_packet_in pin;
 
-    pin.packet = packet;
+    pin.packet = packet->data;
+    pin.packet_len = packet->size;
     pin.in_port = flow->in_port;
     pin.reason = OFPR_NO_MATCH;
     pin.buffer_id = 0;          /* not yet known */
@@ -2433,7 +2434,8 @@ send_packet_in_action(struct ofproto_dpif *ofproto, 
struct ofpbuf *packet,
 
     memcpy(&cookie, &userdata, sizeof(cookie));
 
-    pin.packet = packet;
+    pin.packet = packet->data;
+    pin.packet_len = packet->size;
     pin.in_port = flow->in_port;
     pin.reason = OFPR_ACTION;
     pin.buffer_id = 0;          /* not yet known */
-- 
1.7.7.1

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to