From: Simon Horman Date: Tue, 7 Aug 2012 21:49:38 +0000 (+0900) Subject: ofp-util: Allow encoding of Open Flow 1.2 Packet In Messages X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d94240eccc644cbd702c2f64b608448223cc11f1;p=openvswitch ofp-util: Allow encoding of Open Flow 1.2 Packet In Messages Signed-off-by: Simon Horman Signed-off-by: Ben Pfaff --- diff --git a/lib/ofp-msgs.h b/lib/ofp-msgs.h index 5ff5976e..1639cd97 100644 --- a/lib/ofp-msgs.h +++ b/lib/ofp-msgs.h @@ -127,6 +127,8 @@ enum ofpraw { OFPRAW_OFPT10_PACKET_IN, /* OFPT 1.1 (10): struct ofp11_packet_in up to data, uint8_t[]. */ OFPRAW_OFPT11_PACKET_IN, + /* OFPT 1.2 (10): struct ofp12_packet_in, uint8_t[]. */ + OFPRAW_OFPT12_PACKET_IN, /* NXT 1.0+ (17): struct nx_packet_in, uint8_t[]. */ OFPRAW_NXT_PACKET_IN, @@ -327,6 +329,7 @@ enum ofptype { /* Asynchronous messages. */ OFPTYPE_PACKET_IN, /* OFPRAW_OFPT10_PACKET_IN. * OFPRAW_OFPT11_PACKET_IN. + * OFPRAW_OFPT12_PACKET_IN. * OFPRAW_NXT_PACKET_IN. */ OFPTYPE_FLOW_REMOVED, /* OFPRAW_OFPT10_FLOW_REMOVED. * OFPRAW_NXT_FLOW_REMOVED. */ diff --git a/lib/ofp-util.c b/lib/ofp-util.c index bd0cb348..36f1c8a1 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -1977,17 +1977,58 @@ ofputil_decode_packet_in(struct ofputil_packet_in *pin, return 0; } +static void +ofputil_packet_in_to_rule(const struct ofputil_packet_in *pin, + struct cls_rule *rule) +{ + int i; + + cls_rule_init_catchall(rule, 0); + cls_rule_set_tun_id_masked(rule, pin->fmd.tun_id, + pin->fmd.tun_id_mask); + cls_rule_set_metadata_masked(rule, pin->fmd.metadata, + pin->fmd.metadata_mask); + + for (i = 0; i < FLOW_N_REGS; i++) { + cls_rule_set_reg_masked(rule, i, pin->fmd.regs[i], + pin->fmd.reg_masks[i]); + } + + cls_rule_set_in_port(rule, pin->fmd.in_port); +} + /* Converts abstract ofputil_packet_in 'pin' into a PACKET_IN message * in the format specified by 'packet_in_format'. */ struct ofpbuf * ofputil_encode_packet_in(const struct ofputil_packet_in *pin, + enum ofputil_protocol protocol, enum nx_packet_in_format packet_in_format) { size_t send_len = MIN(pin->send_len, pin->packet_len); struct ofpbuf *packet; /* Add OFPT_PACKET_IN. */ - if (packet_in_format == NXPIF_OPENFLOW10) { + if (protocol == OFPUTIL_P_OF12) { + struct ofp12_packet_in *opi; + struct cls_rule rule; + + ofputil_packet_in_to_rule(pin, &rule); + + /* The final argument is just an estimate of the space required. */ + packet = ofpraw_alloc_xid(OFPRAW_OFPT12_PACKET_IN, OFP12_VERSION, + htonl(0), (sizeof(struct flow_metadata) * 2 + + 2 + send_len)); + ofpbuf_put_zeros(packet, sizeof *opi); + oxm_put_match(packet, &rule); + ofpbuf_put_zeros(packet, 2); + ofpbuf_put(packet, pin->packet, send_len); + + opi = packet->l3; + opi->buffer_id = htonl(pin->buffer_id); + opi->total_len = htons(pin->total_len); + opi->reason = pin->reason; + opi->table_id = pin->table_id; + } else if (packet_in_format == NXPIF_OPENFLOW10) { struct ofp_packet_in *opi; packet = ofpraw_alloc_xid(OFPRAW_OFPT10_PACKET_IN, OFP10_VERSION, @@ -2003,21 +2044,8 @@ ofputil_encode_packet_in(const struct ofputil_packet_in *pin, struct nx_packet_in *npi; struct cls_rule rule; size_t match_len; - size_t i; - - cls_rule_init_catchall(&rule, 0); - cls_rule_set_tun_id_masked(&rule, pin->fmd.tun_id, - pin->fmd.tun_id_mask); - cls_rule_set_metadata_masked(&rule, pin->fmd.metadata, - pin->fmd.metadata_mask); - - - for (i = 0; i < FLOW_N_REGS; i++) { - cls_rule_set_reg_masked(&rule, i, pin->fmd.regs[i], - pin->fmd.reg_masks[i]); - } - cls_rule_set_in_port(&rule, pin->fmd.in_port); + ofputil_packet_in_to_rule(pin, &rule); /* The final argument is just an estimate of the space required. */ packet = ofpraw_alloc_xid(OFPRAW_NXT_PACKET_IN, OFP10_VERSION, diff --git a/lib/ofp-util.h b/lib/ofp-util.h index bea37eee..bc572264 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -277,6 +277,7 @@ struct ofputil_packet_in { enum ofperr ofputil_decode_packet_in(struct ofputil_packet_in *, const struct ofp_header *); struct ofpbuf *ofputil_encode_packet_in(const struct ofputil_packet_in *, + enum ofputil_protocol protocol, enum nx_packet_in_format); const char *ofputil_packet_in_reason_to_string(enum ofp_packet_in_reason); diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c index d436f779..aaf9b3e2 100644 --- a/ofproto/connmgr.c +++ b/ofproto/connmgr.c @@ -1407,7 +1407,8 @@ schedule_packet_in(struct ofconn *ofconn, struct ofputil_packet_in pin) * while (until a later call to pinsched_run()). */ pinsched_send(ofconn->schedulers[pin.reason == OFPR_NO_MATCH ? 0 : 1], pin.fmd.in_port, - ofputil_encode_packet_in(&pin, ofconn->packet_in_format), + ofputil_encode_packet_in(&pin, ofconn->protocol, + ofconn->packet_in_format), do_send_packet_in, ofconn); }