error_cause.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package sctp
  2. import (
  3. "encoding/binary"
  4. "errors"
  5. "fmt"
  6. )
  7. // errorCauseCode is a cause code that appears in either a ERROR or ABORT chunk
  8. type errorCauseCode uint16
  9. type errorCause interface {
  10. unmarshal([]byte) error
  11. marshal() ([]byte, error)
  12. length() uint16
  13. String() string
  14. errorCauseCode() errorCauseCode
  15. }
  16. var errBuildErrorCaseHandle = errors.New("BuildErrorCause does not handle")
  17. // buildErrorCause delegates the building of a error cause from raw bytes to the correct structure
  18. func buildErrorCause(raw []byte) (errorCause, error) {
  19. var e errorCause
  20. c := errorCauseCode(binary.BigEndian.Uint16(raw[0:]))
  21. switch c {
  22. case invalidMandatoryParameter:
  23. e = &errorCauseInvalidMandatoryParameter{}
  24. case unrecognizedChunkType:
  25. e = &errorCauseUnrecognizedChunkType{}
  26. case protocolViolation:
  27. e = &errorCauseProtocolViolation{}
  28. default:
  29. return nil, fmt.Errorf("%w: %s", errBuildErrorCaseHandle, c.String())
  30. }
  31. if err := e.unmarshal(raw); err != nil {
  32. return nil, err
  33. }
  34. return e, nil
  35. }
  36. const (
  37. invalidStreamIdentifier errorCauseCode = 1
  38. missingMandatoryParameter errorCauseCode = 2
  39. staleCookieError errorCauseCode = 3
  40. outOfResource errorCauseCode = 4
  41. unresolvableAddress errorCauseCode = 5
  42. unrecognizedChunkType errorCauseCode = 6
  43. invalidMandatoryParameter errorCauseCode = 7
  44. unrecognizedParameters errorCauseCode = 8
  45. noUserData errorCauseCode = 9
  46. cookieReceivedWhileShuttingDown errorCauseCode = 10
  47. restartOfAnAssociationWithNewAddresses errorCauseCode = 11
  48. userInitiatedAbort errorCauseCode = 12
  49. protocolViolation errorCauseCode = 13
  50. )
  51. func (e errorCauseCode) String() string {
  52. switch e {
  53. case invalidStreamIdentifier:
  54. return "Invalid Stream Identifier"
  55. case missingMandatoryParameter:
  56. return "Missing Mandatory Parameter"
  57. case staleCookieError:
  58. return "Stale Cookie Error"
  59. case outOfResource:
  60. return "Out Of Resource"
  61. case unresolvableAddress:
  62. return "Unresolvable IP"
  63. case unrecognizedChunkType:
  64. return "Unrecognized Chunk Type"
  65. case invalidMandatoryParameter:
  66. return "Invalid Mandatory Parameter"
  67. case unrecognizedParameters:
  68. return "Unrecognized Parameters"
  69. case noUserData:
  70. return "No User Data"
  71. case cookieReceivedWhileShuttingDown:
  72. return "Cookie Received While Shutting Down"
  73. case restartOfAnAssociationWithNewAddresses:
  74. return "Restart Of An Association With New Addresses"
  75. case userInitiatedAbort:
  76. return "User Initiated Abort"
  77. case protocolViolation:
  78. return "Protocol Violation"
  79. default:
  80. return fmt.Sprintf("Unknown CauseCode: %d", e)
  81. }
  82. }