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)
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)

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)
{
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++;

View File

@ -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;
};