Module Name: src
Committed By: kefren
Date: Thu Jul 11 09:11:35 UTC 2013
Modified Files:
src/usr.sbin/ldpd: mpls_routes.c
Log Message:
speed up a little bit the string<->prefixlen transforms
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/usr.sbin/ldpd/mpls_routes.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.sbin/ldpd/mpls_routes.c
diff -u src/usr.sbin/ldpd/mpls_routes.c:1.10 src/usr.sbin/ldpd/mpls_routes.c:1.11
--- src/usr.sbin/ldpd/mpls_routes.c:1.10 Sat Jan 26 17:29:55 2013
+++ src/usr.sbin/ldpd/mpls_routes.c Thu Jul 11 09:11:35 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: mpls_routes.c,v 1.10 2013/01/26 17:29:55 kefren Exp $ */
+/* $NetBSD: mpls_routes.c,v 1.11 2013/07/11 09:11:35 kefren Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -229,16 +229,13 @@ from_cidr_to_union(uint8_t prefixlen)
uint8_t
from_mask_to_cidr(char *mask)
{
- /* LoL (although I don't think about something faster right now) */
- char mtest[20];
- uint8_t i;
-
- for (i = 1; i < 32; i++) {
- from_cidr_to_mask(i, mtest);
- if (!strcmp(mask, mtest))
- break;
- }
- return i;
+ struct in_addr addr;
+ uint8_t plen = 0;
+
+ if (inet_aton(mask, &addr) != 0)
+ for (; addr.s_addr; plen++)
+ addr.s_addr &= addr.s_addr - 1;
+ return plen;
}
uint8_t
@@ -258,23 +255,13 @@ from_union_to_cidr(union sockunion *so_p
void
from_cidr_to_mask(uint8_t prefixlen, char *mask)
{
- uint32_t a = 0, p = prefixlen;
- if (prefixlen > 32) {
- strlcpy(mask, "255.255.255.255", 16);
- return;
- }
- for (; p > 0; p--) {
- a = a >> (p - 1);
- a += 1;
- a = a << (p - 1);
- }
- /* is this OK ? */
-#if _BYTE_ORDER == _LITTLE_ENDIAN
- a = a << (32 - prefixlen);
-#endif
+ uint32_t a = 0;
+ uint8_t plen = prefixlen < 32 ? prefixlen : 32;
+ if (plen != 0)
+ a = (0xffffffff >> (32 - plen)) << (32 - plen);
snprintf(mask, 16, "%d.%d.%d.%d", a >> 24, (a << 8) >> 24,
- (a << 16) >> 24, (a << 24) >> 24);
+ (a << 16) >> 24, (a << 24) >> 24);
}
char *