]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
VPN: Cleaner derivation of subnet mask from CIDR network prefix length
authorRoopesh Chander <roop@roopc.net>
Sun, 28 Oct 2018 06:21:18 +0000 (11:51 +0530)
committerRoopesh Chander <roop@roopc.net>
Sun, 28 Oct 2018 06:21:18 +0000 (11:51 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/VPN/PacketTunnelOptionsGenerator.swift

index e3ecb3c1f0edd482b864810a0b562cbd07caa395..78a5944ba082cc56d7e5d5ce0b91363f28d551cf 100644 (file)
@@ -155,21 +155,15 @@ class PacketTunnelOptionsGenerator {
     }
 
     static func ipv4SubnetMaskString(of addressRange: IPAddressRange) -> String {
-        var n: UInt8 = addressRange.networkPrefixLength
+        let n: UInt8 = addressRange.networkPrefixLength
         assert(n <= 32)
-        var components: [UInt8] = []
-        while (n >= 8) {
-            components.append(255)
-            n = n - 8
-        }
-        if (n > 0) {
-            components.append(((1 << n) - 1) << (8 - n))
-        }
-        while (components.count < 4) {
-            components.append(0)
-        }
-        assert(components.count == 4)
-        return components.map { String($0) }.joined(separator: ".")
+        var octets: [UInt8] = [0, 0, 0, 0]
+        let subnetMask: UInt32 = n > 0 ? ~UInt32(0) << (32 - n) : UInt32(0)
+        octets[0] = UInt8(truncatingIfNeeded: subnetMask >> 24)
+        octets[1] = UInt8(truncatingIfNeeded: subnetMask >> 16)
+        octets[2] = UInt8(truncatingIfNeeded: subnetMask >> 8)
+        octets[3] = UInt8(truncatingIfNeeded: subnetMask)
+        return octets.map { String($0) }.joined(separator: ".")
     }
 }