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