unix: add WireGuard generic netlink interface constants on Linux

Change-Id: I619c49f745da8cfd17bc2aae28d97aff73daf4d5
Reviewed-on: https://go-review.googlesource.com/c/sys/+/371674
Trust: Matt Layher <mdlayher@gmail.com>
Run-TryBot: Matt Layher <mdlayher@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/unix/linux/types.go b/unix/linux/types.go
index e28a937..7d5ff91 100644
--- a/unix/linux/types.go
+++ b/unix/linux/types.go
@@ -135,6 +135,7 @@
 #include <linux/taskstats.h>
 #include <linux/tipc.h>
 #include <linux/watchdog.h>
+#include <linux/wireguard.h>
 #include <linux/vm_sockets.h>
 
 #include <mtd/mtd-user.h>
@@ -3881,3 +3882,40 @@
 // mount_setattr
 
 type MountAttr C.struct_mount_attr
+
+// WireGuard generic netlink interface
+
+// Generated by:
+// perl -nlE '/^\s*(WG\w+)/ && say "$1 = C.$1"' /usr/include/linux/wireguard.h
+const (
+	WG_CMD_GET_DEVICE                      = C.WG_CMD_GET_DEVICE
+	WG_CMD_SET_DEVICE                      = C.WG_CMD_SET_DEVICE
+	WGDEVICE_F_REPLACE_PEERS               = C.WGDEVICE_F_REPLACE_PEERS
+	WGDEVICE_A_UNSPEC                      = C.WGDEVICE_A_UNSPEC
+	WGDEVICE_A_IFINDEX                     = C.WGDEVICE_A_IFINDEX
+	WGDEVICE_A_IFNAME                      = C.WGDEVICE_A_IFNAME
+	WGDEVICE_A_PRIVATE_KEY                 = C.WGDEVICE_A_PRIVATE_KEY
+	WGDEVICE_A_PUBLIC_KEY                  = C.WGDEVICE_A_PUBLIC_KEY
+	WGDEVICE_A_FLAGS                       = C.WGDEVICE_A_FLAGS
+	WGDEVICE_A_LISTEN_PORT                 = C.WGDEVICE_A_LISTEN_PORT
+	WGDEVICE_A_FWMARK                      = C.WGDEVICE_A_FWMARK
+	WGDEVICE_A_PEERS                       = C.WGDEVICE_A_PEERS
+	WGPEER_F_REMOVE_ME                     = C.WGPEER_F_REMOVE_ME
+	WGPEER_F_REPLACE_ALLOWEDIPS            = C.WGPEER_F_REPLACE_ALLOWEDIPS
+	WGPEER_F_UPDATE_ONLY                   = C.WGPEER_F_UPDATE_ONLY
+	WGPEER_A_UNSPEC                        = C.WGPEER_A_UNSPEC
+	WGPEER_A_PUBLIC_KEY                    = C.WGPEER_A_PUBLIC_KEY
+	WGPEER_A_PRESHARED_KEY                 = C.WGPEER_A_PRESHARED_KEY
+	WGPEER_A_FLAGS                         = C.WGPEER_A_FLAGS
+	WGPEER_A_ENDPOINT                      = C.WGPEER_A_ENDPOINT
+	WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL = C.WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL
+	WGPEER_A_LAST_HANDSHAKE_TIME           = C.WGPEER_A_LAST_HANDSHAKE_TIME
+	WGPEER_A_RX_BYTES                      = C.WGPEER_A_RX_BYTES
+	WGPEER_A_TX_BYTES                      = C.WGPEER_A_TX_BYTES
+	WGPEER_A_ALLOWEDIPS                    = C.WGPEER_A_ALLOWEDIPS
+	WGPEER_A_PROTOCOL_VERSION              = C.WGPEER_A_PROTOCOL_VERSION
+	WGALLOWEDIP_A_UNSPEC                   = C.WGALLOWEDIP_A_UNSPEC
+	WGALLOWEDIP_A_FAMILY                   = C.WGALLOWEDIP_A_FAMILY
+	WGALLOWEDIP_A_IPADDR                   = C.WGALLOWEDIP_A_IPADDR
+	WGALLOWEDIP_A_CIDR_MASK                = C.WGALLOWEDIP_A_CIDR_MASK
+)
diff --git a/unix/mkerrors.sh b/unix/mkerrors.sh
index 4945739..a47b035 100755
--- a/unix/mkerrors.sh
+++ b/unix/mkerrors.sh
@@ -261,6 +261,7 @@
 #include <linux/vm_sockets.h>
 #include <linux/wait.h>
 #include <linux/watchdog.h>
