diff options
author | Ben Pfaff <blp@ovn.org> | 2017-05-31 16:06:12 -0700 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2017-05-31 16:06:12 -0700 |
commit | 50f96b10e1c87db9fbe4df297f9b2fea13436bc0 (patch) | |
tree | 9122b84ecb6d90d0ba343f1f7b451b2db057870f /lib/learn.c | |
parent | 52182c5f50198d0f985b10677e47a9ac49ee709b (diff) | |
download | openvswitch-50f96b10e1c87db9fbe4df297f9b2fea13436bc0.tar.gz |
Support accepting and displaying port names in OVS tools.
Until now, most ovs-ofctl commands have not accepted names for ports, only
numbers, and have not been able to display port names either. It's a lot
easier for users if they can use and see meaningful names instead of
arbitrary numbers. This commit adds that support.
For backward compatibility, only interactive ovs-ofctl commands by default
display port names; to display them in scripts, use the new --names
option.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Tested-by: Aaron Conole <aconole@redhat.com>
Diffstat (limited to 'lib/learn.c')
-rw-r--r-- | lib/learn.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/lib/learn.c b/lib/learn.c index f8f872143..bc5a6eb2d 100644 --- a/lib/learn.c +++ b/lib/learn.c @@ -232,6 +232,7 @@ learn_parse_load_immediate(union mf_subvalue *imm, const char *s, * error. The caller is responsible for freeing the returned string. */ static char * OVS_WARN_UNUSED_RESULT learn_parse_spec(const char *orig, char *name, char *value, + const struct ofputil_port_map *port_map, struct ofpact_learn_spec *spec, struct ofpbuf *ofpacts, struct match *match) { @@ -262,7 +263,8 @@ learn_parse_spec(const char *orig, char *name, char *value, /* Try an immediate value. */ if (dst.ofs == 0 && dst.n_bits == dst.field->n_bits) { /* Full field value. */ - imm_error = mf_parse_value(dst.field, value, &imm); + imm_error = mf_parse_value(dst.field, value, port_map, + &imm); } else { char *tail; /* Partial field value. */ @@ -279,7 +281,7 @@ learn_parse_spec(const char *orig, char *name, char *value, struct ds ds; ds_init(&ds); - mf_format(dst.field, &imm, NULL, &ds); + mf_format(dst.field, &imm, NULL, NULL, &ds); imm_error = xasprintf("%s: value %s does not fit into %d bits", orig, ds_cstr(&ds), dst.n_bits); ds_destroy(&ds); @@ -378,7 +380,8 @@ learn_parse_spec(const char *orig, char *name, char *value, /* Returns NULL if successful, otherwise a malloc()'d string describing the * error. The caller is responsible for freeing the returned string. */ static char * OVS_WARN_UNUSED_RESULT -learn_parse__(char *orig, char *arg, struct ofpbuf *ofpacts) +learn_parse__(char *orig, char *arg, const struct ofputil_port_map *port_map, + struct ofpbuf *ofpacts) { struct ofpact_learn *learn; struct match match; @@ -435,7 +438,8 @@ learn_parse__(char *orig, char *arg, struct ofpbuf *ofpacts) char *error; spec = ofpbuf_put_zeros(ofpacts, sizeof *spec); - error = learn_parse_spec(orig, name, value, spec, ofpacts, &match); + error = learn_parse_spec(orig, name, value, port_map, + spec, ofpacts, &match); if (error) { return error; } @@ -460,10 +464,11 @@ learn_parse__(char *orig, char *arg, struct ofpbuf *ofpacts) * * Modifies 'arg'. */ char * OVS_WARN_UNUSED_RESULT -learn_parse(char *arg, struct ofpbuf *ofpacts) +learn_parse(char *arg, const struct ofputil_port_map *port_map, + struct ofpbuf *ofpacts) { char *orig = xstrdup(arg); - char *error = learn_parse__(orig, arg, ofpacts); + char *error = learn_parse__(orig, arg, port_map, ofpacts); free(orig); return error; } @@ -471,7 +476,8 @@ learn_parse(char *arg, struct ofpbuf *ofpacts) /* Appends a description of 'learn' to 's', in the format that ovs-ofctl(8) * describes. */ void -learn_format(const struct ofpact_learn *learn, struct ds *s) +learn_format(const struct ofpact_learn *learn, + const struct ofputil_port_map *port_map, struct ds *s) { const struct ofpact_learn_spec *spec; struct match match; @@ -535,7 +541,7 @@ learn_format(const struct ofpact_learn *learn, struct ds *s) ofpact_learn_spec_imm(spec), n_bytes); ds_put_format(s, "%s%s=%s", colors.param, spec->dst.field->name, colors.end); - mf_format(spec->dst.field, &value, NULL, s); + mf_format(spec->dst.field, &value, NULL, port_map, s); } else { ds_put_format(s, "%s", colors.param); mf_format_subfield(&spec->dst, s); |