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