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:
parent
a3995c7e88
commit
e558ccd57d
1 changed files with 55 additions and 25 deletions
80
src/server.c
80
src/server.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue