commit 7e7dfca6b2824e5a14c5b011a4e05aac89d85231
Author: Iurii Egorov <ye@amnezia.org>
Date:   Fri Nov 15 12:54:46 2024 +0300

    Fix get_random_u8() absence in older kernels
    
    Signed-off-by: Iurii Egorov <ye@amnezia.org>

diff --git a/src/netlink.c b/src/netlink.c
index 5043bb3..29049ba 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -232,7 +232,7 @@ static inline int parse_ipv6_prefix(const char *prefix_str, struct ipv6_prefix *
 static inline int generate_ipv6_address_with_prefix(const struct ipv6_prefix *prefix, u8 *addr)
 {
 	int prefix_bytes, prefix_bits;
-	u8 mask;
+	u8 mask, random_byte;
 
 	if (!prefix || !addr)
 		return -EINVAL;
@@ -246,9 +246,10 @@ static inline int generate_ipv6_address_with_prefix(const struct ipv6_prefix *pr
 		get_random_bytes(addr + prefix_bytes, 16 - prefix_bytes);
 
 		if (prefix_bits != 0) {
+			get_random_bytes(&random_byte, sizeof(random_byte));
 			mask = (u8)(0xFF << (8 - prefix_bits));
 			addr[prefix_bytes] &= mask;
-			addr[prefix_bytes] |= get_random_u8() & ~mask;
+			addr[prefix_bytes] |= random_byte & ~mask;
 		}
 	}
 
diff --git a/src/patches/007-random-bytes-fix.patch b/src/patches/007-random-bytes-fix.patch
new file mode 100644
index 0000000..d898a79
--- /dev/null
+++ b/src/patches/007-random-bytes-fix.patch
@@ -0,0 +1,25 @@
+diff --git netlink.c netlink.c
+index 5043bb3..29049ba 100644
+--- netlink.c
++++ netlink.c
+@@ -232,7 +232,7 @@ static inline int parse_ipv6_prefix(const char *prefix_str, struct ipv6_prefix *
+ static inline int generate_ipv6_address_with_prefix(const struct ipv6_prefix *prefix, u8 *addr)
+ {
+ 	int prefix_bytes, prefix_bits;
+-	u8 mask;
++	u8 mask, random_byte;
+ 
+ 	if (!prefix || !addr)
+ 		return -EINVAL;
+@@ -246,9 +246,10 @@ static inline int generate_ipv6_address_with_prefix(const struct ipv6_prefix *pr
+ 		get_random_bytes(addr + prefix_bytes, 16 - prefix_bytes);
+ 
+ 		if (prefix_bits != 0) {
++			get_random_bytes(&random_byte, sizeof(random_byte));
+ 			mask = (u8)(0xFF << (8 - prefix_bits));
+ 			addr[prefix_bytes] &= mask;
+-			addr[prefix_bytes] |= get_random_u8() & ~mask;
++			addr[prefix_bytes] |= random_byte & ~mask;
+ 		}
+ 	}
+ 
