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.