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
|