aboutsummaryrefslogtreecommitdiff
path: root/networking/libiproute
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2024-05-31 12:01:43 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2024-05-31 16:03:23 +0200
commit2075553a1b0eb843d4ee73a039b3e30bed9274e0 (patch)
tree904f192fa9d7c920c9dde6a7bc26b208c3b03312 /networking/libiproute
parent5a68a246e750359819d63bcff5ef97dd9c7788fc (diff)
downloadbusybox-w32-2075553a1b0eb843d4ee73a039b3e30bed9274e0.tar.gz
busybox-w32-2075553a1b0eb843d4ee73a039b3e30bed9274e0.tar.bz2
busybox-w32-2075553a1b0eb843d4ee73a039b3e30bed9274e0.zip
libbb: add bit counting function, use where appropriate
Although "naive" counting function is not too slow and is smaller, using it on e.g. each of 1024 words of CPU mask feels wrong. function old new delta bb_popcnt_32 - 52 +52 get_prefix 323 321 -2 nproc_main 206 199 -7 d4_run_script 739 731 -8 ipcalc_main 533 507 -26 ------------------------------------------------------------------------------ (add/remove: 2/0 grow/shrink: 0/4 up/down: 52/-43) Total: 9 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/libiproute')
-rw-r--r--networking/libiproute/utils.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/networking/libiproute/utils.c b/networking/libiproute/utils.c
index 4ce230356..3cce4a06e 100644
--- a/networking/libiproute/utils.c
+++ b/networking/libiproute/utils.c
@@ -175,14 +175,13 @@ static void get_prefix_1(inet_prefix *dst, char *arg, int family)
175 if (netmask_pfx.family == AF_INET) { 175 if (netmask_pfx.family == AF_INET) {
176 /* fill in prefix length of dotted quad */ 176 /* fill in prefix length of dotted quad */
177 uint32_t mask = ntohl(netmask_pfx.data[0]); 177 uint32_t mask = ntohl(netmask_pfx.data[0]);
178 uint32_t host = ~mask; 178 uint32_t inv = ~mask;
179 179
180 /* a valid netmask must be 2^n - 1 */ 180 /* a valid netmask must be 11..10..00 */
181 if (host & (host + 1)) 181 if (inv & (inv + 1))
182 goto bad; 182 goto bad; /* inv is not 00..01..11 */
183 183
184 for (plen = 0; mask; mask <<= 1) 184 plen = bb_popcnt_32(mask);
185 ++plen;
186 if (plen > dst->bitlen) 185 if (plen > dst->bitlen)
187 goto bad; 186 goto bad;
188 /* dst->flags |= PREFIXLEN_SPECIFIED; */ 187 /* dst->flags |= PREFIXLEN_SPECIFIED; */