Signed-off-by: Simon Horman <ho...@verge.net.au> ---
v7 * Manual Rebase v6 * No change v5 * No change v4 * Manual rebase v3 * Add protocol variable to do_probe(). Previously this was added by a separate patch. v2 * No change Conflicts: lib/ofp-util.c --- lib/learning-switch.c | 4 ++-- lib/ofp-util.c | 35 +++++++++++++++++++++-------------- lib/ofp-util.h | 3 ++- utilities/ovs-ofctl.c | 5 +++-- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/lib/learning-switch.c b/lib/learning-switch.c index fb19301..f8cad85 100644 --- a/lib/learning-switch.c +++ b/lib/learning-switch.c @@ -533,13 +533,13 @@ process_packet_in(struct lswitch *sw, struct rconn *rconn, /* 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, rconn, ofputil_encode_packet_out(&po)); + queue_tx(sw, rconn, ofputil_encode_packet_out(&po, 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, rconn, ofputil_encode_packet_out(&po)); + queue_tx(sw, rconn, ofputil_encode_packet_out(&po, protocol)); } } } diff --git a/lib/ofp-util.c b/lib/ofp-util.c index f015929..b7211c6 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -3057,27 +3057,34 @@ 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; + uint8_t ofp_version = ofputil_protocol_to_ofp_version(protocol); struct ofpbuf *msg; - size_t size; + size_t size = 0; size = po->ofpacts_len; if (po->buffer_id == UINT32_MAX) { - size += po->packet_len; + 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); - - 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); + if (ofp_version == 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); + } else { + 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 4851c52..e6f8937 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -303,7 +303,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 c3806ba..227bf8c 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); } -- 1.7.10.2.484.gcd07cc5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev