@@ -62,80 +62,45 @@ func (o Originator) String() string {
62
62
return "Terminator"
63
63
}
64
64
65
- type PayloadFlag uint32
65
+ type Flag uint32
66
66
67
67
const (
68
- PayloadFlagCircuitEnd PayloadFlag = 1
69
- PayloadFlagOriginator PayloadFlag = 2
70
- PayloadFlagCircuitStart PayloadFlag = 4
71
- PayloadFlagChunk PayloadFlag = 8
68
+ PayloadFlagCircuitEnd Flag = 1
69
+ PayloadFlagOriginator Flag = 2
70
+ PayloadFlagCircuitStart Flag = 4
71
+ PayloadFlagChunk Flag = 8
72
72
)
73
73
74
- type Header struct {
74
+ func NewAcknowledgement (circuitId string , originator Originator ) * Acknowledgement {
75
+ return & Acknowledgement {
76
+ CircuitId : circuitId ,
77
+ Flags : SetOriginatorFlag (0 , originator ),
78
+ }
79
+ }
80
+
81
+ type Acknowledgement struct {
75
82
CircuitId string
76
83
Flags uint32
77
84
RecvBufferSize uint32
78
85
RTT uint16
86
+ Sequence []int32
79
87
}
80
88
81
- func (header * Header ) GetCircuitId () string {
82
- return header .CircuitId
89
+ func (ack * Acknowledgement ) GetCircuitId () string {
90
+ return ack .CircuitId
83
91
}
84
92
85
- func (header * Header ) GetFlags () uint32 {
86
- return header .Flags
93
+ func (ack * Acknowledgement ) GetFlags () uint32 {
94
+ return ack .Flags
87
95
}
88
96
89
- func (header * Header ) GetOriginator () Originator {
90
- if isPayloadFlagSet ( header .Flags , PayloadFlagOriginator ) {
97
+ func (ack * Acknowledgement ) GetOriginator () Originator {
98
+ if isFlagSet ( ack .Flags , PayloadFlagOriginator ) {
91
99
return Terminator
92
100
}
93
101
return Initiator
94
102
}
95
103
96
- func (header * Header ) unmarshallHeader (msg * channel.Message ) error {
97
- circuitId , ok := msg .Headers [HeaderKeyCircuitId ]
98
- if ! ok {
99
- return fmt .Errorf ("no circuitId found in xgress payload message" )
100
- }
101
-
102
- // If no flags are present, it just means no flags have been set
103
- flags , _ := msg .GetUint32Header (HeaderKeyFlags )
104
-
105
- header .CircuitId = string (circuitId )
106
- header .Flags = flags
107
- if header .RecvBufferSize , ok = msg .GetUint32Header (HeaderKeyRecvBufferSize ); ! ok {
108
- header .RecvBufferSize = math .MaxUint32
109
- }
110
-
111
- header .RTT , _ = msg .GetUint16Header (HeaderKeyRTT )
112
-
113
- return nil
114
- }
115
-
116
- func (header * Header ) marshallHeader (msg * channel.Message ) {
117
- msg .Headers [HeaderKeyCircuitId ] = []byte (header .CircuitId )
118
- if header .Flags != 0 {
119
- msg .PutUint32Header (HeaderKeyFlags , header .Flags )
120
- }
121
-
122
- msg .PutUint32Header (HeaderKeyRecvBufferSize , header .RecvBufferSize )
123
- }
124
-
125
- func NewAcknowledgement (circuitId string , originator Originator ) * Acknowledgement {
126
- return & Acknowledgement {
127
- Header : Header {
128
- CircuitId : circuitId ,
129
- Flags : SetOriginatorFlag (0 , originator ),
130
- },
131
- }
132
- }
133
-
134
- type Acknowledgement struct {
135
- Header
136
- Sequence []int32
137
- }
138
-
139
104
func (ack * Acknowledgement ) GetSequence () []int32 {
140
105
return ack .Sequence
141
106
}
@@ -174,16 +139,33 @@ func (ack *Acknowledgement) unmarshallSequence(data []byte) error {
174
139
func (ack * Acknowledgement ) Marshall () * channel.Message {
175
140
msg := channel .NewMessage (ContentTypeAcknowledgementType , ack .marshallSequence ())
176
141
msg .PutUint16Header (HeaderKeyRTT , ack .RTT )
177
- ack .marshallHeader (msg )
142
+ msg .Headers [HeaderKeyCircuitId ] = []byte (ack .CircuitId )
143
+ if ack .Flags != 0 {
144
+ msg .PutUint32Header (HeaderKeyFlags , ack .Flags )
145
+ }
146
+ msg .PutUint32Header (HeaderKeyRecvBufferSize , ack .RecvBufferSize )
178
147
return msg
179
148
}
180
149
181
150
func UnmarshallAcknowledgement (msg * channel.Message ) (* Acknowledgement , error ) {
182
151
ack := & Acknowledgement {}
183
152
184
- if err := ack .unmarshallHeader (msg ); err != nil {
185
- return nil , err
153
+ circuitId , ok := msg .Headers [HeaderKeyCircuitId ]
154
+ if ! ok {
155
+ return nil , fmt .Errorf ("no circuitId found in xgress payload message" )
186
156
}
157
+
158
+ // If no flags are present, it just means no flags have been set
159
+ flags , _ := msg .GetUint32Header (HeaderKeyFlags )
160
+
161
+ ack .CircuitId = string (circuitId )
162
+ ack .Flags = flags
163
+ if ack .RecvBufferSize , ok = msg .GetUint32Header (HeaderKeyRecvBufferSize ); ! ok {
164
+ ack .RecvBufferSize = math .MaxUint32
165
+ }
166
+
167
+ ack .RTT , _ = msg .GetUint16Header (HeaderKeyRTT )
168
+
187
169
if err := ack .unmarshallSequence (msg .Body ); err != nil {
188
170
return nil , err
189
171
}
@@ -201,10 +183,12 @@ func (ack *Acknowledgement) GetLoggerFields() logrus.Fields {
201
183
}
202
184
203
185
type Payload struct {
204
- Header
205
- Sequence int32
206
- Headers map [uint8 ][]byte
207
- Data []byte
186
+ CircuitId string
187
+ Flags uint32
188
+ RTT uint16
189
+ Sequence int32
190
+ Headers map [uint8 ][]byte
191
+ Data []byte
208
192
}
209
193
210
194
func (payload * Payload ) GetSequence () int32 {
@@ -213,17 +197,25 @@ func (payload *Payload) GetSequence() int32 {
213
197
214
198
func (payload * Payload ) Marshall () * channel.Message {
215
199
msg := channel .NewMessage (ContentTypePayloadType , payload .Data )
216
- for key , value := range payload .Headers {
217
- msgHeaderKey := MinHeaderKey + int32 (key )
218
- msg .Headers [msgHeaderKey ] = value
200
+ addPayloadHeadersToMsg (msg , payload .Headers )
201
+ msg .Headers [HeaderKeyCircuitId ] = []byte (payload .CircuitId )
202
+ if payload .Flags != 0 {
203
+ msg .PutUint32Header (HeaderKeyFlags , payload .Flags )
219
204
}
220
- payload . marshallHeader ( msg )
205
+
221
206
msg .PutUint64Header (HeaderKeySequence , uint64 (payload .Sequence ))
222
207
msg .PutUint16Header (HeaderKeyRTT , uint16 (info .NowInMilliseconds ()))
223
208
224
209
return msg
225
210
}
226
211
212
+ func addPayloadHeadersToMsg (msg * channel.Message , headers map [uint8 ][]byte ) {
213
+ for key , value := range headers {
214
+ msgHeaderKey := MinHeaderKey + int32 (key )
215
+ msg .Headers [msgHeaderKey ] = value
216
+ }
217
+ }
218
+
227
219
func UnmarshallPayload (msg * channel.Message ) (* Payload , error ) {
228
220
var headers map [uint8 ][]byte
229
221
for key , val := range msg .Headers {
@@ -241,10 +233,19 @@ func UnmarshallPayload(msg *channel.Message) (*Payload, error) {
241
233
Data : msg .Body ,
242
234
}
243
235
244
- if err := payload .unmarshallHeader (msg ); err != nil {
245
- return nil , err
236
+ circuitId , ok := msg .Headers [HeaderKeyCircuitId ]
237
+ if ! ok {
238
+ return nil , fmt .Errorf ("no circuitId found in xgress payload message" )
246
239
}
247
240
241
+ // If no flags are present, it just means no flags have been set
242
+ flags , _ := msg .GetUint32Header (HeaderKeyFlags )
243
+
244
+ payload .CircuitId = string (circuitId )
245
+ payload .Flags = flags
246
+
247
+ payload .RTT , _ = msg .GetUint16Header (HeaderKeyRTT )
248
+
248
249
sequence , ok := msg .GetUint64Header (HeaderKeySequence )
249
250
if ! ok {
250
251
return nil , fmt .Errorf ("no sequence found in xgress payload message" )
@@ -254,20 +255,35 @@ func UnmarshallPayload(msg *channel.Message) (*Payload, error) {
254
255
return payload , nil
255
256
}
256
257
257
- func isPayloadFlagSet (flags uint32 , flag PayloadFlag ) bool {
258
- return PayloadFlag (flags )& flag == flag
258
+ func isFlagSet (flags uint32 , flag Flag ) bool {
259
+ return Flag (flags )& flag == flag
259
260
}
260
261
261
- func setPayloadFlag (flags uint32 , flag PayloadFlag ) uint32 {
262
- return uint32 (PayloadFlag (flags ) | flag )
262
+ func setPayloadFlag (flags uint32 , flag Flag ) uint32 {
263
+ return uint32 (Flag (flags ) | flag )
264
+ }
265
+
266
+ func (payload * Payload ) GetCircuitId () string {
267
+ return payload .CircuitId
268
+ }
269
+
270
+ func (payload * Payload ) GetFlags () uint32 {
271
+ return payload .Flags
263
272
}
264
273
265
274
func (payload * Payload ) IsCircuitEndFlagSet () bool {
266
- return isPayloadFlagSet (payload .Flags , PayloadFlagCircuitEnd )
275
+ return isFlagSet (payload .Flags , PayloadFlagCircuitEnd )
267
276
}
268
277
269
278
func (payload * Payload ) IsCircuitStartFlagSet () bool {
270
- return isPayloadFlagSet (payload .Flags , PayloadFlagCircuitStart )
279
+ return isFlagSet (payload .Flags , PayloadFlagCircuitStart )
280
+ }
281
+
282
+ func (payload * Payload ) GetOriginator () Originator {
283
+ if isFlagSet (payload .Flags , PayloadFlagOriginator ) {
284
+ return Terminator
285
+ }
286
+ return Initiator
271
287
}
272
288
273
289
func SetOriginatorFlag (flags uint32 , originator Originator ) uint32 {
0 commit comments