Skip to content

Commit

Permalink
odp-util: Add support for named ports to odp_flow_key_from_string().
Browse files Browse the repository at this point in the history
Really the "trace" command should support this but in fact I need it for
an upcoming update to a test.
  • Loading branch information
blp committed Nov 17, 2011
1 parent 39db78a commit b2a60db
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 6 deletions.
30 changes: 27 additions & 3 deletions lib/odp-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,16 @@
#include "ofpbuf.h"
#include "openvswitch/tunnel.h"
#include "packets.h"
#include "shash.h"
#include "timeval.h"
#include "util.h"
#include "vlog.h"

VLOG_DEFINE_THIS_MODULE(odp_util);

static int parse_odp_key_attr(const char *, const struct shash *port_names,
struct ofpbuf *);

/* The interface between userspace and kernel uses an "OVS_*" prefix.
* Since this is fairly non-specific for the OVS userspace components,
* "ODP_*" (Open vSwitch Datapath) is used as the prefix for
Expand Down Expand Up @@ -564,7 +568,8 @@ ovs_frag_type_from_string(const char *s, enum ovs_frag_type *type)
}

static int
parse_odp_key_attr(const char *s, struct ofpbuf *key)
parse_odp_key_attr(const char *s, const struct shash *port_names,
struct ofpbuf *key)
{
/* Many of the sscanf calls in this function use oversized destination
* fields because some sscanf() implementations truncate the range of %i
Expand Down Expand Up @@ -608,6 +613,20 @@ parse_odp_key_attr(const char *s, struct ofpbuf *key)
}
}

if (port_names && !strncmp(s, "in_port(", 8)) {
const char *name;
const struct shash_node *node;
int name_len;

name = s + 8;
name_len = strcspn(s, ")");
node = shash_find_len(port_names, name, name_len);
if (node) {
nl_msg_put_u32(key, OVS_KEY_ATTR_IN_PORT, (uintptr_t) node->data);
return 8 + name_len + 1;
}
}

{
struct ovs_key_ethernet eth_key;
int n = -1;
Expand Down Expand Up @@ -880,11 +899,16 @@ parse_odp_key_attr(const char *s, struct ofpbuf *key)
* data is appended to 'key'. Either way, 'key''s data might be
* reallocated.
*
* If 'port_names' is nonnull, it points to an shash that maps from a port name
* to a port number cast to void *. (Port names may be used instead of port
* numbers in in_port.)
*
* On success, the attributes appended to 'key' are individually syntactically
* valid, but they may not be valid as a sequence. 'key' might, for example,
* have duplicated keys. odp_flow_key_to_flow() will detect those errors. */
int
odp_flow_key_from_string(const char *s, struct ofpbuf *key)
odp_flow_key_from_string(const char *s, const struct shash *port_names,
struct ofpbuf *key)
{
const size_t old_size = key->size;
for (;;) {
Expand All @@ -895,7 +919,7 @@ odp_flow_key_from_string(const char *s, struct ofpbuf *key)
return 0;
}

retval = parse_odp_key_attr(s, key);
retval = parse_odp_key_attr(s, port_names, key);
if (retval < 0) {
key->size = old_size;
return -retval;
Expand Down
4 changes: 3 additions & 1 deletion lib/odp-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ struct ds;
struct flow;
struct nlattr;
struct ofpbuf;
struct shash;

#define OVSP_NONE ((uint16_t) -1)

Expand Down Expand Up @@ -88,7 +89,8 @@ struct odputil_keybuf {
};

void odp_flow_key_format(const struct nlattr *, size_t, struct ds *);
int odp_flow_key_from_string(const char *s, struct ofpbuf *);
int odp_flow_key_from_string(const char *s, const struct shash *port_names,
struct ofpbuf *);

void odp_flow_key_from_flow(struct ofpbuf *, const struct flow *);
int odp_flow_key_to_flow(const struct nlattr *, size_t, struct flow *);
Expand Down
2 changes: 1 addition & 1 deletion ofproto/ofproto-dpif.c
Original file line number Diff line number Diff line change
Expand Up @@ -5290,7 +5290,7 @@ ofproto_unixctl_trace(struct unixctl_conn *conn, const char *args_,

/* Convert string to datapath key. */
ofpbuf_init(&odp_key, 0);
error = odp_flow_key_from_string(arg1, &odp_key);
error = odp_flow_key_from_string(arg1, NULL, &odp_key);
if (error) {
unixctl_command_reply(conn, 501, "Bad flow syntax");
goto exit;
Expand Down
2 changes: 1 addition & 1 deletion tests/test-odp.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ main(void)

/* Convert string to OVS DP key. */
ofpbuf_init(&odp_key, 0);
error = odp_flow_key_from_string(ds_cstr(&in), &odp_key);
error = odp_flow_key_from_string(ds_cstr(&in), NULL, &odp_key);
if (error) {
printf("odp_flow_key_from_string: error\n");
goto next;
Expand Down

0 comments on commit b2a60db

Please sign in to comment.