It's a lot more straightforward to deal with integer values as integers instead of arrays of bytes.
Signed-off-by: Ben Pfaff <b...@nicira.com> --- lib/lldp/aa-structs.h | 2 +- lib/lldp/lldp.c | 19 +++++++++++++++---- lib/ovs-lldp.c | 42 +++--------------------------------------- tests/test-aa.c | 24 ++++++------------------ 4 files changed, 25 insertions(+), 62 deletions(-) diff --git a/lib/lldp/aa-structs.h b/lib/lldp/aa-structs.h index f58be76..e9d1162 100644 --- a/lib/lldp/aa-structs.h +++ b/lib/lldp/aa-structs.h @@ -38,7 +38,7 @@ struct lldpd_aa_element_tlv { struct lldpd_aa_isid_vlan_map_data { uint16_t status; uint16_t vlan; - uint8_t isid[3]; + uint32_t isid; }; struct lldpd_aa_isid_vlan_maps_tlv { diff --git a/lib/lldp/lldp.c b/lib/lldp/lldp.c index 7c80296..a078538 100644 --- a/lib/lldp/lldp.c +++ b/lib/lldp/lldp.c @@ -125,6 +125,15 @@ lldp_tlv_put_u32(struct ofpbuf *p, uint32_t x) } static void +lldp_tlv_put_isid(struct ofpbuf *p, uint32_t isid) +{ + uint8_t *data = ofpbuf_put_uninit(p, 3); + data[0] = isid >> 16; + data[1] = isid >> 8; + data[2] = isid; +} + +static void lldp_tlv_start(struct ofpbuf *p, uint8_t tlv, unsigned int *start) { *start = ofpbuf_size(p); @@ -286,8 +295,7 @@ lldp_send(struct lldpd *global OVS_UNUSED, vlan_isid_map->isid_vlan_data.vlan; lldp_tlv_put_u16(p, status_vlan_word); - ofpbuf_put(p, &vlan_isid_map->isid_vlan_data.isid, - sizeof vlan_isid_map->isid_vlan_data.isid); + lldp_tlv_put_isid(p, vlan_isid_map->isid_vlan_data.isid); } lldp_tlv_end(p, start); @@ -537,6 +545,8 @@ lldp_decode(struct lldpd *cfg OVS_UNUSED, char *frame, int s, num_mappings /= 5; /* Each mapping is 5 Bytes */ for(; num_mappings > 0; num_mappings--) { + uint8_t isid[3]; + isid_vlan_map = xzalloc(sizeof *isid_vlan_map); aa_status_vlan_word = PEEK_UINT16; @@ -547,8 +557,9 @@ lldp_decode(struct lldpd *cfg OVS_UNUSED, char *frame, int s, /* Vlan is last 12 bits */ isid_vlan_map->isid_vlan_data.vlan = aa_status_vlan_word & 0x0FFF; - PEEK_BYTES(&isid_vlan_map->isid_vlan_data.isid, - sizeof isid_vlan_map->isid_vlan_data.isid); + PEEK_BYTES(isid, 3); + isid_vlan_map->isid_vlan_data.isid = + (isid[0] << 16) | (isid[1] << 8) | isid[2]; list_push_back( (struct ovs_list *) &port->p_isid_vlan_maps, (struct ovs_list *) isid_vlan_map); diff --git a/lib/ovs-lldp.c b/lib/ovs-lldp.c index 9d88213..4f27e5e 100644 --- a/lib/ovs-lldp.c +++ b/lib/ovs-lldp.c @@ -101,38 +101,6 @@ static struct hmap *const all_mappings OVS_GUARDED_BY(mutex) = &all_mappings__; static struct lldp_aa_element_system_id system_id_null; -/* Convert an array to an integer. I-SID are stored in an array of bytes - * in the LLDP hardware structrure. - */ -static uint32_t -array_to_int(uint8_t *array, size_t len) -{ - uint32_t res = 0; - unsigned int i = 0; - - ovs_assert(len <= sizeof(uint32_t)); - - for (i = 0; i < len; i++) { - res = res | (array[len - i - 1] << (i * 8)); - } - - return res; -} - -/* Convert an integer to an array of byte. - */ -static void -int_to_array(uint8_t *array, size_t len, uint32_t value) -{ - unsigned int i; - - ovs_assert(len <= sizeof(uint32_t)); - - for (i = 0; i < len; i++) { - array[len - i - 1] = value >> (8 * i); - } -} - /* Convert an LLDP chassis ID to a string. */ static void @@ -298,8 +266,7 @@ aa_print_isid_status_port_isid(struct lldp *lldp, struct lldpd_port *port) } LIST_FOR_EACH (mapping, m_entries, &port->p_isid_vlan_maps.m_entries) { - uint32_t isid = array_to_int(mapping->isid_vlan_data.isid, - sizeof mapping->isid_vlan_data.isid); + uint32_t isid = mapping->isid_vlan_data.isid; struct aa_mapping_internal *m = mapping_find_by_isid(lldp, isid); VLOG_INFO("h_rport: isid=%u, vlan=%u, status=%d", @@ -435,9 +402,7 @@ update_mapping_on_lldp(struct lldp *lldp, struct lldpd_hardware *hardware, VLOG_INFO("\t\t hardware->h_ifname=%s", hardware->h_ifname); } - int_to_array(lm->isid_vlan_data.isid, - ARRAY_SIZE(lm->isid_vlan_data.isid), - (uint32_t) m->isid); + lm->isid_vlan_data.isid = m->isid; lm->isid_vlan_data.vlan = m->vlan; list_push_back(&hardware->h_lport.p_isid_vlan_maps.m_entries, @@ -623,8 +588,7 @@ aa_mapping_unregister_mapping(struct lldp *lldp, lm_next, m_entries, &hw->h_lport.p_isid_vlan_maps.m_entries) { - uint32_t isid = array_to_int(lm->isid_vlan_data.isid, - sizeof lm->isid_vlan_data.isid); + uint32_t isid = lm->isid_vlan_data.isid; if (isid == (uint32_t) m->isid) { VLOG_INFO("\t\t Removing lport, isid=%u, vlan=%u", diff --git a/tests/test-aa.c b/tests/test-aa.c index 58c20c8..9f2d41a 100644 --- a/tests/test-aa.c +++ b/tests/test-aa.c @@ -117,12 +117,8 @@ check_received_aa(struct lldpd_port *sport, received_map->isid_vlan_data.status); assert(smap[i].isid_vlan_data.vlan == received_map->isid_vlan_data.vlan); - assert(smap[i].isid_vlan_data.isid[0] == - received_map->isid_vlan_data.isid[0]); - assert(smap[i].isid_vlan_data.isid[1] == - received_map->isid_vlan_data.isid[1]); - assert(smap[i].isid_vlan_data.isid[2] == - received_map->isid_vlan_data.isid[2]); + assert(smap[i].isid_vlan_data.isid == + received_map->isid_vlan_data.isid); /* Next mapping sent */ i++; @@ -191,15 +187,11 @@ test_aa_send(void) /* ISID/VLAN mappings */ map_init[0].isid_vlan_data.status = 0xC; map_init[0].isid_vlan_data.vlan = 0x64; - map_init[0].isid_vlan_data.isid[0] = 1; - map_init[0].isid_vlan_data.isid[1] = 2; - map_init[0].isid_vlan_data.isid[2] = 3; + map_init[0].isid_vlan_data.isid = 0x010203; map_init[1].isid_vlan_data.status = 0xD; map_init[1].isid_vlan_data.vlan = 0xF; - map_init[1].isid_vlan_data.isid[0] = 4; - map_init[1].isid_vlan_data.isid[1] = 5; - map_init[1].isid_vlan_data.isid[2] = 6; + map_init[1].isid_vlan_data.isid = 0x040506; /* Prepare an empty packet buffer */ ofpbuf_use_stub(&packet, stub, sizeof stub); @@ -262,15 +254,11 @@ test_aa_send(void) /* Populate instance with two auto attach isid/vlan mappings */ map[0].isid_vlan_data.status = map_init[0].isid_vlan_data.status; map[0].isid_vlan_data.vlan = map_init[0].isid_vlan_data.vlan; - map[0].isid_vlan_data.isid[0] = map_init[0].isid_vlan_data.isid[0]; - map[0].isid_vlan_data.isid[1] = map_init[0].isid_vlan_data.isid[1]; - map[0].isid_vlan_data.isid[2] = map_init[0].isid_vlan_data.isid[2]; + map[0].isid_vlan_data.isid = map_init[0].isid_vlan_data.isid; map[1].isid_vlan_data.status = map_init[1].isid_vlan_data.status; map[1].isid_vlan_data.vlan = map_init[1].isid_vlan_data.vlan; - map[1].isid_vlan_data.isid[0] = map_init[1].isid_vlan_data.isid[0]; - map[1].isid_vlan_data.isid[1] = map_init[1].isid_vlan_data.isid[1]; - map[1].isid_vlan_data.isid[2] = map_init[1].isid_vlan_data.isid[2]; + map[1].isid_vlan_data.isid = map_init[1].isid_vlan_data.isid; list_init(&hw->h_lport.p_isid_vlan_maps.m_entries); list_push_back(&hw->h_lport.p_isid_vlan_maps.m_entries, -- 2.1.3 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev