2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-30 22:05:19 +00:00

lib: New data structure - smap.

A smap is a string to string hash map.  It has a cleaner interface
than shash's which were traditionally used for the same purpose.
This patch implements the data structure, and changes netdev and
its providers to use it.

Signed-off-by: Ethan Jackson <ethan@nicira.com>
This commit is contained in:
Ethan Jackson
2012-05-22 03:47:36 -07:00
parent 37344ffa58
commit 79f1cbe9f8
13 changed files with 558 additions and 287 deletions

View File

@@ -181,7 +181,7 @@ struct tc_ops {
*
* (This function is null for tc_ops_other, which cannot be installed. For
* other TC classes it should always be nonnull.) */
int (*tc_install)(struct netdev *netdev, const struct shash *details);
int (*tc_install)(struct netdev *netdev, const struct smap *details);
/* Called when the netdev code determines (through a Netlink query) that
* this TC class's qdisc is installed on 'netdev', but we didn't install
@@ -221,7 +221,7 @@ struct tc_ops {
*
* This function may be null if 'tc' is not configurable.
*/
int (*qdisc_get)(const struct netdev *netdev, struct shash *details);
int (*qdisc_get)(const struct netdev *netdev, struct smap *details);
/* Reconfigures 'netdev->tc' according to 'details', performing any
* required Netlink calls to complete the reconfiguration.
@@ -232,7 +232,7 @@ struct tc_ops {
*
* This function may be null if 'tc' is not configurable.
*/
int (*qdisc_set)(struct netdev *, const struct shash *details);
int (*qdisc_set)(struct netdev *, const struct smap *details);
/* Retrieves details of 'queue' on 'netdev->tc' into 'details'. 'queue' is
* one of the 'struct tc_queue's within 'netdev->tc->queues'.
@@ -248,7 +248,7 @@ struct tc_ops {
* This function may be null if 'tc' does not have queues ('n_queues' is
* 0). */
int (*class_get)(const struct netdev *netdev, const struct tc_queue *queue,
struct shash *details);
struct smap *details);
/* Configures or reconfigures 'queue_id' on 'netdev->tc' according to
* 'details', perfoming any required Netlink calls to complete the
@@ -262,7 +262,7 @@ struct tc_ops {
* This function may be null if 'tc' does not have queues or its queues are
* not configurable. */
int (*class_set)(struct netdev *, unsigned int queue_id,
const struct shash *details);
const struct smap *details);
/* Deletes 'queue' from 'netdev->tc'. 'queue' is one of the 'struct
* tc_queue's within 'netdev->tc->queues'.
@@ -1845,7 +1845,7 @@ netdev_linux_get_qos_capabilities(const struct netdev *netdev OVS_UNUSED,
static int
netdev_linux_get_qos(const struct netdev *netdev,
const char **typep, struct shash *details)
const char **typep, struct smap *details)
{
struct netdev_dev_linux *netdev_dev =
netdev_dev_linux_cast(netdev_get_dev(netdev));
@@ -1864,7 +1864,7 @@ netdev_linux_get_qos(const struct netdev *netdev,
static int
netdev_linux_set_qos(struct netdev *netdev,
const char *type, const struct shash *details)
const char *type, const struct smap *details)
{
struct netdev_dev_linux *netdev_dev =
netdev_dev_linux_cast(netdev_get_dev(netdev));
@@ -1901,7 +1901,7 @@ netdev_linux_set_qos(struct netdev *netdev,
static int
netdev_linux_get_queue(const struct netdev *netdev,
unsigned int queue_id, struct shash *details)
unsigned int queue_id, struct smap *details)
{
struct netdev_dev_linux *netdev_dev =
netdev_dev_linux_cast(netdev_get_dev(netdev));
@@ -1920,7 +1920,7 @@ netdev_linux_get_queue(const struct netdev *netdev,
static int
netdev_linux_set_queue(struct netdev *netdev,
unsigned int queue_id, const struct shash *details)
unsigned int queue_id, const struct smap *details)
{
struct netdev_dev_linux *netdev_dev =
netdev_dev_linux_cast(netdev_get_dev(netdev));
@@ -2002,7 +2002,7 @@ netdev_linux_dump_queues(const struct netdev *netdev,
struct netdev_dev_linux *netdev_dev =
netdev_dev_linux_cast(netdev_get_dev(netdev));
struct tc_queue *queue, *next_queue;
struct shash details;
struct smap details;
int last_error;
int error;
@@ -2014,10 +2014,10 @@ netdev_linux_dump_queues(const struct netdev *netdev,
}
last_error = 0;
shash_init(&details);
smap_init(&details);
HMAP_FOR_EACH_SAFE (queue, next_queue, hmap_node,
&netdev_dev->tc->queues) {
shash_clear(&details);
smap_clear(&details);
error = netdev_dev->tc->ops->class_get(netdev, queue, &details);
if (!error) {
@@ -2026,7 +2026,7 @@ netdev_linux_dump_queues(const struct netdev *netdev,
last_error = error;
}
}
shash_destroy(&details);
smap_destroy(&details);
return last_error;
}
@@ -2271,7 +2271,7 @@ netdev_linux_get_next_hop(const struct in_addr *host, struct in_addr *next_hop,
}
static int
netdev_linux_get_drv_info(const struct netdev *netdev, struct shash *sh)
netdev_linux_get_drv_info(const struct netdev *netdev, struct smap *smap)
{
int error;
struct netdev_dev_linux *netdev_dev =
@@ -2279,17 +2279,18 @@ netdev_linux_get_drv_info(const struct netdev *netdev, struct shash *sh)
error = netdev_linux_get_drvinfo(netdev_dev);
if (!error) {
shash_add(sh, "driver_name", xstrdup(netdev_dev->drvinfo.driver));
shash_add(sh, "driver_version", xstrdup(netdev_dev->drvinfo.version));
shash_add(sh, "firmware_version", xstrdup(netdev_dev->drvinfo.fw_version));
smap_add(smap, "driver_name", netdev_dev->drvinfo.driver);
smap_add(smap, "driver_version", netdev_dev->drvinfo.version);
smap_add(smap, "firmware_version", netdev_dev->drvinfo.fw_version);
}
return error;
}
static int
netdev_internal_get_drv_info(const struct netdev *netdev OVS_UNUSED, struct shash *sh)
netdev_internal_get_drv_info(const struct netdev *netdev OVS_UNUSED,
struct smap *smap)
{
shash_add(sh, "driver_name", xstrdup("openvswitch"));
smap_add(smap, "driver_name", "openvswitch");
return 0;
}
@@ -2651,11 +2652,11 @@ htb_parse_tcmsg__(struct ofpbuf *tcmsg, unsigned int *queue_id,
static void
htb_parse_qdisc_details__(struct netdev *netdev,
const struct shash *details, struct htb_class *hc)
const struct smap *details, struct htb_class *hc)
{
const char *max_rate_s;
max_rate_s = shash_find_data(details, "max-rate");
max_rate_s = smap_get(details, "max-rate");
hc->max_rate = max_rate_s ? strtoull(max_rate_s, NULL, 10) / 8 : 0;
if (!hc->max_rate) {
enum netdev_features current;
@@ -2670,13 +2671,13 @@ htb_parse_qdisc_details__(struct netdev *netdev,
static int
htb_parse_class_details__(struct netdev *netdev,
const struct shash *details, struct htb_class *hc)
const struct smap *details, struct htb_class *hc)
{
const struct htb *htb = htb_get__(netdev);
const char *min_rate_s = shash_find_data(details, "min-rate");
const char *max_rate_s = shash_find_data(details, "max-rate");
const char *burst_s = shash_find_data(details, "burst");
const char *priority_s = shash_find_data(details, "priority");
const char *min_rate_s = smap_get(details, "min-rate");
const char *max_rate_s = smap_get(details, "max-rate");
const char *burst_s = smap_get(details, "burst");
const char *priority_s = smap_get(details, "priority");
int mtu, error;
error = netdev_get_mtu(netdev, &mtu);
@@ -2734,7 +2735,7 @@ htb_query_class__(const struct netdev *netdev, unsigned int handle,
}
static int
htb_tc_install(struct netdev *netdev, const struct shash *details)
htb_tc_install(struct netdev *netdev, const struct smap *details)
{
int error;
@@ -2826,15 +2827,15 @@ htb_tc_destroy(struct tc *tc)
}
static int
htb_qdisc_get(const struct netdev *netdev, struct shash *details)
htb_qdisc_get(const struct netdev *netdev, struct smap *details)
{
const struct htb *htb = htb_get__(netdev);
shash_add(details, "max-rate", xasprintf("%llu", 8ULL * htb->max_rate));
smap_add_format(details, "max-rate", "%llu", 8ULL * htb->max_rate);
return 0;
}
static int
htb_qdisc_set(struct netdev *netdev, const struct shash *details)
htb_qdisc_set(struct netdev *netdev, const struct smap *details)
{
struct htb_class hc;
int error;
@@ -2850,24 +2851,24 @@ htb_qdisc_set(struct netdev *netdev, const struct shash *details)
static int
htb_class_get(const struct netdev *netdev OVS_UNUSED,
const struct tc_queue *queue, struct shash *details)
const struct tc_queue *queue, struct smap *details)
{
const struct htb_class *hc = htb_class_cast__(queue);
shash_add(details, "min-rate", xasprintf("%llu", 8ULL * hc->min_rate));
smap_add_format(details, "min-rate", "%llu", 8ULL * hc->min_rate);
if (hc->min_rate != hc->max_rate) {
shash_add(details, "max-rate", xasprintf("%llu", 8ULL * hc->max_rate));
smap_add_format(details, "max-rate", "%llu", 8ULL * hc->max_rate);
}
shash_add(details, "burst", xasprintf("%llu", 8ULL * hc->burst));
smap_add_format(details, "burst", "%llu", 8ULL * hc->burst);
if (hc->priority) {
shash_add(details, "priority", xasprintf("%u", hc->priority));
smap_add_format(details, "priority", "%u", hc->priority);
}
return 0;
}
static int
htb_class_set(struct netdev *netdev, unsigned int queue_id,
const struct shash *details)
const struct smap *details)
{
struct htb_class hc;
int error;
@@ -3127,13 +3128,13 @@ hfsc_query_class__(const struct netdev *netdev, unsigned int handle,
}
static void
hfsc_parse_qdisc_details__(struct netdev *netdev, const struct shash *details,
hfsc_parse_qdisc_details__(struct netdev *netdev, const struct smap *details,
struct hfsc_class *class)
{
uint32_t max_rate;
const char *max_rate_s;
max_rate_s = shash_find_data(details, "max-rate");
max_rate_s = smap_get(details, "max-rate");
max_rate = max_rate_s ? strtoull(max_rate_s, NULL, 10) / 8 : 0;
if (!max_rate) {
@@ -3149,7 +3150,7 @@ hfsc_parse_qdisc_details__(struct netdev *netdev, const struct shash *details,
static int
hfsc_parse_class_details__(struct netdev *netdev,
const struct shash *details,
const struct smap *details,
struct hfsc_class * class)
{
const struct hfsc *hfsc;
@@ -3157,8 +3158,8 @@ hfsc_parse_class_details__(struct netdev *netdev,
const char *min_rate_s, *max_rate_s;
hfsc = hfsc_get__(netdev);
min_rate_s = shash_find_data(details, "min-rate");
max_rate_s = shash_find_data(details, "max-rate");
min_rate_s = smap_get(details, "min-rate");
max_rate_s = smap_get(details, "max-rate");
min_rate = min_rate_s ? strtoull(min_rate_s, NULL, 10) / 8 : 0;
min_rate = MAX(min_rate, 1);
@@ -3259,7 +3260,7 @@ hfsc_setup_class__(struct netdev *netdev, unsigned int handle,
}
static int
hfsc_tc_install(struct netdev *netdev, const struct shash *details)
hfsc_tc_install(struct netdev *netdev, const struct smap *details)
{
int error;
struct hfsc_class class;
@@ -3327,16 +3328,16 @@ hfsc_tc_destroy(struct tc *tc)
}
static int
hfsc_qdisc_get(const struct netdev *netdev, struct shash *details)
hfsc_qdisc_get(const struct netdev *netdev, struct smap *details)
{
const struct hfsc *hfsc;
hfsc = hfsc_get__(netdev);
shash_add(details, "max-rate", xasprintf("%llu", 8ULL * hfsc->max_rate));
smap_add_format(details, "max-rate", "%llu", 8ULL * hfsc->max_rate);
return 0;
}
static int
hfsc_qdisc_set(struct netdev *netdev, const struct shash *details)
hfsc_qdisc_set(struct netdev *netdev, const struct smap *details)
{
int error;
struct hfsc_class class;
@@ -3354,21 +3355,21 @@ hfsc_qdisc_set(struct netdev *netdev, const struct shash *details)
static int
hfsc_class_get(const struct netdev *netdev OVS_UNUSED,
const struct tc_queue *queue, struct shash *details)
const struct tc_queue *queue, struct smap *details)
{
const struct hfsc_class *hc;
hc = hfsc_class_cast__(queue);
shash_add(details, "min-rate", xasprintf("%llu", 8ULL * hc->min_rate));
smap_add_format(details, "min-rate", "%llu", 8ULL * hc->min_rate);
if (hc->min_rate != hc->max_rate) {
shash_add(details, "max-rate", xasprintf("%llu", 8ULL * hc->max_rate));
smap_add_format(details, "max-rate", "%llu", 8ULL * hc->max_rate);
}
return 0;
}
static int
hfsc_class_set(struct netdev *netdev, unsigned int queue_id,
const struct shash *details)
const struct smap *details)
{
int error;
struct hfsc_class class;
@@ -3473,7 +3474,7 @@ default_install__(struct netdev *netdev)
static int
default_tc_install(struct netdev *netdev,
const struct shash *details OVS_UNUSED)
const struct smap *details OVS_UNUSED)
{
default_install__(netdev);
return 0;