From 8a6bc7cd70c142eefa06d8714aa093281441cfa2 Mon Sep 17 00:00:00 2001 From: Simon Horman Date: Wed, 8 Aug 2012 06:49:44 +0900 Subject: [PATCH] ofp-util: Prepare Packet Out decoder for other Open Flow versions Signed-off-by: Simon Horman Signed-off-by: Ben Pfaff --- lib/ofp-util.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 463248255..64eb5ca6a 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -2149,18 +2149,27 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po, const struct ofp_header *oh, struct ofpbuf *ofpacts) { - const struct ofp_packet_out *opo; - enum ofperr error; enum ofpraw raw; struct ofpbuf b; ofpbuf_use_const(&b, oh, ntohs(oh->length)); raw = ofpraw_pull_assert(&b); - assert(raw == OFPRAW_OFPT10_PACKET_OUT); - opo = ofpbuf_pull(&b, sizeof *opo); - po->buffer_id = ntohl(opo->buffer_id); - po->in_port = ntohs(opo->in_port); + if (raw == OFPRAW_OFPT10_PACKET_OUT) { + enum ofperr error; + const struct ofp_packet_out *opo = ofpbuf_pull(&b, sizeof *opo); + + po->buffer_id = ntohl(opo->buffer_id); + po->in_port = ntohs(opo->in_port); + + error = ofpacts_pull_openflow10(&b, ntohs(opo->actions_len), ofpacts); + if (error) { + return error; + } + } else { + NOT_REACHED(); + } + if (po->in_port >= OFPP_MAX && po->in_port != OFPP_LOCAL && po->in_port != OFPP_NONE && po->in_port != OFPP_CONTROLLER) { VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out has bad input port %#"PRIx16, @@ -2168,10 +2177,6 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po, return OFPERR_NXBRC_BAD_IN_PORT; } - error = ofpacts_pull_openflow10(&b, ntohs(opo->actions_len), ofpacts); - if (error) { - return error; - } po->ofpacts = ofpacts->data; po->ofpacts_len = ofpacts->size; -- 2.43.0