From c6aac035e1850887dba60951a2d4638afa710aa0 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Thu, 2 Jul 2020 16:07:23 -0400 Subject: [PATCH] Add proto arg to patty_ax25_sock_new() Other changes: * Remove proto arg from patty_ax25_sock_send() and patty_ax25_sock_write(); instead, use the proto member of patty_ax25_sock --- include/patty/ax25/call.h | 2 ++ include/patty/ax25/sock.h | 9 ++++++--- src/call.c | 3 ++- src/server.c | 6 +++--- src/sock.c | 28 +++++++++++++++------------- src/testclient-connect.c | 2 +- src/testclient-listen.c | 2 +- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/include/patty/ax25/call.h b/include/patty/ax25/call.h index 0ed11fb..586d25a 100644 --- a/include/patty/ax25/call.h +++ b/include/patty/ax25/call.h @@ -19,6 +19,7 @@ enum patty_ax25_call { */ typedef struct _patty_ax25_call_socket_request { int opts; + int proto; } patty_ax25_call_socket_request; typedef struct _patty_ax25_response_socket { @@ -29,6 +30,7 @@ typedef struct _patty_ax25_response_socket { int patty_ax25_call_socket(int server, int opts, + int proto, char *path, size_t len); diff --git a/include/patty/ax25/sock.h b/include/patty/ax25/sock.h index 5d89c9f..5a44257 100644 --- a/include/patty/ax25/sock.h +++ b/include/patty/ax25/sock.h @@ -27,6 +27,7 @@ typedef struct _patty_ax25_sock { enum patty_ax25_sock_opts opts; enum patty_ax25_sock_status status; enum patty_ax25_sock_mode mode; + enum patty_ax25_proto proto; time_t timer_ack, timer_response, @@ -65,7 +66,8 @@ typedef struct _patty_ax25_sock { PATTY_AX25_SOCK_CONTROL_SABME(sock, flag): \ PATTY_AX25_SOCK_CONTROL_SABM(sock, flag)) -patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_sock_opts opts); +patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_sock_opts opts, + enum patty_ax25_proto proto); void patty_ax25_sock_reset(patty_ax25_sock *sock); @@ -73,9 +75,11 @@ void patty_ax25_sock_destroy(patty_ax25_sock *sock); char *patty_ax25_sock_pty(patty_ax25_sock *sock); +void patty_ax25_sock_bind_if(patty_ax25_sock *sock, + patty_ax25_if *iface); + ssize_t patty_ax25_sock_send(patty_ax25_sock *sock, uint16_t control, - uint8_t proto, void *info, size_t infolen); @@ -86,7 +90,6 @@ ssize_t patty_ax25_sock_send_sabme(patty_ax25_sock *sock, int poll); ssize_t patty_ax25_sock_send_disc(patty_ax25_sock *sock, int poll); ssize_t patty_ax25_sock_write(patty_ax25_sock *sock, - uint8_t proto, void *buf, size_t len); diff --git a/src/call.c b/src/call.c index ef9c8c1..a6199cf 100644 --- a/src/call.c +++ b/src/call.c @@ -7,12 +7,13 @@ int patty_ax25_call_socket(int server, int opts, + int proto, char *path, size_t len) { enum patty_ax25_call call = PATTY_AX25_CALL_SOCKET; patty_ax25_call_socket_request request = { - opts + opts, proto }; patty_ax25_call_socket_response response; diff --git a/src/server.c b/src/server.c index 5008fd4..7923f1f 100644 --- a/src/server.c +++ b/src/server.c @@ -441,7 +441,7 @@ static int server_socket(patty_ax25_server *server, goto error_read; } - if ((sock = patty_ax25_sock_new(request.opts)) == NULL) { + if ((sock = patty_ax25_sock_new(request.opts, request.proto)) == NULL) { goto error_sock_new; } @@ -1020,7 +1020,7 @@ static int handle_sabm(patty_ax25_server *server, goto error_lookup_client; } - if ((remote = patty_ax25_sock_new(local->opts)) == NULL) { + if ((remote = patty_ax25_sock_new(local->opts, local->proto)) == NULL) { goto error_sock_new; } @@ -1354,7 +1354,7 @@ static int handle_sock(void *key, goto done; } - if (patty_ax25_sock_write(sock, PATTY_AX25_PROTO_NONE, sock->buf, len) < 0) { + if (patty_ax25_sock_write(sock, sock->buf, len) < 0) { goto error_sock_write; } diff --git a/src/sock.c b/src/sock.c index b8a237c..3e035bb 100644 --- a/src/sock.c +++ b/src/sock.c @@ -56,7 +56,8 @@ error_open: return -1; } -patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_sock_opts opts) { +patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_sock_opts opts, + enum patty_ax25_proto proto) { patty_ax25_sock *sock; if ((sock = malloc(sizeof(*sock))) == NULL) { @@ -77,6 +78,7 @@ patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_sock_opts opts) { sock->status = PATTY_AX25_SOCK_CLOSED; sock->mode = PATTY_AX25_SOCK_DM; sock->opts = opts; + sock->proto = proto; sock->n_maxlen = PATTY_AX25_FRAME_DEFAULT_MAXLEN; sock->n_window = PATTY_AX25_FRAME_DEFAULT_WINDOW; @@ -159,10 +161,10 @@ static inline int toobig(patty_ax25_sock *sock, ssize_t patty_ax25_sock_send(patty_ax25_sock *sock, uint16_t control, - uint8_t proto, void *info, size_t infolen) { size_t offset; + uint8_t *buf = (uint8_t *)sock->iface->tx_buf; if (toobig(sock, control, infolen)) { goto error_toobig; @@ -171,24 +173,24 @@ ssize_t patty_ax25_sock_send(patty_ax25_sock *sock, offset = copy_addr_to_tx_buf(sock); if (sock->mode == PATTY_AX25_SOCK_SABME) { - ((uint8_t *)sock->iface->tx_buf)[offset++] = (control & 0xff00) >> 8; - ((uint8_t *)sock->iface->tx_buf)[offset++] = control & 0x00ff; + buf[offset++] = (control & 0xff00) >> 8; + buf[offset++] = control & 0x00ff; sock->seq_send = (sock->seq_send + 1) & 0x07; } else { - ((uint8_t *)sock->iface->tx_buf)[offset++] = control; + buf[offset++] = control; sock->seq_send = (sock->seq_send + 1) & 0x7f; } if (PATTY_AX25_CONTROL_INFO(control)) { - ((uint8_t *)sock->iface->tx_buf)[offset++] = proto; + buf[offset++] = (uint8_t)sock->proto; - memcpy((uint8_t *)sock->iface->tx_buf + offset, info, infolen); + memcpy(buf + offset, info, infolen); offset += infolen; } - return patty_ax25_if_send(sock->iface, sock->iface->tx_buf, offset); + return patty_ax25_if_send(sock->iface, buf, offset); error_toobig: return -1; @@ -198,7 +200,6 @@ ssize_t patty_ax25_sock_send_sabm(patty_ax25_sock *sock, int poll) { return patty_ax25_sock_send(sock, PATTY_AX25_FRAME_U_SABM | PATTY_AX25_FRAME_U_POLL, - PATTY_AX25_PROTO_NONE, NULL, 0); } @@ -207,7 +208,6 @@ ssize_t patty_ax25_sock_send_sabme(patty_ax25_sock *sock, int poll) { return patty_ax25_sock_send(sock, PATTY_AX25_FRAME_U_SABME | PATTY_AX25_FRAME_U_POLL, - PATTY_AX25_PROTO_NONE, NULL, 0); } @@ -216,17 +216,19 @@ ssize_t patty_ax25_sock_send_disc(patty_ax25_sock *sock, int poll) { return patty_ax25_sock_send(sock, PATTY_AX25_FRAME_U_DISC | PATTY_AX25_FRAME_U_POLL, - PATTY_AX25_PROTO_NONE, NULL, 0); } ssize_t patty_ax25_sock_write(patty_ax25_sock *sock, - uint8_t proto, void *buf, size_t len) { uint16_t control = 0x0000; + if (sock->opts & PATTY_AX25_SOCK_RAW) { + return patty_ax25_if_send(sock->iface, buf, len); + } + switch (sock->mode) { case PATTY_AX25_SOCK_DM: errno = EBADF; @@ -244,7 +246,7 @@ ssize_t patty_ax25_sock_write(patty_ax25_sock *sock, break; } - if (patty_ax25_sock_send(sock, control, proto, buf, len) < 0) { + if (patty_ax25_sock_send(sock, control, buf, len) < 0) { goto error_send; } diff --git a/src/testclient-connect.c b/src/testclient-connect.c index c4fd485..67948da 100644 --- a/src/testclient-connect.c +++ b/src/testclient-connect.c @@ -61,7 +61,7 @@ int main(int argc, char **argv) { goto error_connect; } - if ((sock = patty_ax25_call_socket(fd, PATTY_AX25_SOCK_NONE, path, PATTY_AX25_SOCK_PATH_SIZE)) < 0) { + if ((sock = patty_ax25_call_socket(fd, 0, PATTY_AX25_PROTO_NONE, path, PATTY_AX25_SOCK_PATH_SIZE)) < 0) { fprintf(stderr, "%s: %s: %s\n", argv[0], "patty_ax25_call_socket()", strerror(errno)); diff --git a/src/testclient-listen.c b/src/testclient-listen.c index 577e173..c0316e7 100644 --- a/src/testclient-listen.c +++ b/src/testclient-listen.c @@ -64,7 +64,7 @@ int main(int argc, char **argv) { goto error_connect; } - if ((local = patty_ax25_call_socket(fd, PATTY_AX25_SOCK_NONE, NULL, 0)) < 0) { + if ((local = patty_ax25_call_socket(fd, 0, PATTY_AX25_PROTO_NONE, NULL, 0)) < 0) { fprintf(stderr, "%s: %s: %s\n", argv[0], "patty_ax25_call_socket()", strerror(errno));