More work on updating sessions
This commit is contained in:
parent
8028e2d487
commit
89864c330c
11
src/iface.c
11
src/iface.c
@ -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)
|
||||||
|
23
src/proxy.c
23
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)
|
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++;
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user