From c8c00c994c9a9adf1a480aaf6a7110e12f36fc15 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Tue, 22 Sep 2020 16:30:05 -0400 Subject: [PATCH] Handle non-DATA KISS commands in src/tnc.c Handle non-DATA KISS commands in src/tnc.c, rather than simply returning -1 setting errno to EIO --- src/tnc.c | 45 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/src/tnc.c b/src/tnc.c index 09a60ef..fc909f5 100644 --- a/src/tnc.c +++ b/src/tnc.c @@ -23,7 +23,7 @@ enum tnc_opts { enum state { KISS_NONE, - KISS_FRAME, + KISS_FRAME_COMMAND, KISS_FRAME_BODY, KISS_FRAME_ESCAPE }; @@ -40,6 +40,7 @@ struct _patty_kiss_tnc { void *buf; enum state state; + enum patty_kiss_command command; size_t bufsz, readlen, @@ -149,6 +150,7 @@ patty_kiss_tnc *patty_kiss_tnc_new(patty_kiss_tnc_info *info) { tnc->opts = TNC_NONE; tnc->state = KISS_NONE; + tnc->command = PATTY_KISS_RETURN; tnc->bufsz = PATTY_KISS_TNC_BUFSZ; tnc->offset_i = 0; tnc->offset_o = 0; @@ -240,21 +242,35 @@ ssize_t patty_kiss_tnc_drain(patty_kiss_tnc *tnc, void *buf, size_t len) { switch (tnc->state) { case KISS_NONE: if (c == PATTY_KISS_FEND) { - tnc->state = KISS_FRAME; + tnc->state = KISS_FRAME_COMMAND; } break; - case KISS_FRAME: + case KISS_FRAME_COMMAND: if (c == PATTY_KISS_FEND) { break; - } else if (PATTY_KISS_COMMAND(c) != PATTY_KISS_DATA) { - errno = EIO; - - goto error_io; } - tnc->state = KISS_FRAME_BODY; + switch (c) { + case PATTY_KISS_DATA: + case PATTY_KISS_TXDELAY: + case PATTY_KISS_PERSISTENCE: + case PATTY_KISS_SLOT_TIME: + case PATTY_KISS_TX_TAIL: + case PATTY_KISS_FULL_DUPLEX: + case PATTY_KISS_HW_SET: + case PATTY_KISS_RETURN: + break; + + default: + errno = EIO; + + goto error_io; + } + + tnc->state = KISS_FRAME_BODY; + tnc->command = (enum patty_kiss_command)c; break; @@ -262,11 +278,17 @@ ssize_t patty_kiss_tnc_drain(patty_kiss_tnc *tnc, void *buf, size_t len) { if (c == PATTY_KISS_FESC) { tnc->state = KISS_FRAME_ESCAPE; } else if (c == PATTY_KISS_FEND) { - tnc->state = KISS_FRAME; + tnc->state = KISS_FRAME_COMMAND; goto done; } else { - ((uint8_t *)buf)[tnc->offset_o++] = c; + switch (tnc->command) { + case PATTY_KISS_DATA: + ((uint8_t *)buf)[tnc->offset_o++] = c; + + default: + break; + } } break; @@ -294,7 +316,7 @@ error_io: } int patty_kiss_tnc_ready(patty_kiss_tnc *tnc) { - return tnc->state == KISS_FRAME && tnc->offset_o > 0? 1: 0; + return tnc->state == KISS_FRAME_COMMAND && tnc->offset_o > 0? 1: 0; } ssize_t patty_kiss_tnc_flush(patty_kiss_tnc *tnc) { @@ -302,6 +324,7 @@ ssize_t patty_kiss_tnc_flush(patty_kiss_tnc *tnc) { ssize_t ret = (ssize_t)tnc->offset_o; tnc->state = KISS_NONE; + tnc->command = PATTY_KISS_RETURN; tnc->offset_o = 0; return ret;