diff --git a/src/frame.c b/src/frame.c index 135a3d1..85dee75 100644 --- a/src/frame.c +++ b/src/frame.c @@ -195,14 +195,13 @@ ssize_t patty_ax25_frame_decode_control(patty_ax25_frame *frame, break; case PATTY_AX25_FRAME_EXTENDED: - frame->control = (uint16_t)(buf[offset++] << 8); - frame->control |= (uint16_t)(buf[offset++]); + frame->control = (uint16_t)(buf[offset++]); - if (PATTY_AX25_FRAME_CONTROL_U(frame->control)) { - errno = EIO; - - goto error; + if (!PATTY_AX25_FRAME_CONTROL_U(frame->control)) { + frame->control |= (uint16_t)(buf[offset++] << 8); } + + break; } if (PATTY_AX25_FRAME_CONTROL_I(frame->control)) { @@ -638,8 +637,11 @@ ssize_t patty_ax25_frame_encode_reply_to(patty_ax25_frame *frame, break; case PATTY_AX25_FRAME_EXTENDED: - ((uint8_t *)buf)[offset++] = (reply->control & 0xff00) >> 8; - ((uint8_t *)buf)[offset++] = reply->control & 0xf00ff; + ((uint8_t *)buf)[offset++] = reply->control & 0x00ff; + + if (!PATTY_AX25_FRAME_CONTROL_U(reply->control)) { + ((uint8_t *)buf)[offset++] = (reply->control & 0xff00) >> 8; + } break; }