/
dev_addr_prefix.go
48 lines (43 loc) · 1.16 KB
/
dev_addr_prefix.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Copyright © 2020 The Things Industries B.V.
package packetbroker
import (
"errors"
"fmt"
"strconv"
"strings"
)
// MarshalText returns the DevAddrPrefix as formatted string.
func (m *DevAddrPrefix) MarshalText() ([]byte, error) {
if m == nil {
return nil, nil
}
return []byte(fmt.Sprintf("%08X/%d", m.Value, m.Length)), nil
}
// UnmarshalText parses the formatted string.
func (m *DevAddrPrefix) UnmarshalText(text []byte) error {
parts := strings.SplitN(string(text), "/", 2)
if len(parts) != 2 {
return errors.New("packetbroker: require 2 parts of in formatted DevAddrPrefix")
}
value, err := strconv.ParseUint(parts[0], 16, 32)
if err != nil {
return fmt.Errorf("packetbroker: invalid hex value: %w", err)
}
length, err := strconv.ParseUint(parts[1], 10, 8)
if err != nil {
return fmt.Errorf("packetbroker: invalid length value: %w", err)
}
*m = DevAddrPrefix{
Value: uint32(value),
Length: uint32(length),
}
return nil
}
// Match returns true if the DevAddrPrefixes matches the given DevAddr.
func (m DevAddrPrefix) Match(devAddr uint32) bool {
shift := 32 - m.Length
if shift < 0 {
shift = 0
}
return m.Value>>shift == devAddr>>shift
}