Skip to content

Commit 1ac113a

Browse files
committed
Check the AX.25 frame. Not just the payload
1 parent b8fe661 commit 1ac113a

File tree

3 files changed

+54
-58
lines changed

3 files changed

+54
-58
lines changed

src/il2p.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,9 @@ typedef struct {
137137

138138
extern int il2p_payload_compute (il2p_payload_properties_t *p, int payload_size, int max_fec);
139139

140-
extern int il2p_encode_payload (unsigned char *payload, int payload_size, int max_fec, unsigned char *enc, unsigned char **next);
140+
extern int il2p_encode_payload (unsigned char *payload, int payload_size, int max_fec, unsigned char *enc);
141141

142-
extern int il2p_decode_payload (unsigned char *received, int payload_size, int max_fec, unsigned char *payload_out, int *symbols_corrected, unsigned char **next);
142+
extern int il2p_decode_payload (unsigned char *received, int payload_size, int max_fec, unsigned char *payload_out, int *symbols_corrected);
143143

144144
extern int il2p_get_header_attributes (unsigned char *hdr, int *hdr_type, int *max_fec);
145145

src/il2p_codec.c

Lines changed: 50 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,15 @@ int il2p_encode_frame (packet_t pp, int max_fec, unsigned char *iout, int use_cr
105105
unsigned char hdr[IL2P_HEADER_SIZE + IL2P_HEADER_PARITY];
106106
int e;
107107
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);
109117

110118
e = il2p_type_1_header (pp, max_fec, hdr);
111119
if (e >= 0) {
@@ -115,6 +123,10 @@ int il2p_encode_frame (packet_t pp, int max_fec, unsigned char *iout, int use_cr
115123

116124
if (e == 0) {
117125
// 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+
}
118130
return (out_len);
119131
}
120132

@@ -123,18 +135,14 @@ int il2p_encode_frame (packet_t pp, int max_fec, unsigned char *iout, int use_cr
123135
int info_len;
124136
info_len = ax25_get_info (pp, &pinfo);
125137

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);
127139
if (k > 0) {
128140
out_len += k;
129141
// 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+
}
138146
return (out_len);
139147
}
140148

@@ -157,18 +165,14 @@ int il2p_encode_frame (packet_t pp, int max_fec, unsigned char *iout, int use_cr
157165

158166
unsigned char *frame_data_ptr = ax25_get_frame_data_ptr (pp);
159167
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);
161169
if (k > 0) {
162170
out_len += k;
163171
// 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+
}
172176
return (out_len);
173177
}
174178
// Something went wrong with the payload encoding.
@@ -240,8 +244,10 @@ packet_t il2p_decode_header_payload (unsigned char* uhdr, unsigned char *epayloa
240244
int hdr_type;
241245
int max_fec;
242246
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;
245251

246252
packet_t pp = NULL;
247253

@@ -259,7 +265,7 @@ packet_t il2p_decode_header_payload (unsigned char* uhdr, unsigned char *epayloa
259265
// This is the AX.25 Information part.
260266

261267
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);
263269

264270
// It would be possible to have a good header but too many errors in the payload.
265271

@@ -272,46 +278,31 @@ packet_t il2p_decode_header_payload (unsigned char* uhdr, unsigned char *epayloa
272278
text_color_set(DW_COLOR_ERROR);
273279
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);
274280
}
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-
}
291281
ax25_set_info (pp, extracted, payload_len);
292282
}
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+
}
293294
return (pp);
294295
}
295296
else {
296297

297298
// Header type 0. The payload is the entire AX.25 frame.
298299

299300
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);
301302

302303
if (e <= 0) { // Payload was not received correctly.
303304
return (NULL);
304305
}
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-
}
315306
if (e != payload_len) {
316307
text_color_set(DW_COLOR_ERROR);
317308
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
325316
// this redundant.
326317

327318
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+
}
328329
return (pp);
329330
}
330331

src/il2p_payload.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,8 @@ int il2p_payload_compute (il2p_payload_properties_t *p, int payload_size, int ma
132132
*--------------------------------------------------------------------------------*/
133133

134134

135-
int il2p_encode_payload (unsigned char *payload, int payload_size, int max_fec, unsigned char *enc, unsigned char **next)
135+
int il2p_encode_payload (unsigned char *payload, int payload_size, int max_fec, unsigned char *enc)
136136
{
137-
*next = NULL;
138137
if (payload_size > IL2P_MAX_PAYLOAD_SIZE) return (-1);
139138
if (payload_size == 0) return (0);
140139

@@ -183,7 +182,6 @@ int il2p_encode_payload (unsigned char *payload, int payload_size, int max_fec,
183182
encoded_length += ipp.parity_symbols_per_block;
184183
}
185184

186-
*next = pout;
187185

188186
return (encoded_length);
189187

@@ -218,9 +216,8 @@ int il2p_encode_payload (unsigned char *payload, int payload_size, int max_fec,
218216
*
219217
*--------------------------------------------------------------------------------*/
220218

221-
int il2p_decode_payload (unsigned char *received, int payload_size, int max_fec, unsigned char *payload_out, int *symbols_corrected, unsigned char **next)
219+
int il2p_decode_payload (unsigned char *received, int payload_size, int max_fec, unsigned char *payload_out, int *symbols_corrected)
222220
{
223-
*next = NULL;
224221
// Determine number of blocks and sizes.
225222
il2p_payload_properties_t ipp;
226223
int e;
@@ -293,8 +290,6 @@ int il2p_decode_payload (unsigned char *received, int payload_size, int max_fec,
293290
return (-3);
294291
}
295292

296-
*next = pin; // Return pointer to next byte after payload.
297-
298293
return (decoded_length);
299294

300295
} // end il2p_decode_payload

0 commit comments

Comments
 (0)