X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-ofctl.c;h=c36a3bc81a656d493a70b7f5baf52823d519f83b;hb=75e8b46925ef94be2867ad427fa8c04a55673472;hp=e873ed7ba2a41567057290ddae5eeddbbf4d6832;hpb=576e26d7b47f4e53116ef0b5f035d260f426d37b;p=openvswitch diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index e873ed7b..c36a3bc8 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -123,14 +123,15 @@ static void parse_options(int argc, char *argv[], struct settings *s) { enum { - OPT_STRICT = UCHAR_MAX + 1 + OPT_STRICT = UCHAR_MAX + 1, + VLOG_OPTION_ENUMS }; static struct option long_options[] = { {"timeout", required_argument, 0, 't'}, - {"verbose", optional_argument, 0, 'v'}, {"strict", no_argument, 0, OPT_STRICT}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, + VLOG_LONG_OPTIONS, VCONN_SSL_LONG_OPTIONS {0, 0, 0, 0}, }; @@ -166,14 +167,11 @@ parse_options(int argc, char *argv[], struct settings *s) OVS_PRINT_VERSION(OFP_VERSION, OFP_VERSION); exit(EXIT_SUCCESS); - case 'v': - vlog_set_verbosity(optarg); - break; - case OPT_STRICT: s->strict = true; break; + VLOG_OPTION_HANDLERS VCONN_SSL_OPTION_HANDLERS case '?': @@ -374,14 +372,14 @@ dump_trivial_stats_transaction(const char *vconn_name, uint8_t stats_type) } static void -do_show(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) +do_show(const struct settings *s OVS_UNUSED, int argc OVS_UNUSED, char *argv[]) { dump_trivial_transaction(argv[1], OFPT_FEATURES_REQUEST); dump_trivial_transaction(argv[1], OFPT_GET_CONFIG_REQUEST); } static void -do_status(const struct settings *s UNUSED, int argc, char *argv[]) +do_status(const struct settings *s OVS_UNUSED, int argc, char *argv[]) { struct nicira_header *request, *reply; struct vconn *vconn; @@ -413,13 +411,15 @@ do_status(const struct settings *s UNUSED, int argc, char *argv[]) } static void -do_dump_desc(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) +do_dump_desc(const struct settings *s OVS_UNUSED, + int argc OVS_UNUSED, char *argv[]) { dump_trivial_stats_transaction(argv[1], OFPST_DESC); } static void -do_dump_tables(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) +do_dump_tables(const struct settings *s OVS_UNUSED, + int argc OVS_UNUSED, char *argv[]) { dump_trivial_stats_transaction(argv[1], OFPST_TABLE); } @@ -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")) { @@ -799,7 +815,7 @@ str_to_flow(char *string, struct ofp_match *match, struct ofpbuf *actions, } static void -do_dump_flows(const struct settings *s UNUSED, int argc, char *argv[]) +do_dump_flows(const struct settings *s OVS_UNUSED, int argc, char *argv[]) { struct ofp_flow_stats_request *req; uint16_t out_port; @@ -815,7 +831,7 @@ do_dump_flows(const struct settings *s UNUSED, int argc, char *argv[]) } static void -do_dump_aggregate(const struct settings *s UNUSED, int argc, char *argv[]) +do_dump_aggregate(const struct settings *s OVS_UNUSED, int argc, char *argv[]) { struct ofp_aggregate_stats_request *req; struct ofpbuf *request; @@ -831,7 +847,8 @@ do_dump_aggregate(const struct settings *s UNUSED, int argc, char *argv[]) } static void -do_add_flow(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) +do_add_flow(const struct settings *s OVS_UNUSED, int argc OVS_UNUSED, + char *argv[]) { struct vconn *vconn; struct ofpbuf *buffer; @@ -859,7 +876,8 @@ do_add_flow(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) } static void -do_add_flows(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) +do_add_flows(const struct settings *s OVS_UNUSED, int argc OVS_UNUSED, + char *argv[]) { struct vconn *vconn; FILE *file; @@ -912,17 +930,21 @@ do_add_flows(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) } static void -do_mod_flows(const struct settings *s, int argc UNUSED, char *argv[]) +do_mod_flows(const struct settings *s, int argc OVS_UNUSED, char *argv[]) { uint16_t priority, idle_timeout, hard_timeout; struct vconn *vconn; struct ofpbuf *buffer; struct ofp_flow_mod *ofm; + struct ofp_match match; - /* Parse and send. */ - ofm = make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer); - str_to_flow(argv[2], &ofm->match, buffer, + /* 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(argv[2], &match, buffer, NULL, NULL, &priority, &idle_timeout, &hard_timeout); + ofm = buffer->data; + ofm->match = match; if (s->strict) { ofm->command = htons(OFPFC_MODIFY_STRICT); } else { @@ -969,7 +991,8 @@ static void do_del_flows(const struct settings *s, int argc, char *argv[]) } static void -do_monitor(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) +do_monitor(const struct settings *s OVS_UNUSED, + int argc OVS_UNUSED, char *argv[]) { struct vconn *vconn; @@ -994,13 +1017,15 @@ do_monitor(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) } static void -do_dump_ports(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) +do_dump_ports(const struct settings *s OVS_UNUSED, + int argc OVS_UNUSED, char *argv[]) { dump_trivial_stats_transaction(argv[1], OFPST_PORT); } static void -do_probe(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) +do_probe(const struct settings *s OVS_UNUSED, + int argc OVS_UNUSED, char *argv[]) { struct ofpbuf *request; struct vconn *vconn; @@ -1017,7 +1042,8 @@ do_probe(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) } static void -do_mod_port(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) +do_mod_port(const struct settings *s OVS_UNUSED, + int argc OVS_UNUSED, char *argv[]) { struct ofpbuf *request, *reply; struct ofp_switch_features *osf; @@ -1097,7 +1123,7 @@ do_mod_port(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) } static void -do_ping(const struct settings *s UNUSED, int argc, char *argv[]) +do_ping(const struct settings *s OVS_UNUSED, int argc, char *argv[]) { size_t max_payload = 65535 - sizeof(struct ofp_header); unsigned int payload; @@ -1133,7 +1159,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))); @@ -1144,7 +1170,8 @@ do_ping(const struct settings *s UNUSED, int argc, char *argv[]) } static void -do_benchmark(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) +do_benchmark(const struct settings *s OVS_UNUSED, + int argc OVS_UNUSED, char *argv[]) { size_t max_payload = 65535 - sizeof(struct ofp_header); struct timeval start, end; @@ -1187,7 +1214,7 @@ do_benchmark(const struct settings *s UNUSED, int argc UNUSED, char *argv[]) } static void -do_execute(const struct settings *s UNUSED, int argc, char *argv[]) +do_execute(const struct settings *s OVS_UNUSED, int argc, char *argv[]) { struct vconn *vconn; struct ofpbuf *request; @@ -1252,7 +1279,8 @@ do_execute(const struct settings *s UNUSED, int argc, char *argv[]) } static void -do_help(const struct settings *s UNUSED, int argc UNUSED, char *argv[] UNUSED) +do_help(const struct settings *s OVS_UNUSED, + int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { usage(); }