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
This commit is contained in:
parent
0b568435e9
commit
c8c00c994c
1 changed files with 34 additions and 11 deletions
45
src/tnc.c
45
src/tnc.c
|
@ -23,7 +23,7 @@ enum tnc_opts {
|
||||||
|
|
||||||
enum state {
|
enum state {
|
||||||
KISS_NONE,
|
KISS_NONE,
|
||||||
KISS_FRAME,
|
KISS_FRAME_COMMAND,
|
||||||
KISS_FRAME_BODY,
|
KISS_FRAME_BODY,
|
||||||
KISS_FRAME_ESCAPE
|
KISS_FRAME_ESCAPE
|
||||||
};
|
};
|
||||||
|
@ -40,6 +40,7 @@ struct _patty_kiss_tnc {
|
||||||
void *buf;
|
void *buf;
|
||||||
|
|
||||||
enum state state;
|
enum state state;
|
||||||
|
enum patty_kiss_command command;
|
||||||
|
|
||||||
size_t bufsz,
|
size_t bufsz,
|
||||||
readlen,
|
readlen,
|
||||||
|
@ -149,6 +150,7 @@ patty_kiss_tnc *patty_kiss_tnc_new(patty_kiss_tnc_info *info) {
|
||||||
|
|
||||||
tnc->opts = TNC_NONE;
|
tnc->opts = TNC_NONE;
|
||||||
tnc->state = KISS_NONE;
|
tnc->state = KISS_NONE;
|
||||||
|
tnc->command = PATTY_KISS_RETURN;
|
||||||
tnc->bufsz = PATTY_KISS_TNC_BUFSZ;
|
tnc->bufsz = PATTY_KISS_TNC_BUFSZ;
|
||||||
tnc->offset_i = 0;
|
tnc->offset_i = 0;
|
||||||
tnc->offset_o = 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) {
|
switch (tnc->state) {
|
||||||
case KISS_NONE:
|
case KISS_NONE:
|
||||||
if (c == PATTY_KISS_FEND) {
|
if (c == PATTY_KISS_FEND) {
|
||||||
tnc->state = KISS_FRAME;
|
tnc->state = KISS_FRAME_COMMAND;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KISS_FRAME:
|
case KISS_FRAME_COMMAND:
|
||||||
if (c == PATTY_KISS_FEND) {
|
if (c == PATTY_KISS_FEND) {
|
||||||
break;
|
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;
|
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) {
|
if (c == PATTY_KISS_FESC) {
|
||||||
tnc->state = KISS_FRAME_ESCAPE;
|
tnc->state = KISS_FRAME_ESCAPE;
|
||||||
} else if (c == PATTY_KISS_FEND) {
|
} else if (c == PATTY_KISS_FEND) {
|
||||||
tnc->state = KISS_FRAME;
|
tnc->state = KISS_FRAME_COMMAND;
|
||||||
|
|
||||||
goto done;
|
goto done;
|
||||||
} else {
|
} 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;
|
break;
|
||||||
|
@ -294,7 +316,7 @@ error_io:
|
||||||
}
|
}
|
||||||
|
|
||||||
int patty_kiss_tnc_ready(patty_kiss_tnc *tnc) {
|
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) {
|
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;
|
ssize_t ret = (ssize_t)tnc->offset_o;
|
||||||
|
|
||||||
tnc->state = KISS_NONE;
|
tnc->state = KISS_NONE;
|
||||||
|
tnc->command = PATTY_KISS_RETURN;
|
||||||
tnc->offset_o = 0;
|
tnc->offset_o = 0;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Add table
Reference in a new issue