From cad611b323f383d5c3cb13113082dbd92dcc1b71 Mon Sep 17 00:00:00 2001 From: Daniel Adolfsson Date: Thu, 19 Dec 2019 15:06:55 +0100 Subject: [PATCH] Subscribe to NA --- src/addr.c | 5 +++++ src/ndppd.h | 2 ++ src/session.c | 30 +++++++++++++++++++++--------- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/addr.c b/src/addr.c index 6360cf1..52ec20d 100644 --- a/src/addr.c +++ b/src/addr.c @@ -174,6 +174,11 @@ const char *nd_ll_ntoa(const nd_lladdr_t *addr) return addr ? ether_ntoa_r((struct ether_addr *)addr, buf[index++ % 3]) : "(null)"; } +bool nd_ll_addr_eq(const nd_lladdr_t *first, const nd_lladdr_t *second) +{ + return !memcmp(first, second, sizeof(nd_lladdr_t)); +} + bool nd_ll_addr_is_unspecified(const nd_lladdr_t *lladdr) { return !lladdr->u8[0] && !lladdr->u8[1] && !lladdr->u8[2] && !lladdr->u8[3] && !lladdr->u8[4] && !lladdr->u8[5]; diff --git a/src/ndppd.h b/src/ndppd.h index ab28db2..77d6483 100644 --- a/src/ndppd.h +++ b/src/ndppd.h @@ -284,6 +284,8 @@ uint32_t nd_addr_hash(const nd_addr_t *addr); */ const char *nd_ll_ntoa(const nd_lladdr_t *addr); +bool nd_ll_addr_eq(const nd_lladdr_t *first, const nd_lladdr_t *second); + bool nd_ll_addr_is_unspecified(const nd_lladdr_t *lladdr); /* diff --git a/src/session.c b/src/session.c index bbcb577..7328447 100644 --- a/src/session.c +++ b/src/session.c @@ -58,7 +58,16 @@ void nd_session_handle_ns(nd_session_t *session, const nd_addr_t *src, const nd_ session->ins_time = nd_current_time; if (session->state != ND_STATE_VALID && session->state != ND_STATE_STALE) { - /* Register sub */ + nd_sub_t *sub; + ND_LL_SEARCH(session->subs, sub, next, nd_addr_eq(&sub->addr, src) && nd_ll_addr_eq(&sub->lladdr, src_ll)); + + if (!sub) { + sub = ND_NEW(nd_sub_t); + sub->addr = *src; + sub->lladdr = *src_ll; + ND_LL_PREPEND(session->subs, sub, next); + } + return; } @@ -81,15 +90,15 @@ void nd_session_handle_na(nd_session_t *session) return; } - /*if (!nd_addr_is_unspecified(&q)) { - nd_log_error("testing quickness.. "); - nd_lladdr_t *tgt_ll = !nd_ll_addr_is_unspecified(&session->rule->target) ? &session->rule->target : NULL; + nd_lladdr_t *tgt_ll = !nd_ll_addr_is_unspecified(&session->rule->target) ? &session->rule->target : NULL; - nd_iface_send_na(session->rule->proxy->iface, &q, &z, // + ND_LL_FOREACH_S (session->subs, sub, tmp, next) { + nd_iface_send_na(session->rule->proxy->iface, &sub->addr, &sub->lladdr, // &session->tgt, tgt_ll, session->rule->proxy->router); + ND_DELETE(sub); + } - memset(&q, 0, sizeof(q)); - }*/ + session->subs = NULL; if (session->state != ND_STATE_VALID) { nd_log_debug("Session [%s] %s -> VALID", session->rule->proxy->ifname, nd_ntoa(&session->tgt)); @@ -168,6 +177,10 @@ void nd_session_update(nd_session_t *session) nd_iface_close(session->iface); } + ND_LL_FOREACH_S (session->subs, sub, tmp, next) { + ND_DELETE(sub); + } + ND_LL_DELETE(ndL_sessions[NDL_BUCKET(&session->tgt)], session, next); ND_LL_DELETE(ndL_sessions_r[NDL_BUCKET(&session->tgt_r)], session, next_r); @@ -248,9 +261,8 @@ nd_session_t *nd_session_find_r(const nd_addr_t *tgt, const nd_iface_t *iface) void nd_session_update_all() { for (int i = 0; i < NDPPD_SESSION_BUCKETS; i++) { - ND_LL_FOREACH_S(ndL_sessions[i], session, tmp, next) { + ND_LL_FOREACH_S (ndL_sessions[i], session, tmp, next) { nd_session_update(session); } } } -