From 89864c330cc2d9c87f09c06454b18112f972ec54 Mon Sep 17 00:00:00 2001 From: Daniel Adolfsson Date: Wed, 11 Dec 2019 13:44:55 +0100 Subject: [PATCH] More work on updating sessions --- src/iface.c | 11 ++++++++--- src/proxy.c | 23 ++++++++++++++++------- src/session.h | 5 +++-- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/iface.c b/src/iface.c index 8ca798d..1d1c443 100644 --- a/src/iface.c +++ b/src/iface.c @@ -93,9 +93,14 @@ static void ndL_handle_na(nd_iface_t *iface, ndL_icmp6_msg_t *msg) if (!session) return; - session->state = ND_STATE_VALID; - session->mtime = nd_current_time; - nd_log_debug("session [%s] %s INVALID -> (deleted)", "?", nd_addr_to_string(&session->tgt)); + if (session->state != ND_STATE_VALID) + { + session->state = ND_STATE_VALID; + session->mtime = nd_current_time; + nd_log_debug("session [%s] %s ? -> VALID", "?", nd_addr_to_string(&session->tgt)); + } + + session->atime = nd_current_time; } static uint16_t ndL_calculate_checksum(uint32_t sum, const void *data, size_t length) diff --git a/src/proxy.c b/src/proxy.c index 33bfeb6..f691437 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -78,6 +78,7 @@ void nd_proxy_handle_ns(nd_proxy_t *proxy, nd_addr_t *src, __attribute__((unused if (session->state == ND_STATE_VALID || session->state == ND_STATE_STALE) { + session->atime = nd_current_time; nd_iface_write_na(proxy->iface, src, src_ll, tgt, proxy->router); return; } @@ -95,11 +96,13 @@ void nd_proxy_handle_ns(nd_proxy_t *proxy, nd_addr_t *src, __attribute__((unused return; session = nd_alloc_session(); - session->mtime = nd_current_time; - session->tgt = *tgt; - ND_LL_PREPEND(proxy->sessions, session, next_in_proxy); + session->mtime = nd_current_time; + session->atime = nd_current_time; + session->rtime = nd_current_time; + session->tgt = *tgt; + if (rule->is_auto) { /* TODO: Loop through valid routes. */ @@ -128,6 +131,7 @@ void nd_proxy_handle_ns(nd_proxy_t *proxy, nd_addr_t *src, __attribute__((unused if (session->iface) { session->state = ND_STATE_INCOMPLETE; + session->rcount = 0; nd_iface_write_ns(session->iface, tgt); ND_LL_PREPEND(session->iface->sessions, session, next_in_iface); @@ -193,11 +197,16 @@ static void ndL_update_session(nd_proxy_t *proxy, nd_session_t *session) } else { - long t = session->rcount && !(session->rcount % nd_conf_retrans_limit) - ? ((1 << session->rcount / 3) * nd_conf_retrans_time) - : nd_conf_retrans_time; + /* We will only retransmit if nd_conf_keepalive is true, or if the last incoming NS + * request was made less than nd_conf_valid_ttl milliseconds ago. */ + if (!nd_conf_keepalive && nd_current_time - session->atime > nd_conf_valid_ttl) + break; - if (nd_current_time - session->rtime < t) + long time = session->rcount && !(session->rcount % nd_conf_retrans_limit) + ? ((1 << session->rcount / 3) * nd_conf_retrans_time) + : nd_conf_retrans_time; + + if (nd_current_time - session->rtime < time) break; session->rcount++; diff --git a/src/session.h b/src/session.h index 305c22b..756c27e 100644 --- a/src/session.h +++ b/src/session.h @@ -52,8 +52,9 @@ struct nd_session nd_session_t *next_in_iface; nd_addr_t tgt; int rcount; - long rtime; - long mtime; + long atime; /* Last time the session was used in a NA response. */ + long rtime; /* Last time a NS request was made. */ + long mtime; /* Last time state was changed. */ nd_state_t state; nd_iface_t *iface; };