xref: /openbsd/sys/net/if_wg.h (revision c5093773)
1 /*	$OpenBSD: if_wg.h,v 1.6 2024/10/13 00:53:21 jsg Exp $ */
2 
3 /*
4  * Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
5  * Copyright (C) 2019-2020 Matt Dunwoodie <ncon@noconroy.net>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #ifndef __IF_WG_H__
21 #define __IF_WG_H__
22 
23 #include <net/if.h>
24 #include <netinet/in.h>
25 
26 
27 /*
28  * This is the public interface to the WireGuard network interface.
29  *
30  * It is designed to be used by tools such as ifconfig(8) and wg(8).
31  */
32 
33 #define WG_KEY_LEN 32
34 
35 /*
36  * These ioctls do not need a NETLOCK as they use their own locks to serialise
37  * access.
38  */
39 #define SIOCSWG _IOWR('i', 210, struct wg_data_io)
40 #define SIOCGWG _IOWR('i', 211, struct wg_data_io)
41 
42 #define a_ipv4	a_addr.addr_ipv4
43 #define a_ipv6	a_addr.addr_ipv6
44 
45 struct wg_aip_io {
46 	sa_family_t	 a_af;
47 	int		 a_cidr;
48 	union wg_aip_addr {
49 		struct in_addr		addr_ipv4;
50 		struct in6_addr		addr_ipv6;
51 	}		 a_addr;
52 };
53 
54 #define WG_PEER_HAS_PUBLIC		(1 << 0)
55 #define WG_PEER_HAS_PSK			(1 << 1)
56 #define WG_PEER_HAS_PKA			(1 << 2)
57 #define WG_PEER_HAS_ENDPOINT		(1 << 3)
58 #define WG_PEER_REPLACE_AIPS		(1 << 4)
59 #define WG_PEER_REMOVE			(1 << 5)
60 #define WG_PEER_UPDATE			(1 << 6)
61 #define WG_PEER_SET_DESCRIPTION		(1 << 7)
62 
63 #define p_sa		p_endpoint.sa_sa
64 #define p_sin		p_endpoint.sa_sin
65 #define p_sin6		p_endpoint.sa_sin6
66 
67 struct wg_peer_io {
68 	int			p_flags;
69 	int			p_protocol_version;
70 	uint8_t			p_public[WG_KEY_LEN];
71 	uint8_t			p_psk[WG_KEY_LEN];
72 	uint16_t		p_pka;
73 	union wg_peer_endpoint {
74 		struct sockaddr		sa_sa;
75 		struct sockaddr_in	sa_sin;
76 		struct sockaddr_in6	sa_sin6;
77 	}			p_endpoint;
78 	uint64_t		p_txbytes;
79 	uint64_t		p_rxbytes;
80 	struct timespec		p_last_handshake; /* nanotime */
81 	char			p_description[IFDESCRSIZE];
82 	size_t			p_aips_count;
83 	struct wg_aip_io	p_aips[];
84 };
85 
86 #define WG_INTERFACE_HAS_PUBLIC		(1 << 0)
87 #define WG_INTERFACE_HAS_PRIVATE	(1 << 1)
88 #define WG_INTERFACE_HAS_PORT		(1 << 2)
89 #define WG_INTERFACE_HAS_RTABLE		(1 << 3)
90 #define WG_INTERFACE_REPLACE_PEERS	(1 << 4)
91 
92 struct wg_interface_io {
93 	uint8_t			i_flags;
94 	in_port_t		i_port;
95 	int			i_rtable;
96 	uint8_t			i_public[WG_KEY_LEN];
97 	uint8_t			i_private[WG_KEY_LEN];
98 	size_t			i_peers_count;
99 	struct wg_peer_io	i_peers[];
100 };
101 
102 struct wg_data_io {
103 	char	 		 wgd_name[IFNAMSIZ];
104 	size_t			 wgd_size;	/* total size of the memory pointed to by wgd_interface */
105 	struct wg_interface_io	*wgd_interface;
106 };
107 
108 #endif /* __IF_WG_H__ */
109