chunk_shutdown.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
  2. // SPDX-License-Identifier: MIT
  3. package sctp
  4. import (
  5. "encoding/binary"
  6. "errors"
  7. "fmt"
  8. )
  9. /*
  10. chunkShutdown represents an SCTP Chunk of type chunkShutdown
  11. 0 1 2 3
  12. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  13. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  14. | Type = 7 | Chunk Flags | Length = 8 |
  15. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  16. | Cumulative TSN Ack |
  17. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  18. */
  19. type chunkShutdown struct {
  20. chunkHeader
  21. cumulativeTSNAck uint32
  22. }
  23. const (
  24. cumulativeTSNAckLength = 4
  25. )
  26. // Shutdown chunk errors
  27. var (
  28. ErrInvalidChunkSize = errors.New("invalid chunk size")
  29. ErrChunkTypeNotShutdown = errors.New("ChunkType is not of type SHUTDOWN")
  30. )
  31. func (c *chunkShutdown) unmarshal(raw []byte) error {
  32. if err := c.chunkHeader.unmarshal(raw); err != nil {
  33. return err
  34. }
  35. if c.typ != ctShutdown {
  36. return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotShutdown, c.typ.String())
  37. }
  38. if len(c.raw) != cumulativeTSNAckLength {
  39. return ErrInvalidChunkSize
  40. }
  41. c.cumulativeTSNAck = binary.BigEndian.Uint32(c.raw[0:])
  42. return nil
  43. }
  44. func (c *chunkShutdown) marshal() ([]byte, error) {
  45. out := make([]byte, cumulativeTSNAckLength)
  46. binary.BigEndian.PutUint32(out[0:], c.cumulativeTSNAck)
  47. c.typ = ctShutdown
  48. c.raw = out
  49. return c.chunkHeader.marshal()
  50. }
  51. func (c *chunkShutdown) check() (abort bool, err error) {
  52. return false, nil
  53. }
  54. // String makes chunkShutdown printable
  55. func (c *chunkShutdown) String() string {
  56. return c.chunkHeader.String()
  57. }