[ovs-dev] [PATCH v2 2/3] Factor out code for composing OFPT_PACKET_IN messages.

Ben Pfaff blp at nicira.com
Tue Sep 15 22:48:14 UTC 2009


Currently only ofproto.c ever composes OFPT_PACKET_IN messages, but some
upcoming code wants to do the same thing, so factor this out into a new
function to avoid code duplication.
---
 lib/vconn.c       |   22 ++++++++++++++++++++++
 lib/vconn.h       |    3 +++
 secchan/ofproto.c |   27 ++++++++++++---------------
 3 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/lib/vconn.c b/lib/vconn.c
index 12680c5..d1b8353 100644
--- a/lib/vconn.c
+++ b/lib/vconn.c
@@ -929,6 +929,28 @@ make_add_simple_flow(const flow_t *flow,
 }
 
 struct ofpbuf *
+make_packet_in(uint32_t buffer_id, uint16_t in_port, uint8_t reason,
+               const struct ofpbuf *payload, int max_send_len)
+{
+    struct ofp_packet_in *opi;
+    struct ofpbuf *buf;
+    int send_len;
+
+    send_len = MIN(max_send_len, payload->size);
+    buf = ofpbuf_new(sizeof *opi + send_len);
+    opi = put_openflow_xid(offsetof(struct ofp_packet_in, data),
+                           OFPT_PACKET_IN, 0, buf);
+    opi->buffer_id = htonl(buffer_id);
+    opi->total_len = htons(payload->size);
+    opi->in_port = htons(in_port);
+    opi->reason = reason;
+    ofpbuf_put(buf, payload->data, send_len);
+    update_openflow_length(buf);
+
+    return buf;
+}
+
+struct ofpbuf *
 make_packet_out(const struct ofpbuf *packet, uint32_t buffer_id,
                 uint16_t in_port,
                 const struct ofp_action_header *actions, size_t n_actions)
diff --git a/lib/vconn.h b/lib/vconn.h
index 9e012bc..0c13744 100644
--- a/lib/vconn.h
+++ b/lib/vconn.h
@@ -85,6 +85,9 @@ struct ofpbuf *make_del_flow(const flow_t *);
 struct ofpbuf *make_add_simple_flow(const flow_t *,
                                     uint32_t buffer_id, uint16_t out_port,
                                     uint16_t max_idle);
+struct ofpbuf *make_packet_in(uint32_t buffer_id, uint16_t in_port,
+                              uint8_t reason,
+                              const struct ofpbuf *payload, int max_send_len);
 struct ofpbuf *make_packet_out(const struct ofpbuf *packet, uint32_t buffer_id,
                                uint16_t in_port,
                                const struct ofp_action_header *,
diff --git a/secchan/ofproto.c b/secchan/ofproto.c
index 105e43e..72adbc4 100644
--- a/secchan/ofproto.c
+++ b/secchan/ofproto.c
@@ -3264,25 +3264,22 @@ static void
 do_send_packet_in(struct ofconn *ofconn, uint32_t buffer_id,
                   const struct ofpbuf *packet, int send_len)
 {
-    struct ofp_packet_in *opi;
-    struct ofpbuf payload, *buf;
-    struct odp_msg *msg;
+    struct odp_msg *msg = packet->data;
+    struct ofpbuf payload;
+    struct ofpbuf *opi;
+    uint8_t reason;
 
-    msg = packet->data;
+    /* Extract packet payload from 'msg'. */
     payload.data = msg + 1;
     payload.size = msg->length - sizeof *msg;
 
-    send_len = MIN(send_len, payload.size);
-    buf = ofpbuf_new(sizeof *opi + send_len);
-    opi = put_openflow_xid(offsetof(struct ofp_packet_in, data),
-                           OFPT_PACKET_IN, 0, buf);
-    opi->buffer_id = htonl(buffer_id);
-    opi->total_len = htons(payload.size);
-    opi->in_port = htons(odp_port_to_ofp_port(msg->port));
-    opi->reason = msg->type == _ODPL_ACTION_NR ? OFPR_ACTION : OFPR_NO_MATCH;
-    ofpbuf_put(buf, payload.data, MIN(send_len, payload.size));
-    update_openflow_length(buf);
-    rconn_send_with_limit(ofconn->rconn, buf, ofconn->packet_in_counter, 100);
+    /* Construct ofp_packet_in message. */
+    reason = msg->type == _ODPL_ACTION_NR ? OFPR_ACTION : OFPR_NO_MATCH;
+    opi = make_packet_in(buffer_id, odp_port_to_ofp_port(msg->port), reason,
+                         &payload, send_len);
+
+    /* Send. */
+    rconn_send_with_limit(ofconn->rconn, opi, ofconn->packet_in_counter, 100);
 }
 
 static void
-- 
1.6.3.3





More information about the dev mailing list