summaryrefslogtreecommitdiff
path: root/bgpd
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd')
-rw-r--r--bgpd/bgp_community.c19
-rw-r--r--bgpd/bgp_ecommunity.c21
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;
}