From: Alex Wang Date: Thu, 22 Aug 2013 21:24:17 +0000 (-0700) Subject: ofproto: Change max_ports and alloc_port_no to uint16_t type. X-Git-Tag: sliver-openvswitch-2.0.90-1~20^2~1 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=430dbb14c150ced081b42ec6314c7dc63661a1d1;p=sliver-openvswitch.git ofproto: Change max_ports and alloc_port_no to uint16_t type. The declaration of 'max_ports' and 'alloc_port_no' as ofp_port_t adds unwanted complexity to coding. This commit changes them back to uint16_t type. Signed-off-by: Alex Wang Signed-off-by: Ben Pfaff --- diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index ef4d5883e..d8b6a796c 100644 --- a/ofproto/ofproto-provider.h +++ b/ofproto/ofproto-provider.h @@ -65,8 +65,8 @@ struct ofproto { struct shash port_by_name; unsigned long *ofp_port_ids;/* Bitmap of used OpenFlow port numbers. */ struct simap ofp_requests; /* OpenFlow port number requests. */ - ofp_port_t alloc_port_no; /* Last allocated OpenFlow port number. */ - ofp_port_t max_ports; /* Max possible OpenFlow port num, plus one. */ + uint16_t alloc_port_no; /* Last allocated OpenFlow port number. */ + uint16_t max_ports; /* Max possible OpenFlow port num, plus one. */ /* Flow tables. */ struct oftable *tables; @@ -114,7 +114,7 @@ struct ofproto { }; void ofproto_init_tables(struct ofproto *, int n_tables); -void ofproto_init_max_ports(struct ofproto *, ofp_port_t max_ports); +void ofproto_init_max_ports(struct ofproto *, uint16_t max_ports); struct ofproto *ofproto_lookup(const char *name); struct ofport *ofproto_get_port(const struct ofproto *, ofp_port_t ofp_port); diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 947b8c657..709fd0751 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -432,7 +432,7 @@ ofproto_create(const char *datapath_name, const char *datapath_type, hmap_init(&ofproto->ports); shash_init(&ofproto->port_by_name); simap_init(&ofproto->ofp_requests); - ofproto->max_ports = OFPP_MAX; + ofproto->max_ports = ofp_to_u16(OFPP_MAX); ofproto->tables = NULL; ofproto->n_tables = 0; hindex_init(&ofproto->cookies); @@ -461,7 +461,7 @@ ofproto_create(const char *datapath_name, const char *datapath_type, /* The "max_ports" member should have been set by ->construct(ofproto). * Port 0 is not a valid OpenFlow port, so mark that as unavailable. */ - ofproto->ofp_port_ids = bitmap_allocate(ofp_to_u16(ofproto->max_ports)); + ofproto->ofp_port_ids = bitmap_allocate(ofproto->max_ports); bitmap_set1(ofproto->ofp_port_ids, 0); /* Check that hidden tables, if any, are at the end. */ @@ -520,9 +520,9 @@ ofproto_init_tables(struct ofproto *ofproto, int n_tables) * Reserved ports numbered OFPP_MAX and higher are special and not subject to * the 'max_ports' restriction. */ void -ofproto_init_max_ports(struct ofproto *ofproto, ofp_port_t max_ports) +ofproto_init_max_ports(struct ofproto *ofproto, uint16_t max_ports) { - ovs_assert(ofp_to_u16(max_ports) <= ofp_to_u16(OFPP_MAX)); + ovs_assert(max_ports <= ofp_to_u16(OFPP_MAX)); ofproto->max_ports = max_ports; } @@ -1742,32 +1742,28 @@ reinit_ports(struct ofproto *p) static ofp_port_t alloc_ofp_port(struct ofproto *ofproto, const char *netdev_name) { - uint16_t max_ports = ofp_to_u16(ofproto->max_ports); uint16_t port_idx; port_idx = simap_get(&ofproto->ofp_requests, netdev_name); - if (!port_idx) { - port_idx = UINT16_MAX; - } + port_idx = port_idx ? port_idx : UINT16_MAX; - if (port_idx >= max_ports + if (port_idx >= ofproto->max_ports || bitmap_is_set(ofproto->ofp_port_ids, port_idx)) { - uint16_t end_port_no = ofp_to_u16(ofproto->alloc_port_no); - uint16_t alloc_port_no = end_port_no; + uint16_t end_port_no = ofproto->alloc_port_no; /* Search for a free OpenFlow port number. We try not to * immediately reuse them to prevent problems due to old * flows. */ for (;;) { - if (++alloc_port_no >= max_ports) { - alloc_port_no = 0; + if (++ofproto->alloc_port_no >= ofproto->max_ports) { + ofproto->alloc_port_no = 0; } - if (!bitmap_is_set(ofproto->ofp_port_ids, alloc_port_no)) { - port_idx = alloc_port_no; - ofproto->alloc_port_no = u16_to_ofp(alloc_port_no); + if (!bitmap_is_set(ofproto->ofp_port_ids, + ofproto->alloc_port_no)) { + port_idx = ofproto->alloc_port_no; break; } - if (alloc_port_no == end_port_no) { + if (ofproto->alloc_port_no == end_port_no) { return OFPP_NONE; } } @@ -1779,7 +1775,7 @@ alloc_ofp_port(struct ofproto *ofproto, const char *netdev_name) static void dealloc_ofp_port(const struct ofproto *ofproto, ofp_port_t ofp_port) { - if (ofp_to_u16(ofp_port) < ofp_to_u16(ofproto->max_ports)) { + if (ofp_to_u16(ofp_port) < ofproto->max_ports) { bitmap_set0(ofproto->ofp_port_ids, ofp_to_u16(ofp_port)); } } @@ -2103,9 +2099,9 @@ init_ports(struct ofproto *p) netdev = ofport_open(p, &ofproto_port, &pp); if (netdev) { ofport_install(p, netdev, &pp); - if (ofproto_port.ofp_port < p->max_ports) { + if (ofp_to_u16(ofproto_port.ofp_port) < p->max_ports) { p->alloc_port_no = MAX(p->alloc_port_no, - ofproto_port.ofp_port); + ofp_to_u16(ofproto_port.ofp_port)); } } } @@ -2466,8 +2462,8 @@ ofproto_check_ofpacts(struct ofproto *ofproto, enum ofperr error; uint32_t mid; - error = ofpacts_check(ofpacts, ofpacts_len, flow, ofproto->max_ports, - table_id); + error = ofpacts_check(ofpacts, ofpacts_len, flow, + u16_to_ofp(ofproto->max_ports), table_id); if (error) { return error; } @@ -2504,7 +2500,7 @@ handle_packet_out(struct ofconn *ofconn, const struct ofp_header *oh) if (error) { goto exit_free_ofpacts; } - if (ofp_to_u16(po.in_port) >= ofp_to_u16(p->max_ports) + if (ofp_to_u16(po.in_port) >= p->max_ports && ofp_to_u16(po.in_port) < ofp_to_u16(OFPP_MAX)) { error = OFPERR_OFPBRC_BAD_PORT; goto exit_free_ofpacts; @@ -3558,7 +3554,7 @@ modify_flows__(struct ofproto *ofproto, struct ofconn *ofconn, /* Verify actions. */ error = ofpacts_check(fm->ofpacts, fm->ofpacts_len, &fm->match.flow, - ofproto->max_ports, rule->table_id); + u16_to_ofp(ofproto->max_ports), rule->table_id); if (error) { return error; }