Skip to content

Commit

Permalink
ping, ninfod: merge network information constants
Browse files Browse the repository at this point in the history
Both ninfod and ping -6 need the same definitions.

Signed-off-by: Sami Kerola <[email protected]>
  • Loading branch information
kerolasa committed Mar 23, 2019
1 parent a6921f3 commit ef941da
Show file tree
Hide file tree
Showing 8 changed files with 130 additions and 164 deletions.
40 changes: 40 additions & 0 deletions iputils_ni.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#ifndef IPUTILS_NI_H
#define IPUTILS_NI_H
/*
* Shared network information definitions.
*/
#include <asm/byteorder.h>

#define IPUTILS_NI_ICMP6_QUERY 139
#define IPUTILS_NI_ICMP6_REPLY 140

/* NI Codes */
#define IPUTILS_NI_QTYPE_NOOP 0 /* NOOP */
#define IPUTILS_NI_QTYPE_DNSNAME 2 /* DNS Name */
#define IPUTILS_NI_QTYPE_IPV6ADDR 3 /* IPv6 Addresses */
#define IPUTILS_NI_QTYPE_IPV4ADDR 4 /* IPv4 Addresses */

/* ICMP6 codes for NI Query */
#define IPUTILS_NI_ICMP6_SUBJ_IPV6 0 /* Query Subject is an ipv6 address */
#define IPUTILS_NI_ICMP6_SUBJ_FQDN 1 /* Query Subject is a Domain name */
#define IPUTILS_NI_ICMP6_SUBJ_IPV4 2 /* Query Subject is an ipv4 address */

/* ICMP6 codes for NI Reply */
#define IPUTILS_NI_ICMP6_SUCCESS 0 /* NI successful reply */
#define IPUTILS_NI_ICMP6_REFUSED 1 /* NI request is refused */
#define IPUTILS_NI_ICMP6_UNKNOWN 2 /* unknown Qtype */

/* Flags */
#define IPUTILS_NI_IPV6_FLAG_TRUNCATE __constant_cpu_to_be16(0x0001)
#define IPUTILS_NI_IPV6_FLAG_ALL __constant_cpu_to_be16(0x0002)
#define IPUTILS_NI_IPV6_FLAG_COMPAT __constant_cpu_to_be16(0x0004)
#define IPUTILS_NI_IPV6_FLAG_LINKLOCAL __constant_cpu_to_be16(0x0008)
#define IPUTILS_NI_IPV6_FLAG_SITELOCAL __constant_cpu_to_be16(0x0010)
#define IPUTILS_NI_IPV6_FLAG_GLOBAL __constant_cpu_to_be16(0x0020)

#define IPUTILS_NI_FQDN_VALIDTTL __constant_cpu_to_be16(0x0001)

#define IPUTILS_NI_IPV4_FLAG_TRUNCATE IPUTILS_NI_IPV6_FLAG_TRUNCATE
#define IPUTILS_NI_IPV4_FLAG_ALL IPUTILS_NI_IPV6_FLAG_ALL

