diff --git a/include/patty/timer.h b/include/patty/timer.h index ba5a8c9..5bb4321 100644 --- a/include/patty/timer.h +++ b/include/patty/timer.h @@ -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); diff --git a/src/server.c b/src/server.c index 9b3b55a..b4a203e 100644 --- a/src/server.c +++ b/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; diff --git a/src/sock.c b/src/sock.c index 666d014..df19bfc 100644 --- a/src/sock.c +++ b/src/sock.c @@ -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); } } diff --git a/src/timer.c b/src/timer.c index 7d55634..2859694 100644 --- a/src/timer.c +++ b/src/timer.c @@ -1,5 +1,9 @@ #include +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; }