-
Notifications
You must be signed in to change notification settings - Fork 647
/
fields.go
177 lines (170 loc) · 4.7 KB
/
fields.go
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// Copyright (C) 2019-2021, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package message
import (
"github.com/ava-labs/avalanchego/utils/wrappers"
)
// Field that may be packed into a message
type Field uint32
// Fields that may be packed. These values are not sent over the wire.
const (
VersionStr Field = iota // Used in handshake
NetworkID // Used in handshake
NodeID // Used in handshake
MyTime // Used in handshake
IP // Used in handshake
Peers // Used in handshake
ChainID // Used for dispatching
RequestID // Used for all messages
Deadline // Used for request messages
ContainerID // Used for querying
ContainerBytes // Used for gossiping
ContainerIDs // Used for querying
MultiContainerBytes // Used in Ancestors
SigBytes // Used in handshake / peer gossiping
VersionTime // Used in handshake / peer gossiping
SignedPeers // Used in peer gossiping
TrackedSubnets // Used in handshake / peer gossiping
AppBytes // Used at application level
VMMessage // Used internally
Uptime // Used for Pong
VersionStruct // Used internally
)
// Packer returns the packer function that can be used to pack this field.
func (f Field) Packer() func(*wrappers.Packer, interface{}) {
switch f {
case VersionStr:
return wrappers.TryPackStr
case NetworkID:
return wrappers.TryPackInt
case NodeID:
return wrappers.TryPackInt
case MyTime:
return wrappers.TryPackLong
case IP:
return wrappers.TryPackIP
case Peers:
return wrappers.TryPackIPList
case ChainID: // TODO: This will be shortened to use a modified varint spec
return wrappers.TryPackHash
case RequestID:
return wrappers.TryPackInt
case Deadline:
return wrappers.TryPackLong
case ContainerID:
return wrappers.TryPackHash
case ContainerBytes:
return wrappers.TryPackBytes
case ContainerIDs:
return wrappers.TryPackHashes
case MultiContainerBytes:
return wrappers.TryPack2DBytes
case AppBytes:
return wrappers.TryPackBytes
case SigBytes:
return wrappers.TryPackBytes
case VersionTime:
return wrappers.TryPackLong
case SignedPeers:
return wrappers.TryPackIPCertList
case TrackedSubnets:
return wrappers.TryPackHashes
case Uptime:
return wrappers.TryPackByte
default:
return nil
}
}
// Unpacker returns the unpacker function that can be used to unpack this field.
func (f Field) Unpacker() func(*wrappers.Packer) interface{} {
switch f {
case VersionStr:
return wrappers.TryUnpackStr
case NetworkID:
return wrappers.TryUnpackInt
case NodeID:
return wrappers.TryUnpackInt
case MyTime:
return wrappers.TryUnpackLong
case IP:
return wrappers.TryUnpackIP
case Peers:
return wrappers.TryUnpackIPList
case ChainID: // TODO: This will be shortened to use a modified varint spec
return wrappers.TryUnpackHash
case RequestID:
return wrappers.TryUnpackInt
case Deadline:
return wrappers.TryUnpackLong
case ContainerID:
return wrappers.TryUnpackHash
case ContainerBytes:
return wrappers.TryUnpackBytes
case ContainerIDs:
return wrappers.TryUnpackHashes
case MultiContainerBytes:
return wrappers.TryUnpack2DBytes
case AppBytes:
return wrappers.TryUnpackBytes
case SigBytes:
return wrappers.TryUnpackBytes
case VersionTime:
return wrappers.TryUnpackLong
case SignedPeers:
return wrappers.TryUnpackIPCertList
case TrackedSubnets:
return wrappers.TryUnpackHashes
case Uptime:
return wrappers.TryUnpackByte
default:
return nil
}
}
func (f Field) String() string {
switch f {
case VersionStr:
return "VersionStr"
case NetworkID:
return "NetworkID"
case NodeID:
return "NodeID"
case MyTime:
return "MyTime"
case IP:
return "IP"
case Peers:
return "Peers"
case ChainID:
return "ChainID"
case RequestID:
return "RequestID"
case Deadline:
return "Deadline"
case ContainerID:
return "ContainerID"
case ContainerBytes:
return "Container Bytes"
case ContainerIDs:
return "Container IDs"
case MultiContainerBytes:
return "MultiContainerBytes"
case AppBytes:
return "AppBytes"
case SigBytes:
return "SigBytes"
case VersionTime:
return "VersionTime"
case SignedPeers:
return "SignedPeers"
case TrackedSubnets:
return "TrackedSubnets"
case VMMessage:
return "VMMessage"
case Uptime:
return "Uptime"
case VersionStruct:
return "VersionStruct"
default:
return "Unknown Field"
}
}