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:
parent
4577b5f223
commit
0fb7d08872
4 changed files with 38 additions and 26 deletions
|
@ -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);
|
||||
|
||||
|
|
41
src/server.c
41
src/server.c
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
11
src/timer.c
11
src/timer.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue