From: Simon Horman Date: Wed, 8 Aug 2012 03:19:57 +0000 (+0900) Subject: ofp-util: Prepare Packet Out encoder for other Open Flow versions X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de0f3156a0ad6cc86b042d19ec8faf3c3a282ed5;p=openvswitch ofp-util: Prepare Packet Out encoder for other Open Flow versions Signed-off-by: Simon Horman Signed-off-by: Ben Pfaff --- diff --git a/lib/learning-switch.c b/lib/learning-switch.c index c1cd909f..235e9d44 100644 --- a/lib/learning-switch.c +++ b/lib/learning-switch.c @@ -590,13 +590,13 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh) /* If the switch didn't buffer the packet, we need to send a copy. */ if (pi.buffer_id == UINT32_MAX && out_port != OFPP_NONE) { - queue_tx(sw, ofputil_encode_packet_out(&po)); + queue_tx(sw, ofputil_encode_packet_out(&po, sw->protocol)); } } else { /* We don't know that MAC, or we don't set up flows. Send along the * packet without setting up a flow. */ if (pi.buffer_id != UINT32_MAX || out_port != OFPP_NONE) { - queue_tx(sw, ofputil_encode_packet_out(&po)); + queue_tx(sw, ofputil_encode_packet_out(&po, sw->protocol)); } } } diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 03c81394..910e63a1 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -3043,10 +3043,10 @@ ofputil_append_flow_update(const struct ofputil_flow_update *update, } struct ofpbuf * -ofputil_encode_packet_out(const struct ofputil_packet_out *po) +ofputil_encode_packet_out(const struct ofputil_packet_out *po, + enum ofputil_protocol protocol) { - struct ofp_packet_out *opo; - size_t actions_ofs; + enum ofp_version ofp_version = ofputil_protocol_to_ofp_version(protocol); struct ofpbuf *msg; size_t size; @@ -3055,15 +3055,28 @@ ofputil_encode_packet_out(const struct ofputil_packet_out *po) size += po->packet_len; } - msg = ofpraw_alloc(OFPRAW_OFPT10_PACKET_OUT, OFP10_VERSION, size); - ofpbuf_put_zeros(msg, sizeof *opo); - actions_ofs = msg->size; - ofpacts_put_openflow10(po->ofpacts, po->ofpacts_len, msg); + switch (ofp_version) { + case OFP10_VERSION: { + struct ofp_packet_out *opo; + size_t actions_ofs; + + msg = ofpraw_alloc(OFPRAW_OFPT10_PACKET_OUT, OFP10_VERSION, size); + ofpbuf_put_zeros(msg, sizeof *opo); + actions_ofs = msg->size; + ofpacts_put_openflow10(po->ofpacts, po->ofpacts_len, msg); + + opo = msg->l3; + opo->buffer_id = htonl(po->buffer_id); + opo->in_port = htons(po->in_port); + opo->actions_len = htons(msg->size - actions_ofs); + break; + } - opo = msg->l3; - opo->buffer_id = htonl(po->buffer_id); - opo->in_port = htons(po->in_port); - opo->actions_len = htons(msg->size - actions_ofs); + case OFP11_VERSION: + case OFP12_VERSION: + default: + NOT_REACHED(); + } if (po->buffer_id == UINT32_MAX) { ofpbuf_put(msg, po->packet, po->packet_len); diff --git a/lib/ofp-util.h b/lib/ofp-util.h index bc572264..51f0f5a7 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -300,7 +300,8 @@ struct ofputil_packet_out { enum ofperr ofputil_decode_packet_out(struct ofputil_packet_out *, const struct ofp_header *, struct ofpbuf *ofpacts); -struct ofpbuf *ofputil_encode_packet_out(const struct ofputil_packet_out *); +struct ofpbuf *ofputil_encode_packet_out(const struct ofputil_packet_out *, + enum ofputil_protocol protocol); enum ofputil_port_config { /* OpenFlow 1.0 and 1.1 share these values for these port config bits. */ diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index cd42b969..dd5f4ba1 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -1453,6 +1453,7 @@ ofctl_probe(int argc OVS_UNUSED, char *argv[]) static void ofctl_packet_out(int argc, char *argv[]) { + enum ofputil_protocol protocol; struct ofputil_packet_out po; struct ofpbuf ofpacts; struct vconn *vconn; @@ -1468,7 +1469,7 @@ ofctl_packet_out(int argc, char *argv[]) po.ofpacts = ofpacts.data; po.ofpacts_len = ofpacts.size; - open_vconn(argv[1], &vconn); + protocol = open_vconn(argv[1], &vconn); for (i = 4; i < argc; i++) { struct ofpbuf *packet, *opo; const char *error_msg; @@ -1480,7 +1481,7 @@ ofctl_packet_out(int argc, char *argv[]) po.packet = packet->data; po.packet_len = packet->size; - opo = ofputil_encode_packet_out(&po); + opo = ofputil_encode_packet_out(&po, protocol); transact_noreply(vconn, opo); ofpbuf_delete(packet); }