reqfamily.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package proto
  2. import (
  3. "errors"
  4. "github.com/pion/stun"
  5. )
  6. // RequestedAddressFamily represents the REQUESTED-ADDRESS-FAMILY Attribute as
  7. // defined in RFC 6156 Section 4.1.1.
  8. type RequestedAddressFamily byte
  9. const requestedFamilySize = 4
  10. var errInvalidRequestedFamilyValue = errors.New("invalid value for requested family attribute")
  11. // GetFrom decodes REQUESTED-ADDRESS-FAMILY from message.
  12. func (f *RequestedAddressFamily) GetFrom(m *stun.Message) error {
  13. v, err := m.Get(stun.AttrRequestedAddressFamily)
  14. if err != nil {
  15. return err
  16. }
  17. if err = stun.CheckSize(stun.AttrRequestedAddressFamily, len(v), requestedFamilySize); err != nil {
  18. return err
  19. }
  20. switch v[0] {
  21. case byte(RequestedFamilyIPv4), byte(RequestedFamilyIPv6):
  22. *f = RequestedAddressFamily(v[0])
  23. default:
  24. return errInvalidRequestedFamilyValue
  25. }
  26. return nil
  27. }
  28. func (f RequestedAddressFamily) String() string {
  29. switch f {
  30. case RequestedFamilyIPv4:
  31. return "IPv4"
  32. case RequestedFamilyIPv6:
  33. return "IPv6"
  34. default:
  35. return "unknown"
  36. }
  37. }
  38. // AddTo adds REQUESTED-ADDRESS-FAMILY to message.
  39. func (f RequestedAddressFamily) AddTo(m *stun.Message) error {
  40. v := make([]byte, requestedFamilySize)
  41. v[0] = byte(f)
  42. // b[1:4] is RFFU = 0.
  43. // The RFFU field MUST be set to zero on transmission and MUST be
  44. // ignored on reception. It is reserved for future uses.
  45. m.Add(stun.AttrRequestedAddressFamily, v)
  46. return nil
  47. }
  48. // Values for RequestedAddressFamily as defined in RFC 6156 Section 4.1.1.
  49. const (
  50. RequestedFamilyIPv4 RequestedAddressFamily = 0x01
  51. RequestedFamilyIPv6 RequestedAddressFamily = 0x02
  52. )