From: Ben Pfaff Date: Tue, 15 Sep 2009 22:23:45 +0000 (-0700) Subject: Factor out code for composing OFPT_PACKET_IN messages. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=372179d4f4a1dc6113bc4ea60cee76cb354e22f4;p=openvswitch Factor out code for composing OFPT_PACKET_IN messages. 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. --- diff --git a/lib/vconn.c b/lib/vconn.c index 12680c5b..d1b8353b 100644 --- a/lib/vconn.c +++ b/lib/vconn.c @@ -928,6 +928,28 @@ make_add_simple_flow(const flow_t *flow, return buffer; } +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, diff --git a/lib/vconn.h b/lib/vconn.h index 9e012bcf..0c13744c 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 105e43e6..72adbc4c 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