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