X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofp-util.c;h=1fe30b469582e00178545e3abdb88f204a12e2c5;hb=48d84b1706f76882bc5265c09257e70899fb9c41;hp=bcfab7d49681c72f29f5f95335cd6cf8ae81bdee;hpb=70d19663e411c250362a0e71dd481c5efd41de8b;p=openvswitch diff --git a/lib/ofp-util.c b/lib/ofp-util.c index bcfab7d4..1fe30b46 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -469,7 +469,6 @@ ofputil_cls_rule_to_ofp11_match(const struct cls_rule *rule, match->in_port = ofputil_port_to_ofp11(rule->flow.in_port); } - memcpy(match->dl_src, rule->flow.dl_src, ETH_ADDR_LEN); for (i = 0; i < ETH_ADDR_LEN; i++) { match->dl_src_mask[i] = ~rule->wc.dl_src_mask[i]; @@ -1260,6 +1259,15 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, return 0; } +static ovs_be16 +ofputil_tid_command(const struct ofputil_flow_mod *fm, + enum ofputil_protocol protocol) +{ + return htons(protocol & OFPUTIL_P_TID + ? (fm->command & 0xff) | (fm->table_id << 8) + : fm->command); +} + /* Converts 'fm' into an OFPT_FLOW_MOD or NXT_FLOW_MOD message according to * 'protocol' and returns the message. */ struct ofpbuf * @@ -1267,13 +1275,33 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod *fm, enum ofputil_protocol protocol) { struct ofpbuf *msg; - uint16_t command; - - command = (protocol & OFPUTIL_P_TID - ? (fm->command & 0xff) | (fm->table_id << 8) - : fm->command); switch (protocol) { + case OFPUTIL_P_OF12: { + struct ofp11_flow_mod *ofm; + + msg = ofpraw_alloc(OFPRAW_OFPT11_FLOW_MOD, OFP12_VERSION, + NXM_TYPICAL_LEN + fm->ofpacts_len); + ofm = ofpbuf_put_zeros(msg, sizeof *ofm); + ofm->cookie = fm->new_cookie; + ofm->cookie_mask = fm->cookie_mask; + ofm->table_id = fm->table_id; + ofm->command = fm->command; + ofm->idle_timeout = htons(fm->idle_timeout); + ofm->hard_timeout = htons(fm->hard_timeout); + ofm->priority = htons(fm->cr.priority); + ofm->buffer_id = htonl(fm->buffer_id); + ofm->out_port = ofputil_port_to_ofp11(fm->out_port); + ofm->out_group = htonl(OFPG11_ANY); + ofm->flags = htons(fm->flags); + oxm_put_match(msg, &fm->cr); + if (fm->ofpacts) { + ofpacts_put_openflow11_instructions(fm->ofpacts, fm->ofpacts_len, + msg); + } + break; + } + case OFPUTIL_P_OF10: case OFPUTIL_P_OF10_TID: { struct ofp10_flow_mod *ofm; @@ -1283,13 +1311,16 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod *fm, ofm = ofpbuf_put_zeros(msg, sizeof *ofm); ofputil_cls_rule_to_ofp10_match(&fm->cr, &ofm->match); ofm->cookie = fm->new_cookie; - ofm->command = htons(command); + ofm->command = ofputil_tid_command(fm, protocol); ofm->idle_timeout = htons(fm->idle_timeout); ofm->hard_timeout = htons(fm->hard_timeout); ofm->priority = htons(fm->cr.priority); ofm->buffer_id = htonl(fm->buffer_id); ofm->out_port = htons(fm->out_port); ofm->flags = htons(fm->flags); + if (fm->ofpacts) { + ofpacts_put_openflow10(fm->ofpacts, fm->ofpacts_len, msg); + } break; } @@ -1301,10 +1332,9 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod *fm, msg = ofpraw_alloc(OFPRAW_NXT_FLOW_MOD, OFP10_VERSION, NXM_TYPICAL_LEN + fm->ofpacts_len); nfm = ofpbuf_put_zeros(msg, sizeof *nfm); - nfm->command = htons(command); + nfm->command = ofputil_tid_command(fm, protocol); nfm->cookie = fm->new_cookie; - match_len = nx_put_match(msg, false, &fm->cr, - fm->cookie, fm->cookie_mask); + match_len = nx_put_match(msg, &fm->cr, fm->cookie, fm->cookie_mask); nfm = msg->l3; nfm->idle_timeout = htons(fm->idle_timeout); nfm->hard_timeout = htons(fm->hard_timeout); @@ -1313,17 +1343,16 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod *fm, nfm->out_port = htons(fm->out_port); nfm->flags = htons(fm->flags); nfm->match_len = htons(match_len); + if (fm->ofpacts) { + ofpacts_put_openflow10(fm->ofpacts, fm->ofpacts_len, msg); + } break; } - case OFPUTIL_P_OF12: default: NOT_REACHED(); } - if (fm->ofpacts) { - ofpacts_put_openflow10(fm->ofpacts, fm->ofpacts_len, msg); - } ofpmsg_update_length(msg); return msg; } @@ -1464,7 +1493,7 @@ ofputil_encode_flow_stats_request(const struct ofputil_flow_stats_request *fsr, : OFPRAW_NXST_FLOW_REQUEST); msg = ofpraw_alloc(raw, OFP10_VERSION, 0); ofpbuf_put_zeros(msg, sizeof *nfsr); - match_len = nx_put_match(msg, false, &fsr->match, + match_len = nx_put_match(msg, &fsr->match, fsr->cookie, fsr->cookie_mask); nfsr = msg->l3; @@ -1676,7 +1705,7 @@ ofputil_append_flow_stats_reply(const struct ofputil_flow_stats *fs, int match_len; ofpbuf_put_uninit(reply, sizeof *nfs); - match_len = nx_put_match(reply, false, &fs->rule, 0, 0); + match_len = nx_put_match(reply, &fs->rule, 0, 0); ofpacts_put_openflow10(fs->ofpacts, fs->ofpacts_len, reply); nfs = ofpbuf_at_assert(reply, start_ofs, sizeof *nfs); @@ -1845,7 +1874,7 @@ ofputil_encode_flow_removed(const struct ofputil_flow_removed *fr, msg = ofpraw_alloc_xid(OFPRAW_NXT_FLOW_REMOVED, OFP10_VERSION, htonl(0), NXM_TYPICAL_LEN); nfr = ofpbuf_put_zeros(msg, sizeof *nfr); - match_len = nx_put_match(msg, false, &fr->rule, 0, 0); + match_len = nx_put_match(msg, &fr->rule, 0, 0); nfr = msg->l3; nfr->cookie = fr->cookie; @@ -1981,7 +2010,7 @@ ofputil_encode_packet_in(const struct ofputil_packet_in *pin, htonl(0), (sizeof(struct flow_metadata) * 2 + 2 + send_len)); ofpbuf_put_zeros(packet, sizeof *npi); - match_len = nx_put_match(packet, false, &rule, 0, 0); + match_len = nx_put_match(packet, &rule, 0, 0); ofpbuf_put_zeros(packet, 2); ofpbuf_put(packet, pin->packet, send_len); @@ -2342,52 +2371,6 @@ static const struct ofputil_action_bit_translation of10_action_bits[] = { { 0, 0 }, }; -static const struct ofputil_action_bit_translation of11_action_bits[] = { - { OFPUTIL_A_OUTPUT, OFPAT11_OUTPUT }, - { OFPUTIL_A_SET_VLAN_VID, OFPAT11_SET_VLAN_VID }, - { OFPUTIL_A_SET_VLAN_PCP, OFPAT11_SET_VLAN_PCP }, - { OFPUTIL_A_SET_DL_SRC, OFPAT11_SET_DL_SRC }, - { OFPUTIL_A_SET_DL_DST, OFPAT11_SET_DL_DST }, - { OFPUTIL_A_SET_NW_SRC, OFPAT11_SET_NW_SRC }, - { OFPUTIL_A_SET_NW_DST, OFPAT11_SET_NW_DST }, - { OFPUTIL_A_SET_NW_TOS, OFPAT11_SET_NW_TOS }, - { OFPUTIL_A_SET_NW_ECN, OFPAT11_SET_NW_ECN }, - { OFPUTIL_A_SET_TP_SRC, OFPAT11_SET_TP_SRC }, - { OFPUTIL_A_SET_TP_DST, OFPAT11_SET_TP_DST }, - { OFPUTIL_A_COPY_TTL_OUT, OFPAT11_COPY_TTL_OUT }, - { OFPUTIL_A_COPY_TTL_IN, OFPAT11_COPY_TTL_IN }, - { OFPUTIL_A_SET_MPLS_LABEL, OFPAT11_SET_MPLS_LABEL }, - { OFPUTIL_A_SET_MPLS_TC, OFPAT11_SET_MPLS_TC }, - { OFPUTIL_A_SET_MPLS_TTL, OFPAT11_SET_MPLS_TTL }, - { OFPUTIL_A_DEC_MPLS_TTL, OFPAT11_DEC_MPLS_TTL }, - { OFPUTIL_A_PUSH_VLAN, OFPAT11_PUSH_VLAN }, - { OFPUTIL_A_POP_VLAN, OFPAT11_POP_VLAN }, - { OFPUTIL_A_PUSH_MPLS, OFPAT11_PUSH_MPLS }, - { OFPUTIL_A_POP_MPLS, OFPAT11_POP_MPLS }, - { OFPUTIL_A_SET_QUEUE, OFPAT11_SET_QUEUE }, - { OFPUTIL_A_GROUP, OFPAT11_GROUP }, - { OFPUTIL_A_SET_NW_TTL, OFPAT11_SET_NW_TTL }, - { OFPUTIL_A_DEC_NW_TTL, OFPAT11_DEC_NW_TTL }, - { 0, 0 }, -}; - -static const struct ofputil_action_bit_translation of12_action_bits[] = { - { OFPUTIL_A_OUTPUT, OFPAT12_OUTPUT }, - { OFPUTIL_A_COPY_TTL_OUT, OFPAT12_COPY_TTL_OUT }, - { OFPUTIL_A_COPY_TTL_IN, OFPAT12_COPY_TTL_IN }, - { OFPUTIL_A_SET_MPLS_TTL, OFPAT12_SET_MPLS_TTL }, - { OFPUTIL_A_DEC_MPLS_TTL, OFPAT12_DEC_MPLS_TTL }, - { OFPUTIL_A_PUSH_VLAN, OFPAT12_PUSH_VLAN }, - { OFPUTIL_A_POP_VLAN, OFPAT12_POP_VLAN }, - { OFPUTIL_A_PUSH_MPLS, OFPAT12_PUSH_MPLS }, - { OFPUTIL_A_POP_MPLS, OFPAT12_POP_MPLS }, - { OFPUTIL_A_SET_QUEUE, OFPAT12_SET_QUEUE }, - { OFPUTIL_A_GROUP, OFPAT12_GROUP }, - { OFPUTIL_A_SET_NW_TTL, OFPAT12_SET_NW_TTL }, - { OFPUTIL_A_DEC_NW_TTL, OFPAT12_DEC_NW_TTL }, - { 0, 0 }, -}; - static enum ofputil_action_bitmap decode_action_bits(ovs_be32 of_actions, const struct ofputil_action_bit_translation *x) @@ -2456,19 +2439,7 @@ ofputil_decode_switch_features(const struct ofp_header *oh, if (osf->capabilities & htonl(OFPC11_GROUP_STATS)) { features->capabilities |= OFPUTIL_C_GROUP_STATS; } - switch ((enum ofp_version)oh->version) { - case OFP11_VERSION: - features->actions = decode_action_bits(htonl(UINT32_MAX), - of11_action_bits); - break; - case OFP12_VERSION: - features->actions = decode_action_bits(htonl(UINT32_MAX), - of12_action_bits); - break; - case OFP10_VERSION: - default: - NOT_REACHED(); - } + features->actions = 0; } else { return OFPERR_OFPBRC_BAD_VERSION; } @@ -2811,7 +2782,7 @@ ofputil_append_flow_monitor_request( start_ofs = msg->size; ofpbuf_put_zeros(msg, sizeof *nfmr); - match_len = nx_put_match(msg, false, &rq->match, htonll(0), htonll(0)); + match_len = nx_put_match(msg, &rq->match, htonll(0), htonll(0)); nfmr = ofpbuf_at_assert(msg, start_ofs, sizeof *nfmr); nfmr->id = htonl(rq->id); @@ -2979,8 +2950,7 @@ ofputil_append_flow_update(const struct ofputil_flow_update *update, int match_len; ofpbuf_put_zeros(msg, sizeof *nfuf); - match_len = nx_put_match(msg, false, update->match, - htonll(0), htonll(0)); + match_len = nx_put_match(msg, update->match, htonll(0), htonll(0)); ofpacts_put_openflow10(update->ofpacts, update->ofpacts_len, msg); nfuf = ofpbuf_at_assert(msg, start_ofs, sizeof *nfuf); @@ -3034,9 +3004,9 @@ ofputil_encode_packet_out(const struct ofputil_packet_out *po) /* Creates and returns an OFPT_ECHO_REQUEST message with an empty payload. */ struct ofpbuf * -make_echo_request(void) +make_echo_request(enum ofp_version ofp_version) { - return ofpraw_alloc_xid(OFPRAW_OFPT_ECHO_REQUEST, OFP10_VERSION, + return ofpraw_alloc_xid(OFPRAW_OFPT_ECHO_REQUEST, ofp_version, htonl(0), 0); } @@ -3057,9 +3027,25 @@ make_echo_reply(const struct ofp_header *rq) } struct ofpbuf * -ofputil_encode_barrier_request(void) +ofputil_encode_barrier_request(enum ofp_version ofp_version) { - return ofpraw_alloc(OFPRAW_OFPT10_BARRIER_REQUEST, OFP10_VERSION, 0); + enum ofpraw type; + + switch (ofp_version) { + case OFP12_VERSION: + case OFP11_VERSION: + type = OFPRAW_OFPT11_BARRIER_REQUEST; + break; + + case OFP10_VERSION: + type = OFPRAW_OFPT10_BARRIER_REQUEST; + break; + + default: + NOT_REACHED(); + } + + return ofpraw_alloc(type, ofp_version, 0); } const char *