#endif /* IPUTILS_NI_H */
47 changes: 0 additions & 47 deletions ninfod/icmp6_nodeinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,51 +44,4 @@ struct icmp6_nodeinfo {
#define ni_flags icmp6_ni_hdr.icmp6_data16[1]
#define ni_nonce icmp6_ni_nonce

/* ICMP6 types */
#define ICMP6_NI_QUERY 139
#define ICMP6_NI_REPLY 140

/* ICMP6 codes for NI Query */
#define ICMP6_NI_SUBJ_IPV6 0 /* Query Subject is an ipv6 address */
#define ICMP6_NI_SUBJ_FQDN 1 /* Query Subject is a Domain name */
#define ICMP6_NI_SUBJ_IPV4 2 /* Query Subject is an ipv4 address */

/* ICMP6 codes for NI Reply */
#define ICMP6_NI_SUCCESS 0 /* NI successful reply */
#define ICMP6_NI_REFUSED 1 /* NI request is refused */
#define ICMP6_NI_UNKNOWN 2 /* unknown Qtype */

/* NI Codes */
#define NI_QTYPE_NOOP 0 /* NOOP */
#define NI_QTYPE_DNSNAME 2 /* DNS Name */
#define NI_QTYPE_NODEADDR 3 /* Node Addresses */
#define NI_QTYPE_IPV4ADDR 4 /* IPv4 Addresses */

/* NI Flags */
#if WORDS_BIGENDIAN
#define NI_FQDN_FLAG_VALIDTTL 0x1
#else
#define NI_FQDN_FLAG_VALIDTTL 0x0100
#endif

#if WORDS_BIGENDIAN
#define NI_NODEADDR_FLAG_TRUNCATE 0x1
#define NI_NODEADDR_FLAG_ALL 0x2
#define NI_NODEADDR_FLAG_COMPAT 0x4
#define NI_NODEADDR_FLAG_LINKLOCAL 0x8
#define NI_NODEADDR_FLAG_SITELOCAL 0x10
#define NI_NODEADDR_FLAG_GLOBAL 0x20
#else
#define NI_NODEADDR_FLAG_TRUNCATE 0x0100
#define NI_NODEADDR_FLAG_ALL 0x0200
#define NI_NODEADDR_FLAG_COMPAT 0x0400
#define NI_NODEADDR_FLAG_LINKLOCAL 0x0800
#define NI_NODEADDR_FLAG_SITELOCAL 0x1000
#define NI_NODEADDR_FLAG_GLOBAL 0x2000
#endif

#define NI_IPV4ADDR_FLAG_TRUNCATE NI_NODEADDR_FLAG_TRUNCATE
#define NI_IPV4ADDR_FLAG_ALL NI_NODEADDR_FLAG_ALL

#endif

5 changes: 3 additions & 2 deletions ninfod/ninfod.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@
#endif

#include "iputils_common.h"
#include "iputils_ni.h"
#include "ninfod.h"

/* Variables */
Expand Down Expand Up @@ -221,7 +222,7 @@ __inline__ static int init_sock(int socket)
struct icmp6_filter filter;

ICMP6_FILTER_SETBLOCKALL(&filter);
ICMP6_FILTER_SETPASS(ICMP6_NI_QUERY, &filter);
ICMP6_FILTER_SETPASS(IPUTILS_NI_ICMP6_QUERY, &filter);
if (setsockopt(socket,
IPPROTO_ICMPV6, ICMP6_FILTER,
&filter, sizeof(filter)) < 0) {
Expand Down Expand Up @@ -726,7 +727,7 @@ int main (int argc, char **argv)
icmph->icmp6_type, icmph->icmp6_code,
ntohs(icmph->icmp6_cksum));

if (icmph->icmp6_type != ICMP6_NI_QUERY) {
if (icmph->icmp6_type != IPUTILS_NI_ICMP6_QUERY) {
#if ENABLE_DEBUG
DEBUG(LOG_WARNING,
"Strange icmp type %d from %s\n",
Expand Down
51 changes: 26 additions & 25 deletions ninfod/ninfod_addrs.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@
# include <syslog.h>
#endif

#include "iputils_ni.h"
#include "ninfod.h"
#include "ni_ifaddrs.h"

Expand All @@ -128,13 +129,13 @@ int filter_ipv6addr(const struct in6_addr *ifaddr, unsigned int flags)
return 1;
} else if (IN6_IS_ADDR_V4COMPAT(ifaddr) ||
IN6_IS_ADDR_V4MAPPED(ifaddr)) {
return !(flags & NI_NODEADDR_FLAG_COMPAT);
return !(flags & IPUTILS_NI_IPV6_FLAG_COMPAT);
} else if (IN6_IS_ADDR_LINKLOCAL(ifaddr)) {
return !(flags & NI_NODEADDR_FLAG_LINKLOCAL);
return !(flags & IPUTILS_NI_IPV6_FLAG_LINKLOCAL);
} else if (IN6_IS_ADDR_SITELOCAL(ifaddr)) {
return !(flags & NI_NODEADDR_FLAG_SITELOCAL);
return !(flags & IPUTILS_NI_IPV6_FLAG_SITELOCAL);
}
return !(flags & NI_NODEADDR_FLAG_GLOBAL);
return !(flags & IPUTILS_NI_IPV6_FLAG_GLOBAL);
}

int pr_nodeinfo_ipv6addr(CHECKANDFILL_ARGS)
Expand Down Expand Up @@ -207,22 +208,22 @@ int pr_nodeinfo_ipv6addr(CHECKANDFILL_ARGS)
unsigned int addrs0 = 0, paddrs0 = 0;
unsigned int addrs, paddrs = 0, daddrs = 0;

flags &= ~NI_NODEADDR_FLAG_TRUNCATE;
flags &= ~IPUTILS_NI_IPV6_FLAG_TRUNCATE;

/* pass 1: count addresses and preferred addresses to be returned */
for (ifa = ifa0; ifa; ifa = ifa->ifa_next) {
if (!ifa->ifa_addr)
continue;
if (ifa->ifa_flags & (IFA_F_TENTATIVE|IFA_F_SECONDARY))
continue;
if (!(flags & NI_NODEADDR_FLAG_ALL) &&
if (!(flags & IPUTILS_NI_IPV6_FLAG_ALL) &&
ifa->ifa_ifindex != ifindex)
continue;
if (filter_ipv6addr((struct in6_addr *)ifa->ifa_addr, flags))
continue;

if (addrs0 + 1 >= ((MAX_REPLY_SIZE - sizeof(struct icmp6_nodeinfo)) / (sizeof(uint32_t) + sizeof(struct in6_addr)))) {
flags |= ~NI_NODEADDR_FLAG_TRUNCATE;
flags |= ~IPUTILS_NI_IPV6_FLAG_TRUNCATE;
break;
}

Expand All @@ -231,21 +232,21 @@ int pr_nodeinfo_ipv6addr(CHECKANDFILL_ARGS)
paddrs0++;
}

p->reply.ni_type = ICMP6_NI_REPLY;
p->reply.ni_code = ICMP6_NI_SUCCESS;
p->reply.ni_type = IPUTILS_NI_ICMP6_REPLY;
p->reply.ni_code = IPUTILS_NI_ICMP6_SUCCESS;
p->reply.ni_cksum = 0;
p->reply.ni_qtype = htons(NI_QTYPE_NODEADDR);
p->reply.ni_flags = flags&(NI_NODEADDR_FLAG_COMPAT|
NI_NODEADDR_FLAG_LINKLOCAL|
NI_NODEADDR_FLAG_SITELOCAL|
NI_NODEADDR_FLAG_GLOBAL);
p->reply.ni_qtype = htons(IPUTILS_NI_QTYPE_IPV6ADDR);
p->reply.ni_flags = flags&(IPUTILS_NI_IPV6_FLAG_COMPAT|
IPUTILS_NI_IPV6_FLAG_LINKLOCAL|
IPUTILS_NI_IPV6_FLAG_SITELOCAL|
IPUTILS_NI_IPV6_FLAG_GLOBAL);

/* pass 2: store addresses */
p->replydatalen = (sizeof(uint32_t)+sizeof(struct in6_addr)) * addrs0;
p->replydata = p->replydatalen ? malloc(p->replydatalen) : NULL;

if (p->replydatalen && !p->replydata) {
p->reply.ni_flags |= NI_NODEADDR_FLAG_TRUNCATE;
p->reply.ni_flags |= IPUTILS_NI_IPV6_FLAG_TRUNCATE;
addrs0 = paddrs0 = 0;
}

Expand All @@ -259,7 +260,7 @@ int pr_nodeinfo_ipv6addr(CHECKANDFILL_ARGS)
continue;
if (ifa->ifa_flags & (IFA_F_TENTATIVE|IFA_F_SECONDARY))
continue;
if (!(flags & NI_NODEADDR_FLAG_ALL) &&
if (!(flags & IPUTILS_NI_IPV6_FLAG_ALL) &&
((subj_if && *subj_if) ? (ifa->ifa_ifindex != *subj_if) :
(ifa->ifa_ifindex != p->pktinfo.ipi6_ifindex)))
continue;
Expand Down Expand Up @@ -351,7 +352,7 @@ int pr_nodeinfo_ipv4addr(CHECKANDFILL_ARGS)
unsigned int addrs0 = 0, paddrs0 = 0;
unsigned int addrs, paddrs = 0, daddrs = 0;

flags &= ~NI_IPV4ADDR_FLAG_TRUNCATE;
flags &= ~IPUTILS_NI_IPV4_FLAG_TRUNCATE;

/* pass 1: count addresses and preferred addresses to be returned */
for (ifa = ifa0; ifa; ifa = ifa->ifa_next) {
Expand All @@ -361,13 +362,13 @@ int pr_nodeinfo_ipv4addr(CHECKANDFILL_ARGS)
if (ifa->ifa_flags & (IFA_F_TENTATIVE))
continue;
#endif
if (!(flags & NI_NODEADDR_FLAG_ALL) &&
if (!(flags & IPUTILS_NI_IPV6_FLAG_ALL) &&
((subj_if && *subj_if) ? (ifa->ifa_ifindex != *subj_if) :
(ifa->ifa_ifindex != p->pktinfo.ipi6_ifindex)))
continue;

if (addrs0 + 1 >= ((MAX_REPLY_SIZE - sizeof(struct icmp6_nodeinfo)) / (sizeof(uint32_t) + sizeof(struct in_addr)))) {
flags |= NI_IPV4ADDR_FLAG_TRUNCATE;
flags |= IPUTILS_NI_IPV4_FLAG_TRUNCATE;
break;
}

Expand All @@ -376,18 +377,18 @@ int pr_nodeinfo_ipv4addr(CHECKANDFILL_ARGS)
paddrs0++;
}

p->reply.ni_type = ICMP6_NI_REPLY;
p->reply.ni_code = ICMP6_NI_SUCCESS;
p->reply.ni_type = IPUTILS_NI_ICMP6_REPLY;
p->reply.ni_code = IPUTILS_NI_ICMP6_SUCCESS;
p->reply.ni_cksum = 0;
p->reply.ni_qtype = htons(NI_QTYPE_IPV4ADDR);
p->reply.ni_flags = flags & NI_IPV4ADDR_FLAG_ALL;
p->reply.ni_qtype = htons(IPUTILS_NI_QTYPE_IPV4ADDR);
p->reply.ni_flags = flags & IPUTILS_NI_IPV4_FLAG_ALL;

/* pass 2: store addresses */
p->replydatalen = (sizeof(uint32_t)+sizeof(struct in_addr)) * addrs0;
p->replydata = addrs0 ? malloc(p->replydatalen) : NULL;

if (p->replydatalen && !p->replydata) {
p->reply.ni_flags |= NI_NODEADDR_FLAG_TRUNCATE;
p->reply.ni_flags |= IPUTILS_NI_IPV6_FLAG_TRUNCATE;
addrs0 = paddrs0 = 0;
}

Expand All @@ -403,7 +404,7 @@ int pr_nodeinfo_ipv4addr(CHECKANDFILL_ARGS)
if (ifa->ifa_flags & (IFA_F_TENTATIVE))
continue;
#endif
if (!(flags & NI_NODEADDR_FLAG_ALL) &&
if (!(flags & IPUTILS_NI_IPV6_FLAG_ALL) &&
(ifa->ifa_ifindex != ifindex))
continue;

Expand Down
47 changes: 24 additions & 23 deletions ninfod/ninfod_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@
#endif
#include <sys/wait.h>

#include "iputils_ni.h"
#include "ninfod.h"

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
Expand All @@ -123,20 +124,20 @@ struct subjinfo {
};

static struct subjinfo subjinfo_table [] = {
[ICMP6_NI_SUBJ_IPV6] = {
.code = ICMP6_NI_SUBJ_IPV6,
[IPUTILS_NI_ICMP6_SUBJ_IPV6] = {
.code = IPUTILS_NI_ICMP6_SUBJ_IPV6,
.name = "IPv6",
//.init = init_nodeinfo_ipv6addr,
.checksubj = pr_nodeinfo_ipv6addr,
},
[ICMP6_NI_SUBJ_FQDN] = {
.code = ICMP6_NI_SUBJ_FQDN,
[IPUTILS_NI_ICMP6_SUBJ_FQDN] = {
.code = IPUTILS_NI_ICMP6_SUBJ_FQDN,
.name = "FQDN",
//.init = init_nodeinfo_nodename,
.checksubj = pr_nodeinfo_nodename,
},
[ICMP6_NI_SUBJ_IPV4] = {
.code = ICMP6_NI_SUBJ_IPV4,
[IPUTILS_NI_ICMP6_SUBJ_IPV4] = {
.code = IPUTILS_NI_ICMP6_SUBJ_IPV4,
.name = "IPv4",
//.init = init_nodeinfo_ipv4addr,
.checksubj = pr_nodeinfo_ipv4addr,
Expand Down Expand Up @@ -169,25 +170,25 @@ struct qtypeinfo {
};

static struct qtypeinfo qtypeinfo_table[] = {
[NI_QTYPE_NOOP] = {
.qtype = NI_QTYPE_NOOP,
[IPUTILS_NI_QTYPE_NOOP] = {
.qtype = IPUTILS_NI_QTYPE_NOOP,
.name = "NOOP",
.getreply = pr_nodeinfo_noop,
},
[NI_QTYPE_DNSNAME] = {
.qtype = NI_QTYPE_DNSNAME,
[IPUTILS_NI_QTYPE_DNSNAME] = {
.qtype = IPUTILS_NI_QTYPE_DNSNAME,
.name = "DnsName",
.getreply = pr_nodeinfo_nodename,
.init = init_nodeinfo_nodename,
},
[NI_QTYPE_NODEADDR] = {
.qtype = NI_QTYPE_NODEADDR,
[IPUTILS_NI_QTYPE_IPV6ADDR] = {
.qtype = IPUTILS_NI_QTYPE_IPV6ADDR,
.name = "NodeAddr",
.getreply = pr_nodeinfo_ipv6addr,
.init = init_nodeinfo_ipv6addr,
},
[NI_QTYPE_IPV4ADDR] = {
.qtype = NI_QTYPE_IPV4ADDR,
[IPUTILS_NI_QTYPE_IPV4ADDR] = {
.qtype = IPUTILS_NI_QTYPE_IPV4ADDR,
.name = "IPv4Addr",
.getreply = pr_nodeinfo_ipv4addr,
.init = init_nodeinfo_ipv4addr,
Expand Down Expand Up @@ -229,10 +230,10 @@ int pr_nodeinfo_noop(CHECKANDFILL_ARGS_3)
}

if (reply) {
p->reply.ni_type = ICMP6_NI_REPLY;
p->reply.ni_code = ICMP6_NI_SUCCESS;
p->reply.ni_type = IPUTILS_NI_ICMP6_REPLY;
p->reply.ni_code = IPUTILS_NI_ICMP6_SUCCESS;
p->reply.ni_cksum = 0;
p->reply.ni_qtype = htons(NI_QTYPE_NOOP);
p->reply.ni_qtype = htons(IPUTILS_NI_QTYPE_NOOP);
p->reply.ni_flags = flags;
}

Expand All @@ -249,8 +250,8 @@ int pr_nodeinfo_unknown(CHECKANDFILL_ARGS_1)
if (!reply)
return -1; /*???*/

p->reply.ni_type = ICMP6_NI_REPLY;
p->reply.ni_code = ICMP6_NI_UNKNOWN;
p->reply.ni_type = IPUTILS_NI_ICMP6_REPLY;
p->reply.ni_code = IPUTILS_NI_ICMP6_UNKNOWN;
p->reply.ni_cksum = 0;
//p->reply.ni_qtype = 0;
p->reply.ni_flags = flags;
Expand All @@ -267,8 +268,8 @@ int pr_nodeinfo_refused(CHECKANDFILL_ARGS_1)
if (!reply)
return -1; /*???*/

p->reply.ni_type = ICMP6_NI_REPLY;
p->reply.ni_code = ICMP6_NI_REFUSED;
p->reply.ni_type = IPUTILS_NI_ICMP6_REPLY;
p->reply.ni_code = IPUTILS_NI_ICMP6_REFUSED;
p->reply.ni_cksum = 0;
//p->reply.ni_qtype = 0;
p->reply.ni_flags = flags;
Expand Down Expand Up @@ -478,8 +479,8 @@ int pr_nodeinfo(struct packetcontext *p)

/* Step 2: Check Subject Code */
switch(htons(query->ni_qtype)) {
case NI_QTYPE_NOOP:
if (query->ni_code != ICMP6_NI_SUBJ_FQDN) {
case IPUTILS_NI_QTYPE_NOOP:
if (query->ni_code != IPUTILS_NI_ICMP6_SUBJ_FQDN) {
DEBUG(LOG_WARNING,
"%s(): invalid/unknown code %u\n",
__func__, query->ni_code);
Expand Down
Loading

0 comments on commit ef941da

Please sign in to comment.