From aa294b27108f0b06f70469c2002eba16f746da0e Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sat, 18 Jul 2015 02:22:25 -0500 Subject: [PATCH] =?UTF-8?q?Refactors=20with=20the=20lightest=20touch=20?= =?UTF-8?q?=F0=9F=92=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ax25.c | 69 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/src/ax25.c b/src/ax25.c index 585de76..3d75a64 100644 --- a/src/ax25.c +++ b/src/ax25.c @@ -3,7 +3,7 @@ #include -static ssize_t frame_decode_address(patty_ax25_address *address, void *data, off_t offset) { +static ssize_t frame_decode_station(patty_ax25_address *address, void *data, off_t offset) { int i, space = 0; uint8_t ssid = ((uint8_t *)data + offset)[6]; @@ -70,7 +70,7 @@ static ssize_t frame_decode_hops(patty_ax25_frame *frame, void *data, off_t star * frame. */ for (i=0; irepeaters[i], data, offset)) < 0) { + if ((decoded = frame_decode_station(&frame->repeaters[i], data, offset)) < 0) { goto error; } else { offset += decoded; @@ -101,6 +101,44 @@ error: return -1; } +static ssize_t frame_decode_address(patty_ax25_frame *frame, void *data, off_t start) { + off_t offset = start; + ssize_t decoded; + + if ((decoded = frame_decode_station(&frame->dest, data, offset)) < 0) { + goto error; + } else { + offset += decoded; + } + + /* + * It would be considered erroneous if the destination address did have the + * extension bit set to 1. + */ + if ((decoded = frame_decode_station(&frame->src, data, offset)) < 0) { + goto error; + } else { + offset += decoded; + } + + /* + * If the source address is not the final address in the frame, begin + * decoding repeater addresses. + */ + if (!frame->src.last) { + if ((decoded = frame_decode_hops(frame, data, offset)) < 0) { + goto error; + } else { + offset += decoded; + } + } + + return offset - start; + +error: + return -1; +} + static ssize_t frame_decode_payload(patty_ax25_frame *frame, void *data, off_t offset) { uint8_t control = ((uint8_t *)data + offset)[0]; size_t decoded = 0; @@ -160,34 +198,15 @@ int patty_ax25_frame_decode(patty_ax25_frame *frame, void *data, size_t size) { frame->size = size; - if ((decoded = frame_decode_address(&frame->dest, data, offset)) < 0) { + /* + * First, decode the variable-length Address field. + */ + if ((decoded = frame_decode_address(frame, data, offset)) < 0) { goto error_decode; } else { offset += decoded; } - /* - * It would be considered erroneous if the destination address did have the - * extension bit set to 1. - */ - if ((decoded = frame_decode_address(&frame->src, data, offset)) < 0) { - goto error_decode; - } else { - offset += decoded; - } - - /* - * If the source address is not the final address in the frame, begin - * decoding repeater addresses. - */ - if (!frame->src.last) { - if ((decoded = frame_decode_hops(frame, data, offset)) < 0) { - goto error_decode; - } else { - offset += decoded; - } - } - /* * Now, decode the remaining Control Field, optional Protocol Identifier * field, and payload that may follow.