Attention is currently required from: Arne Schwabe.
Hello Arne Schwabe,
I'd like you to do a code review.
Please visit
https://gerrit.openvpn.net/c/openvpn/+/2126?usp=email
to review the following change.
Change subject: pool: reuse handle-to-address helpers in ifconfig_pool_acquire()
......................................................................
pool: reuse handle-to-address helpers in ifconfig_pool_acquire()
ifconfig_pool_acquire() duplicated the address calculation of
ifconfig_pool_handle_to_ip_base() and
ifconfig_pool_handle_to_ipv6_base(). Use those instead, and add
in6_addr_low32() for the three open-coded conversions of the last
32 bits of an IPv6 address. Its uint32_t casts also avoid shifting
an int into the sign bit.
Change-Id: I0f8ea4fa572f84e6dcc9b0806c23977c64ea645d
Signed-off-by: Razvan Cojocaru <[email protected]>
---
M src/openvpn/pool.c
1 file changed, 27 insertions(+), 28 deletions(-)
git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/26/2126/1
diff --git a/src/openvpn/pool.c b/src/openvpn/pool.c
index fff0e3f..7978f93 100644
--- a/src/openvpn/pool.c
+++ b/src/openvpn/pool.c
@@ -35,6 +35,20 @@
#include "memdbg.h"
+static in_addr_t ifconfig_pool_handle_to_ip_base(const struct ifconfig_pool
*pool,
+ ifconfig_pool_handle hand);
+
+static struct in6_addr ifconfig_pool_handle_to_ipv6_base(const struct
ifconfig_pool *pool,
+ ifconfig_pool_handle
hand);
+
+/* Return the last 32 bits of an IPv6 address in host byte order */
+static inline uint32_t
+in6_addr_low32(const struct in6_addr *a)
+{
+ return ((uint32_t)a->s6_addr[12] << 24) | ((uint32_t)a->s6_addr[13] << 16)
+ | ((uint32_t)a->s6_addr[14] << 8) | a->s6_addr[15];
+}
+
static void
ifconfig_pool_entry_free(struct ifconfig_pool_entry *ipe, bool hard)
{
@@ -192,8 +206,7 @@
* 4 bytes, therefore we can just extract that and use it as base in
* integer form
*/
- uint32_t base = (ipv6_base.s6_addr[12] << 24) | (ipv6_base.s6_addr[13]
<< 16)
- | (ipv6_base.s6_addr[14] << 8) | ipv6_base.s6_addr[15];
+ uint32_t base = in6_addr_low32(&ipv6_base);
/* some bits of the last 4 bytes may still be part of the network
* portion of the address, therefore we need to set them to 0
*/
@@ -314,33 +327,22 @@
if (pool->ipv4.enabled && local && remote)
{
- switch (pool->ipv4.type)
+ const in_addr_t b = ifconfig_pool_handle_to_ip_base(pool, i);
+ if (pool->ipv4.type == IFCONFIG_POOL_30NET)
{
- case IFCONFIG_POOL_30NET:
- {
- in_addr_t b = pool->ipv4.base + (i << 2);
- *local = b + 1;
- *remote = b + 2;
- break;
- }
-
- case IFCONFIG_POOL_INDIV:
- {
- in_addr_t b = pool->ipv4.base + i;
- *local = 0;
- *remote = b;
- break;
- }
-
- default:
- ASSERT(0);
+ *local = b + 1;
+ *remote = b + 2;
+ }
+ else
+ {
+ *local = 0;
+ *remote = b;
}
}
- /* IPv6 pools are always INDIV (--linear) */
if (pool->ipv6.enabled && remote_ipv6)
{
- *remote_ipv6 = add_in6_addr(pool->ipv6.base, i);
+ *remote_ipv6 = ifconfig_pool_handle_to_ipv6_base(pool, i);
}
}
return i;
@@ -415,11 +417,8 @@
}
}
- base = (pool->ipv6.base.s6_addr[12] << 24) | (pool->ipv6.base.s6_addr[13]
<< 16)
- | (pool->ipv6.base.s6_addr[14] << 8) | pool->ipv6.base.s6_addr[15];
-
- addr = (in_addr->s6_addr[12] << 24) | (in_addr->s6_addr[13] << 16) |
(in_addr->s6_addr[14] << 8)
- | in_addr->s6_addr[15];
+ base = in6_addr_low32(&pool->ipv6.base);
+ addr = in6_addr_low32(in_addr);
ret = addr - base;
if (ret < 0 || ret >= pool->size)
--
To view, visit https://gerrit.openvpn.net/c/openvpn/+/2126?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.openvpn.net/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: openvpn
Gerrit-Branch: master
Gerrit-Change-Id: I0f8ea4fa572f84e6dcc9b0806c23977c64ea645d
Gerrit-Change-Number: 2126
Gerrit-PatchSet: 1
Gerrit-Owner: Răzvan Cojocaru <[email protected]>
Gerrit-Reviewer: Arne Schwabe <[email protected]>
Gerrit-CC: openvpn-devel <[email protected]>
Gerrit-Attention: Arne Schwabe <[email protected]>
_______________________________________________
Openvpn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel