1*9f20bfa6SDavid van Moolenbroek /* $NetBSD: ipv6nd.h,v 1.13 2015/07/09 10:15:34 roy Exp $ */ 2*9f20bfa6SDavid van Moolenbroek 3*9f20bfa6SDavid van Moolenbroek /* 4*9f20bfa6SDavid van Moolenbroek * dhcpcd - DHCP client daemon 5*9f20bfa6SDavid van Moolenbroek * Copyright (c) 2006-2015 Roy Marples <roy@marples.name> 6*9f20bfa6SDavid van Moolenbroek * All rights reserved 7*9f20bfa6SDavid van Moolenbroek 8*9f20bfa6SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 9*9f20bfa6SDavid van Moolenbroek * modification, are permitted provided that the following conditions 10*9f20bfa6SDavid van Moolenbroek * are met: 11*9f20bfa6SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright 12*9f20bfa6SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer. 13*9f20bfa6SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright 14*9f20bfa6SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the 15*9f20bfa6SDavid van Moolenbroek * documentation and/or other materials provided with the distribution. 16*9f20bfa6SDavid van Moolenbroek * 17*9f20bfa6SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*9f20bfa6SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*9f20bfa6SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*9f20bfa6SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*9f20bfa6SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*9f20bfa6SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*9f20bfa6SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*9f20bfa6SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*9f20bfa6SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*9f20bfa6SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*9f20bfa6SDavid van Moolenbroek * SUCH DAMAGE. 28*9f20bfa6SDavid van Moolenbroek */ 29*9f20bfa6SDavid van Moolenbroek 30*9f20bfa6SDavid van Moolenbroek #ifndef IPV6ND_H 31*9f20bfa6SDavid van Moolenbroek #define IPV6ND_H 32*9f20bfa6SDavid van Moolenbroek 33*9f20bfa6SDavid van Moolenbroek #include <time.h> 34*9f20bfa6SDavid van Moolenbroek 35*9f20bfa6SDavid van Moolenbroek #include "config.h" 36*9f20bfa6SDavid van Moolenbroek #include "dhcpcd.h" 37*9f20bfa6SDavid van Moolenbroek #include "ipv6.h" 38*9f20bfa6SDavid van Moolenbroek 39*9f20bfa6SDavid van Moolenbroek struct ra { 40*9f20bfa6SDavid van Moolenbroek TAILQ_ENTRY(ra) next; 41*9f20bfa6SDavid van Moolenbroek struct interface *iface; 42*9f20bfa6SDavid van Moolenbroek struct in6_addr from; 43*9f20bfa6SDavid van Moolenbroek char sfrom[INET6_ADDRSTRLEN]; 44*9f20bfa6SDavid van Moolenbroek unsigned char *data; 45*9f20bfa6SDavid van Moolenbroek size_t data_len; 46*9f20bfa6SDavid van Moolenbroek struct timespec acquired; 47*9f20bfa6SDavid van Moolenbroek unsigned char flags; 48*9f20bfa6SDavid van Moolenbroek uint32_t lifetime; 49*9f20bfa6SDavid van Moolenbroek uint32_t reachable; 50*9f20bfa6SDavid van Moolenbroek uint32_t retrans; 51*9f20bfa6SDavid van Moolenbroek uint32_t mtu; 52*9f20bfa6SDavid van Moolenbroek struct ipv6_addrhead addrs; 53*9f20bfa6SDavid van Moolenbroek uint8_t hasdns; 54*9f20bfa6SDavid van Moolenbroek uint8_t expired; 55*9f20bfa6SDavid van Moolenbroek uint8_t no_public_warned; 56*9f20bfa6SDavid van Moolenbroek }; 57*9f20bfa6SDavid van Moolenbroek 58*9f20bfa6SDavid van Moolenbroek TAILQ_HEAD(ra_head, ra); 59*9f20bfa6SDavid van Moolenbroek 60*9f20bfa6SDavid van Moolenbroek struct rs_state { 61*9f20bfa6SDavid van Moolenbroek unsigned char *rs; 62*9f20bfa6SDavid van Moolenbroek size_t rslen; 63*9f20bfa6SDavid van Moolenbroek int rsprobes; 64*9f20bfa6SDavid van Moolenbroek }; 65*9f20bfa6SDavid van Moolenbroek 66*9f20bfa6SDavid van Moolenbroek #define RS_STATE(a) ((struct rs_state *)(ifp)->if_data[IF_DATA_IPV6ND]) 67*9f20bfa6SDavid van Moolenbroek #define RS_STATE_RUNNING(a) (ipv6nd_hasra((a)) && ipv6nd_dadcompleted((a))) 68*9f20bfa6SDavid van Moolenbroek 69*9f20bfa6SDavid van Moolenbroek #define ND_CFIRST_OPTION(m) \ 70*9f20bfa6SDavid van Moolenbroek ((const struct nd_opt_hdr *) \ 71*9f20bfa6SDavid van Moolenbroek ((const uint8_t *)(m)->data + sizeof(struct nd_router_advert))) 72*9f20bfa6SDavid van Moolenbroek #define ND_OPTION_LEN(o) ((size_t)((o)->nd_opt_len * 8) - \ 73*9f20bfa6SDavid van Moolenbroek sizeof(struct nd_opt_hdr)) 74*9f20bfa6SDavid van Moolenbroek #define ND_CNEXT_OPTION(o) \ 75*9f20bfa6SDavid van Moolenbroek ((const struct nd_opt_hdr *)((const uint8_t *)(o) + \ 76*9f20bfa6SDavid van Moolenbroek (size_t)((o)->nd_opt_len * 8))) 77*9f20bfa6SDavid van Moolenbroek #define ND_COPTION_DATA(o) \ 78*9f20bfa6SDavid van Moolenbroek ((const uint8_t *)(o) + sizeof(struct nd_opt_hdr)) 79*9f20bfa6SDavid van Moolenbroek 80*9f20bfa6SDavid van Moolenbroek #define MAX_RTR_SOLICITATION_DELAY 1 /* seconds */ 81*9f20bfa6SDavid van Moolenbroek #define MAX_UNICAST_SOLICIT 3 /* 3 transmissions */ 82*9f20bfa6SDavid van Moolenbroek #define RTR_SOLICITATION_INTERVAL 4 /* seconds */ 83*9f20bfa6SDavid van Moolenbroek #define MAX_RTR_SOLICITATIONS 3 /* times */ 84*9f20bfa6SDavid van Moolenbroek 85*9f20bfa6SDavid van Moolenbroek /* On carrier up, expire known routers after RTR_CARRIER_EXPIRE seconds. */ 86*9f20bfa6SDavid van Moolenbroek #define RTR_CARRIER_EXPIRE \ 87*9f20bfa6SDavid van Moolenbroek (MAX_RTR_SOLICITATION_DELAY + \ 88*9f20bfa6SDavid van Moolenbroek (MAX_RTR_SOLICITATIONS + 1) * \ 89*9f20bfa6SDavid van Moolenbroek RTR_SOLICITATION_INTERVAL) 90*9f20bfa6SDavid van Moolenbroek 91*9f20bfa6SDavid van Moolenbroek #define MAX_REACHABLE_TIME 3600000 /* milliseconds */ 92*9f20bfa6SDavid van Moolenbroek #define REACHABLE_TIME 30000 /* milliseconds */ 93*9f20bfa6SDavid van Moolenbroek #define RETRANS_TIMER 1000 /* milliseconds */ 94*9f20bfa6SDavid van Moolenbroek #define DELAY_FIRST_PROBE_TIME 5 /* seconds */ 95*9f20bfa6SDavid van Moolenbroek 96*9f20bfa6SDavid van Moolenbroek #define IPV6ND_REACHABLE (1 << 0) 97*9f20bfa6SDavid van Moolenbroek #define IPV6ND_ROUTER (1 << 1) 98*9f20bfa6SDavid van Moolenbroek 99*9f20bfa6SDavid van Moolenbroek #ifdef INET6 100*9f20bfa6SDavid van Moolenbroek void ipv6nd_printoptions(const struct dhcpcd_ctx *, 101*9f20bfa6SDavid van Moolenbroek const struct dhcp_opt *, size_t); 102*9f20bfa6SDavid van Moolenbroek void ipv6nd_startrs(struct interface *); 103*9f20bfa6SDavid van Moolenbroek ssize_t ipv6nd_env(char **, const char *, const struct interface *); 104*9f20bfa6SDavid van Moolenbroek const struct ipv6_addr *ipv6nd_iffindaddr(const struct interface *ifp, 105*9f20bfa6SDavid van Moolenbroek const struct in6_addr *addr, short flags); 106*9f20bfa6SDavid van Moolenbroek struct ipv6_addr *ipv6nd_findaddr(struct dhcpcd_ctx *, 107*9f20bfa6SDavid van Moolenbroek const struct in6_addr *, short); 108*9f20bfa6SDavid van Moolenbroek void ipv6nd_freedrop_ra(struct ra *, int); 109*9f20bfa6SDavid van Moolenbroek #define ipv6nd_free_ra(ra) ipv6nd_freedrop_ra((ra), 0) 110*9f20bfa6SDavid van Moolenbroek #define ipv6nd_drop_ra(ra) ipv6nd_freedrop_ra((ra), 1) 111*9f20bfa6SDavid van Moolenbroek ssize_t ipv6nd_free(struct interface *); 112*9f20bfa6SDavid van Moolenbroek void ipv6nd_expirera(void *arg); 113*9f20bfa6SDavid van Moolenbroek int ipv6nd_hasra(const struct interface *); 114*9f20bfa6SDavid van Moolenbroek int ipv6nd_hasradhcp(const struct interface *); 115*9f20bfa6SDavid van Moolenbroek void ipv6nd_runignoredra(struct interface *); 116*9f20bfa6SDavid van Moolenbroek void ipv6nd_handleifa(struct dhcpcd_ctx *, int, 117*9f20bfa6SDavid van Moolenbroek const char *, const struct in6_addr *, int); 118*9f20bfa6SDavid van Moolenbroek int ipv6nd_dadcompleted(const struct interface *); 119*9f20bfa6SDavid van Moolenbroek void ipv6nd_expire(struct interface *, uint32_t); 120*9f20bfa6SDavid van Moolenbroek void ipv6nd_drop(struct interface *); 121*9f20bfa6SDavid van Moolenbroek void ipv6nd_neighbour(struct dhcpcd_ctx *, struct in6_addr *, int); 122*9f20bfa6SDavid van Moolenbroek #else 123*9f20bfa6SDavid van Moolenbroek #define ipv6nd_startrs(a) {} 124*9f20bfa6SDavid van Moolenbroek #define ipv6nd_free(a) {} 125*9f20bfa6SDavid van Moolenbroek #define ipv6nd_hasra(a) (0) 126*9f20bfa6SDavid van Moolenbroek #define ipv6nd_dadcompleted(a) (0) 127*9f20bfa6SDavid van Moolenbroek #define ipv6nd_drop(a) {} 128*9f20bfa6SDavid van Moolenbroek #define ipv6nd_expire(a, b) {} 129*9f20bfa6SDavid van Moolenbroek #endif 130*9f20bfa6SDavid van Moolenbroek 131*9f20bfa6SDavid van Moolenbroek #endif 132