summaryrefslogtreecommitdiff
path: root/vendor/github.com/pion/turn/v2/internal/proto/reqfamily.go
blob: e83d6bba4405f710023dd87495ca5149803c9e05 (plain)
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
49
50
51
52
53
54
55
56
57
58
59
60
61
package proto

import (
	"errors"

	"github.com/pion/stun"
)

// RequestedAddressFamily represents the REQUESTED-ADDRESS-FAMILY Attribute as
// defined in RFC 6156 Section 4.1.1.
type RequestedAddressFamily byte

const requestedFamilySize = 4

var errInvalidRequestedFamilyValue = errors.New("invalid value for requested family attribute")

// GetFrom decodes REQUESTED-ADDRESS-FAMILY from message.
func (f *RequestedAddressFamily) GetFrom(m *stun.Message) error {
	v, err := m.Get(stun.AttrRequestedAddressFamily)
	if err != nil {
		return err
	}
	if err = stun.CheckSize(stun.AttrRequestedAddressFamily, len(v), requestedFamilySize); err != nil {
		return err
	}
	switch v[0] {
	case byte(RequestedFamilyIPv4), byte(RequestedFamilyIPv6):
		*f = RequestedAddressFamily(v[0])
	default:
		return errInvalidRequestedFamilyValue
	}
	return nil
}

func (f RequestedAddressFamily) String() string {
	switch f {
	case RequestedFamilyIPv4:
		return "IPv4"
	case RequestedFamilyIPv6:
		return "IPv6"
	default:
		return "unknown"
	}
}

// AddTo adds REQUESTED-ADDRESS-FAMILY to message.
func (f RequestedAddressFamily) AddTo(m *stun.Message) error {
	v := make([]byte, requestedFamilySize)
	v[0] = byte(f)
	// b[1:4] is RFFU = 0.
	// The RFFU field MUST be set to zero on transmission and MUST be
	// ignored on reception. It is reserved for future uses.
	m.Add(stun.AttrRequestedAddressFamily, v)
	return nil
}

// Values for RequestedAddressFamily as defined in RFC 6156 Section 4.1.1.
const (
	RequestedFamilyIPv4 RequestedAddressFamily = 0x01
	RequestedFamilyIPv6 RequestedAddressFamily = 0x02
)