+#include <linux/wireguard.h>
 
 #include <mtd/ubi-user.h>
 #include <mtd/mtd-user.h>
@@ -606,6 +607,7 @@
 		$2 ~ /^MTD/ ||
 		$2 ~ /^OTP/ ||
 		$2 ~ /^MEM/ ||
+		$2 ~ /^WG/ ||
 		$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)}
 		$2 ~ /^__WCOREFLAG$/ {next}
 		$2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)}
diff --git a/unix/zerrors_linux.go b/unix/zerrors_linux.go
index d175aae..bcc45d1 100644
--- a/unix/zerrors_linux.go
+++ b/unix/zerrors_linux.go
@@ -2826,6 +2826,13 @@
 	WDIOS_TEMPPANIC                             = 0x4
 	WDIOS_UNKNOWN                               = -0x1
 	WEXITED                                     = 0x4
+	WGALLOWEDIP_A_MAX                           = 0x3
+	WGDEVICE_A_MAX                              = 0x8
+	WGPEER_A_MAX                                = 0xa
+	WG_CMD_MAX                                  = 0x1
+	WG_GENL_NAME                                = "wireguard"
+	WG_GENL_VERSION                             = 0x1
+	WG_KEY_LEN                                  = 0x20
 	WIN_ACKMEDIACHANGE                          = 0xdb
 	WIN_CHECKPOWERMODE1                         = 0xe5
 	WIN_CHECKPOWERMODE2                         = 0x98
diff --git a/unix/ztypes_linux.go b/unix/ztypes_linux.go
index af18e4f..e76b7f6 100644
--- a/unix/ztypes_linux.go
+++ b/unix/ztypes_linux.go
@@ -3976,3 +3976,36 @@
 	Propagation uint64
 	Userns_fd   uint64
 }
+
+const (
+	WG_CMD_GET_DEVICE                      = 0x0
+	WG_CMD_SET_DEVICE                      = 0x1
+	WGDEVICE_F_REPLACE_PEERS               = 0x1
+	WGDEVICE_A_UNSPEC                      = 0x0
+	WGDEVICE_A_IFINDEX                     = 0x1
+	WGDEVICE_A_IFNAME                      = 0x2
+	WGDEVICE_A_PRIVATE_KEY                 = 0x3
+	WGDEVICE_A_PUBLIC_KEY                  = 0x4
+	WGDEVICE_A_FLAGS                       = 0x5
+	WGDEVICE_A_LISTEN_PORT                 = 0x6
+	WGDEVICE_A_FWMARK                      = 0x7
+	WGDEVICE_A_PEERS                       = 0x8
+	WGPEER_F_REMOVE_ME                     = 0x1
+	WGPEER_F_REPLACE_ALLOWEDIPS            = 0x2
+	WGPEER_F_UPDATE_ONLY                   = 0x4
+	WGPEER_A_UNSPEC                        = 0x0
+	WGPEER_A_PUBLIC_KEY                    = 0x1
+	WGPEER_A_PRESHARED_KEY                 = 0x2
+	WGPEER_A_FLAGS                         = 0x3
+	WGPEER_A_ENDPOINT                      = 0x4
+	WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL = 0x5
+	WGPEER_A_LAST_HANDSHAKE_TIME           = 0x6
+	WGPEER_A_RX_BYTES                      = 0x7
+	WGPEER_A_TX_BYTES                      = 0x8
+	WGPEER_A_ALLOWEDIPS                    = 0x9
+	WGPEER_A_PROTOCOL_VERSION              = 0xa
+	WGALLOWEDIP_A_UNSPEC                   = 0x0
+	WGALLOWEDIP_A_FAMILY                   = 0x1
+	WGALLOWEDIP_A_IPADDR                   = 0x2
+	WGALLOWEDIP_A_CIDR_MASK                = 0x3
+)