X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-ofctl.c;h=65e2a9fc64da972c558deb94a406c4f0dd5e9761;hb=9ea5d2d58ba8783271d096d417082a8372b87c5d;hp=73a8fca402b27e59e6d6cb4ccc4fc98e0d6e5ee5;hpb=09246b99d1601e2ba7ff85bb26f9b0235632a76d;p=openvswitch diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 73a8fca4..65e2a9fc 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -217,7 +217,7 @@ open_vconn__(const char *name, const char *default_suffix, struct stat s; char *bridge_path, *datapath_name, *datapath_type; - bridge_path = xasprintf("%s/%s.%s", ovs_rundir, name, default_suffix); + bridge_path = xasprintf("%s/%s.%s", ovs_rundir(), name, default_suffix); dp_parse_name(name, &datapath_name, &datapath_type); if (strstr(name, ":")) { @@ -239,7 +239,7 @@ open_vconn__(const char *name, const char *default_suffix, } socket_name = xasprintf("%s/%s.%s", - ovs_rundir, dpif_name, default_suffix); + ovs_rundir(), dpif_name, default_suffix); if (stat(socket_name, &s)) { ovs_fatal(errno, "cannot connect to %s: stat failed on %s", name, socket_name); @@ -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,21 @@ 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] : ""); + ofputil_cls_rule_to_match(&pf.rule, 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 +455,13 @@ 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] : ""); + ofputil_cls_rule_to_match(&pf.rule, 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 +495,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 +526,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 +540,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 +753,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);