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:
parent
e74941f714
commit
d44889121e
3 changed files with 26 additions and 25 deletions
|
@ -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);
|
||||
|
||||
|
|
23
src/decode.c
23
src/decode.c
|
@ -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:
|
||||
|
|
23
src/kiss.c
23
src/kiss.c
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue