Implement patty_timer_init()

Implement patty_timer_init() to allow the caller to specify a timer
value to use each time patty_timer_start() is called, obviating the need
to pass the same argument redundantly; if the timer value must be
changed, then another call to patty_timer_init() may be used
This commit is contained in:
XANTRONIX Development 2020-08-19 22:06:39 -04:00 committed by XANTRONIX Industrial
parent 4577b5f223
commit 0fb7d08872
4 changed files with 38 additions and 26 deletions

View file

@ -9,18 +9,20 @@ enum patty_timer_flags {
};
typedef struct _patty_timer {
time_t ms;
struct timespec t;
uint32_t flags;
} patty_timer;
void patty_timer_init(patty_timer *timer, time_t ms);
int patty_timer_running(patty_timer *timer);
int patty_timer_expired(patty_timer *timer);
void patty_timer_clear(patty_timer *timer);
void patty_timer_start(patty_timer *timer,
time_t ms);
void patty_timer_start(patty_timer *timer);
void patty_timer_stop(patty_timer *timer);

View file

@ -307,7 +307,7 @@ static int sock_shutdown(patty_ax25_server *server,
ret = patty_ax25_sock_send_disc(sock, PATTY_AX25_FRAME_POLL);
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
return ret;
}
@ -901,7 +901,7 @@ static int server_connect(patty_ax25_server *server,
* will help us determine what version of AX.25 to apply for this
* socket, or whether the peer is not accepting connections.
*/
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
default:
break;
@ -1234,6 +1234,7 @@ static int handle_frmr(patty_ax25_server *server,
int ret = patty_ax25_sock_send_sabm(sock, PATTY_AX25_FRAME_POLL);
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
return ret;
}
@ -1310,7 +1311,7 @@ static int handle_sabm(patty_ax25_server *server,
goto error_notify_accept;
}
patty_timer_start(&remote->timer_t3, PATTY_AX25_SOCK_DEFAULT_KEEPALIVE);
patty_timer_start(&remote->timer_t3);
return reply_ua(iface, frame, PATTY_AX25_FRAME_FINAL);
@ -1362,7 +1363,7 @@ static int handle_ua(patty_ax25_server *server,
}
patty_timer_stop(&sock->timer_t1);
patty_timer_start(&sock->timer_t3, PATTY_AX25_SOCK_DEFAULT_KEEPALIVE);
patty_timer_start(&sock->timer_t3);
sock->state = PATTY_AX25_SOCK_ESTABLISHED;
@ -1511,7 +1512,7 @@ static int handle_i(patty_ax25_server *server,
fd_clear(server, sock->fd);
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
}
if (frame->ns == sock->vr) {
@ -1540,8 +1541,8 @@ static int handle_i(patty_ax25_server *server,
return patty_ax25_sock_send_rr(sock, PATTY_AX25_FRAME_RESPONSE, 0);
}
patty_timer_start(&sock->timer_t2, PATTY_AX25_SOCK_DEFAULT_DELAY);
patty_timer_start(&sock->timer_t3, PATTY_AX25_SOCK_DEFAULT_KEEPALIVE);
patty_timer_start(&sock->timer_t2);
patty_timer_start(&sock->timer_t3);
/*
* AX.25 v2.2 Section 6.2 "Poll/Final (P/F) Bit Procedures"
@ -1611,7 +1612,7 @@ static int frame_ack(patty_ax25_server *server,
}
if (patty_ax25_sock_ack_pending(sock) > 0) {
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
}
}
@ -1646,14 +1647,14 @@ static int handle_rr(patty_ax25_server *server,
fd_watch(server, sock->fd);
patty_timer_start(&sock->timer_t3, PATTY_AX25_SOCK_DEFAULT_KEEPALIVE);
patty_timer_start(&sock->timer_t3);
} else {
sock->retries = sock->n_retry;
sock->flow = PATTY_AX25_SOCK_WAIT;
fd_clear(server, sock->fd);
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
}
default:
@ -1693,9 +1694,9 @@ static int handle_rnr(patty_ax25_server *server,
fd_clear(server, sock->fd);
if (patty_ax25_sock_ack_pending(sock) == 0) {
patty_timer_start(&sock->timer_t3, PATTY_AX25_SOCK_DEFAULT_KEEPALIVE);
patty_timer_start(&sock->timer_t3);
} else {
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
}
default:
@ -1814,7 +1815,7 @@ static int handle_xid(patty_ax25_server *server,
ret = patty_ax25_sock_send_sabm(remote, PATTY_AX25_FRAME_POLL);
patty_timer_start(&remote->timer_t1, remote->n_ack);
patty_timer_start(&remote->timer_t1);
return ret;
}
@ -1861,7 +1862,7 @@ static int handle_xid(patty_ax25_server *server,
ret = patty_ax25_sock_send_xid(remote, PATTY_AX25_FRAME_RESPONSE);
patty_timer_start(&remote->timer_t1, remote->n_ack);
patty_timer_start(&remote->timer_t1);
return ret;
}
@ -2083,7 +2084,7 @@ static int handle_sock(uint32_t key,
int ret = patty_ax25_sock_send_xid(sock, PATTY_AX25_FRAME_RESPONSE);
sock->retries--;
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
return ret;
} else {
@ -2099,7 +2100,7 @@ static int handle_sock(uint32_t key,
int ret = patty_ax25_sock_send_sabm(sock, PATTY_AX25_FRAME_POLL);
sock->retries--;
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
return ret;
} else {
@ -2126,7 +2127,7 @@ static int handle_sock(uint32_t key,
1);
sock->retries--;
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
return ret;
} else {
@ -2157,7 +2158,7 @@ static int handle_sock(uint32_t key,
patty_ax25_sock_send_rnr(sock, PATTY_AX25_FRAME_COMMAND, 1);
patty_timer_stop(&sock->timer_t3);
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
return ret;
}
@ -2185,7 +2186,7 @@ static int handle_sock(uint32_t key,
ret = patty_ax25_sock_send_rr(sock, PATTY_AX25_FRAME_COMMAND, 1);
patty_timer_stop(&sock->timer_t3);
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
return ret;
}
@ -2206,7 +2207,7 @@ static int handle_sock(uint32_t key,
/*
* AX.25 v2.2, Section 6.4.1, "Sending I Frames"
*/
patty_timer_start(&sock->timer_t1, sock->n_ack);
patty_timer_start(&sock->timer_t1);
}
return 0;

View file

@ -234,6 +234,10 @@ void patty_ax25_sock_init(patty_ax25_sock *sock) {
sock->n_retry = PATTY_AX25_SOCK_DEFAULT_RETRY;
sock->retries = PATTY_AX25_SOCK_DEFAULT_RETRY;
sock->pending = 0;
patty_timer_init(&sock->timer_t1, sock->n_ack);
patty_timer_init(&sock->timer_t2, PATTY_AX25_SOCK_DEFAULT_DELAY);
patty_timer_init(&sock->timer_t3, PATTY_AX25_SOCK_DEFAULT_KEEPALIVE);
}
/*
@ -356,6 +360,8 @@ int patty_ax25_sock_params_negotiate(patty_ax25_sock *sock,
if (params->flags & PATTY_AX25_PARAM_ACK) {
if (sock->n_ack < params->ack) {
sock->n_ack = params->ack;
patty_timer_init(&sock->timer_t1, params->ack);
}
}

View file

@ -1,5 +1,9 @@
#include <patty/timer.h>
void patty_timer_init(patty_timer *timer, time_t ms) {
timer->ms = ms;
}
int patty_timer_running(patty_timer *timer) {
return (timer->flags & PATTY_TIMER_RUNNING)? 1: 0;
}
@ -20,10 +24,9 @@ void patty_timer_clear(patty_timer *timer) {
timer->flags &= ~PATTY_TIMER_RUNNING;
}
void patty_timer_start(patty_timer *timer,
time_t ms) {
timer->t.tv_sec = ms / 1000;
timer->t.tv_nsec = (ms % 1000) * 1000000;
void patty_timer_start(patty_timer *timer) {
timer->t.tv_sec = timer->ms / 1000;
timer->t.tv_nsec = (timer->ms % 1000) * 1000000;
timer->flags |= PATTY_TIMER_RUNNING;
}