allowedips_test.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /* SPDX-License-Identifier: MIT
  2. *
  3. * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
  4. */
  5. package device
  6. import (
  7. "math/rand"
  8. "net"
  9. "net/netip"
  10. "testing"
  11. )
  12. type testPairCommonBits struct {
  13. s1 []byte
  14. s2 []byte
  15. match uint8
  16. }
  17. func TestCommonBits(t *testing.T) {
  18. tests := []testPairCommonBits{
  19. {s1: []byte{1, 4, 53, 128}, s2: []byte{0, 0, 0, 0}, match: 7},
  20. {s1: []byte{0, 4, 53, 128}, s2: []byte{0, 0, 0, 0}, match: 13},
  21. {s1: []byte{0, 4, 53, 253}, s2: []byte{0, 4, 53, 252}, match: 31},
  22. {s1: []byte{192, 168, 1, 1}, s2: []byte{192, 169, 1, 1}, match: 15},
  23. {s1: []byte{65, 168, 1, 1}, s2: []byte{192, 169, 1, 1}, match: 0},
  24. }
  25. for _, p := range tests {
  26. v := commonBits(p.s1, p.s2)
  27. if v != p.match {
  28. t.Error(
  29. "For slice", p.s1, p.s2,
  30. "expected match", p.match,
  31. ",but got", v,
  32. )
  33. }
  34. }
  35. }
  36. func benchmarkTrie(peerNumber, addressNumber, addressLength int, b *testing.B) {
  37. var trie *trieEntry
  38. var peers []*Peer
  39. root := parentIndirection{&trie, 2}
  40. rand.Seed(1)
  41. const AddressLength = 4
  42. for n := 0; n < peerNumber; n++ {
  43. peers = append(peers, &Peer{})
  44. }
  45. for n := 0; n < addressNumber; n++ {
  46. var addr [AddressLength]byte
  47. rand.Read(addr[:])
  48. cidr := uint8(rand.Uint32() % (AddressLength * 8))
  49. index := rand.Int() % peerNumber
  50. root.insert(addr[:], cidr, peers[index])
  51. }
  52. for n := 0; n < b.N; n++ {
  53. var addr [AddressLength]byte
  54. rand.Read(addr[:])
  55. trie.lookup(addr[:])
  56. }
  57. }
  58. func BenchmarkTrieIPv4Peers100Addresses1000(b *testing.B) {
  59. benchmarkTrie(100, 1000, net.IPv4len, b)
  60. }
  61. func BenchmarkTrieIPv4Peers10Addresses10(b *testing.B) {
  62. benchmarkTrie(10, 10, net.IPv4len, b)
  63. }
  64. func BenchmarkTrieIPv6Peers100Addresses1000(b *testing.B) {
  65. benchmarkTrie(100, 1000, net.IPv6len, b)
  66. }
  67. func BenchmarkTrieIPv6Peers10Addresses10(b *testing.B) {
  68. benchmarkTrie(10, 10, net.IPv6len, b)
  69. }
  70. /* Test ported from kernel implementation:
  71. * selftest/allowedips.h
  72. */
  73. func TestTrieIPv4(t *testing.T) {
  74. a := &Peer{}
  75. b := &Peer{}
  76. c := &Peer{}
  77. d := &Peer{}
  78. e := &Peer{}
  79. g := &Peer{}
  80. h := &Peer{}
  81. var allowedIPs AllowedIPs
  82. insert := func(peer *Peer, a, b, c, d byte, cidr uint8) {
  83. allowedIPs.Insert(netip.PrefixFrom(netip.AddrFrom4([4]byte{a, b, c, d}), int(cidr)), peer)
  84. }
  85. assertEQ := func(peer *Peer, a, b, c, d byte) {
  86. p := allowedIPs.Lookup([]byte{a, b, c, d})
  87. if p != peer {
  88. t.Error("Assert EQ failed")
  89. }
  90. }
  91. assertNEQ := func(peer *Peer, a, b, c, d byte) {
  92. p := allowedIPs.Lookup([]byte{a, b, c, d})
  93. if p == peer {
  94. t.Error("Assert NEQ failed")
  95. }
  96. }
  97. insert(a, 192, 168, 4, 0, 24)
  98. insert(b, 192, 168, 4, 4, 32)
  99. insert(c, 192, 168, 0, 0, 16)
  100. insert(d, 192, 95, 5, 64, 27)
  101. insert(c, 192, 95, 5, 65, 27)
  102. insert(e, 0, 0, 0, 0, 0)
  103. insert(g, 64, 15, 112, 0, 20)
  104. insert(h, 64, 15, 123, 211, 25)
  105. insert(a, 10, 0, 0, 0, 25)
  106. insert(b, 10, 0, 0, 128, 25)
  107. insert(a, 10, 1, 0, 0, 30)
  108. insert(b, 10, 1, 0, 4, 30)
  109. insert(c, 10, 1, 0, 8, 29)
  110. insert(d, 10, 1, 0, 16, 29)
  111. assertEQ(a, 192, 168, 4, 20)
  112. assertEQ(a, 192, 168, 4, 0)
  113. assertEQ(b, 192, 168, 4, 4)
  114. assertEQ(c, 192, 168, 200, 182)
  115. assertEQ(c, 192, 95, 5, 68)
  116. assertEQ(e, 192, 95, 5, 96)
  117. assertEQ(g, 64, 15, 116, 26)
  118. assertEQ(g, 64, 15, 127, 3)
  119. insert(a, 1, 0, 0, 0, 32)
  120. insert(a, 64, 0, 0, 0, 32)
  121. insert(a, 128, 0, 0, 0, 32)
  122. insert(a, 192, 0, 0, 0, 32)
  123. insert(a, 255, 0, 0, 0, 32)
  124. assertEQ(a, 1, 0, 0, 0)
  125. assertEQ(a, 64, 0, 0, 0)
  126. assertEQ(a, 128, 0, 0, 0)
  127. assertEQ(a, 192, 0, 0, 0)
  128. assertEQ(a, 255, 0, 0, 0)
  129. allowedIPs.RemoveByPeer(a)
  130. assertNEQ(a, 1, 0, 0, 0)
  131. assertNEQ(a, 64, 0, 0, 0)
  132. assertNEQ(a, 128, 0, 0, 0)
  133. assertNEQ(a, 192, 0, 0, 0)
  134. assertNEQ(a, 255, 0, 0, 0)
  135. allowedIPs.RemoveByPeer(a)
  136. allowedIPs.RemoveByPeer(b)
  137. allowedIPs.RemoveByPeer(c)
  138. allowedIPs.RemoveByPeer(d)
  139. allowedIPs.RemoveByPeer(e)
  140. allowedIPs.RemoveByPeer(g)
  141. allowedIPs.RemoveByPeer(h)
  142. if allowedIPs.IPv4 != nil || allowedIPs.IPv6 != nil {
  143. t.Error("Expected removing all the peers to empty trie, but it did not")
  144. }
  145. insert(a, 192, 168, 0, 0, 16)
  146. insert(a, 192, 168, 0, 0, 24)
  147. allowedIPs.RemoveByPeer(a)
  148. assertNEQ(a, 192, 168, 0, 1)
  149. }
  150. /* Test ported from kernel implementation:
  151. * selftest/allowedips.h
  152. */
  153. func TestTrieIPv6(t *testing.T) {
  154. a := &Peer{}
  155. b := &Peer{}
  156. c := &Peer{}
  157. d := &Peer{}
  158. e := &Peer{}
  159. f := &Peer{}
  160. g := &Peer{}
  161. h := &Peer{}
  162. var allowedIPs AllowedIPs
  163. expand := func(a uint32) []byte {
  164. var out [4]byte
  165. out[0] = byte(a >> 24 & 0xff)
  166. out[1] = byte(a >> 16 & 0xff)
  167. out[2] = byte(a >> 8 & 0xff)
  168. out[3] = byte(a & 0xff)
  169. return out[:]
  170. }
  171. insert := func(peer *Peer, a, b, c, d uint32, cidr uint8) {
  172. var addr []byte
  173. addr = append(addr, expand(a)...)
  174. addr = append(addr, expand(b)...)
  175. addr = append(addr, expand(c)...)
  176. addr = append(addr, expand(d)...)
  177. allowedIPs.Insert(netip.PrefixFrom(netip.AddrFrom16(*(*[16]byte)(addr)), int(cidr)), peer)
  178. }
  179. assertEQ := func(peer *Peer, a, b, c, d uint32) {
  180. var addr []byte
  181. addr = append(addr, expand(a)...)
  182. addr = append(addr, expand(b)...)
  183. addr = append(addr, expand(c)...)
  184. addr = append(addr, expand(d)...)
  185. p := allowedIPs.Lookup(addr)
  186. if p != peer {
  187. t.Error("Assert EQ failed")
  188. }
  189. }
  190. insert(d, 0x26075300, 0x60006b00, 0, 0xc05f0543, 128)
  191. insert(c, 0x26075300, 0x60006b00, 0, 0, 64)
  192. insert(e, 0, 0, 0, 0, 0)
  193. insert(f, 0, 0, 0, 0, 0)
  194. insert(g, 0x24046800, 0, 0, 0, 32)
  195. insert(h, 0x24046800, 0x40040800, 0xdeadbeef, 0xdeadbeef, 64)
  196. insert(a, 0x24046800, 0x40040800, 0xdeadbeef, 0xdeadbeef, 128)
  197. insert(c, 0x24446800, 0x40e40800, 0xdeaebeef, 0xdefbeef, 128)
  198. insert(b, 0x24446800, 0xf0e40800, 0xeeaebeef, 0, 98)
  199. assertEQ(d, 0x26075300, 0x60006b00, 0, 0xc05f0543)
  200. assertEQ(c, 0x26075300, 0x60006b00, 0, 0xc02e01ee)
  201. assertEQ(f, 0x26075300, 0x60006b01, 0, 0)
  202. assertEQ(g, 0x24046800, 0x40040806, 0, 0x1006)
  203. assertEQ(g, 0x24046800, 0x40040806, 0x1234, 0x5678)
  204. assertEQ(f, 0x240467ff, 0x40040806, 0x1234, 0x5678)
  205. assertEQ(f, 0x24046801, 0x40040806, 0x1234, 0x5678)
  206. assertEQ(h, 0x24046800, 0x40040800, 0x1234, 0x5678)
  207. assertEQ(h, 0x24046800, 0x40040800, 0, 0)
  208. assertEQ(h, 0x24046800, 0x40040800, 0x10101010, 0x10101010)
  209. assertEQ(a, 0x24046800, 0x40040800, 0xdeadbeef, 0xdeadbeef)
  210. }