summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rtadvd/rtadvd.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/rtadvd/rtadvd.h')
-rw-r--r--usr.sbin/rtadvd/rtadvd.h226
1 files changed, 153 insertions, 73 deletions
diff --git a/usr.sbin/rtadvd/rtadvd.h b/usr.sbin/rtadvd/rtadvd.h
index 828fec6..f65a837 100644
--- a/usr.sbin/rtadvd/rtadvd.h
+++ b/usr.sbin/rtadvd/rtadvd.h
@@ -4,7 +4,7 @@
/*
* Copyright (C) 1998 WIDE Project.
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -16,7 +16,7 @@
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -30,11 +30,41 @@
* SUCH DAMAGE.
*/
-#define ALLNODES "ff02::1"
-#define ALLROUTERS_LINK "ff02::2"
-#define ALLROUTERS_SITE "ff05::2"
-#define ANY "::"
-#define RTSOLLEN 8
+#define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
+ {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
+
+#define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
+ {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}}
+
+#define IN6ADDR_SITELOCAL_ALLROUTERS_INIT \
+ {{{ 0xff, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}}
+
+extern struct sockaddr_in6 sin6_linklocal_allnodes;
+extern struct sockaddr_in6 sin6_linklocal_allrouters;
+extern struct sockaddr_in6 sin6_sitelocal_allrouters;
+
+/*
+ * RFC 3542 API deprecates IPV6_PKTINFO in favor of
+ * IPV6_RECVPKTINFO
+ */
+#ifndef IPV6_RECVPKTINFO
+#ifdef IPV6_PKTINFO
+#define IPV6_RECVPKTINFO IPV6_PKTINFO
+#endif
+#endif
+
+/*
+ * RFC 3542 API deprecates IPV6_HOPLIMIT in favor of
+ * IPV6_RECVHOPLIMIT
+ */
+#ifndef IPV6_RECVHOPLIMIT
+#ifdef IPV6_HOPLIMIT
+#define IPV6_RECVHOPLIMIT IPV6_HOPLIMIT
+#endif
+#endif
/* protocol constants and default values */
#define DEF_MAXRTRADVINTERVAL 600
@@ -62,100 +92,150 @@
#define PREFIX_FROM_DYNAMIC 3
struct prefix {
- struct prefix *next; /* forward link */
- struct prefix *prev; /* previous link */
-
- struct rainfo *rainfo; /* back pointer to the interface */
-
- struct rtadvd_timer *timer; /* expiration timer. used when a prefix
- * derived from the kernel is deleted.
- */
-
- u_int32_t validlifetime; /* AdvValidLifetime */
- long vltimeexpire; /* expiration of vltime; decrement case only */
- u_int32_t preflifetime; /* AdvPreferredLifetime */
- long pltimeexpire; /* expiration of pltime; decrement case only */
- u_int onlinkflg; /* bool: AdvOnLinkFlag */
- u_int autoconfflg; /* bool: AdvAutonomousFlag */
- int prefixlen;
- int origin; /* from kernel or config */
- struct in6_addr prefix;
+ TAILQ_ENTRY(prefix) pfx_next;
+
+ struct rainfo *pfx_rainfo; /* back pointer to the interface */
+ /*
+ * Expiration timer. This is used when a prefix derived from
+ * the kernel is deleted.
+ */
+ struct rtadvd_timer *pfx_timer;
+
+ u_int32_t pfx_validlifetime; /* AdvValidLifetime */
+ long pfx_vltimeexpire; /* Expiration of vltime */
+ u_int32_t pfx_preflifetime; /* AdvPreferredLifetime */
+ long pfx_pltimeexpire; /* Expiration of pltime */
+ u_int pfx_onlinkflg; /* bool: AdvOnLinkFlag */
+ u_int pfx_autoconfflg; /* bool: AdvAutonomousFlag */
+ int pfx_prefixlen;
+ int pfx_origin; /* From kernel or config */
+
+ struct in6_addr pfx_prefix;
};
#ifdef ROUTEINFO
struct rtinfo {
- struct rtinfo *prev; /* previous link */
- struct rtinfo *next; /* forward link */
+ TAILQ_ENTRY(rtinfo) rti_next;
- u_int32_t ltime; /* route lifetime */
- u_int rtpref; /* route preference */
- int prefixlen;
- struct in6_addr prefix;
+ u_int32_t rti_ltime; /* route lifetime */
+ u_int rti_rtpref; /* route preference */
+ int rti_prefixlen;
+ struct in6_addr rti_prefix;
};
#endif
+struct rdnss_addr {
+ TAILQ_ENTRY(rdnss_addr) ra_next;
+
+ struct in6_addr ra_dns; /* DNS server entry */
+};
+
+struct rdnss {
+ TAILQ_ENTRY(rdnss) rd_next;
+
+ TAILQ_HEAD(, rdnss_addr) rd_list; /* list of DNS servers */
+ int rd_cnt; /* number of DNS servers */
+ u_int32_t rd_ltime; /* number of seconds valid */
+};
+
+/*
+ * The maximum length of a domain name in a DNS search list is calculated
+ * by a domain name + length fields per 63 octets + a zero octet at
+ * the tail and adding 8 octet boundary padding.
+ */
+#define _DNAME_LABELENC_MAXLEN \
+ (NI_MAXHOST + (NI_MAXHOST / 64 + 1) + 1)
+
+#define DNAME_LABELENC_MAXLEN \
+ (_DNAME_LABELENC_MAXLEN + 8 - _DNAME_LABELENC_MAXLEN % 8)
+
+struct dnssl_addr {
+ TAILQ_ENTRY(dnssl_addr) da_next;
+
+ int da_len; /* length of entry */
+ char da_dom[DNAME_LABELENC_MAXLEN]; /* search domain name entry */
+};
+
+struct dnssl {
+ TAILQ_ENTRY(dnssl) dn_next;
+
+ TAILQ_HEAD(, dnssl_addr) dn_list; /* list of search domains */
+ u_int32_t dn_ltime; /* number of seconds valid */
+};
+
struct soliciter {
- struct soliciter *next;
- struct sockaddr_in6 addr;
+ TAILQ_ENTRY(soliciter) sol_next;
+
+ struct sockaddr_in6 sol_addr;
};
struct rainfo {
/* pointer for list */
- struct rainfo *next;
+ TAILQ_ENTRY(rainfo) rai_next;
/* timer related parameters */
- struct rtadvd_timer *timer;
- int initcounter; /* counter for the first few advertisements */
- struct timeval lastsent; /* timestamp when the latest RA was sent */
- int waiting; /* number of RS waiting for RA */
+ struct rtadvd_timer *rai_timer;
+ /* counter for the first few advertisements */
+ int rai_initcounter;
+ /* timestamp when the latest RA was sent */
+ struct timeval rai_lastsent;
+ /* number of RS waiting for RA */
+ int rai_waiting;
/* interface information */
- int ifindex;
- int advlinkopt; /* bool: whether include link-layer addr opt */
- struct sockaddr_dl *sdl;
- char ifname[16];
- int phymtu; /* mtu of the physical interface */
+ int rai_ifindex;
+ int rai_advlinkopt; /* bool: whether include link-layer addr opt */
+ int rai_advifprefix; /* bool: gather IF prefixes? */
+ struct sockaddr_dl *rai_sdl;
+ char rai_ifname[IFNAMSIZ];
+ u_int32_t rai_phymtu; /* mtu of the physical interface */
/* Router configuration variables */
- u_short lifetime; /* AdvDefaultLifetime */
- u_int maxinterval; /* MaxRtrAdvInterval */
- u_int mininterval; /* MinRtrAdvInterval */
- int managedflg; /* AdvManagedFlag */
- int otherflg; /* AdvOtherConfigFlag */
-
- int rtpref; /* router preference */
- u_int32_t linkmtu; /* AdvLinkMTU */
- u_int32_t reachabletime; /* AdvReachableTime */
- u_int32_t retranstimer; /* AdvRetransTimer */
- u_int hoplimit; /* AdvCurHopLimit */
- struct prefix prefix; /* AdvPrefixList(link head) */
- int pfxs; /* number of prefixes */
- long clockskew; /* used for consisitency check of lifetimes */
+ u_short rai_lifetime; /* AdvDefaultLifetime */
+ u_int rai_maxinterval; /* MaxRtrAdvInterval */
+ u_int rai_mininterval; /* MinRtrAdvInterval */
+ int rai_managedflg; /* AdvManagedFlag */
+ int rai_otherflg; /* AdvOtherConfigFlag */
+ int rai_rtpref; /* router preference */
+ u_int32_t rai_linkmtu; /* AdvLinkMTU */
+ u_int32_t rai_reachabletime; /* AdvReachableTime */
+ u_int32_t rai_retranstimer; /* AdvRetransTimer */
+ u_int rai_hoplimit; /* AdvCurHopLimit */
+
+ TAILQ_HEAD(, prefix) rai_prefix;/* AdvPrefixList(link head) */
+ int rai_pfxs; /* number of prefixes */
+
+ long rai_clockskew; /* used for consisitency check of lifetimes */
+
+ TAILQ_HEAD(, rdnss) rai_rdnss; /* DNS server list */
+ TAILQ_HEAD(, dnssl) rai_dnssl; /* search domain list */
#ifdef ROUTEINFO
- struct rtinfo route; /* route information option (link head) */
- int routes; /* number of route information options */
+ TAILQ_HEAD(, rtinfo) rai_route; /* route information option (link head) */
+ int rai_routes; /* number of route information options */
#endif
-
/* actual RA packet data and its length */
- size_t ra_datalen;
- u_char *ra_data;
+ size_t rai_ra_datalen;
+ u_char *rai_ra_data;
/* statistics */
- u_quad_t raoutput; /* number of RAs sent */
- u_quad_t rainput; /* number of RAs received */
- u_quad_t rainconsistent; /* number of RAs inconsistent with ours */
- u_quad_t rsinput; /* number of RSs received */
+ u_quad_t rai_raoutput; /* # of RAs sent */
+ u_quad_t rai_rainput; /* # of RAs received */
+ u_quad_t rai_rainconsistent; /* # of RAs inconsistent with ours */
+ u_quad_t rai_rsinput; /* # of RSs received */
/* info about soliciter */
- struct soliciter *soliciter; /* recent solication source */
+ TAILQ_HEAD(, soliciter) rai_soliciter; /* recent solication source */
};
-struct rtadvd_timer *ra_timeout(void *);
-void ra_timer_update(void *, struct timeval *);
+/* Interface list including RA information */
+extern TAILQ_HEAD(railist_head_t, rainfo) railist;
-int prefix_match(struct in6_addr *, int, struct in6_addr *, int);
-struct rainfo *if_indextorainfo(int);
-struct prefix *find_prefix(struct rainfo *, struct in6_addr *, int);
+struct rtadvd_timer *ra_timeout(void *);
+void ra_timer_update(void *, struct timeval *);
-extern struct in6_addr in6a_site_allrouters;
+int prefix_match(struct in6_addr *, int,
+ struct in6_addr *, int);
+struct rainfo *if_indextorainfo(int);
+struct prefix *find_prefix(struct rainfo *,
+ struct in6_addr *, int);
OpenPOWER on IntegriCloud