2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

simap: New data structure for string-to-integer maps.

This commit adapts a couple of existing pieces of code to use the
new data structure.  The following commit will add another user
(which is also the first use of the simap_increas() function).

Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Ben Pfaff
2012-05-22 10:32:02 -07:00
parent b54c9e972e
commit 44bac24ba5
9 changed files with 352 additions and 36 deletions

View File

@@ -32,7 +32,7 @@
#include "ofpbuf.h"
#include "openvswitch/tunnel.h"
#include "packets.h"
#include "shash.h"
#include "simap.h"
#include "timeval.h"
#include "util.h"
#include "vlog.h"
@@ -49,7 +49,7 @@ VLOG_DEFINE_THIS_MODULE(odp_util);
* from another. */
static const char *delimiters = ", \t\r\n";
static int parse_odp_key_attr(const char *, const struct shash *port_names,
static int parse_odp_key_attr(const char *, const struct simap *port_names,
struct ofpbuf *);
static void format_odp_key_attr(const struct nlattr *a, struct ds *ds);
@@ -355,7 +355,7 @@ format_odp_actions(struct ds *ds, const struct nlattr *actions,
}
static int
parse_odp_action(const char *s, const struct shash *port_names,
parse_odp_action(const char *s, const struct simap *port_names,
struct ofpbuf *actions)
{
/* Many of the sscanf calls in this function use oversized destination
@@ -380,12 +380,11 @@ parse_odp_action(const char *s, const struct shash *port_names,
if (port_names) {
int len = strcspn(s, delimiters);
struct shash_node *node;
struct simap_node *node;
node = shash_find_len(port_names, s, len);
node = simap_find_len(port_names, s, len);
if (node) {
nl_msg_put_u32(actions, OVS_ACTION_ATTR_OUTPUT,
(uintptr_t) node->data);
nl_msg_put_u32(actions, OVS_ACTION_ATTR_OUTPUT, node->data);
return len;
}
}
@@ -561,7 +560,7 @@ parse_odp_action(const char *s, const struct shash *port_names,
* Netlink attributes. On failure, no data is appended to 'actions'. Either
* way, 'actions''s data might be reallocated. */
int
odp_actions_from_string(const char *s, const struct shash *port_names,
odp_actions_from_string(const char *s, const struct simap *port_names,
struct ofpbuf *actions)
{
size_t old_size;
@@ -878,7 +877,7 @@ ovs_frag_type_from_string(const char *s, enum ovs_frag_type *type)
}
static int
parse_odp_key_attr(const char *s, const struct shash *port_names,
parse_odp_key_attr(const char *s, const struct simap *port_names,
struct ofpbuf *key)
{
/* Many of the sscanf calls in this function use oversized destination
@@ -925,14 +924,14 @@ parse_odp_key_attr(const char *s, const struct shash *port_names,
if (port_names && !strncmp(s, "in_port(", 8)) {
const char *name;
const struct shash_node *node;
const struct simap_node *node;
int name_len;
name = s + 8;
name_len = strcspn(s, ")");
node = shash_find_len(port_names, name, name_len);
node = simap_find_len(port_names, name, name_len);
if (node) {
nl_msg_put_u32(key, OVS_KEY_ATTR_IN_PORT, (uintptr_t) node->data);
nl_msg_put_u32(key, OVS_KEY_ATTR_IN_PORT, node->data);
return 8 + name_len + 1;
}
}
@@ -1209,15 +1208,15 @@ parse_odp_key_attr(const char *s, const struct shash *port_names,
* 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.)
* If 'port_names' is nonnull, it points to an simap that maps from a port name
* to a port number. (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, const struct shash *port_names,
odp_flow_key_from_string(const char *s, const struct simap *port_names,
struct ofpbuf *key)
{
const size_t old_size = key->size;