From: Ben Pfaff Date: Thu, 28 Jul 2011 22:02:06 +0000 (-0700) Subject: ofproto: New helper macro OFPROTO_FOR_EACH_TABLE. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b772ded808ccc1b3cce2c10377a35637b1beb28c;p=openvswitch ofproto: New helper macro OFPROTO_FOR_EACH_TABLE. In my opinion this makes the code slightly easier to read and write. --- diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index f46ff842..8c32e4fc 100644 --- a/ofproto/ofproto-provider.h +++ b/ofproto/ofproto-provider.h @@ -67,6 +67,15 @@ struct ofproto { struct ofproto *ofproto_lookup(const char *name); struct ofport *ofproto_get_port(const struct ofproto *, uint16_t ofp_port); +/* Assigns CLS to each classifier table, in turn, in OFPROTO. + * + * All parameters are evaluated multiple times. */ +#define OFPROTO_FOR_EACH_TABLE(CLS, OFPROTO) \ + for ((CLS) = (OFPROTO)->tables; \ + (CLS) < &(OFPROTO)->tables[(OFPROTO)->n_tables]; \ + (CLS)++) + + /* An OpenFlow port within a "struct ofproto". * * With few exceptions, ofproto implementations may look at these fields but diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 8d22c50f..2dd3c9f7 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -289,10 +289,10 @@ ofproto_create(const char *datapath_name, const char *datapath_type, struct ofproto **ofprotop) { const struct ofproto_class *class; + struct classifier *table; struct ofproto *ofproto; int n_tables; int error; - int i; *ofprotop = NULL; @@ -350,8 +350,8 @@ ofproto_create(const char *datapath_name, const char *datapath_type, assert(n_tables >= 1 && n_tables <= 255); ofproto->n_tables = n_tables; ofproto->tables = xmalloc(n_tables * sizeof *ofproto->tables); - for (i = 0; i < n_tables; i++) { - classifier_init(&ofproto->tables[i]); + OFPROTO_FOR_EACH_TABLE (table, ofproto) { + classifier_init(table); } ofproto->datapath_id = pick_datapath_id(ofproto); @@ -675,8 +675,7 @@ ofproto_flush__(struct ofproto *ofproto) } group = ofopgroup_create(ofproto); - for (table = ofproto->tables; table < &ofproto->tables[ofproto->n_tables]; - table++) { + OFPROTO_FOR_EACH_TABLE (table, ofproto) { struct rule *rule, *next_rule; struct cls_cursor cursor; @@ -695,7 +694,7 @@ ofproto_flush__(struct ofproto *ofproto) static void ofproto_destroy__(struct ofproto *ofproto) { - size_t i; + struct classifier *table; assert(list_is_empty(&ofproto->pending)); @@ -712,9 +711,9 @@ ofproto_destroy__(struct ofproto *ofproto) hmap_destroy(&ofproto->ports); shash_destroy(&ofproto->port_by_name); - for (i = 0; i < ofproto->n_tables; i++) { - assert(classifier_is_empty(&ofproto->tables[i])); - classifier_destroy(&ofproto->tables[i]); + OFPROTO_FOR_EACH_TABLE (table, ofproto) { + assert(classifier_is_empty(table)); + classifier_destroy(table); } free(ofproto->tables); @@ -1956,7 +1955,7 @@ ofproto_get_all_flows(struct ofproto *p, struct ds *results) { struct classifier *cls; - for (cls = &p->tables[0]; cls < &p->tables[p->n_tables]; cls++) { + OFPROTO_FOR_EACH_TABLE (cls, p) { struct cls_cursor cursor; struct rule *rule;