1*884d1deeSbket /* $OpenBSD: slaacd.h,v 1.20 2018/07/27 06:23:08 bket 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 21702139cbSflorian #define SLAACD_SOCKET "/dev/slaacd.sock" 220acf3e2dSflorian #define SLAACD_USER "_slaacd" 235d55626aSflorian #define SLAACD_RTA_LABEL "slaacd" 240acf3e2dSflorian 25b9b376fbSflorian #define SLAACD_SOIIKEY_LEN 16 26b9b376fbSflorian 270acf3e2dSflorian /* MAXDNAME from arpa/namesr.h */ 280acf3e2dSflorian #define SLAACD_MAX_DNSSL 1025 290acf3e2dSflorian 300acf3e2dSflorian static const char * const log_procnames[] = { 310acf3e2dSflorian "main", 32178f9218Sflorian "engine", 33178f9218Sflorian "frontend" 340acf3e2dSflorian }; 350acf3e2dSflorian 360acf3e2dSflorian struct imsgev { 370acf3e2dSflorian struct imsgbuf ibuf; 380acf3e2dSflorian void (*handler)(int, short, void *); 390acf3e2dSflorian struct event ev; 400acf3e2dSflorian short events; 410acf3e2dSflorian }; 420acf3e2dSflorian 430acf3e2dSflorian enum imsg_type { 440acf3e2dSflorian IMSG_NONE, 45bf0ed931Sflorian #ifndef SMALL 460acf3e2dSflorian IMSG_CTL_LOG_VERBOSE, 470acf3e2dSflorian IMSG_CTL_SHOW_INTERFACE_INFO, 480acf3e2dSflorian IMSG_CTL_SHOW_INTERFACE_INFO_RA, 490acf3e2dSflorian IMSG_CTL_SHOW_INTERFACE_INFO_RA_PREFIX, 500acf3e2dSflorian IMSG_CTL_SHOW_INTERFACE_INFO_RA_RDNS, 510acf3e2dSflorian IMSG_CTL_SHOW_INTERFACE_INFO_RA_DNSSL, 5234795d09Sflorian IMSG_CTL_SHOW_INTERFACE_INFO_ADDR_PROPOSALS, 5334795d09Sflorian IMSG_CTL_SHOW_INTERFACE_INFO_ADDR_PROPOSAL, 5434795d09Sflorian IMSG_CTL_SHOW_INTERFACE_INFO_DFR_PROPOSALS, 5534795d09Sflorian IMSG_CTL_SHOW_INTERFACE_INFO_DFR_PROPOSAL, 560acf3e2dSflorian IMSG_CTL_END, 57060a7308Sflorian IMSG_UPDATE_ADDRESS, 5896316c8dSflorian IMSG_UPDATE_LINK_STATE, 59bf0ed931Sflorian #endif /* SMALL */ 6034795d09Sflorian IMSG_CTL_SEND_SOLICITATION, 610acf3e2dSflorian IMSG_SOCKET_IPC, 62f9631f15Sflorian IMSG_ICMP6SOCK, 63f9631f15Sflorian IMSG_ROUTESOCK, 64f9631f15Sflorian IMSG_CONTROLFD, 650acf3e2dSflorian IMSG_STARTUP, 667f820bb4Sflorian IMSG_STARTUP_DONE, 670acf3e2dSflorian IMSG_UPDATE_IF, 680acf3e2dSflorian IMSG_REMOVE_IF, 690acf3e2dSflorian IMSG_RA, 700acf3e2dSflorian IMSG_PROPOSAL, 710acf3e2dSflorian IMSG_PROPOSAL_ACK, 720acf3e2dSflorian IMSG_CONFIGURE_ADDRESS, 730acf3e2dSflorian IMSG_DEL_ADDRESS, 74d3ff3477Sflorian IMSG_DEL_ROUTE, 750acf3e2dSflorian IMSG_FAKE_ACK, 760acf3e2dSflorian IMSG_CONFIGURE_DFR, 770acf3e2dSflorian IMSG_WITHDRAW_DFR, 7805b87f88Sflorian IMSG_DUP_ADDRESS, 790acf3e2dSflorian }; 800acf3e2dSflorian 810acf3e2dSflorian enum { 820acf3e2dSflorian PROC_MAIN, 830acf3e2dSflorian PROC_ENGINE, 840acf3e2dSflorian PROC_FRONTEND 850acf3e2dSflorian } slaacd_process; 860acf3e2dSflorian 87bca4d785Sflorian enum rpref { 88bca4d785Sflorian LOW, 89bca4d785Sflorian MEDIUM, 90bca4d785Sflorian HIGH, 91bca4d785Sflorian }; 92bca4d785Sflorian 93bf0ed931Sflorian #ifndef SMALL 940acf3e2dSflorian struct ctl_engine_info { 950acf3e2dSflorian uint32_t if_index; 960acf3e2dSflorian int running; 970acf3e2dSflorian int autoconfprivacy; 98b9b376fbSflorian int soii; 990acf3e2dSflorian struct ether_addr hw_address; 1000acf3e2dSflorian struct sockaddr_in6 ll_address; 1010acf3e2dSflorian }; 1020acf3e2dSflorian 1030acf3e2dSflorian struct ctl_engine_info_ra { 1040acf3e2dSflorian struct sockaddr_in6 from; 1050acf3e2dSflorian struct timespec when; 1060acf3e2dSflorian struct timespec uptime; 1070acf3e2dSflorian uint8_t curhoplimit; 1080acf3e2dSflorian int managed; 1090acf3e2dSflorian int other; 1100acf3e2dSflorian char rpref[sizeof("MEDIUM")]; 1110acf3e2dSflorian uint16_t router_lifetime; /* in seconds */ 1120acf3e2dSflorian uint32_t reachable_time; /* in milliseconds */ 1130acf3e2dSflorian uint32_t retrans_time; /* in milliseconds */ 114*884d1deeSbket uint32_t mtu; 1150acf3e2dSflorian }; 1160acf3e2dSflorian 1170acf3e2dSflorian struct ctl_engine_info_ra_prefix { 1180acf3e2dSflorian struct in6_addr prefix; 1190acf3e2dSflorian uint8_t prefix_len; 1200acf3e2dSflorian int onlink; 1210acf3e2dSflorian int autonomous; 1220acf3e2dSflorian uint32_t vltime; 1230acf3e2dSflorian uint32_t pltime; 1240acf3e2dSflorian }; 1250acf3e2dSflorian 1260acf3e2dSflorian struct ctl_engine_info_ra_rdns { 1270acf3e2dSflorian uint32_t lifetime; 1280acf3e2dSflorian struct in6_addr rdns; 1290acf3e2dSflorian }; 1300acf3e2dSflorian 1310acf3e2dSflorian struct ctl_engine_info_ra_dnssl { 1320acf3e2dSflorian uint32_t lifetime; 1330acf3e2dSflorian char dnssl[SLAACD_MAX_DNSSL]; 1340acf3e2dSflorian }; 1350acf3e2dSflorian 1360acf3e2dSflorian struct ctl_engine_info_address_proposal { 1370acf3e2dSflorian int64_t id; 1380acf3e2dSflorian char state[sizeof("PROPOSAL_NEARLY_EXPIRED")]; 1393e9e3174Sflorian time_t next_timeout; 1400acf3e2dSflorian int timeout_count; 1410acf3e2dSflorian struct timespec when; 1420acf3e2dSflorian struct timespec uptime; 1430acf3e2dSflorian struct sockaddr_in6 addr; 1440acf3e2dSflorian struct in6_addr prefix; 1450acf3e2dSflorian int privacy; 1460acf3e2dSflorian uint8_t prefix_len; 1470acf3e2dSflorian uint32_t vltime; 1480acf3e2dSflorian uint32_t pltime; 1490acf3e2dSflorian }; 1500acf3e2dSflorian 1510acf3e2dSflorian struct ctl_engine_info_dfr_proposal { 1520acf3e2dSflorian int64_t id; 1530acf3e2dSflorian char state[sizeof("PROPOSAL_NEARLY_EXPIRED")]; 1543e9e3174Sflorian time_t next_timeout; 1550acf3e2dSflorian int timeout_count; 1560acf3e2dSflorian struct timespec when; 1570acf3e2dSflorian struct timespec uptime; 1580acf3e2dSflorian struct sockaddr_in6 addr; 1590acf3e2dSflorian uint32_t router_lifetime; 1600acf3e2dSflorian char rpref[sizeof("MEDIUM")]; 1610acf3e2dSflorian }; 162060a7308Sflorian 163060a7308Sflorian struct imsg_addrinfo { 164060a7308Sflorian uint32_t if_index; 165060a7308Sflorian struct ether_addr hw_address; 166060a7308Sflorian struct sockaddr_in6 ll_address; 167060a7308Sflorian struct sockaddr_in6 addr; 168060a7308Sflorian struct in6_addr mask; 169060a7308Sflorian int privacy; 170060a7308Sflorian uint32_t vltime; 171060a7308Sflorian uint32_t pltime; 172060a7308Sflorian }; 17396316c8dSflorian 17496316c8dSflorian struct imsg_link_state { 17596316c8dSflorian uint32_t if_index; 17696316c8dSflorian int link_state; 17796316c8dSflorian }; 178bf0ed931Sflorian #endif /* SMALL */ 1790acf3e2dSflorian 1800acf3e2dSflorian struct imsg_ifinfo { 1810acf3e2dSflorian uint32_t if_index; 1820acf3e2dSflorian int running; 1830acf3e2dSflorian int autoconfprivacy; 184b9b376fbSflorian int soii; 1850acf3e2dSflorian struct ether_addr hw_address; 1860acf3e2dSflorian struct sockaddr_in6 ll_address; 187b9b376fbSflorian uint8_t soiikey[SLAACD_SOIIKEY_LEN]; 1880acf3e2dSflorian }; 1890acf3e2dSflorian 1900acf3e2dSflorian struct imsg_del_addr { 1910acf3e2dSflorian uint32_t if_index; 1920acf3e2dSflorian struct sockaddr_in6 addr; 1930acf3e2dSflorian }; 1940acf3e2dSflorian 195d3ff3477Sflorian struct imsg_del_route { 196d3ff3477Sflorian uint32_t if_index; 197d3ff3477Sflorian struct sockaddr_in6 gw; 198d3ff3477Sflorian }; 199d3ff3477Sflorian 2000acf3e2dSflorian struct imsg_proposal_ack { 2010acf3e2dSflorian int64_t id; 2020acf3e2dSflorian pid_t pid; 2030acf3e2dSflorian uint32_t if_index; 2040acf3e2dSflorian }; 2050acf3e2dSflorian 2060acf3e2dSflorian struct imsg_ra { 2070acf3e2dSflorian uint32_t if_index; 2080acf3e2dSflorian struct sockaddr_in6 from; 2090acf3e2dSflorian ssize_t len; 2100acf3e2dSflorian uint8_t packet[1500]; 2110acf3e2dSflorian }; 2120acf3e2dSflorian 21305b87f88Sflorian struct imsg_dup_addr { 21405b87f88Sflorian uint32_t if_index; 21505b87f88Sflorian struct sockaddr_in6 addr; 21605b87f88Sflorian }; 21705b87f88Sflorian 2180acf3e2dSflorian /* slaacd.c */ 2190acf3e2dSflorian void imsg_event_add(struct imsgev *); 2200acf3e2dSflorian int imsg_compose_event(struct imsgev *, uint16_t, uint32_t, pid_t, 2210acf3e2dSflorian int, void *, uint16_t); 2225ab5607cSflorian #ifndef SMALL 2235ab5607cSflorian const char *sin6_to_str(struct sockaddr_in6 *); 2245ab5607cSflorian #else 2255ab5607cSflorian #define sin6_to_str(x...) "" 2265ab5607cSflorian #endif /* SMALL */ 227