I just learnt that uint8 and byte are the fucking same And that bytes.Buffer is the thing to use Idiot idiot idiot... Live and learn
76 lines
2.7 KiB
Go
76 lines
2.7 KiB
Go
package pdu
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
)
|
|
|
|
type (
|
|
PDU interface {
|
|
Encode(*bytes.Buffer) error
|
|
Decode(*bytes.Buffer) error
|
|
// Size in bytes
|
|
Size() int
|
|
}
|
|
|
|
PDU_HEADER struct {
|
|
command_length uint32
|
|
command_id uint32
|
|
command_status uint32
|
|
sequence_number uint32
|
|
}
|
|
|
|
GENERIC_NACK struct {
|
|
header PDU_HEADER
|
|
}
|
|
)
|
|
|
|
// Hmm the header can be partially encoded
|
|
// As in command_status can just be null
|
|
// So not 0s, null, non existent, not encoded
|
|
// So we'll have to maybe set them to nil or something...
|
|
// Wireshark dump of a submit_sm
|
|
// See header: 00 00 00 3e (size, 62 bytes), 00 00 00 04 (command_id), status and sequence number are 0
|
|
// So they are not encoded
|
|
// Here the header is 8 bytes, not 16
|
|
// 0000 02 00 00 00 45 00 00 66 6f ff 40 00 80 06 00 00 ....E..fo.@.....
|
|
// 0010 7f 00 00 01 7f 00 00 01 31 4f 0a d7 e8 b0 b1 b5 ........1O......
|
|
// 0020 3e 91 d9 dc 50 18 20 fa 2a 1f 00 00 00 00 00 3e >...P. .*......>
|
|
// 0030 00 00 00 04 00 00 00 00 00 00 00 02 00 00 00 73 ...............s
|
|
// 0040 6d 70 70 5f 74 65 73 74 5f 31 00 00 00 31 32 33 mpp_test_1...123
|
|
// 0050 31 32 33 31 32 33 31 32 33 00 00 00 00 00 00 00 123123123.......
|
|
// 0060 00 c0 00 06 48 65 6c 6c 6f 21 ....Hello!
|
|
// I AM NOT RIGHT
|
|
// Beyond the size and command_id, command_status and sequence_number here are:
|
|
// 00 00 00 00 (0) 00 00 00 02 (2)
|
|
//
|
|
// Another example - bind_transciever:
|
|
// 0000 02 00 00 00 45 00 00 47 6f fb 40 00 80 06 00 00 ....E..Go.@.....
|
|
// 0010 7f 00 00 01 7f 00 00 01 31 4f 0a d7 e8 b0 b1 96 ........1O......
|
|
// 0020 3e 91 d9 cb 50 18 20 fa df ab 00 00 00 00 00 1f >...P. .........
|
|
// 0030 00 00 00 09 00 00 00 00 00 00 00 01 74 65 73 74 ............test
|
|
// 0040 00 74 65 73 74 00 00 50 00 00 00 .test..P...
|
|
// 00 00 00 1f - 00 00 00 09 - 00 00 00 00 - 00 00 00 01 (header)
|
|
// 74 65 73 74 00 - 74 65 73 74 00 - 00 50 00 00 00
|
|
// ^system_id ^password ^interface_version
|
|
// What are the other 0s?
|
|
// Don't know
|
|
|
|
func (p *PDU_HEADER) Encode(buf *bytes.Buffer) error {
|
|
binary.Write(buf, binary.BigEndian, p.command_length)
|
|
binary.Write(buf, binary.BigEndian, p.command_id)
|
|
binary.Write(buf, binary.BigEndian, p.command_status)
|
|
binary.Write(buf, binary.BigEndian, p.sequence_number)
|
|
return nil
|
|
}
|
|
func (p *PDU_HEADER) Decode(buf *bytes.Buffer) error {
|
|
binary.Read(buf, binary.BigEndian, &p.command_length)
|
|
binary.Read(buf, binary.BigEndian, &p.command_id)
|
|
binary.Read(buf, binary.BigEndian, &p.command_status)
|
|
binary.Read(buf, binary.BigEndian, &p.sequence_number)
|
|
return nil
|
|
}
|
|
func (p *PDU_HEADER) Size() int {
|
|
return 16
|
|
}
|