xref: /openbsd/sbin/slaacd/slaacd.h (revision 884d1dee)
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