lol

lib.mkEUI64Suffix: init (#416086)

authored by

misuzu and committed by
GitHub
8d45e68f 36db1149

+110
+3
lib/default.nix
··· 571 571 inherit (self.versions) 572 572 splitVersion 573 573 ; 574 + inherit (self.network.ipv6) 575 + mkEUI64Suffix 576 + ; 574 577 } 575 578 ); 576 579 in
+63
lib/network/default.nix
··· 1 1 { lib }: 2 2 let 3 3 inherit (import ./internal.nix { inherit lib; }) _ipv6; 4 + inherit (lib.strings) match concatStringsSep toLower; 5 + inherit (lib.trivial) 6 + pipe 7 + bitXor 8 + fromHexString 9 + toHexString 10 + ; 11 + inherit (lib.lists) elemAt; 4 12 in 5 13 { 6 14 ipv6 = { ··· 45 53 { 46 54 inherit address prefixLength; 47 55 }; 56 + 57 + /** 58 + Converts a 48-bit MAC address into a EUI-64 IPv6 address suffix. 59 + 60 + # Example 61 + 62 + ```nix 63 + mkEUI64Suffix "66:75:63:6B:20:75" 64 + => "6475:63ff:fe6b:2075" 65 + ``` 66 + 67 + # Type 68 + 69 + ``` 70 + mkEUI64Suffix :: String -> String 71 + ``` 72 + 73 + # Inputs 74 + 75 + mac 76 + : The MAC address (may contain these delimiters: `:`, `-` or `.` but it's not necessary) 77 + */ 78 + mkEUI64Suffix = 79 + mac: 80 + pipe mac [ 81 + # match mac address 82 + (match "^([0-9A-Fa-f]{2})[-:.]?([0-9A-Fa-f]{2})[-:.]?([0-9A-Fa-f]{2})[-:.]?([0-9A-Fa-f]{2})[-:.]?([0-9A-Fa-f]{2})[-:.]?([0-9A-Fa-f]{2})$") 83 + 84 + # check if there are matches 85 + ( 86 + matches: 87 + if matches == null then 88 + throw ''"${mac}" is not a valid MAC address (expected 6 octets of hex digits)'' 89 + else 90 + matches 91 + ) 92 + 93 + # transform to result hextets 94 + (octets: [ 95 + # combine 1st and 2nd octets into first hextet, flip U/L bit, 512 = 0x200 96 + (toHexString (bitXor 512 (fromHexString ((elemAt octets 0) + (elemAt octets 1))))) 97 + 98 + # combine 3rd and 4th octets, combine them, insert fffe pattern in between to get next two hextets 99 + "${elemAt octets 2}ff" 100 + "fe${elemAt octets 3}" 101 + 102 + # combine 5th and 6th octets into the last hextet 103 + ((elemAt octets 4) + (elemAt octets 5)) 104 + ]) 105 + 106 + # concat to result suffix 107 + (concatStringsSep ":") 108 + 109 + toLower 110 + ]; 48 111 }; 49 112 }
+44
lib/tests/network.sh
··· 114 114 expectSuccess 'lib.network.ipv6.fromString "2001:DB8::ffff/64"' '{"address":"2001:db8:0:0:0:0:0:ffff","prefixLength":64}' 115 115 expectSuccess 'lib.network.ipv6.fromString "1234:5678:90ab:cdef:fedc:ba09:8765:4321/44"' '{"address":"1234:5678:90ab:cdef:fedc:ba09:8765:4321","prefixLength":44}' 116 116 117 + expectSuccess 'mkEUI64Suffix "00:11:22:AA:BB:CC"' '"211:22ff:feaa:bbcc"' 118 + expectSuccess 'mkEUI64Suffix "00-11-22-AA-BB-CC"' '"211:22ff:feaa:bbcc"' 119 + expectSuccess 'mkEUI64Suffix "00.11.22.AA.BB.CC"' '"211:22ff:feaa:bbcc"' 120 + expectSuccess 'mkEUI64Suffix "00:11:22:aa:bb:cc"' '"211:22ff:feaa:bbcc"' 121 + expectSuccess 'mkEUI64Suffix "00-11-22-aa-bb-cc"' '"211:22ff:feaa:bbcc"' 122 + expectSuccess 'mkEUI64Suffix "00.11.22.aa.bb.cc"' '"211:22ff:feaa:bbcc"' 123 + 124 + expectSuccess 'mkEUI64Suffix "12:34:56:78:9A:bc"' '"1034:56ff:fe78:9abc"' 125 + expectSuccess 'mkEUI64Suffix "123456789ABC"' '"1034:56ff:fe78:9abc"' 126 + 127 + expectSuccess 'mkEUI64Suffix "001122AABBCC"' '"211:22ff:feaa:bbcc"' 128 + expectSuccess 'mkEUI64Suffix "001122aabbcc"' '"211:22ff:feaa:bbcc"' 129 + 130 + expectSuccess 'mkEUI64Suffix "ff-ff-ff-ff-ff-ff"' '"fdff:ffff:feff:ffff"' 131 + expectSuccess 'mkEUI64Suffix "ffffffffffff"' '"fdff:ffff:feff:ffff"' 132 + expectSuccess 'mkEUI64Suffix "00.00.00.00.00.00"' '"200:00ff:fe00:0000"' 133 + expectSuccess 'mkEUI64Suffix "000000000000"' '"200:00ff:fe00:0000"' 134 + 135 + expectFailure 'mkEUI64Suffix "123456789AB"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 136 + expectFailure 'mkEUI64Suffix "123456789A"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 137 + expectFailure 'mkEUI64Suffix "123456789"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 138 + expectFailure 'mkEUI64Suffix "12345678"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 139 + expectFailure 'mkEUI64Suffix "1234567"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 140 + expectFailure 'mkEUI64Suffix "123456"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 141 + expectFailure 'mkEUI64Suffix "12345"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 142 + expectFailure 'mkEUI64Suffix "1234"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 143 + expectFailure 'mkEUI64Suffix "123"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 144 + expectFailure 'mkEUI64Suffix "12"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 145 + expectFailure 'mkEUI64Suffix "1"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 146 + expectFailure 'mkEUI64Suffix ""' "is not a valid MAC address \(expected 6 octets of hex digits\)" 147 + expectFailure 'mkEUI64Suffix "------------"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 148 + expectFailure 'mkEUI64Suffix "............"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 149 + expectFailure 'mkEUI64Suffix "::::::::::::"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 150 + expectFailure 'mkEUI64Suffix "1:2:3:4:5:6"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 151 + expectFailure 'mkEUI64Suffix "0.0.0.0.0.0"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 152 + expectFailure 'mkEUI64Suffix "00:11:-2:AA:BB:CC"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 153 + expectFailure 'mkEUI64Suffix "00:-11:22:AA:BB:CC"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 154 + expectFailure 'mkEUI64Suffix "ab:cd:ef:g0:12:34"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 155 + expectFailure 'mkEUI64Suffix "AB:CD:EF:G0:12:34"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 156 + expectFailure 'mkEUI64Suffix "ab:cd:ef:gh:jk:lm"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 157 + expectFailure 'mkEUI64Suffix "AB:CD:EF:GH:JK:LM"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 158 + expectFailure 'mkEUI64Suffix "01:23:3a:bc:de:fg"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 159 + expectFailure 'mkEUI64Suffix "01:23:3A:BC:DE:FG"' "is not a valid MAC address \(expected 6 octets of hex digits\)" 160 + 117 161 echo >&2 tests ok