@@ -7,6 +7,7 @@ package device
77
88import (
99 "container/list"
10+ "encoding/binary"
1011 "errors"
1112 "math/bits"
1213 "net"
@@ -32,45 +33,24 @@ type trieEntry struct {
3233 perPeerElem * list.Element
3334}
3435
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-
5636func commonBits (ip1 , ip2 []byte ) uint8 {
5737 size := len (ip1 )
5838 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 ))
6343 } 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
6747 if x != 0 {
68- return uint8 (bits .LeadingZeros64 (swapU64 ( x ) ))
48+ return uint8 (bits .LeadingZeros64 (x ))
6949 }
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 ))
7454 } else {
7555 panic ("Wrong size bit string" )
7656 }
0 commit comments