summaryrefslogtreecommitdiff
path: root/ninfod
diff options
context:
space:
mode:
authorYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>2012-11-24 10:39:50 +0900
committerYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>2012-11-25 15:19:09 +0900
commit0ae42139342f47a5a62977346f095fd94e1508c2 (patch)
treedb09f276e2f52baf44bdbf5de2cbff7ca13002a2 /ninfod
parent761025d719c444f030bef422654235aebe984670 (diff)
downloadiputils-0ae42139342f47a5a62977346f095fd94e1508c2.tar.gz
ninfod: Discard multicat packet outside linklocal scope.
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Diffstat (limited to 'ninfod')
-rw-r--r--ninfod/ninfod.h1
-rw-r--r--ninfod/ninfod_core.c25
-rw-r--r--ninfod/ninfod_name.c6
3 files changed, 32 insertions, 0 deletions
diff --git a/ninfod/ninfod.h b/ninfod/ninfod.h
index d0c1779..feda4fa 100644
--- a/ninfod/ninfod.h
+++ b/ninfod/ninfod.h
@@ -130,6 +130,7 @@ void init_nodeinfo_ipv4addr(INIT_ARGS);
int pr_nodeinfo_ipv4addr(CHECKANDFILL_ARGS);
/* ninfod_name.c */
+int check_nigroup(const struct in6_addr *addr);
void init_nodeinfo_nodename(INIT_ARGS);
int pr_nodeinfo_nodename(CHECKANDFILL_ARGS);
diff --git a/ninfod/ninfod_core.c b/ninfod/ninfod_core.c
index 5cc4f9f..4a81531 100644
--- a/ninfod/ninfod_core.c
+++ b/ninfod/ninfod_core.c
@@ -503,6 +503,31 @@ int pr_nodeinfo(struct packetcontext *p)
pthread_t thread;
#endif
+ /* Step 0: Check destination address
+ * discard non-linklocal multicast
+ * discard non-nigroup multicast address(?)
+ */
+ if (IN6_IS_ADDR_MULTICAST(&p->pktinfo.ipi6_addr)) {
+ if (!IN6_IS_ADDR_MC_LINKLOCAL(&p->pktinfo.ipi6_addr)) {
+ DEBUG(LOG_WARNING,
+ "Destination is non-link-local multicast address.\n");
+ ni_free(p);
+ return -1;
+ }
+#if 0
+ /* Do not discard NI Queries to multicast address
+ * other than its own NI Group Address(es) by default.
+ */
+ if (!check_nigroup(&p->pktinfo.ipi6_addr)) {
+ DEBUG(LOG_WARNING,
+ "Destination is link-local multicast address other than "
+ "NI Group address.\n");
+ ni_free(p);
+ return -1;
+ }
+#endif
+ }
+
/* Step 1: Check length */
if (p->querylen < sizeof(struct icmp6_nodeinfo)) {
DEBUG(LOG_WARNING, "Query too short\n");
diff --git a/ninfod/ninfod_name.c b/ninfod/ninfod_name.c
index 3401ffe..c6e7c4a 100644
--- a/ninfod/ninfod_name.c
+++ b/ninfod/ninfod_name.c
@@ -142,6 +142,12 @@ static struct ipv6_mreq nigroup;
/* ---------- */
/* Functions */
+int check_nigroup(const struct in6_addr *addr)
+{
+ return IN6_IS_ADDR_MULTICAST(&nigroup.ipv6mr_multiaddr) &&
+ IN6_ARE_ADDR_EQUAL(&nigroup.ipv6mr_multiaddr, addr);
+}
+
static int encode_dnsname(const char *name,
char *buf, size_t buflen,
int fqdn)