1package proto
2
3import "github.com/pion/stun"
4
5// ReservationToken represents RESERVATION-TOKEN attribute.
6//
7// The RESERVATION-TOKEN attribute contains a token that uniquely
8// identifies a relayed transport address being held in reserve by the
9// server. The server includes this attribute in a success response to
10// tell the client about the token, and the client includes this
11// attribute in a subsequent Allocate request to request the server use
12// that relayed transport address for the allocation.
13//
14// RFC 5766 Section 14.9
15type ReservationToken []byte
16
17const reservationTokenSize = 8 // 8 bytes
18
19// AddTo adds RESERVATION-TOKEN to message.
20func (t ReservationToken) AddTo(m *stun.Message) error {
21	if err := stun.CheckSize(stun.AttrReservationToken, len(t), reservationTokenSize); err != nil {
22		return err
23	}
24	m.Add(stun.AttrReservationToken, t)
25	return nil
26}
27
28// GetFrom decodes RESERVATION-TOKEN from message.
29func (t *ReservationToken) GetFrom(m *stun.Message) error {
30	v, err := m.Get(stun.AttrReservationToken)
31	if err != nil {
32		return err
33	}
34	if err = stun.CheckSize(stun.AttrReservationToken, len(v), reservationTokenSize); err != nil {
35		return err
36	}
37	*t = v
38	return nil
39}
40