Cleanup in src/server.c, handle_sock()

Changes:

    * Implement handle_sock_dgram() to specifically handle datagram
      (UI frame-only) sockets; this fixes issues wherein logic
      specific to SOCK_STREAM timers would be erroneously applied
      to datagram sockets

    * Always tick Timers T1, T2 and T3

    * Some slight code reorganization for improved readability of
      control flow
This commit is contained in:
XANTRONIX Development 2020-08-07 22:06:22 -04:00 committed by XANTRONIX Industrial
parent a3995c7e88
commit e558ccd57d

View file

@ -1805,6 +1805,35 @@ error_io:
return -1; return -1;
} }
static int handle_sock_dgram(patty_ax25_server *server,
patty_ax25_sock *sock) {
ssize_t len;
if (!FD_ISSET(sock->fd, &server->fds_r)) {
return 0;
}
if ((len = read(sock->fd, sock->rx_buf, sock->n_maxlen_rx)) < 0) {
if (errno == EIO) {
(void)sock_close(server, sock);
} else {
goto error_unknown;
}
} else if (len == 0) {
(void)sock_close(server, sock);
} else if (len > 0) {
if (patty_ax25_sock_write(sock, sock->rx_buf, len) < 0) {
goto error_sock_write;
}
}
return 0;
error_sock_write:
error_unknown:
return -1;
}
static int handle_sock_raw(patty_ax25_server *server, static int handle_sock_raw(patty_ax25_server *server,
patty_ax25_sock *sock) { patty_ax25_sock *sock) {
if (!FD_ISSET(sock->fd, &server->fds_r) || sock->iface == NULL) { if (!FD_ISSET(sock->fd, &server->fds_r) || sock->iface == NULL) {
@ -1839,14 +1868,23 @@ static int handle_sock(uint32_t key,
ssize_t len; ssize_t len;
if (sock->type == PATTY_AX25_SOCK_RAW) { switch (sock->type) {
return handle_sock_raw(server, sock); case PATTY_AX25_SOCK_DGRAM:
return handle_sock_dgram(server, sock);
case PATTY_AX25_SOCK_RAW:
return handle_sock_raw(server, sock);
case PATTY_AX25_SOCK_STREAM:
break;
} }
patty_timer_tick(&sock->timer_t1, &server->elapsed);
patty_timer_tick(&sock->timer_t2, &server->elapsed);
patty_timer_tick(&sock->timer_t3, &server->elapsed);
switch (sock->state) { switch (sock->state) {
case PATTY_AX25_SOCK_PENDING_CONNECT: case PATTY_AX25_SOCK_PENDING_CONNECT:
patty_timer_tick(&sock->timer_t1, &server->elapsed);
if (patty_timer_expired(&sock->timer_t1)) { if (patty_timer_expired(&sock->timer_t1)) {
if (sock->retries) { if (sock->retries) {
int ret = patty_ax25_sock_send_sabm(sock, PATTY_AX25_FRAME_POLL); int ret = patty_ax25_sock_send_sabm(sock, PATTY_AX25_FRAME_POLL);
@ -1869,12 +1907,9 @@ static int handle_sock(uint32_t key,
} }
} }
goto done; return 0;
case PATTY_AX25_SOCK_ESTABLISHED: case PATTY_AX25_SOCK_ESTABLISHED:
patty_timer_tick(&sock->timer_t2, &server->elapsed);
patty_timer_tick(&sock->timer_t3, &server->elapsed);
if (patty_timer_expired(&sock->timer_t1)) { if (patty_timer_expired(&sock->timer_t1)) {
if (sock->retries) { if (sock->retries) {
int ret = patty_ax25_sock_send_rr(sock, int ret = patty_ax25_sock_send_rr(sock,
@ -1921,7 +1956,7 @@ static int handle_sock(uint32_t key,
} }
if (!FD_ISSET(sock->fd, &server->fds_r)) { if (!FD_ISSET(sock->fd, &server->fds_r)) {
goto done; return 0;
} }
/* /*
@ -1945,32 +1980,27 @@ static int handle_sock(uint32_t key,
if ((len = read(sock->fd, sock->rx_buf, sock->n_maxlen_rx)) < 0) { if ((len = read(sock->fd, sock->rx_buf, sock->n_maxlen_rx)) < 0) {
if (errno == EIO) { if (errno == EIO) {
(void)sock_shutdown(server, sock); (void)sock_shutdown(server, sock);
} else {
goto done; goto error_unknown;
} }
goto error_io;
} else if (len == 0) { } else if (len == 0) {
(void)sock_shutdown(server, sock); (void)sock_shutdown(server, sock);
} else if (len > 0) {
if (patty_ax25_sock_write(sock, sock->rx_buf, len) < 0) {
goto error_sock_write;
}
goto done; /*
* AX.25 v2.2, Section 6.4.1, "Sending I Frames"
*/
patty_timer_start(&sock->timer_t1, sock->n_ack);
} }
if (patty_ax25_sock_write(sock, sock->rx_buf, len) < 0) {
goto error_sock_write;
}
/*
* AX.25 v2.2, Section 6.4.1, "Sending I Frames"
*/
patty_timer_start(&sock->timer_t1, sock->n_ack);
done:
return 0; return 0;
error_client_by_sock: error_client_by_sock:
error_sock_write: error_sock_write:
error_io: error_unknown:
return -1; return -1;
} }