@@ -105,7 +105,15 @@ int il2p_encode_frame (packet_t pp, int max_fec, unsigned char *iout, int use_cr
105
105
unsigned char hdr [IL2P_HEADER_SIZE + IL2P_HEADER_PARITY ];
106
106
int e ;
107
107
int out_len = 0 ;
108
- unsigned char * crc_hdr ;
108
+ unsigned char crc [IL2P_CODED_CRC_LENGTH ];
109
+ int crc_len ;
110
+ unsigned char * frame_data ;
111
+ int frame_len ;
112
+
113
+
114
+ frame_len = ax25_get_frame_len (pp );
115
+ frame_data = ax25_get_frame_data_ptr (pp );
116
+ crc_len = il2p_generate_crc (crc , frame_data , frame_len );
109
117
110
118
e = il2p_type_1_header (pp , max_fec , hdr );
111
119
if (e >= 0 ) {
@@ -115,6 +123,10 @@ int il2p_encode_frame (packet_t pp, int max_fec, unsigned char *iout, int use_cr
115
123
116
124
if (e == 0 ) {
117
125
// Success. No info part.
126
+ if (use_crc == IL2P_USECRC ) {
127
+ memcpy (iout + out_len , crc , IL2P_CODED_CRC_LENGTH );
128
+ out_len += crc_len ;
129
+ }
118
130
return (out_len );
119
131
}
120
132
@@ -123,18 +135,14 @@ int il2p_encode_frame (packet_t pp, int max_fec, unsigned char *iout, int use_cr
123
135
int info_len ;
124
136
info_len = ax25_get_info (pp , & pinfo );
125
137
126
- int k = il2p_encode_payload (pinfo , info_len , max_fec , iout + out_len , & crc_hdr );
138
+ int k = il2p_encode_payload (pinfo , info_len , max_fec , iout + out_len );
127
139
if (k > 0 ) {
128
140
out_len += k ;
129
141
// Success. Info part was <= 1023 bytes.
130
- if (use_crc == IL2P_USECRC ) {
131
- if (crc_hdr != NULL ) {
132
- int crc_len = il2p_generate_crc (crc_hdr , pinfo , info_len );
133
- out_len += crc_len ;
134
- } else {
135
- return (-1 );
136
- }
137
- }
142
+ if (use_crc == IL2P_USECRC ) {
143
+ memcpy (iout + out_len , & crc , sizeof (crc ));
144
+ out_len += crc_len ;
145
+ }
138
146
return (out_len );
139
147
}
140
148
@@ -157,18 +165,14 @@ int il2p_encode_frame (packet_t pp, int max_fec, unsigned char *iout, int use_cr
157
165
158
166
unsigned char * frame_data_ptr = ax25_get_frame_data_ptr (pp );
159
167
int frame_len = ax25_get_frame_len (pp );
160
- int k = il2p_encode_payload (frame_data_ptr , frame_len , max_fec , iout + out_len , & crc_hdr );
168
+ int k = il2p_encode_payload (frame_data_ptr , frame_len , max_fec , iout + out_len );
161
169
if (k > 0 ) {
162
170
out_len += k ;
163
171
// Success. Entire AX.25 frame <= 1023 bytes.
164
- if (use_crc == IL2P_USECRC ) {
165
- if (crc_hdr != NULL ) {
166
- int crc_len = il2p_generate_crc (crc_hdr , frame_data_ptr , frame_len );
167
- out_len += crc_len ;
168
- } else {
169
- return (-1 );
170
- }
171
- }
172
+ if (use_crc == IL2P_USECRC ) {
173
+ memcpy (iout + out_len , & crc , sizeof (crc ));
174
+ out_len += crc_len ;
175
+ }
172
176
return (out_len );
173
177
}
174
178
// Something went wrong with the payload encoding.
@@ -240,8 +244,10 @@ packet_t il2p_decode_header_payload (unsigned char* uhdr, unsigned char *epayloa
240
244
int hdr_type ;
241
245
int max_fec ;
242
246
int payload_len = il2p_get_header_attributes (uhdr , & hdr_type , & max_fec );
243
- unsigned char * crc_hdr ;
244
- int ret ;
247
+ unsigned char * crc_hdr = epayload ; // In case ther's no payload, this is where the CRC is stored.
248
+ int ret ;
249
+ int frame_len ;
250
+ unsigned char * frame_data ;
245
251
246
252
packet_t pp = NULL ;
247
253
@@ -259,7 +265,7 @@ packet_t il2p_decode_header_payload (unsigned char* uhdr, unsigned char *epayloa
259
265
// This is the AX.25 Information part.
260
266
261
267
unsigned char extracted [IL2P_MAX_PAYLOAD_SIZE ];
262
- int e = il2p_decode_payload (epayload , payload_len , max_fec , extracted , symbols_corrected , & crc_hdr );
268
+ int e = il2p_decode_payload (epayload , payload_len , max_fec , extracted , symbols_corrected );
263
269
264
270
// It would be possible to have a good header but too many errors in the payload.
265
271
@@ -272,46 +278,31 @@ packet_t il2p_decode_header_payload (unsigned char* uhdr, unsigned char *epayloa
272
278
text_color_set (DW_COLOR_ERROR );
273
279
dw_printf ("IL2P Internal Error: %s(): hdr_type=%d, max_fec=%d, payload_len=%d, e=%d.\n" , __func__ , hdr_type , max_fec , payload_len , e );
274
280
}
275
- if (use_crc == IL2P_USECRC ) {
276
- if (crc_hdr != NULL ) {
277
- // Check the CRC-16 for the payload.
278
- // If it fails, return NULL.
279
- ret = il2p_check_crc (extracted , payload_len , crc_hdr );
280
- if (ret < 0 ) {
281
- ax25_delete (pp );
282
- pp = NULL ;
283
- return pp ;
284
- }
285
- } else {
286
- ax25_delete (pp );
287
- pp = NULL ;
288
- return pp ;
289
- }
290
- }
291
281
ax25_set_info (pp , extracted , payload_len );
292
282
}
283
+ // Check CRC if requested.
284
+ if (use_crc == IL2P_USECRC ) {
285
+ frame_len = ax25_get_frame_len (pp );
286
+ frame_data = ax25_get_frame_data_ptr (pp );
287
+ crc_hdr = epayload + payload_len ; // CRC is at the end of the payload.
288
+ ret = il2p_check_crc (frame_data , frame_len , crc_hdr );
289
+ if (ret < 0 ) {
290
+ ax25_delete (pp );
291
+ pp = NULL ;
292
+ }
293
+ }
293
294
return (pp );
294
295
}
295
296
else {
296
297
297
298
// Header type 0. The payload is the entire AX.25 frame.
298
299
299
300
unsigned char extracted [IL2P_MAX_PAYLOAD_SIZE ];
300
- int e = il2p_decode_payload (epayload , payload_len , max_fec , extracted , symbols_corrected , & crc_hdr );
301
+ int e = il2p_decode_payload (epayload , payload_len , max_fec , extracted , symbols_corrected );
301
302
302
303
if (e <= 0 ) { // Payload was not received correctly.
303
304
return (NULL );
304
305
}
305
- if (use_crc == IL2P_USECRC ) {
306
- if (crc_hdr != NULL ) {
307
- ret = il2p_check_crc (extracted , payload_len , crc_hdr );
308
- if (ret < 0 ) {
309
- return NULL ;
310
- }
311
- } else {
312
- return NULL ;
313
- }
314
- }
315
306
if (e != payload_len ) {
316
307
text_color_set (DW_COLOR_ERROR );
317
308
dw_printf ("IL2P Internal Error: %s(): hdr_type=%d, e=%d, payload_len=%d\n" , __func__ , hdr_type , e , payload_len );
@@ -325,6 +316,16 @@ packet_t il2p_decode_header_payload (unsigned char* uhdr, unsigned char *epayloa
325
316
// this redundant.
326
317
327
318
pp = ax25_from_frame (extracted , payload_len , alevel );
319
+ if (use_crc ) {
320
+ frame_len = ax25_get_frame_len (pp );
321
+ frame_data = ax25_get_frame_data_ptr (pp );
322
+ crc_hdr = epayload + payload_len ; // CRC is at the end of the payload.
323
+ ret = il2p_check_crc (frame_data , frame_len , crc_hdr );
324
+ if (ret < 0 ) {
325
+ ax25_delete (pp );
326
+ pp = NULL ;
327
+ }
328
+ }
328
329
return (pp );
329
330
}
330
331
0 commit comments