summaryrefslogtreecommitdiff
path: root/rudp/proto.go
blob: 04176b2c89629bf8eeb5430ebd45f359f412219d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
Package rudp implements the low-level Minetest protocol described at
https://dev.minetest.net/Network_Protocol#Low-level_protocol.

All exported functions and methods in this package are safe for concurrent use
by multiple goroutines.
*/
package rudp

// protoID must be at the start of every network packet.
const protoID uint32 = 0x4f457403

// PeerIDs aren't actually used to identify peers, network addresses are,
// these just exist for backward compatability.
type PeerID uint16

const (
	// Used by clients before the server sets their ID.
	PeerIDNil PeerID = iota

	// The server always has this ID.
	PeerIDSrv

	// Lowest ID the server can assign to a client.
	PeerIDCltMin
)

// ChannelCount is the maximum channel number + 1.
const ChannelCount = 3

/*
rawPkt.Data format (big endian):

	rawType
	switch rawType {
	case rawTypeCtl:
		ctlType
		switch ctlType {
		case ctlAck:
			// Tells peer you received a rawTypeRel
			// and it doesn't need to resend it.
			seqnum
		case ctlSetPeerId:
			// Tells peer to send packets with this Src PeerID.
			PeerId
		case ctlPing:
			// Sent to prevent timeout.
		case ctlDisco:
			// Tells peer that you disconnected.
		}
	case rawTypeOrig:
		Pkt.(Data)
	case rawTypeSplit:
		// Packet larger than MaxNetPktSize split into smaller packets.
		// Packets with I >= Count should be ignored.
		// Once all Count chunks are recieved, they are sorted by I and
		// concatenated to make a Pkt.(Data).
		seqnum // Identifies split packet.
		Count, I uint16
		Chunk...
	case rawTypeRel:
		// Resent until a ctlAck with same seqnum is recieved.
		// seqnums are sequencial and start at seqnumInit,
		// These should be processed in seqnum order.
		seqnum
		rawPkt.Data
	}
*/
type rawPkt struct {
	Data  []byte
	ChNo  uint8
	Unrel bool
}

type rawType uint8

const (
	rawTypeCtl rawType = iota
	rawTypeOrig
	rawTypeSplit
	rawTypeRel
)

type ctlType uint8

const (
	ctlAck ctlType = iota
	ctlSetPeerID
	ctlPing
	ctlDisco
)

type Pkt struct {
	Data  []byte
	ChNo  uint8
	Unrel bool
}

// seqnums are sequence numbers used to maintain reliable packet order
// and to identify split packets.
type seqnum uint16

const seqnumInit seqnum = 65500