diff options
author | Jorge Boncompte [DTI2] <jorge@dti2.net> | 2012-05-07 16:52:55 +0000 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2012-05-22 20:25:44 +0200 |
commit | c76275ee960c708408646d8a680b201b27cb9c1a (patch) | |
tree | 59daf9a650950d35aa5350270118cd94e4a1fde3 | |
parent | 6d85b15bbb2fd3c263d5d4b402c88ff348af877b (diff) |
bgpd: optimize loops on [e]community_hash_make()
This change reduces loop count. Less jumps.
* bgp_community.c: One loop per community.
* bgp_ecommunity.c: One loop per ecommunity.
Signed-off-by: Jorge Boncompte [DTI2] <jorge@dti2.net>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
-rw-r--r-- | bgpd/bgp_community.c | 19 | ||||
-rw-r--r-- | bgpd/bgp_ecommunity.c | 21 |
2 files changed, 25 insertions, 15 deletions
diff --git a/bgpd/bgp_community.c b/bgpd/bgp_community.c index 2ba45f6e..fc1bef88 100644 --- a/bgpd/bgp_community.c +++ b/bgpd/bgp_community.c @@ -394,16 +394,19 @@ community_str (struct community *com) unsigned int community_hash_make (struct community *com) { + unsigned char *pnt = (unsigned char *)com->val; + int size = com->size * 4; + unsigned int key = 0; int c; - unsigned int key; - unsigned char *pnt; - key = 0; - pnt = (unsigned char *)com->val; - - for(c = 0; c < com->size * 4; c++) - key += pnt[c]; - + for (c = 0; c < size; c += 4) + { + key += pnt[c]; + key += pnt[c + 1]; + key += pnt[c + 2]; + key += pnt[c + 3]; + } + return key; } diff --git a/bgpd/bgp_ecommunity.c b/bgpd/bgp_ecommunity.c index 9f4aaa4b..5722425e 100644 --- a/bgpd/bgp_ecommunity.c +++ b/bgpd/bgp_ecommunity.c @@ -233,15 +233,22 @@ unsigned int ecommunity_hash_make (void *arg) { const struct ecommunity *ecom = arg; + int size = ecom->size * ECOMMUNITY_SIZE; + u_int8_t *pnt = ecom->val; + unsigned int key = 0; int c; - unsigned int key; - u_int8_t *pnt; - key = 0; - pnt = ecom->val; - - for (c = 0; c < ecom->size * ECOMMUNITY_SIZE; c++) - key += pnt[c]; + for (c = 0; c < size; c += ECOMMUNITY_SIZE) + { + key += pnt[c]; + key += pnt[c + 1]; + key += pnt[c + 2]; + key += pnt[c + 3]; + key += pnt[c + 4]; + key += pnt[c + 5]; + key += pnt[c + 6]; + key += pnt[c + 7]; + } return key; } |