X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-ofctl.c;h=be68bdcb1692eff78b58c56738e8663cbfcbfa67;hb=8321fb9c570bd25bb8925e7b5116ab90662113b5;hp=73a8fca402b27e59e6d6cb4ccc4fc98e0d6e5ee5;hpb=09246b99d1601e2ba7ff85bb26f9b0235632a76d;p=openvswitch diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 73a8fca4..be68bdcb 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -307,7 +307,7 @@ dump_trivial_transaction(const char *vconn_name, uint8_t request_type) static void dump_stats_transaction(const char *vconn_name, struct ofpbuf *request) { - uint32_t send_xid = ((struct ofp_header *) request->data)->xid; + ovs_be32 send_xid = ((struct ofp_header *) request->data)->xid; struct vconn *vconn; bool done = false; @@ -431,21 +431,22 @@ str_to_port_no(const char *vconn_name, const char *str) ofpbuf_delete(reply); vconn_close(vconn); - return port_idx; + return ntohs(osf->ports[port_idx].port_no); } static void do_dump_flows(int argc, char *argv[]) { struct ofp_flow_stats_request *req; - uint16_t out_port; + struct parsed_flow pf; struct ofpbuf *request; req = alloc_stats_request(sizeof *req, OFPST_FLOW, &request); - parse_ofp_str(argc > 2 ? argv[2] : "", &req->match, NULL, - &req->table_id, &out_port, NULL, NULL, NULL, NULL); + parse_ofp_str(&pf, NULL, argc > 2 ? argv[2] : ""); + flow_to_match(&pf.rule.flow, pf.rule.wc.wildcards, NXFF_OPENFLOW10, + &req->match); memset(&req->pad, 0, sizeof req->pad); - req->out_port = htons(out_port); + req->out_port = htons(pf.out_port); dump_stats_transaction(argv[1], request); } @@ -455,13 +456,14 @@ do_dump_aggregate(int argc, char *argv[]) { struct ofp_aggregate_stats_request *req; struct ofpbuf *request; - uint16_t out_port; + struct parsed_flow pf; req = alloc_stats_request(sizeof *req, OFPST_AGGREGATE, &request); - parse_ofp_str(argc > 2 ? argv[2] : "", &req->match, NULL, - &req->table_id, &out_port, NULL, NULL, NULL, NULL); + parse_ofp_str(&pf, NULL, argc > 2 ? argv[2] : ""); + flow_to_match(&pf.rule.flow, pf.rule.wc.wildcards, NXFF_OPENFLOW10, + &req->match); memset(&req->pad, 0, sizeof req->pad); - req->out_port = htons(out_port); + req->out_port = htons(pf.out_port); dump_stats_transaction(argv[1], request); } @@ -495,26 +497,8 @@ do_add_flow(int argc OVS_UNUSED, char *argv[]) { struct vconn *vconn; struct ofpbuf *buffer; - struct ofp_flow_mod *ofm; - uint16_t priority, idle_timeout, hard_timeout; - uint64_t cookie; - struct ofp_match match; - - /* Parse and send. parse_ofp_str() will expand and reallocate the - * data in 'buffer', so we can't keep pointers to across the - * parse_ofp_str() call. */ - make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer); - parse_ofp_str(argv[2], &match, buffer, - NULL, NULL, &priority, &idle_timeout, &hard_timeout, - &cookie); - ofm = buffer->data; - ofm->match = match; - ofm->command = htons(OFPFC_ADD); - ofm->cookie = htonll(cookie); - ofm->idle_timeout = htons(idle_timeout); - ofm->hard_timeout = htons(hard_timeout); - ofm->buffer_id = htonl(UINT32_MAX); - ofm->priority = htons(priority); + + buffer = parse_ofp_flow_mod_str(argv[2], OFPFC_ADD); open_vconn(argv[1], &vconn); send_openflow_buffer(vconn, buffer); @@ -544,33 +528,12 @@ do_add_flows(int argc OVS_UNUSED, char *argv[]) static void do_mod_flows(int argc OVS_UNUSED, char *argv[]) { - uint16_t priority, idle_timeout, hard_timeout; - uint64_t cookie; struct vconn *vconn; struct ofpbuf *buffer; - struct ofp_flow_mod *ofm; - struct ofp_match match; - - /* Parse and send. parse_ofp_str() will expand and reallocate the - * data in 'buffer', so we can't keep pointers to across the - * parse_ofp_str() call. */ - make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer); - parse_ofp_str(argv[2], &match, buffer, - NULL, NULL, &priority, &idle_timeout, &hard_timeout, - &cookie); - ofm = buffer->data; - ofm->match = match; - if (strict) { - ofm->command = htons(OFPFC_MODIFY_STRICT); - } else { - ofm->command = htons(OFPFC_MODIFY); - } - ofm->idle_timeout = htons(idle_timeout); - ofm->hard_timeout = htons(hard_timeout); - ofm->cookie = htonll(cookie); - ofm->buffer_id = htonl(UINT32_MAX); - ofm->priority = htons(priority); + uint16_t command; + command = strict ? OFPFC_MODIFY_STRICT : OFPFC_MODIFY; + buffer = parse_ofp_flow_mod_str(argv[2], command); open_vconn(argv[1], &vconn); send_openflow_buffer(vconn, buffer); vconn_close(vconn); @@ -579,25 +542,11 @@ do_mod_flows(int argc OVS_UNUSED, char *argv[]) static void do_del_flows(int argc, char *argv[]) { struct vconn *vconn; - uint16_t priority; - uint16_t out_port; struct ofpbuf *buffer; - struct ofp_flow_mod *ofm; - - /* Parse and send. */ - ofm = make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer); - parse_ofp_str(argc > 2 ? argv[2] : "", &ofm->match, NULL, NULL, - &out_port, &priority, NULL, NULL, NULL); - if (strict) { - ofm->command = htons(OFPFC_DELETE_STRICT); - } else { - ofm->command = htons(OFPFC_DELETE); - } - ofm->idle_timeout = htons(0); - ofm->hard_timeout = htons(0); - ofm->buffer_id = htonl(UINT32_MAX); - ofm->out_port = htons(out_port); - ofm->priority = htons(priority); + uint16_t command; + + command = strict ? OFPFC_DELETE_STRICT : OFPFC_DELETE; + buffer = parse_ofp_flow_mod_str(argc > 2 ? argv[2] : "", command); open_vconn(argv[1], &vconn); send_openflow_buffer(vconn, buffer); @@ -806,7 +755,7 @@ do_ping(int argc, char *argv[]) ofp_print(stdout, reply, reply->size, 2); } printf("%zu bytes from %s: xid=%08"PRIx32" time=%.1f ms\n", - reply->size - sizeof *rpy_hdr, argv[1], rpy_hdr->xid, + reply->size - sizeof *rpy_hdr, argv[1], ntohl(rpy_hdr->xid), (1000*(double)(end.tv_sec - start.tv_sec)) + (.001*(end.tv_usec - start.tv_usec))); ofpbuf_delete(request);