@@ -64,9 +64,14 @@ z_result_t _z_join_encode(_z_wbuf_t *wbf, uint8_t header, const _z_t_msg_join_t
64
64
}
65
65
_Z_RETURN_IF_ERR (_z_zsize_encode (wbf , msg -> _next_sn ._val ._plain ._reliable ));
66
66
_Z_RETURN_IF_ERR (_z_zsize_encode (wbf , msg -> _next_sn ._val ._plain ._best_effort ));
67
+ #if Z_FEATURE_FRAGMENTATION == 1
68
+ bool has_patch = msg -> _patch != _Z_NO_PATCH ;
69
+ #else
70
+ bool has_patch = false;
71
+ #endif
67
72
if (msg -> _next_sn ._is_qos ) {
68
73
if (_Z_HAS_FLAG (header , _Z_FLAG_T_Z )) {
69
- _Z_RETURN_IF_ERR (_z_uint8_encode (wbf , _Z_MSG_EXT_ENC_ZBUF | _Z_MSG_EXT_FLAG_M | 1 ));
74
+ _Z_RETURN_IF_ERR (_z_uint8_encode (wbf , _Z_MSG_EXT_ID_JOIN_QOS | _Z_MSG_EXT_MORE ( has_patch ) ));
70
75
size_t len = 0 ;
71
76
for (uint8_t i = 0 ; (i < Z_PRIORITIES_NUM ) && (ret == _Z_RES_OK ); i ++ ) {
72
77
len += _z_zint_len (msg -> _next_sn ._val ._qos [i ]._reliable ) +
@@ -82,21 +87,35 @@ z_result_t _z_join_encode(_z_wbuf_t *wbf, uint8_t header, const _z_t_msg_join_t
82
87
ret |= _Z_ERR_MESSAGE_SERIALIZATION_FAILED ;
83
88
}
84
89
}
90
+ #if Z_FEATURE_FRAGMENTATION == 1
91
+ if (has_patch ) {
92
+ if (_Z_HAS_FLAG (header , _Z_FLAG_T_Z )) {
93
+ _Z_RETURN_IF_ERR (_z_uint8_encode (wbf , _Z_MSG_EXT_ID_JOIN_PATCH ));
94
+ _Z_RETURN_IF_ERR (_z_zint64_encode (wbf , msg -> _patch ));
95
+ } else {
96
+ _Z_DEBUG ("Attempted to serialize Patch extension, but the header extension flag was unset" );
97
+ ret |= _Z_ERR_MESSAGE_SERIALIZATION_FAILED ;
98
+ }
99
+ }
100
+ #endif
85
101
86
102
return ret ;
87
103
}
88
104
89
105
z_result_t _z_join_decode_ext (_z_msg_ext_t * extension , void * ctx ) {
90
106
z_result_t ret = _Z_RES_OK ;
91
107
_z_t_msg_join_t * msg = (_z_t_msg_join_t * )ctx ;
92
- if (_Z_EXT_FULL_ID (extension -> _header ) ==
93
- (_Z_MSG_EXT_ENC_ZBUF | _Z_MSG_EXT_FLAG_M | 1 )) { // QOS: (enc=zbuf)(mandatory=true)(id=1)
108
+ if (_Z_EXT_FULL_ID (extension -> _header ) == _Z_MSG_EXT_ID_JOIN_QOS ) {
94
109
msg -> _next_sn ._is_qos = true;
95
110
_z_zbuf_t zbf = _z_slice_as_zbuf (extension -> _body ._zbuf ._val );
96
111
for (int i = 0 ; (ret == _Z_RES_OK ) && (i < Z_PRIORITIES_NUM ); ++ i ) {
97
112
ret |= _z_zsize_decode (& msg -> _next_sn ._val ._qos [i ]._reliable , & zbf );
98
113
ret |= _z_zsize_decode (& msg -> _next_sn ._val ._qos [i ]._best_effort , & zbf );
99
114
}
115
+ #if Z_FEATURE_FRAGMENTATION == 1
116
+ } else if (_Z_EXT_FULL_ID (extension -> _header ) == _Z_MSG_EXT_ID_JOIN_PATCH ) {
117
+ msg -> _patch = (uint8_t )extension -> _body ._zint ._val ;
118
+ #endif
100
119
} else if (_Z_MSG_EXT_IS_MANDATORY (extension -> _header )) {
101
120
ret = _Z_ERR_MESSAGE_EXTENSION_MANDATORY_AND_UNKNOWN ;
102
121
}
@@ -147,6 +166,7 @@ z_result_t _z_join_decode(_z_t_msg_join_t *msg, _z_zbuf_t *zbf, uint8_t header)
147
166
ret |= _z_zsize_decode (& msg -> _next_sn ._val ._plain ._reliable , zbf );
148
167
ret |= _z_zsize_decode (& msg -> _next_sn ._val ._plain ._best_effort , zbf );
149
168
}
169
+ msg -> _patch = _Z_NO_PATCH ;
150
170
if ((ret == _Z_RES_OK ) && _Z_HAS_FLAG (header , _Z_FLAG_T_Z )) {
151
171
ret |= _z_msg_ext_decode_iter (zbf , _z_join_decode_ext , msg );
152
172
}
@@ -180,6 +200,32 @@ z_result_t _z_init_encode(_z_wbuf_t *wbf, uint8_t header, const _z_t_msg_init_t
180
200
_Z_RETURN_IF_ERR (_z_slice_encode (wbf , & msg -> _cookie ))
181
201
}
182
202
203
+ #if Z_FEATURE_FRAGMENTATION == 1
204
+ if (msg -> _patch != _Z_NO_PATCH ) {
205
+ if (_Z_HAS_FLAG (header , _Z_FLAG_T_Z )) {
206
+ _Z_RETURN_IF_ERR (_z_uint8_encode (wbf , _Z_MSG_EXT_ID_JOIN_PATCH ));
207
+ _Z_RETURN_IF_ERR (_z_zint64_encode (wbf , msg -> _patch ));
208
+ } else {
209
+ _Z_DEBUG ("Attempted to serialize Patch extension, but the header extension flag was unset" );
210
+ ret |= _Z_ERR_MESSAGE_SERIALIZATION_FAILED ;
211
+ }
212
+ }
213
+ #endif
214
+
215
+ return ret ;
216
+ }
217
+
218
+ z_result_t _z_init_decode_ext (_z_msg_ext_t * extension , void * ctx ) {
219
+ z_result_t ret = _Z_RES_OK ;
220
+ _z_t_msg_init_t * msg = (_z_t_msg_init_t * )ctx ;
221
+ if (false) {
222
+ #if Z_FEATURE_FRAGMENTATION == 1
223
+ } else if (_Z_EXT_FULL_ID (extension -> _header ) == _Z_MSG_EXT_ID_INIT_PATCH ) {
224
+ msg -> _patch = (uint8_t )extension -> _body ._zint ._val ;
225
+ #endif
226
+ } else if (_Z_MSG_EXT_IS_MANDATORY (extension -> _header )) {
227
+ ret = _Z_ERR_MESSAGE_EXTENSION_MANDATORY_AND_UNKNOWN ;
228
+ }
183
229
return ret ;
184
230
}
185
231
@@ -222,8 +268,9 @@ z_result_t _z_init_decode(_z_t_msg_init_t *msg, _z_zbuf_t *zbf, uint8_t header)
222
268
msg -> _cookie = _z_slice_empty ();
223
269
}
224
270
225
- if ((ret == _Z_RES_OK ) && (_Z_HAS_FLAG (header , _Z_FLAG_T_Z ) == true)) {
226
- ret |= _z_msg_ext_skip_non_mandatories (zbf , 0x01 );
271
+ msg -> _patch = _Z_NO_PATCH ;
272
+ if ((ret == _Z_RES_OK ) && _Z_HAS_FLAG (header , _Z_FLAG_T_Z )) {
273
+ ret |= _z_msg_ext_decode_iter (zbf , _z_init_decode_ext , msg );
227
274
}
228
275
229
276
return ret ;
@@ -388,25 +435,53 @@ z_result_t _z_fragment_encode(_z_wbuf_t *wbf, uint8_t header, const _z_t_msg_fra
388
435
z_result_t ret = _Z_RES_OK ;
389
436
_Z_DEBUG ("Encoding _Z_TRANSPORT_FRAGMENT" );
390
437
_Z_RETURN_IF_ERR (_z_zsize_encode (wbf , msg -> _sn ))
391
- if (_Z_HAS_FLAG (header , _Z_FLAG_T_Z )) {
392
- ret = _Z_ERR_MESSAGE_SERIALIZATION_FAILED ;
438
+ if (msg -> first ) {
439
+ if (_Z_HAS_FLAG (header , _Z_FLAG_T_Z ) == true) {
440
+ _Z_RETURN_IF_ERR (_z_uint8_encode (wbf , _Z_MSG_EXT_ID_FRAGMENT_FIRST | _Z_MSG_EXT_MORE (msg -> drop )));
441
+ } else {
442
+ _Z_DEBUG ("Attempted to serialize Start extension, but the header extension flag was unset" );
443
+ ret |= _Z_ERR_MESSAGE_SERIALIZATION_FAILED ;
444
+ }
445
+ }
446
+ if (msg -> drop ) {
447
+ if (_Z_HAS_FLAG (header , _Z_FLAG_T_Z ) == true) {
448
+ _Z_RETURN_IF_ERR (_z_uint8_encode (wbf , _Z_MSG_EXT_ID_FRAGMENT_DROP ));
449
+ } else {
450
+ _Z_DEBUG ("Attempted to serialize Stop extension, but the header extension flag was unset" );
451
+ ret |= _Z_ERR_MESSAGE_SERIALIZATION_FAILED ;
452
+ }
393
453
}
394
- if (ret == _Z_RES_OK && _z_slice_check (& msg -> _payload )) {
454
+ if (_z_slice_check (& msg -> _payload )) {
395
455
_Z_RETURN_IF_ERR (_z_wbuf_write_bytes (wbf , msg -> _payload .start , 0 , msg -> _payload .len ));
396
456
}
397
457
398
458
return ret ;
399
459
}
400
460
461
+ z_result_t _z_fragment_decode_ext (_z_msg_ext_t * extension , void * ctx ) {
462
+ z_result_t ret = _Z_RES_OK ;
463
+ _z_t_msg_fragment_t * msg = (_z_t_msg_fragment_t * )ctx ;
464
+ if (_Z_EXT_FULL_ID (extension -> _header ) == _Z_MSG_EXT_ID_FRAGMENT_FIRST ) {
465
+ msg -> first = true;
466
+ } else if (_Z_EXT_FULL_ID (extension -> _header ) == _Z_MSG_EXT_ID_FRAGMENT_DROP ) {
467
+ msg -> drop = true;
468
+ } else if (_Z_MSG_EXT_IS_MANDATORY (extension -> _header )) {
469
+ ret = _Z_ERR_MESSAGE_EXTENSION_MANDATORY_AND_UNKNOWN ;
470
+ }
471
+ return ret ;
472
+ }
473
+
401
474
z_result_t _z_fragment_decode (_z_t_msg_fragment_t * msg , _z_zbuf_t * zbf , uint8_t header ) {
402
475
z_result_t ret = _Z_RES_OK ;
403
476
* msg = (_z_t_msg_fragment_t ){0 };
404
477
405
478
_Z_DEBUG ("Decoding _Z_TRANSPORT_FRAGMENT" );
406
479
ret |= _z_zsize_decode (& msg -> _sn , zbf );
407
480
481
+ msg -> first = false;
482
+ msg -> drop = false;
408
483
if ((ret == _Z_RES_OK ) && (_Z_HAS_FLAG (header , _Z_FLAG_T_Z ) == true)) {
409
- ret |= _z_msg_ext_skip_non_mandatories (zbf , 0x05 );
484
+ ret |= _z_msg_ext_decode_iter (zbf , _z_fragment_decode_ext , msg );
410
485
}
411
486
412
487
_z_slice_t slice = _z_slice_alias_buf ((uint8_t * )_z_zbuf_start (zbf ), _z_zbuf_len (zbf ));
0 commit comments