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:
@@ -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;
|
||||
|
Reference in New Issue
Block a user