error_cause_header.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package sctp
  2. import (
  3. "encoding/binary"
  4. )
  5. // errorCauseHeader represents the shared header that is shared by all error causes
  6. type errorCauseHeader struct {
  7. code errorCauseCode
  8. len uint16
  9. raw []byte
  10. }
  11. const (
  12. errorCauseHeaderLength = 4
  13. )
  14. func (e *errorCauseHeader) marshal() ([]byte, error) {
  15. e.len = uint16(len(e.raw)) + uint16(errorCauseHeaderLength)
  16. raw := make([]byte, e.len)
  17. binary.BigEndian.PutUint16(raw[0:], uint16(e.code))
  18. binary.BigEndian.PutUint16(raw[2:], e.len)
  19. copy(raw[errorCauseHeaderLength:], e.raw)
  20. return raw, nil
  21. }
  22. func (e *errorCauseHeader) unmarshal(raw []byte) error {
  23. e.code = errorCauseCode(binary.BigEndian.Uint16(raw[0:]))
  24. e.len = binary.BigEndian.Uint16(raw[2:])
  25. valueLength := e.len - errorCauseHeaderLength
  26. e.raw = raw[errorCauseHeaderLength : errorCauseHeaderLength+valueLength]
  27. return nil
  28. }
  29. func (e *errorCauseHeader) length() uint16 {
  30. return e.len
  31. }
  32. func (e *errorCauseHeader) errorCauseCode() errorCauseCode {
  33. return e.code
  34. }
  35. // String makes errorCauseHeader printable
  36. func (e errorCauseHeader) String() string {
  37. return e.code.String()
  38. }