Do not decode KISS frames into internal buffer

Changes:

    * Modify patty_kiss_tnc_recv() to accept a pointer to a read buffer,
      and a maximum length argument, to receive one packet

    * Modify src/decode.c to use the new patty_kiss_tnc_recv() calling
      form
This commit is contained in:
XANTRONIX Development 2020-05-27 19:11:25 -04:00 committed by XANTRONIX Industrial
parent e74941f714
commit d44889121e
3 changed files with 26 additions and 25 deletions

View file

@ -40,11 +40,12 @@ void patty_kiss_tnc_close(patty_kiss_tnc *tnc);
size_t patty_kiss_tnc_dropped(patty_kiss_tnc *tnc); size_t patty_kiss_tnc_dropped(patty_kiss_tnc *tnc);
ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc, ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc,
void **frame, void *buf,
size_t len,
int *port); int *port);
ssize_t patty_kiss_tnc_send(patty_kiss_tnc *tnc, ssize_t patty_kiss_tnc_send(patty_kiss_tnc *tnc,
const void *frame, const void *buf,
size_t len, size_t len,
int port); int port);

View file

@ -142,7 +142,7 @@ error_io:
int main(int argc, char **argv) { int main(int argc, char **argv) {
patty_kiss_tnc *tnc; patty_kiss_tnc *tnc;
void *data; void *buf;
int port; int port;
if (argc != 2) { if (argc != 2) {
@ -155,38 +155,49 @@ int main(int argc, char **argv) {
goto error_kiss_tnc_open; goto error_kiss_tnc_open;
} }
if ((buf = malloc(PATTY_KISS_BUFSZ)) == NULL) {
perror("malloc()");
goto error_malloc_buf;
}
while (1) { while (1) {
ssize_t len; ssize_t len;
patty_ax25_frame frame; patty_ax25_frame frame;
if ((len = patty_kiss_tnc_recv(tnc, &data, &port)) < 0) { if ((len = patty_kiss_tnc_recv(tnc, buf, PATTY_KISS_BUFSZ, &port)) < 0) {
perror("Unable to read frame"); perror("Unable to read frame");
goto error_ax25_frame_read; goto error_kiss_tnc_recv;
} else if (len == 0) { } else if (len == 0) {
break; break;
} }
if (patty_ax25_frame_decode(&frame, data, len) < 0) { if (patty_ax25_frame_decode(&frame, buf, len) < 0) {
perror("Unable to decode frame"); perror("Unable to decode frame");
goto error_ax25_frame_decode; goto error_ax25_frame_decode;
} }
if (frame_fprint(stdout, &frame, data, len) < 0) { if (frame_fprint(stdout, &frame, buf, len) < 0) {
perror("Unable to print frame"); perror("Unable to print frame");
goto error_frame_fprint; goto error_frame_fprint;
} }
} }
free(buf);
patty_kiss_tnc_close(tnc); patty_kiss_tnc_close(tnc);
return 0; return 0;
error_frame_fprint: error_frame_fprint:
error_ax25_frame_decode: error_ax25_frame_decode:
error_ax25_frame_read: error_kiss_tnc_recv:
free(buf);
error_malloc_buf:
patty_kiss_tnc_close(tnc); patty_kiss_tnc_close(tnc);
error_kiss_tnc_open: error_kiss_tnc_open:

View file

@ -39,10 +39,6 @@ patty_kiss_tnc *patty_kiss_tnc_open_fd(int fd, size_t bufsz) {
goto error_malloc_buf; goto error_malloc_buf;
} }
if ((tnc->frame = malloc(bufsz)) == NULL) {
goto error_malloc_frame;
}
tnc->fd = fd; tnc->fd = fd;
tnc->bufsz = bufsz; tnc->bufsz = bufsz;
tnc->buflen = 0; tnc->buflen = 0;
@ -50,9 +46,6 @@ patty_kiss_tnc *patty_kiss_tnc_open_fd(int fd, size_t bufsz) {
return tnc; return tnc;
error_malloc_frame:
free(tnc->buf);
error_malloc_buf: error_malloc_buf:
free(tnc); free(tnc);
@ -87,7 +80,6 @@ int patty_kiss_tnc_fd_unix(patty_kiss_tnc *tnc) {
void patty_kiss_tnc_close(patty_kiss_tnc *tnc) { void patty_kiss_tnc_close(patty_kiss_tnc *tnc) {
close(tnc->fd); close(tnc->fd);
free(tnc->frame);
free(tnc->buf); free(tnc->buf);
free(tnc); free(tnc);
} }
@ -130,7 +122,8 @@ size_t patty_kiss_tnc_dropped(patty_kiss_tnc *tnc) {
} }
ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc, ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc,
void **frame, void *buf,
size_t len,
int *port) { int *port) {
size_t i = 0, size_t i = 0,
b = 0; b = 0;
@ -141,7 +134,7 @@ ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc,
goto error_io; goto error_io;
} }
while (i < tnc->buflen) { while (i < tnc->buflen && b < len) {
uint8_t c = ((uint8_t *)tnc->buf)[i++]; uint8_t c = ((uint8_t *)tnc->buf)[i++];
if (!(flags & KISS_FRAME)) { if (!(flags & KISS_FRAME)) {
@ -189,12 +182,12 @@ ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc,
} else { } else {
switch (c) { switch (c) {
case PATTY_KISS_TFEND: case PATTY_KISS_TFEND:
((uint8_t *)tnc->frame)[b++] = PATTY_KISS_FEND; ((uint8_t *)buf)[b++] = PATTY_KISS_FEND;
flags &= ~KISS_ESCAPE; flags &= ~KISS_ESCAPE;
continue; continue;
case PATTY_KISS_TFESC: case PATTY_KISS_TFESC:
((uint8_t *)tnc->frame)[b++] = PATTY_KISS_FESC; ((uint8_t *)buf)[b++] = PATTY_KISS_FESC;
flags &= ~KISS_ESCAPE; flags &= ~KISS_ESCAPE;
continue; continue;
@ -205,18 +198,14 @@ ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc,
} }
} }
((uint8_t *)tnc->frame)[b++] = c; ((uint8_t *)buf)[b++] = c;
} }
done: done:
if (flags & KISS_FRAME) { if (flags & KISS_FRAME) {
tnc_drop(tnc); tnc_drop(tnc);
*frame = NULL;
} else { } else {
tnc_flush(tnc, i); tnc_flush(tnc, i);
*frame = tnc->frame;
} }
return (ssize_t)b; return (ssize_t)b;