18d36e1dfSRoy Marples /* SPDX-License-Identifier: BSD-2-Clause */ 27827cba2SAaron LI /* 37827cba2SAaron LI * dhcpcd - IPv6 ND handling 480aa9461SRoy Marples * Copyright (c) 2006-2023 Roy Marples <roy@marples.name> 57827cba2SAaron LI * All rights reserved 67827cba2SAaron LI 77827cba2SAaron LI * Redistribution and use in source and binary forms, with or without 87827cba2SAaron LI * modification, are permitted provided that the following conditions 97827cba2SAaron LI * are met: 107827cba2SAaron LI * 1. Redistributions of source code must retain the above copyright 117827cba2SAaron LI * notice, this list of conditions and the following disclaimer. 127827cba2SAaron LI * 2. Redistributions in binary form must reproduce the above copyright 137827cba2SAaron LI * notice, this list of conditions and the following disclaimer in the 147827cba2SAaron LI * documentation and/or other materials provided with the distribution. 157827cba2SAaron LI * 167827cba2SAaron LI * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 177827cba2SAaron LI * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 187827cba2SAaron LI * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 197827cba2SAaron LI * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 207827cba2SAaron LI * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 217827cba2SAaron LI * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 227827cba2SAaron LI * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 237827cba2SAaron LI * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 247827cba2SAaron LI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 257827cba2SAaron LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 267827cba2SAaron LI * SUCH DAMAGE. 277827cba2SAaron LI */ 287827cba2SAaron LI 297827cba2SAaron LI #ifndef IPV6ND_H 307827cba2SAaron LI #define IPV6ND_H 317827cba2SAaron LI 328d36e1dfSRoy Marples #ifdef INET6 338d36e1dfSRoy Marples 347827cba2SAaron LI #include <time.h> 357827cba2SAaron LI 367827cba2SAaron LI #include "config.h" 377827cba2SAaron LI #include "dhcpcd.h" 387827cba2SAaron LI #include "ipv6.h" 397827cba2SAaron LI 40*54175cefSRoy Marples /* rfc4191 */ 41*54175cefSRoy Marples struct routeinfo { 42*54175cefSRoy Marples TAILQ_ENTRY(routeinfo) next; 43*54175cefSRoy Marples struct in6_addr prefix; 44*54175cefSRoy Marples uint8_t prefix_len; 45*54175cefSRoy Marples uint32_t lifetime; 46*54175cefSRoy Marples uint8_t flags; 47*54175cefSRoy Marples struct timespec acquired; 48*54175cefSRoy Marples char sprefix[INET6_ADDRSTRLEN]; 49*54175cefSRoy Marples }; 50*54175cefSRoy Marples 51*54175cefSRoy Marples TAILQ_HEAD(routeinfohead, routeinfo); 52*54175cefSRoy Marples 53*54175cefSRoy Marples 547827cba2SAaron LI struct ra { 557827cba2SAaron LI TAILQ_ENTRY(ra) next; 567827cba2SAaron LI struct interface *iface; 577827cba2SAaron LI struct in6_addr from; 587827cba2SAaron LI char sfrom[INET6_ADDRSTRLEN]; 597827cba2SAaron LI uint8_t *data; 607827cba2SAaron LI size_t data_len; 617827cba2SAaron LI struct timespec acquired; 62*54175cefSRoy Marples uint8_t flags; 637827cba2SAaron LI uint32_t lifetime; 647827cba2SAaron LI uint32_t reachable; 657827cba2SAaron LI uint32_t retrans; 667827cba2SAaron LI uint32_t mtu; 67b9ccd228SRoy Marples uint8_t hoplimit; 687827cba2SAaron LI struct ipv6_addrhead addrs; 69*54175cefSRoy Marples struct routeinfohead rinfos; 708d36e1dfSRoy Marples bool hasdns; 718d36e1dfSRoy Marples bool expired; 726e63cc1fSRoy Marples bool willexpire; 736e63cc1fSRoy Marples bool doexpire; 748d36e1dfSRoy Marples bool isreachable; 757827cba2SAaron LI }; 767827cba2SAaron LI 777827cba2SAaron LI TAILQ_HEAD(ra_head, ra); 787827cba2SAaron LI 797827cba2SAaron LI struct rs_state { 807827cba2SAaron LI struct nd_router_solicit *rs; 817827cba2SAaron LI size_t rslen; 827827cba2SAaron LI int rsprobes; 838d36e1dfSRoy Marples uint32_t retrans; 848d36e1dfSRoy Marples #ifdef __sun 858d36e1dfSRoy Marples int nd_fd; 868d36e1dfSRoy Marples #endif 877827cba2SAaron LI }; 887827cba2SAaron LI 897827cba2SAaron LI #define RS_STATE(a) ((struct rs_state *)(ifp)->if_data[IF_DATA_IPV6ND]) 908d36e1dfSRoy Marples #define RS_CSTATE(a) ((const struct rs_state *)(ifp)->if_data[IF_DATA_IPV6ND]) 917827cba2SAaron LI #define RS_STATE_RUNNING(a) (ipv6nd_hasra((a)) && ipv6nd_dadcompleted((a))) 927827cba2SAaron LI 937827cba2SAaron LI #ifndef MAX_RTR_SOLICITATION_DELAY 947827cba2SAaron LI #define MAX_RTR_SOLICITATION_DELAY 1 /* seconds */ 957827cba2SAaron LI #define MAX_UNICAST_SOLICIT 3 /* 3 transmissions */ 967827cba2SAaron LI #define RTR_SOLICITATION_INTERVAL 4 /* seconds */ 977827cba2SAaron LI #define MAX_RTR_SOLICITATIONS 3 /* times */ 988d36e1dfSRoy Marples #define MAX_NEIGHBOR_ADVERTISEMENT 3 /* 3 transmissions */ 99b9ccd228SRoy Marples 100b9ccd228SRoy Marples #ifndef IPV6_DEFHLIM 101b9ccd228SRoy Marples #define IPV6_DEFHLIM 64 102b9ccd228SRoy Marples #endif 1037827cba2SAaron LI #endif 1047827cba2SAaron LI 1057827cba2SAaron LI /* On carrier up, expire known routers after RTR_CARRIER_EXPIRE seconds. */ 1067827cba2SAaron LI #define RTR_CARRIER_EXPIRE \ 1077827cba2SAaron LI (MAX_RTR_SOLICITATION_DELAY + \ 1087827cba2SAaron LI (MAX_RTR_SOLICITATIONS + 1) * \ 1097827cba2SAaron LI RTR_SOLICITATION_INTERVAL) 1107827cba2SAaron LI 1117827cba2SAaron LI #define MAX_REACHABLE_TIME 3600000 /* milliseconds */ 1127827cba2SAaron LI #define REACHABLE_TIME 30000 /* milliseconds */ 1137827cba2SAaron LI #define RETRANS_TIMER 1000 /* milliseconds */ 1147827cba2SAaron LI #define DELAY_FIRST_PROBE_TIME 5 /* seconds */ 1157827cba2SAaron LI 11680aa9461SRoy Marples #define MIN_EXTENDED_VLTIME 7200 /* seconds */ 11780aa9461SRoy Marples 118d4fb1e02SRoy Marples int ipv6nd_open(bool); 1196e63cc1fSRoy Marples #ifdef __sun 120d4fb1e02SRoy Marples int ipv6nd_openif(struct interface *); 1216e63cc1fSRoy Marples #endif 1226e63cc1fSRoy Marples void ipv6nd_recvmsg(struct dhcpcd_ctx *, struct msghdr *); 123*54175cefSRoy Marples int ipv6nd_rtpref(uint8_t); 1247827cba2SAaron LI void ipv6nd_printoptions(const struct dhcpcd_ctx *, 1257827cba2SAaron LI const struct dhcp_opt *, size_t); 1267827cba2SAaron LI void ipv6nd_startrs(struct interface *); 1278d36e1dfSRoy Marples ssize_t ipv6nd_env(FILE *, const struct interface *); 1287827cba2SAaron LI const struct ipv6_addr *ipv6nd_iffindaddr(const struct interface *ifp, 1297827cba2SAaron LI const struct in6_addr *addr, unsigned int flags); 1307827cba2SAaron LI struct ipv6_addr *ipv6nd_findaddr(struct dhcpcd_ctx *, 1317827cba2SAaron LI const struct in6_addr *, unsigned int); 1326e63cc1fSRoy Marples struct ipv6_addr *ipv6nd_iffindprefix(struct interface *, 1336e63cc1fSRoy Marples const struct in6_addr *, uint8_t); 1347827cba2SAaron LI ssize_t ipv6nd_free(struct interface *); 1357827cba2SAaron LI void ipv6nd_expirera(void *arg); 1368d36e1dfSRoy Marples bool ipv6nd_hasralifetime(const struct interface *, bool); 1378d36e1dfSRoy Marples #define ipv6nd_hasra(i) ipv6nd_hasralifetime((i), false) 1386e63cc1fSRoy Marples bool ipv6nd_hasradhcp(const struct interface *, bool); 1397827cba2SAaron LI void ipv6nd_handleifa(int, struct ipv6_addr *, pid_t); 1407827cba2SAaron LI int ipv6nd_dadcompleted(const struct interface *); 1418d36e1dfSRoy Marples void ipv6nd_advertise(struct ipv6_addr *); 1428d36e1dfSRoy Marples void ipv6nd_startexpire(struct interface *); 1437827cba2SAaron LI void ipv6nd_drop(struct interface *); 1448d36e1dfSRoy Marples void ipv6nd_neighbour(struct dhcpcd_ctx *, struct in6_addr *, bool); 1458d36e1dfSRoy Marples #endif /* INET6 */ 1467827cba2SAaron LI 1478d36e1dfSRoy Marples #endif /* IPV6ND_H */ 148