X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=utilities%2Fovs-ofctl.c;h=6c7e3ac105dccad032c5afcc1fede675a7352d12;hb=5ff660c69619505fbcec5041a13493f32d6f014d;hp=b829ac727819cf53269395d4e680de661ad22c1a;hpb=08944c1db1ab2707e28deab838dc0937bf8de8ae;p=sliver-openvswitch.git diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index b829ac727..6c7e3ac10 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -85,15 +85,15 @@ parse_options(int argc, char *argv[]) VLOG_OPTION_ENUMS }; static struct option long_options[] = { - {"timeout", required_argument, 0, 't'}, - {"strict", no_argument, 0, OPT_STRICT}, - {"flow-format", required_argument, 0, 'F'}, - {"more", no_argument, 0, 'm'}, - {"help", no_argument, 0, 'h'}, - {"version", no_argument, 0, 'V'}, + {"timeout", required_argument, NULL, 't'}, + {"strict", no_argument, NULL, OPT_STRICT}, + {"flow-format", required_argument, NULL, 'F'}, + {"more", no_argument, NULL, 'm'}, + {"help", no_argument, NULL, 'h'}, + {"version", no_argument, NULL, 'V'}, VLOG_LONG_OPTIONS, - STREAM_SSL_LONG_OPTIONS - {0, 0, 0, 0}, + STREAM_SSL_LONG_OPTIONS, + {NULL, 0, NULL, 0}, }; char *short_options = long_options_to_short_options(long_options); @@ -172,6 +172,7 @@ usage(void) " add-flows SWITCH FILE add flows from FILE\n" " mod-flows SWITCH FLOW modify actions of matching FLOWs\n" " del-flows SWITCH [FLOW] delete matching FLOWs\n" + " replace-flows SWITCH FILE replace flows with those in FILE\n" " monitor SWITCH [MISSLEN] print packets received from SWITCH\n" "\nFor OpenFlow switches and controllers:\n" " probe VCONN probe whether VCONN is up\n" @@ -262,12 +263,11 @@ open_vconn(const char *name, struct vconn **vconnp) static void * alloc_stats_request(size_t body_len, uint16_t type, struct ofpbuf **bufferp) { - struct ofp_stats_request *rq; - rq = make_openflow((offsetof(struct ofp_stats_request, body) - + body_len), OFPT_STATS_REQUEST, bufferp); + struct ofp_stats_msg *rq; + rq = make_openflow(sizeof *rq + body_len, OFPT_STATS_REQUEST, bufferp); rq->type = htons(type); rq->flags = htons(0); - return rq->body; + return rq + 1; } static void @@ -314,12 +314,12 @@ dump_stats_transaction(const char *vconn_name, struct ofpbuf *request) run(vconn_recv_block(vconn, &reply), "OpenFlow packet receive failed"); recv_xid = ((struct ofp_header *) reply->data)->xid; if (send_xid == recv_xid) { - struct ofp_stats_reply *osr; + struct ofp_stats_msg *osm; ofp_print(stdout, reply->data, reply->size, verbosity + 1); - osr = ofpbuf_at(reply, 0, sizeof *osr); - done = !osr || !(ntohs(osr->flags) & OFPSF_REPLY_MORE); + osm = ofpbuf_at(reply, 0, sizeof *osm); + done = !osm || !(ntohs(osm->flags) & OFPSF_REPLY_MORE); } else { VLOG_DBG("received reply with xid %08"PRIx32" " "!= expected %08"PRIx32, recv_xid, send_xid); @@ -502,8 +502,6 @@ negotiate_highest_flow_format(struct vconn *vconn, if (try_set_flow_format(vconn, NXFF_NXM)) { flow_format = NXFF_NXM; - } else if (try_set_flow_format(vconn, NXFF_TUN_ID_FROM_COOKIE)) { - flow_format = NXFF_TUN_ID_FROM_COOKIE; } else { flow_format = NXFF_OPENFLOW10; } @@ -531,7 +529,7 @@ do_dump_flows__(int argc, char *argv[], bool aggregate) parse_ofp_flow_stats_request_str(&fsr, aggregate, argc > 2 ? argv[2] : ""); open_vconn(argv[1], &vconn); - min_flow_format = ofputil_min_flow_format(&fsr.match, false, 0); + min_flow_format = ofputil_min_flow_format(&fsr.match); flow_format = negotiate_highest_flow_format(vconn, min_flow_format); request = ofputil_encode_flow_stats_request(&fsr, flow_format); dump_stats_transaction(argv[1], request); @@ -615,6 +613,7 @@ static void do_flow_mod_file__(int argc OVS_UNUSED, char *argv[], uint16_t command) { enum nx_flow_format flow_format; + bool flow_mod_table_id; struct list requests; struct vconn *vconn; FILE *file; @@ -626,9 +625,11 @@ do_flow_mod_file__(int argc OVS_UNUSED, char *argv[], uint16_t command) list_init(&requests); flow_format = set_initial_format_for_flow_mod(&requests); + flow_mod_table_id = false; open_vconn(argv[1], &vconn); - while (parse_ofp_flow_mod_file(&requests, &flow_format, file, command)) { + while (parse_ofp_flow_mod_file(&requests, &flow_format, &flow_mod_table_id, + file, command)) { check_final_format_for_flow_mod(flow_format); transact_multiple_noreply(vconn, &requests); } @@ -643,6 +644,7 @@ static void do_flow_mod__(int argc, char *argv[], uint16_t command) { enum nx_flow_format flow_format; + bool flow_mod_table_id; struct list requests; struct vconn *vconn; @@ -653,9 +655,10 @@ do_flow_mod__(int argc, char *argv[], uint16_t command) list_init(&requests); flow_format = set_initial_format_for_flow_mod(&requests); + flow_mod_table_id = false; - parse_ofp_flow_mod_str(&requests, &flow_format, argc > 2 ? argv[2] : "", - command); + parse_ofp_flow_mod_str(&requests, &flow_format, &flow_mod_table_id, + argc > 2 ? argv[2] : "", command); check_final_format_for_flow_mod(flow_format); open_vconn(argv[1], &vconn); @@ -1030,10 +1033,9 @@ read_flows_from_file(const char *filename, struct classifier *cls, int index) enum nx_flow_format min_ff; struct ofpbuf actions; struct flow_mod fm; - uint8_t table_idx; ofpbuf_init(&actions, 64); - parse_ofp_str(&fm, &table_idx, &actions, ds_cstr(&s)); + parse_ofp_str(&fm, &actions, ds_cstr(&s)); version = xmalloc(sizeof *version); version->cookie = fm.cookie; @@ -1043,7 +1045,7 @@ read_flows_from_file(const char *filename, struct classifier *cls, int index) version->n_actions = actions.size / sizeof *version->actions; version->actions = ofpbuf_steal_data(&actions); - min_ff = ofputil_min_flow_format(&fm.cr, true, fm.cookie); + min_ff = ofputil_min_flow_format(&fm.cr); min_flow_format = MAX(min_flow_format, min_ff); check_final_format_for_flow_mod(min_flow_format); @@ -1087,7 +1089,7 @@ read_flows_from_switch(struct vconn *vconn, enum nx_flow_format flow_format, recv_xid = ((struct ofp_header *) reply->data)->xid; if (send_xid == recv_xid) { const struct ofputil_msg_type *type; - const struct ofp_stats_reply *osr; + const struct ofp_stats_msg *osm; enum ofputil_msg_code code; ofputil_decode_msg_type(reply->data, &type); @@ -1099,8 +1101,8 @@ read_flows_from_switch(struct vconn *vconn, enum nx_flow_format flow_format, verbosity + 1)); } - osr = reply->data; - if (!(osr->flags & htons(OFPSF_REPLY_MORE))) { + osm = reply->data; + if (!(osm->flags & htons(OFPSF_REPLY_MORE))) { done = true; } @@ -1109,8 +1111,7 @@ read_flows_from_switch(struct vconn *vconn, enum nx_flow_format flow_format, struct ofputil_flow_stats fs; int retval; - retval = ofputil_decode_flow_stats_reply(&fs, reply, - flow_format); + retval = ofputil_decode_flow_stats_reply(&fs, reply); if (retval) { if (retval != EOF) { ovs_fatal(0, "parse error in reply"); @@ -1147,6 +1148,7 @@ fte_make_flow_mod(const struct fte *fte, int index, uint16_t command, fm.cr = fte->rule; fm.cookie = version->cookie; + fm.table_id = 0xff; fm.command = command; fm.idle_timeout = version->idle_timeout; fm.hard_timeout = version->hard_timeout; @@ -1162,7 +1164,7 @@ fte_make_flow_mod(const struct fte *fte, int index, uint16_t command, fm.n_actions = 0; } - ofm = ofputil_encode_flow_mod(&fm, flow_format); + ofm = ofputil_encode_flow_mod(&fm, flow_format, false); list_push_back(packets, &ofm->list_node); } @@ -1295,15 +1297,18 @@ static void do_parse_flow(int argc OVS_UNUSED, char *argv[]) { enum nx_flow_format flow_format; + bool flow_mod_table_id; struct list packets; flow_format = NXFF_OPENFLOW10; if (preferred_flow_format > 0) { flow_format = preferred_flow_format; } + flow_mod_table_id = false; list_init(&packets); - parse_ofp_flow_mod_str(&packets, &flow_format, argv[1], OFPFC_ADD); + parse_ofp_flow_mod_str(&packets, &flow_format, &flow_mod_table_id, + argv[1], OFPFC_ADD); print_packet_list(&packets); } @@ -1313,6 +1318,7 @@ static void do_parse_flows(int argc OVS_UNUSED, char *argv[]) { enum nx_flow_format flow_format; + bool flow_mod_table_id; struct list packets; FILE *file; @@ -1325,9 +1331,11 @@ do_parse_flows(int argc OVS_UNUSED, char *argv[]) if (preferred_flow_format > 0) { flow_format = preferred_flow_format; } + flow_mod_table_id = false; list_init(&packets); - while (parse_ofp_flow_mod_file(&packets, &flow_format, file, OFPFC_ADD)) { + while (parse_ofp_flow_mod_file(&packets, &flow_format, &flow_mod_table_id, + file, OFPFC_ADD)) { print_packet_list(&packets); } fclose(file);