You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 line
1.4 KiB

  1. package packet
  2. // Length of the fixed header of the PINGRESP Packet
  3. const lenPINGRESPFixedHeader = 2
  4. // PINGRESP represents a PINGRESP Packet.
  5. type PINGRESP struct {
  6. base
  7. }
  8. // NewPINGRESPFromBytes creates a PINGRESP Packet from
  9. // the byte data and returns it.
  10. func NewPINGRESPFromBytes(fixedHeader FixedHeader, remaining []byte) (Packet, error) {
  11. // Validate the byte data.
  12. if err := validatePINGRESPBytes(fixedHeader, remaining); err != nil {
  13. return nil, err
  14. }
  15. // Create a PINGRESP Packet.
  16. p := &PINGRESP{}
  17. // Set the fixed header to the Packet.
  18. p.fixedHeader = fixedHeader
  19. // Return the Packet.
  20. return p, nil
  21. }
  22. // validatePINGRESPBytes validates the fixed header and the remaining.
  23. func validatePINGRESPBytes(fixedHeader FixedHeader, remaining []byte) error {
  24. // Extract the MQTT Control Packet type.
  25. ptype, err := fixedHeader.ptype()
  26. if err != nil {
  27. return err
  28. }
  29. // Check the length of the fixed header.
  30. if len(fixedHeader) != lenPINGRESPFixedHeader {
  31. return ErrInvalidFixedHeaderLen
  32. }
  33. // Check the MQTT Control Packet type.
  34. if ptype != TypePINGRESP {
  35. return ErrInvalidPacketType
  36. }
  37. // Check the reserved bits of the fixed header.
  38. if fixedHeader[0]<<4 != 0x00 {
  39. return ErrInvalidFixedHeader
  40. }
  41. // Check the Remaining Length of the fixed header.
  42. if fixedHeader[1] != 0x00 {
  43. return ErrInvalidRemainingLength
  44. }
  45. // Check the length of the remaining.
  46. if len(remaining) != 0 {
  47. return ErrInvalidRemainingLen
  48. }
  49. return nil
  50. }