1*5a030e60Sflorian /* $OpenBSD: slaacd.h,v 1.38 2022/07/12 16:55:00 florian Exp $ */ 20acf3e2dSflorian 30acf3e2dSflorian /* 40acf3e2dSflorian * Copyright (c) 2017 Florian Obser <florian@openbsd.org> 50acf3e2dSflorian * Copyright (c) 2004 Esben Norby <norby@openbsd.org> 60acf3e2dSflorian * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> 70acf3e2dSflorian * 80acf3e2dSflorian * Permission to use, copy, modify, and distribute this software for any 90acf3e2dSflorian * purpose with or without fee is hereby granted, provided that the above 100acf3e2dSflorian * copyright notice and this permission notice appear in all copies. 110acf3e2dSflorian * 120acf3e2dSflorian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 130acf3e2dSflorian * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 140acf3e2dSflorian * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 150acf3e2dSflorian * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 160acf3e2dSflorian * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 170acf3e2dSflorian * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 180acf3e2dSflorian * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 190acf3e2dSflorian */ 200acf3e2dSflorian 21bc9eb55cSkn #define _PATH_LOCKFILE "/dev/slaacd.lock" 22168427c5Sflorian #define _PATH_SLAACD_SOCKET "/dev/slaacd.sock" 230acf3e2dSflorian #define SLAACD_USER "_slaacd" 245d55626aSflorian #define SLAACD_RTA_LABEL "slaacd" 250acf3e2dSflorian 26b9b376fbSflorian #define SLAACD_SOIIKEY_LEN 16 27b9b376fbSflorian 2834435150Sflorian #define MAX_RDNS_COUNT 8 /* max nameserver in a RTM_PROPOSAL */ 2934435150Sflorian 30b9687754Spamela #define IMSG_DATA_SIZE(imsg) ((imsg).hdr.len - IMSG_HEADER_SIZE) 31b9687754Spamela 320acf3e2dSflorian struct imsgev { 330acf3e2dSflorian struct imsgbuf ibuf; 340acf3e2dSflorian void (*handler)(int, short, void *); 350acf3e2dSflorian struct event ev; 360acf3e2dSflorian short events; 370acf3e2dSflorian }; 380acf3e2dSflorian 390acf3e2dSflorian enum imsg_type { 400acf3e2dSflorian IMSG_NONE, 41bf0ed931Sflorian #ifndef SMALL 420acf3e2dSflorian IMSG_CTL_LOG_VERBOSE, 430acf3e2dSflorian IMSG_CTL_SHOW_INTERFACE_INFO, 440acf3e2dSflorian IMSG_CTL_SHOW_INTERFACE_INFO_RA, 450acf3e2dSflorian IMSG_CTL_SHOW_INTERFACE_INFO_RA_PREFIX, 460acf3e2dSflorian IMSG_CTL_SHOW_INTERFACE_INFO_RA_RDNS, 4734795d09Sflorian IMSG_CTL_SHOW_INTERFACE_INFO_ADDR_PROPOSALS, 4834795d09Sflorian IMSG_CTL_SHOW_INTERFACE_INFO_ADDR_PROPOSAL, 4934795d09Sflorian IMSG_CTL_SHOW_INTERFACE_INFO_DFR_PROPOSALS, 5034795d09Sflorian IMSG_CTL_SHOW_INTERFACE_INFO_DFR_PROPOSAL, 5134435150Sflorian IMSG_CTL_SHOW_INTERFACE_INFO_RDNS_PROPOSALS, 5234435150Sflorian IMSG_CTL_SHOW_INTERFACE_INFO_RDNS_PROPOSAL, 530acf3e2dSflorian IMSG_CTL_END, 5406d929a1Skn #endif /* SMALL */ 5534435150Sflorian IMSG_PROPOSE_RDNS, 5634435150Sflorian IMSG_REPROPOSE_RDNS, 5734795d09Sflorian IMSG_CTL_SEND_SOLICITATION, 580acf3e2dSflorian IMSG_SOCKET_IPC, 59dd19964dSflorian IMSG_OPEN_ICMP6SOCK, 60f9631f15Sflorian IMSG_ICMP6SOCK, 61f9631f15Sflorian IMSG_ROUTESOCK, 62f9631f15Sflorian IMSG_CONTROLFD, 630acf3e2dSflorian IMSG_STARTUP, 640acf3e2dSflorian IMSG_UPDATE_IF, 650acf3e2dSflorian IMSG_REMOVE_IF, 660acf3e2dSflorian IMSG_RA, 670acf3e2dSflorian IMSG_CONFIGURE_ADDRESS, 68b64c4682Spamela IMSG_WITHDRAW_ADDRESS, 690acf3e2dSflorian IMSG_DEL_ADDRESS, 70d3ff3477Sflorian IMSG_DEL_ROUTE, 710acf3e2dSflorian IMSG_CONFIGURE_DFR, 720acf3e2dSflorian IMSG_WITHDRAW_DFR, 7305b87f88Sflorian IMSG_DUP_ADDRESS, 740acf3e2dSflorian }; 750acf3e2dSflorian 76bca4d785Sflorian enum rpref { 77bca4d785Sflorian LOW, 78bca4d785Sflorian MEDIUM, 79bca4d785Sflorian HIGH, 80bca4d785Sflorian }; 81bca4d785Sflorian 82bf0ed931Sflorian #ifndef SMALL 830acf3e2dSflorian struct ctl_engine_info { 840acf3e2dSflorian uint32_t if_index; 850acf3e2dSflorian int running; 86c6384676Sflorian int autoconf; 87804ba004Sflorian int temporary; 88b9b376fbSflorian int soii; 890acf3e2dSflorian struct ether_addr hw_address; 900acf3e2dSflorian struct sockaddr_in6 ll_address; 910acf3e2dSflorian }; 920acf3e2dSflorian 930acf3e2dSflorian struct ctl_engine_info_ra { 940acf3e2dSflorian struct sockaddr_in6 from; 950acf3e2dSflorian struct timespec when; 960acf3e2dSflorian struct timespec uptime; 970acf3e2dSflorian uint8_t curhoplimit; 980acf3e2dSflorian int managed; 990acf3e2dSflorian int other; 1000acf3e2dSflorian char rpref[sizeof("MEDIUM")]; 1010acf3e2dSflorian uint16_t router_lifetime; /* in seconds */ 1020acf3e2dSflorian uint32_t reachable_time; /* in milliseconds */ 1030acf3e2dSflorian uint32_t retrans_time; /* in milliseconds */ 104884d1deeSbket uint32_t mtu; 1050acf3e2dSflorian }; 1060acf3e2dSflorian 1070acf3e2dSflorian struct ctl_engine_info_ra_prefix { 1080acf3e2dSflorian struct in6_addr prefix; 1090acf3e2dSflorian uint8_t prefix_len; 1100acf3e2dSflorian int onlink; 1110acf3e2dSflorian int autonomous; 1120acf3e2dSflorian uint32_t vltime; 1130acf3e2dSflorian uint32_t pltime; 1140acf3e2dSflorian }; 1150acf3e2dSflorian 1160acf3e2dSflorian struct ctl_engine_info_ra_rdns { 1170acf3e2dSflorian uint32_t lifetime; 1180acf3e2dSflorian struct in6_addr rdns; 1190acf3e2dSflorian }; 1200acf3e2dSflorian 1210acf3e2dSflorian struct ctl_engine_info_address_proposal { 1220acf3e2dSflorian int64_t id; 1230acf3e2dSflorian char state[sizeof("PROPOSAL_NEARLY_EXPIRED")]; 1243e9e3174Sflorian time_t next_timeout; 1250acf3e2dSflorian struct timespec when; 1260acf3e2dSflorian struct timespec uptime; 1270acf3e2dSflorian struct sockaddr_in6 addr; 1280acf3e2dSflorian struct in6_addr prefix; 129804ba004Sflorian int temporary; 1300acf3e2dSflorian uint8_t prefix_len; 1310acf3e2dSflorian uint32_t vltime; 1320acf3e2dSflorian uint32_t pltime; 1330acf3e2dSflorian }; 1340acf3e2dSflorian 1350acf3e2dSflorian struct ctl_engine_info_dfr_proposal { 1360acf3e2dSflorian int64_t id; 1370acf3e2dSflorian char state[sizeof("PROPOSAL_NEARLY_EXPIRED")]; 1383e9e3174Sflorian time_t next_timeout; 1390acf3e2dSflorian struct timespec when; 1400acf3e2dSflorian struct timespec uptime; 1410acf3e2dSflorian struct sockaddr_in6 addr; 1420acf3e2dSflorian uint32_t router_lifetime; 1430acf3e2dSflorian char rpref[sizeof("MEDIUM")]; 1440acf3e2dSflorian }; 145060a7308Sflorian 14634435150Sflorian struct ctl_engine_info_rdns_proposal { 14734435150Sflorian int64_t id; 14834435150Sflorian char state[sizeof("PROPOSAL_NEARLY_EXPIRED")]; 14934435150Sflorian time_t next_timeout; 15034435150Sflorian struct timespec when; 15134435150Sflorian struct timespec uptime; 15234435150Sflorian struct sockaddr_in6 from; 15334435150Sflorian uint32_t rdns_lifetime; 15434435150Sflorian int rdns_count; 15534435150Sflorian struct in6_addr rdns[MAX_RDNS_COUNT]; 15634435150Sflorian }; 15734435150Sflorian 15806d929a1Skn #endif /* SMALL */ 15906d929a1Skn 16034435150Sflorian struct imsg_propose_rdns { 16134435150Sflorian uint32_t if_index; 162dd19964dSflorian int rdomain; 16334435150Sflorian int rdns_count; 164fdb4a585Sflorian struct in6_addr rdns[MAX_RDNS_COUNT]; 16534435150Sflorian }; 16634435150Sflorian 1670acf3e2dSflorian 1680acf3e2dSflorian struct imsg_ifinfo { 1690acf3e2dSflorian uint32_t if_index; 170dd19964dSflorian int rdomain; 1710acf3e2dSflorian int running; 1728a8bcb8bSflorian int link_state; 173c6384676Sflorian int autoconf; 174804ba004Sflorian int temporary; 175b9b376fbSflorian int soii; 1760acf3e2dSflorian struct ether_addr hw_address; 1770acf3e2dSflorian struct sockaddr_in6 ll_address; 178b9b376fbSflorian uint8_t soiikey[SLAACD_SOIIKEY_LEN]; 1790acf3e2dSflorian }; 1800acf3e2dSflorian 1810acf3e2dSflorian struct imsg_del_addr { 1820acf3e2dSflorian uint32_t if_index; 1830acf3e2dSflorian struct sockaddr_in6 addr; 1840acf3e2dSflorian }; 1850acf3e2dSflorian 186d3ff3477Sflorian struct imsg_del_route { 187d3ff3477Sflorian uint32_t if_index; 188d3ff3477Sflorian struct sockaddr_in6 gw; 189d3ff3477Sflorian }; 190d3ff3477Sflorian 1910acf3e2dSflorian struct imsg_ra { 1920acf3e2dSflorian uint32_t if_index; 1930acf3e2dSflorian struct sockaddr_in6 from; 1940acf3e2dSflorian ssize_t len; 1950acf3e2dSflorian uint8_t packet[1500]; 1960acf3e2dSflorian }; 1970acf3e2dSflorian 19805b87f88Sflorian struct imsg_dup_addr { 19905b87f88Sflorian uint32_t if_index; 20005b87f88Sflorian struct sockaddr_in6 addr; 20105b87f88Sflorian }; 20205b87f88Sflorian 2030acf3e2dSflorian /* slaacd.c */ 2040acf3e2dSflorian void imsg_event_add(struct imsgev *); 2050acf3e2dSflorian int imsg_compose_event(struct imsgev *, uint16_t, uint32_t, pid_t, 2060acf3e2dSflorian int, void *, uint16_t); 2075ab5607cSflorian #ifndef SMALL 2085ab5607cSflorian const char *sin6_to_str(struct sockaddr_in6 *); 2095ab5607cSflorian #else 2105ab5607cSflorian #define sin6_to_str(x...) "" 2115ab5607cSflorian #endif /* SMALL */ 212