More work on updating sessions

This commit is contained in:
Daniel Adolfsson 2019-12-11 13:44:55 +01:00
parent 8028e2d487
commit 89864c330c
3 changed files with 27 additions and 12 deletions

View File

@ -93,9 +93,14 @@ static void ndL_handle_na(nd_iface_t *iface, ndL_icmp6_msg_t *msg)
if (!session) if (!session)
return; return;
session->state = ND_STATE_VALID; if (session->state != ND_STATE_VALID)
session->mtime = nd_current_time; {
nd_log_debug("session [%s] %s INVALID -> (deleted)", "?", nd_addr_to_string(&session->tgt)); 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) static uint16_t ndL_calculate_checksum(uint32_t sum, const void *data, size_t length)

View File

@ -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) 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); nd_iface_write_na(proxy->iface, src, src_ll, tgt, proxy->router);
return; return;
} }
@ -95,11 +96,13 @@ void nd_proxy_handle_ns(nd_proxy_t *proxy, nd_addr_t *src, __attribute__((unused
return; return;
session = nd_alloc_session(); session = nd_alloc_session();
session->mtime = nd_current_time;
session->tgt = *tgt;
ND_LL_PREPEND(proxy->sessions, session, next_in_proxy); 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) if (rule->is_auto)
{ {
/* TODO: Loop through valid routes. */ /* 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) if (session->iface)
{ {
session->state = ND_STATE_INCOMPLETE; session->state = ND_STATE_INCOMPLETE;
session->rcount = 0;
nd_iface_write_ns(session->iface, tgt); nd_iface_write_ns(session->iface, tgt);
ND_LL_PREPEND(session->iface->sessions, session, next_in_iface); 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 else
{ {
long t = session->rcount && !(session->rcount % nd_conf_retrans_limit) /* We will only retransmit if nd_conf_keepalive is true, or if the last incoming NS
? ((1 << session->rcount / 3) * nd_conf_retrans_time) * request was made less than nd_conf_valid_ttl milliseconds ago. */
: nd_conf_retrans_time; 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; break;
session->rcount++; session->rcount++;

View File

@ -52,8 +52,9 @@ struct nd_session
nd_session_t *next_in_iface; nd_session_t *next_in_iface;
nd_addr_t tgt; nd_addr_t tgt;
int rcount; int rcount;
long rtime; long atime; /* Last time the session was used in a NA response. */
long mtime; long rtime; /* Last time a NS request was made. */
long mtime; /* Last time state was changed. */
nd_state_t state; nd_state_t state;
nd_iface_t *iface; nd_iface_t *iface;
}; };