@@ -7,6 +7,7 @@ package device
7
7
8
8
import (
9
9
"container/list"
10
+ "encoding/binary"
10
11
"errors"
11
12
"math/bits"
12
13
"net"
@@ -32,45 +33,24 @@ type trieEntry struct {
32
33
perPeerElem * list.Element
33
34
}
34
35
35
- func isLittleEndian () bool {
36
- one := uint32 (1 )
37
- return * (* byte )(unsafe .Pointer (& one )) != 0
38
- }
39
-
40
- func swapU32 (i uint32 ) uint32 {
41
- if ! isLittleEndian () {
42
- return i
43
- }
44
-
45
- return bits .ReverseBytes32 (i )
46
- }
47
-
48
- func swapU64 (i uint64 ) uint64 {
49
- if ! isLittleEndian () {
50
- return i
51
- }
52
-
53
- return bits .ReverseBytes64 (i )
54
- }
55
-
56
36
func commonBits (ip1 , ip2 []byte ) uint8 {
57
37
size := len (ip1 )
58
38
if size == net .IPv4len {
59
- a := ( * uint32 )( unsafe . Pointer ( & ip1 [ 0 ]) )
60
- b := ( * uint32 )( unsafe . Pointer ( & ip2 [ 0 ]) )
61
- x := * a ^ * b
62
- return uint8 (bits .LeadingZeros32 (swapU32 ( x ) ))
39
+ a := binary . BigEndian . Uint32 ( ip1 )
40
+ b := binary . BigEndian . Uint32 ( ip2 )
41
+ x := a ^ b
42
+ return uint8 (bits .LeadingZeros32 (x ))
63
43
} else if size == net .IPv6len {
64
- a := ( * uint64 )( unsafe . Pointer ( & ip1 [ 0 ]) )
65
- b := ( * uint64 )( unsafe . Pointer ( & ip2 [ 0 ]) )
66
- x := * a ^ * b
44
+ a := binary . BigEndian . Uint64 ( ip1 )
45
+ b := binary . BigEndian . Uint64 ( ip2 )
46
+ x := a ^ b
67
47
if x != 0 {
68
- return uint8 (bits .LeadingZeros64 (swapU64 ( x ) ))
48
+ return uint8 (bits .LeadingZeros64 (x ))
69
49
}
70
- a = ( * uint64 )( unsafe . Pointer ( & ip1 [8 ]) )
71
- b = ( * uint64 )( unsafe . Pointer ( & ip2 [8 ]) )
72
- x = * a ^ * b
73
- return 64 + uint8 (bits .LeadingZeros64 (swapU64 ( x ) ))
50
+ a = binary . BigEndian . Uint64 ( ip1 [8 :] )
51
+ b = binary . BigEndian . Uint64 ( ip2 [8 :] )
52
+ x = a ^ b
53
+ return 64 + uint8 (bits .LeadingZeros64 (x ))
74
54
} else {
75
55
panic ("Wrong size bit string" )
76
56
}
0 commit comments