X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-ofctl.c;h=db6038a030375205f0bc12b3e64f39389a6c9683;hb=0a9126739bc5cd60d3666f4bd574217545001b06;hp=9efd484ff176b8178cc9759a88567bc0b92b6a95;hpb=cae7a4b90a55cbfd4cfd23c06f9f09cd429ab4c0;p=openvswitch diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 9efd484f..db6038a0 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -251,7 +251,7 @@ static void run(int retval, const char *message, ...) static void open_vconn(const char *name, struct vconn **vconnp) { - struct dpif dpif; + struct dpif *dpif; struct stat s; if (strstr(name, ":")) { @@ -268,9 +268,9 @@ open_vconn(const char *name, struct vconn **vconnp) char *socket_name; char *vconn_name; - run(dpif_get_name(&dpif, dpif_name, sizeof dpif_name), + run(dpif_port_get_name(dpif, ODPP_LOCAL, dpif_name, sizeof dpif_name), "obtaining name of %s", dpif_name); - dpif_close(&dpif); + dpif_close(dpif); if (strcmp(dpif_name, name)) { VLOG_INFO("datapath %s is named %s", name, dpif_name); } @@ -599,6 +599,22 @@ str_to_action(char *str, struct ofpbuf *b) put_dl_addr_action(b, OFPAT_SET_DL_SRC, arg); } else if (!strcasecmp(act, "mod_dl_dst")) { put_dl_addr_action(b, OFPAT_SET_DL_DST, arg); + } else if (!strcasecmp(act, "mod_nw_src")) { + struct ofp_action_nw_addr *na; + na = put_action(b, sizeof *na, OFPAT_SET_NW_SRC); + str_to_ip(arg, &na->nw_addr); + } else if (!strcasecmp(act, "mod_nw_dst")) { + struct ofp_action_nw_addr *na; + na = put_action(b, sizeof *na, OFPAT_SET_NW_DST); + str_to_ip(arg, &na->nw_addr); + } else if (!strcasecmp(act, "mod_tp_src")) { + struct ofp_action_tp_port *ta; + ta = put_action(b, sizeof *ta, OFPAT_SET_TP_SRC); + ta->tp_port = htons(str_to_u32(arg)); + } else if (!strcasecmp(act, "mod_tp_dst")) { + struct ofp_action_tp_port *ta; + ta = put_action(b, sizeof *ta, OFPAT_SET_TP_DST); + ta->tp_port = htons(str_to_u32(arg)); } else if (!strcasecmp(act, "output")) { put_output_action(b, str_to_u32(arg)); } else if (!strcasecmp(act, "drop")) { @@ -617,6 +633,8 @@ str_to_action(char *str, struct ofpbuf *b) * packet to the controller. */ if (arg && (strspn(act, "0123456789") == strlen(act))) { oao->max_len = htons(str_to_u32(arg)); + } else { + oao->max_len = htons(UINT16_MAX); } } else if (parse_port_name(act, &port)) { put_output_action(b, port); @@ -948,15 +966,11 @@ static void do_del_flows(const struct settings *s, int argc, char *argv[]) uint16_t out_port; struct ofpbuf *buffer; struct ofp_flow_mod *ofm; - struct ofp_match match; - /* Parse and send. str_to_flow() will expand and reallocate the data in - * 'buffer', so we can't keep pointers to across the str_to_flow() call. */ - make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer); - str_to_flow(argc > 2 ? argv[2] : "", &match, buffer, - NULL, &out_port, &priority, NULL, NULL); - ofm = buffer->data; - ofm->match = match; + /* Parse and send. */ + ofm = make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer); + str_to_flow(argc > 2 ? argv[2] : "", &ofm->match, NULL, NULL, + &out_port, &priority, NULL, NULL); if (s->strict) { ofm->command = htons(OFPFC_DELETE_STRICT); } else { @@ -1139,7 +1153,7 @@ do_ping(const struct settings *s UNUSED, int argc, char *argv[]) printf("Reply:\n"); ofp_print(stdout, reply, reply->size, 2); } - printf("%d bytes from %s: xid=%08"PRIx32" time=%.1f ms\n", + printf("%zu bytes from %s: xid=%08"PRIx32" time=%.1f ms\n", reply->size - sizeof *rpy_hdr, argv[1], rpy_hdr->xid, (1000*(double)(end.tv_sec - start.tv_sec)) + (.001*(end.tv_usec - start.tv_usec)));