More work on updating sessions
This commit is contained in:
parent
8028e2d487
commit
89864c330c
@ -93,9 +93,14 @@ static void ndL_handle_na(nd_iface_t *iface, ndL_icmp6_msg_t *msg)
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
if (session->state != ND_STATE_VALID)
|
||||
{
|
||||
session->state = ND_STATE_VALID;
|
||||
session->mtime = nd_current_time;
|
||||
nd_log_debug("session [%s] %s INVALID -> (deleted)", "?", nd_addr_to_string(&session->tgt));
|
||||
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)
|
||||
|
19
src/proxy.c
19
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)
|
||||
/* 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;
|
||||
|
||||
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 < t)
|
||||
if (nd_current_time - session->rtime < time)
|
||||
break;
|
||||
|
||||
session->rcount++;
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user