67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package pdu
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
)
|
|
|
|
type (
|
|
PDU interface {
|
|
EncodeInto(*[]uint8)
|
|
Encode() []uint8
|
|
Decode([]uint8)
|
|
// Size in bytes
|
|
Size() uint32
|
|
}
|
|
|
|
PDU_HEADER struct {
|
|
command_length uint32
|
|
command_id uint32
|
|
command_status uint32
|
|
sequence_number uint32
|
|
}
|
|
|
|
GENERIC_NACK struct {
|
|
header PDU_HEADER
|
|
}
|
|
)
|
|
|
|
func (p *PDU_HEADER) Encode() ([]uint8, error) {
|
|
buf := make([]uint8, 16)
|
|
err := p.EncodeInto(&buf)
|
|
return buf, err
|
|
}
|
|
func (p *PDU_HEADER) EncodeInto(buf *[]uint8) error {
|
|
if buf == nil {
|
|
return fmt.Errorf("cannot encode PDU_HEADER, buffer is nil")
|
|
}
|
|
if len(*buf) < 16 {
|
|
return fmt.Errorf("cannot encode PDU_HEADER, buffer too small (%d, required 16)", len(*buf))
|
|
}
|
|
bufVal := *buf
|
|
binary.BigEndian.PutUint32(bufVal[0:4], p.command_length)
|
|
binary.BigEndian.PutUint32(bufVal[4:8], p.command_id)
|
|
binary.BigEndian.PutUint32(bufVal[8:12], p.command_status)
|
|
binary.BigEndian.PutUint32(bufVal[12:16], p.sequence_number)
|
|
return nil
|
|
}
|
|
func (p *PDU_HEADER) Decode(data []uint8) error {
|
|
if len(data) >= 4 {
|
|
p.command_length = binary.BigEndian.Uint32(data[0:4])
|
|
}
|
|
if len(data) >= 8 {
|
|
p.command_id = binary.BigEndian.Uint32(data[4:8])
|
|
}
|
|
if len(data) >= 12 {
|
|
p.command_status = binary.BigEndian.Uint32(data[8:12])
|
|
|
|
}
|
|
if len(data) >= 16 {
|
|
p.sequence_number = binary.BigEndian.Uint32(data[12:16])
|
|
}
|
|
return nil
|
|
}
|
|
func (p *PDU_HEADER) Size() uint32 {
|
|
return 16
|
|
}
|