Signed-off-by: Simon Horman <ho...@verge.net.au> ---
v7 * Manual rebase * Use struct ofp12_packet_in instead of struct ofp11_packet_in v6 * No change v5 * Manual rebase v4 * No change v3 * Add OF1.2 entry to to ofputil_msg_types * Make OF1.2 the first option in the if statement in ofputil_decode_packet_in() * Rename o11pi as opi, which is consistent with the style used elsewhere * Rebase v2 * No change Conflicts: lib/ofp-util.c --- lib/ofp-util.c | 61 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 5cf49c0..0993829 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -1933,6 +1933,27 @@ ofputil_encode_flow_removed(const struct ofputil_flow_removed *fr, return msg; } +static void +ofputil_decode_packet_in_finish(struct ofputil_packet_in *pin, + struct cls_rule *rule, + struct ofpbuf *b) +{ + pin->packet = b->data; + pin->packet_len = b->size; + + pin->fmd.in_port = rule->flow.in_port; + + pin->fmd.tun_id = rule->flow.tun_id; + pin->fmd.tun_id_mask = rule->wc.tun_id_mask; + + pin->fmd.metadata = rule->flow.metadata; + pin->fmd.metadata_mask = rule->wc.metadata_mask; + + memcpy(pin->fmd.regs, rule->flow.regs, sizeof pin->fmd.regs); + memcpy(pin->fmd.reg_masks, rule->wc.reg_masks, + sizeof pin->fmd.reg_masks); +} + enum ofperr ofputil_decode_packet_in(struct ofputil_packet_in *pin, const struct ofp_header *oh) @@ -1944,7 +1965,29 @@ ofputil_decode_packet_in(struct ofputil_packet_in *pin, ofpbuf_use_const(&b, oh, ntohs(oh->length)); raw = ofpraw_pull_assert(&b); - if (raw == OFPRAW_OFPT10_PACKET_IN) { + if (raw == OFPRAW_OFPT12_PACKET_IN) { + const struct ofp12_packet_in *opi; + struct cls_rule rule; + int error; + + opi = ofpbuf_pull(&b, sizeof *opi); + error = oxm_pull_match_loose(&b, 0, &rule, NULL, NULL); + if (error) { + return error; + } + + if (!ofpbuf_try_pull(&b, 2)) { + return OFPERR_OFPBRC_BAD_LEN; + } + + pin->reason = opi->reason; + pin->table_id = opi->table_id; + + pin->buffer_id = ntohl(opi->buffer_id); + pin->total_len = ntohs(opi->total_len); + + ofputil_decode_packet_in_finish(pin, &rule, &b); + } else if (raw == OFPRAW_OFPT10_PACKET_IN) { const struct ofp_packet_in *opi; opi = ofpbuf_pull(&b, offsetof(struct ofp_packet_in, data)); @@ -1972,26 +2015,14 @@ ofputil_decode_packet_in(struct ofputil_packet_in *pin, return OFPERR_OFPBRC_BAD_LEN; } - pin->packet = b.data; - pin->packet_len = b.size; pin->reason = npi->reason; pin->table_id = npi->table_id; pin->cookie = npi->cookie; - pin->fmd.in_port = rule.flow.in_port; - - pin->fmd.tun_id = rule.flow.tun_id; - pin->fmd.tun_id_mask = rule.wc.tun_id_mask; - - pin->fmd.metadata = rule.flow.metadata; - pin->fmd.metadata_mask = rule.wc.metadata_mask; - - memcpy(pin->fmd.regs, rule.flow.regs, sizeof pin->fmd.regs); - memcpy(pin->fmd.reg_masks, rule.wc.reg_masks, - sizeof pin->fmd.reg_masks); - pin->buffer_id = ntohl(npi->buffer_id); pin->total_len = ntohs(npi->total_len); + + ofputil_decode_packet_in_finish(pin, &rule, &b); } else { NOT_REACHED(); } -- 1.7.10.2.484.gcd07cc5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev