xref: /freebsd/usr.sbin/rtsold/rtsold.h (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
19a364ca3SHajimu UMEMOTO /*	$KAME: rtsold.h,v 1.19 2003/04/16 09:48:15 itojun Exp $	*/
2804c83d4SKris Kennaway 
38a16b7a1SPedro F. Giffuni /*-
48a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
58a16b7a1SPedro F. Giffuni  *
67d56d374SYoshinobu Inoue  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
77d56d374SYoshinobu Inoue  * All rights reserved.
87d56d374SYoshinobu Inoue  *
97d56d374SYoshinobu Inoue  * Redistribution and use in source and binary forms, with or without
107d56d374SYoshinobu Inoue  * modification, are permitted provided that the following conditions
117d56d374SYoshinobu Inoue  * are met:
127d56d374SYoshinobu Inoue  * 1. Redistributions of source code must retain the above copyright
137d56d374SYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer.
147d56d374SYoshinobu Inoue  * 2. Redistributions in binary form must reproduce the above copyright
157d56d374SYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer in the
167d56d374SYoshinobu Inoue  *    documentation and/or other materials provided with the distribution.
177d56d374SYoshinobu Inoue  * 3. Neither the name of the project nor the names of its contributors
187d56d374SYoshinobu Inoue  *    may be used to endorse or promote products derived from this software
197d56d374SYoshinobu Inoue  *    without specific prior written permission.
207d56d374SYoshinobu Inoue  *
217d56d374SYoshinobu Inoue  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
227d56d374SYoshinobu Inoue  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
237d56d374SYoshinobu Inoue  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
247d56d374SYoshinobu Inoue  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
257d56d374SYoshinobu Inoue  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
267d56d374SYoshinobu Inoue  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
277d56d374SYoshinobu Inoue  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
287d56d374SYoshinobu Inoue  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
297d56d374SYoshinobu Inoue  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
307d56d374SYoshinobu Inoue  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
317d56d374SYoshinobu Inoue  * SUCH DAMAGE.
327d56d374SYoshinobu Inoue  */
337d56d374SYoshinobu Inoue 
34db82af41SHiroki Sato struct script_msg {
35db82af41SHiroki Sato 	TAILQ_ENTRY(script_msg)	sm_next;
36db82af41SHiroki Sato 
37db82af41SHiroki Sato 	char *sm_msg;
38db82af41SHiroki Sato };
39db82af41SHiroki Sato 
40489e04d0SHiroki Sato TAILQ_HEAD(script_msg_head_t, script_msg);
41489e04d0SHiroki Sato 
42db82af41SHiroki Sato struct ra_opt {
43db82af41SHiroki Sato 	TAILQ_ENTRY(ra_opt)	rao_next;
44db82af41SHiroki Sato 
45db82af41SHiroki Sato 	u_int8_t	rao_type;
467d26db17SHiroki Sato 	struct timespec	rao_expire;
47db82af41SHiroki Sato 	size_t		rao_len;
48db82af41SHiroki Sato 	void		*rao_msg;
49db82af41SHiroki Sato };
50db82af41SHiroki Sato 
5106056832SHiroki Sato TAILQ_HEAD(rainfo_head, ra_opt);
5206056832SHiroki Sato 
5306056832SHiroki Sato struct rainfo {
5406056832SHiroki Sato 	TAILQ_ENTRY(rainfo)	rai_next;
5506056832SHiroki Sato 
5606056832SHiroki Sato 	struct ifinfo		*rai_ifinfo;
5706056832SHiroki Sato 	struct sockaddr_in6	rai_saddr;
5806056832SHiroki Sato 	TAILQ_HEAD(, ra_opt)	rai_ra_opt;
5906056832SHiroki Sato };
6006056832SHiroki Sato 
6104e9edb5SMark Johnston /* Per-interface tracking info. */
627d56d374SYoshinobu Inoue struct ifinfo {
63db82af41SHiroki Sato 	TAILQ_ENTRY(ifinfo) ifi_next;	/* pointer to the next interface */
647d56d374SYoshinobu Inoue 
657d56d374SYoshinobu Inoue 	struct sockaddr_dl *sdl; /* link-layer address */
66489e04d0SHiroki Sato 	char ifname[IFNAMSIZ];	/* interface name */
6704e9edb5SMark Johnston 	uint32_t linkid;	/* link ID of this interface */
687d56d374SYoshinobu Inoue 	int active;		/* interface status */
697d56d374SYoshinobu Inoue 	int probeinterval;	/* interval of probe timer (if necessary) */
707d56d374SYoshinobu Inoue 	int probetimer;		/* rest of probe timer */
71463a577bSEitan Adler 	int mediareqok;		/* whether the IF supports SIOCGIFMEDIA */
7260e7f669SBjoern A. Zeeb 	int managedconfig;	/* need a separate protocol for the "managed"
7360e7f669SBjoern A. Zeeb 				 * configuration */
7486b032afSHajimu UMEMOTO 	int otherconfig;	/* need a separate protocol for the "other"
7586b032afSHajimu UMEMOTO 				 * configuration */
76*476babaeSKristof Provost 	int alwaysconfig;	/* Have we called the 'always' script? */
777d56d374SYoshinobu Inoue 	int state;
787d56d374SYoshinobu Inoue 	int probes;
797d56d374SYoshinobu Inoue 	int dadcount;
807d26db17SHiroki Sato 	struct timespec timer;
817d26db17SHiroki Sato 	struct timespec expire;
8206056832SHiroki Sato #define IFI_DNSOPT_STATE_NOINFO		0
8306056832SHiroki Sato #define IFI_DNSOPT_STATE_RECEIVED     	1
8406056832SHiroki Sato 	int ifi_rdnss;		/* RDNSS option state */
8506056832SHiroki Sato 	int ifi_dnssl;		/* DNSSL option state */
867d56d374SYoshinobu Inoue 
877d56d374SYoshinobu Inoue 	int racnt;		/* total # of valid RAs it have got */
8806056832SHiroki Sato 	TAILQ_HEAD(, rainfo)	ifi_rainfo;
897d56d374SYoshinobu Inoue 
907d56d374SYoshinobu Inoue 	size_t rs_datalen;
917d56d374SYoshinobu Inoue 	u_char *rs_data;
927d56d374SYoshinobu Inoue };
937d56d374SYoshinobu Inoue 
947d56d374SYoshinobu Inoue /* per interface status */
957d56d374SYoshinobu Inoue #define IFS_IDLE	0
967d56d374SYoshinobu Inoue #define IFS_DELAY	1
977d56d374SYoshinobu Inoue #define IFS_PROBE	2
987d56d374SYoshinobu Inoue #define IFS_DOWN	3
997d56d374SYoshinobu Inoue #define IFS_TENTATIVE	4
1007d56d374SYoshinobu Inoue 
101db82af41SHiroki Sato /* Interface list */
102db82af41SHiroki Sato extern TAILQ_HEAD(ifinfo_head_t, ifinfo) ifinfo_head;
103db82af41SHiroki Sato 
104489e04d0SHiroki Sato #define	DNSINFO_ORIGIN_LABEL	"slaac"
105db82af41SHiroki Sato /*
106db82af41SHiroki Sato  * RFC 3542 API deprecates IPV6_PKTINFO in favor of
107db82af41SHiroki Sato  * IPV6_RECVPKTINFO
108db82af41SHiroki Sato  */
109db82af41SHiroki Sato #ifndef IPV6_RECVPKTINFO
110db82af41SHiroki Sato #ifdef IPV6_PKTINFO
111db82af41SHiroki Sato #define IPV6_RECVPKTINFO	IPV6_PKTINFO
112db82af41SHiroki Sato #endif
113db82af41SHiroki Sato #endif
114db82af41SHiroki Sato /*
115db82af41SHiroki Sato  * RFC 3542 API deprecates IPV6_HOPLIMIT in favor of
116db82af41SHiroki Sato  * IPV6_RECVHOPLIMIT
117db82af41SHiroki Sato  */
118db82af41SHiroki Sato #ifndef IPV6_RECVHOPLIMIT
119db82af41SHiroki Sato #ifdef IPV6_HOPLIMIT
120db82af41SHiroki Sato #define IPV6_RECVHOPLIMIT	IPV6_HOPLIMIT
121db82af41SHiroki Sato #endif
122db82af41SHiroki Sato #endif
123db82af41SHiroki Sato 
124db82af41SHiroki Sato #ifndef IN6ADDR_LINKLOCAL_ALLROUTERS_INIT
125db82af41SHiroki Sato #define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT			\
126db82af41SHiroki Sato 	{{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	\
127db82af41SHiroki Sato 	    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}}
128db82af41SHiroki Sato #endif
129db82af41SHiroki Sato 
1307d26db17SHiroki Sato #define	TS_CMP(tsp, usp, cmp)						\
1317d26db17SHiroki Sato 	(((tsp)->tv_sec == (usp)->tv_sec) ?				\
1327d26db17SHiroki Sato 	    ((tsp)->tv_nsec cmp (usp)->tv_nsec) :			\
1337d26db17SHiroki Sato 	    ((tsp)->tv_sec cmp (usp)->tv_sec))
1347d26db17SHiroki Sato #define	TS_ADD(tsp, usp, vsp)						\
1357d26db17SHiroki Sato 	do {								\
1367d26db17SHiroki Sato 		(vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec;		\
1377d26db17SHiroki Sato 		(vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec;	\
1387d26db17SHiroki Sato 		if ((vsp)->tv_nsec >= 1000000000L) {			\
1397d26db17SHiroki Sato 			(vsp)->tv_sec++;				\
1407d26db17SHiroki Sato 			(vsp)->tv_nsec -= 1000000000L;			\
1417d26db17SHiroki Sato 		}							\
1427d26db17SHiroki Sato 	} while (0)
1437d26db17SHiroki Sato #define	TS_SUB(tsp, usp, vsp)						\
1447d26db17SHiroki Sato 	do {								\
1457d26db17SHiroki Sato 		(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec;		\
1467d26db17SHiroki Sato 		(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec;	\
1477d26db17SHiroki Sato 		if ((vsp)->tv_nsec < 0) {				\
1487d26db17SHiroki Sato 			(vsp)->tv_sec--;				\
1497d26db17SHiroki Sato 			(vsp)->tv_nsec += 1000000000L;			\
1507d26db17SHiroki Sato 		}							\
1517d26db17SHiroki Sato 	} while (0)
1527d26db17SHiroki Sato 
1537d56d374SYoshinobu Inoue /* rtsold.c */
15404e9edb5SMark Johnston struct cap_channel;
1557d26db17SHiroki Sato extern struct timespec tm_max;
1567d56d374SYoshinobu Inoue extern int dflag;
1579a364ca3SHajimu UMEMOTO extern int aflag;
158eb87e699SHiroki Sato extern int Fflag;
159489e04d0SHiroki Sato extern int uflag;
16060e7f669SBjoern A. Zeeb extern const char *managedconf_script;
161db82af41SHiroki Sato extern const char *otherconf_script;
162*476babaeSKristof Provost extern const char *alwaysconf_script;
163db82af41SHiroki Sato extern const char *resolvconf_script;
16404e9edb5SMark Johnston extern struct cap_channel *capllflags, *capscript, *capsendmsg, *capsyslog;
16504e9edb5SMark Johnston 
166784bddbcSKevin Lo struct ifinfo *find_ifinfo(int);
16706056832SHiroki Sato struct rainfo *find_rainfo(struct ifinfo *, struct sockaddr_in6 *);
168784bddbcSKevin Lo void rtsol_timer_update(struct ifinfo *);
169784bddbcSKevin Lo extern void warnmsg(int, const char *, const char *, ...)
170804c83d4SKris Kennaway      __attribute__((__format__(__printf__, 3, 4)));
171db82af41SHiroki Sato extern int ra_opt_handler(struct ifinfo *);
1727d56d374SYoshinobu Inoue 
1737d56d374SYoshinobu Inoue /* if.c */
17404e9edb5SMark Johnston struct nd_opt_hdr;
175784bddbcSKevin Lo extern int ifinit(void);
176784bddbcSKevin Lo extern int interface_up(char *);
177784bddbcSKevin Lo extern int interface_status(struct ifinfo *);
178784bddbcSKevin Lo extern int lladdropt_length(struct sockaddr_dl *);
179784bddbcSKevin Lo extern void lladdropt_fill(struct sockaddr_dl *, struct nd_opt_hdr *);
180784bddbcSKevin Lo extern struct sockaddr_dl *if_nametosdl(char *);
1817d56d374SYoshinobu Inoue 
1827d56d374SYoshinobu Inoue /* rtsol.c */
18304e9edb5SMark Johnston extern int recvsockopen(void);
184784bddbcSKevin Lo extern void rtsol_input(int);
1857d56d374SYoshinobu Inoue 
18604e9edb5SMark Johnston /* cap_llflags.c */
18704e9edb5SMark Johnston extern int cap_llflags_get(struct cap_channel *, const char *, int *);
18804e9edb5SMark Johnston 
18904e9edb5SMark Johnston /* cap_script.c */
19004e9edb5SMark Johnston extern int cap_script_run(struct cap_channel *, const char *const *);
19104e9edb5SMark Johnston extern int cap_script_wait(struct cap_channel *, int *);
19204e9edb5SMark Johnston 
19304e9edb5SMark Johnston /* cap_sendmsg.c */
19404e9edb5SMark Johnston extern int cap_probe_defrouters(struct cap_channel *, struct ifinfo *);
19504e9edb5SMark Johnston extern int cap_rssend(struct cap_channel *, struct ifinfo *);
1967d56d374SYoshinobu Inoue 
1977d56d374SYoshinobu Inoue /* dump.c */
19804e9edb5SMark Johnston extern FILE *rtsold_init_dumpfile(const char *);
19904e9edb5SMark Johnston extern void rtsold_dump(FILE *);
2007d26db17SHiroki Sato extern const char *sec2str(const struct timespec *);
20133841545SHajimu UMEMOTO 
20233841545SHajimu UMEMOTO /* rtsock.c */
203784bddbcSKevin Lo extern int rtsock_open(void);
204784bddbcSKevin Lo extern int rtsock_input(int);
205