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);
ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc,
void **frame,
void *buf,
size_t len,
int *port);
ssize_t patty_kiss_tnc_send(patty_kiss_tnc *tnc,
const void *frame,
const void *buf,
size_t len,
int port);

View file

@ -142,7 +142,7 @@ error_io:
int main(int argc, char **argv) {
patty_kiss_tnc *tnc;
void *data;
void *buf;
int port;
if (argc != 2) {
@ -155,38 +155,49 @@ int main(int argc, char **argv) {
goto error_kiss_tnc_open;
}
if ((buf = malloc(PATTY_KISS_BUFSZ)) == NULL) {
perror("malloc()");
goto error_malloc_buf;
}
while (1) {
ssize_t len;
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");
goto error_ax25_frame_read;
goto error_kiss_tnc_recv;
} else if (len == 0) {
break;
}
if (patty_ax25_frame_decode(&frame, data, len) < 0) {
if (patty_ax25_frame_decode(&frame, buf, len) < 0) {
perror("Unable to decode frame");
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");
goto error_frame_fprint;
}
}
free(buf);
patty_kiss_tnc_close(tnc);
return 0;
error_frame_fprint:
error_ax25_frame_decode:
error_ax25_frame_read:
error_kiss_tnc_recv:
free(buf);
error_malloc_buf:
patty_kiss_tnc_close(tnc);
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;
}
if ((tnc->frame = malloc(bufsz)) == NULL) {
goto error_malloc_frame;
}
tnc->fd = fd;
tnc->bufsz = bufsz;
tnc->buflen = 0;
@ -50,9 +46,6 @@ patty_kiss_tnc *patty_kiss_tnc_open_fd(int fd, size_t bufsz) {
return tnc;
error_malloc_frame:
free(tnc->buf);
error_malloc_buf:
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) {
close(tnc->fd);
free(tnc->frame);
free(tnc->buf);
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,
void **frame,
void *buf,
size_t len,
int *port) {
size_t i = 0,
b = 0;
@ -141,7 +134,7 @@ ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc,
goto error_io;
}
while (i < tnc->buflen) {
while (i < tnc->buflen && b < len) {
uint8_t c = ((uint8_t *)tnc->buf)[i++];
if (!(flags & KISS_FRAME)) {
@ -189,12 +182,12 @@ ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc,
} else {
switch (c) {
case PATTY_KISS_TFEND:
((uint8_t *)tnc->frame)[b++] = PATTY_KISS_FEND;
((uint8_t *)buf)[b++] = PATTY_KISS_FEND;
flags &= ~KISS_ESCAPE;
continue;
case PATTY_KISS_TFESC:
((uint8_t *)tnc->frame)[b++] = PATTY_KISS_FESC;
((uint8_t *)buf)[b++] = PATTY_KISS_FESC;
flags &= ~KISS_ESCAPE;
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:
if (flags & KISS_FRAME) {
tnc_drop(tnc);
*frame = NULL;
} else {
tnc_flush(tnc, i);
*frame = tnc->frame;
}
return (ssize_t)b;