mirror of
https://github.com/amnezia-vpn/amneziawg-tools.git
synced 2025-08-01 17:12:50 +02:00
feat: first batch of awg-1.5
This commit is contained in:
parent
c0b400c6df
commit
71219488c1
6 changed files with 990 additions and 632 deletions
|
@ -57,6 +57,15 @@ enum wgdevice_attribute {
|
|||
WGDEVICE_A_H2,
|
||||
WGDEVICE_A_H3,
|
||||
WGDEVICE_A_H4,
|
||||
WGDEVICE_A_I1,
|
||||
WGDEVICE_A_I2,
|
||||
WGDEVICE_A_I3,
|
||||
WGDEVICE_A_I4,
|
||||
WGDEVICE_A_I5,
|
||||
WGDEVICE_A_J1,
|
||||
WGDEVICE_A_J2,
|
||||
WGDEVICE_A_J3,
|
||||
WGDEVICE_A_ITIME,
|
||||
__WGDEVICE_A_LAST
|
||||
};
|
||||
|
||||
|
|
135
src/config.c
135
src/config.c
|
@ -410,13 +410,29 @@ err:
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline bool parse_string(char **device_value, const char *name, const char *value) {
|
||||
size_t len = strlen(value);
|
||||
if (!len) {
|
||||
fprintf(stderr, "Unable to parse empty string for: %s\n", name);
|
||||
return false;
|
||||
}
|
||||
|
||||
if( len >= MAX_AWG_JUNK_LEN) {
|
||||
fprintf(stderr, "Unable to process hex string longer than: %d\n", MAX_AWG_JUNK_LEN);
|
||||
return false;
|
||||
}
|
||||
*device_value = strdup(value);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool parse_uint16(uint16_t *device_value, const char *name, const char *value) {
|
||||
|
||||
if (!strlen(value)) {
|
||||
fprintf(stderr, "Unable to parse empty string\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
char *end;
|
||||
uint32_t ret;
|
||||
ret = strtoul(value, &end, 10);
|
||||
|
@ -558,6 +574,42 @@ static bool process_line(struct config_ctx *ctx, const char *line)
|
|||
ret = parse_uint32(&ctx->device->transport_packet_magic_header, "H4", value);
|
||||
if (ret)
|
||||
ctx->device->flags |= WGDEVICE_HAS_H4;
|
||||
} else if (key_match("I1")) {
|
||||
ret = parse_string(&ctx->device->i1, "I1", value);
|
||||
if (ret)
|
||||
ctx->device->flags |= WGDEVICE_HAS_I1;
|
||||
} else if (key_match("I2")) {
|
||||
ret = parse_string(&ctx->device->i2, "I2", value);
|
||||
if (ret)
|
||||
ctx->device->flags |= WGDEVICE_HAS_I2;
|
||||
} else if (key_match("I3")) {
|
||||
ret = parse_string(&ctx->device->i3, "I3", value);
|
||||
if (ret)
|
||||
ctx->device->flags |= WGDEVICE_HAS_I3;
|
||||
} else if (key_match("I4")) {
|
||||
ret = parse_string(&ctx->device->i4, "I4", value);
|
||||
if (ret)
|
||||
ctx->device->flags |= WGDEVICE_HAS_I4;
|
||||
} else if (key_match("I5")) {
|
||||
ret = parse_string(&ctx->device->i5, "I5", value);
|
||||
if (ret)
|
||||
ctx->device->flags |= WGDEVICE_HAS_I5;
|
||||
} else if (key_match("J1")) {
|
||||
ret = parse_string(&ctx->device->j1, "J1", value);
|
||||
if (ret)
|
||||
ctx->device->flags |= WGDEVICE_HAS_J1;
|
||||
} else if (key_match("J2")) {
|
||||
ret = parse_string(&ctx->device->j2, "J2", value);
|
||||
if (ret)
|
||||
ctx->device->flags |= WGDEVICE_HAS_J2;
|
||||
} else if (key_match("J3")) {
|
||||
ret = parse_string(&ctx->device->j3, "J3", value);
|
||||
if (ret)
|
||||
ctx->device->flags |= WGDEVICE_HAS_J3;
|
||||
} else if (key_match("ITIME")) {
|
||||
ret = parse_string(&ctx->device->itime, "Itime", value);
|
||||
if (ret)
|
||||
ctx->device->flags |= WGDEVICE_HAS_ITIME;
|
||||
} else
|
||||
goto error;
|
||||
} else if (ctx->is_peer_section) {
|
||||
|
@ -703,66 +755,129 @@ struct wgdevice *config_read_cmd(const char *argv[], int argc)
|
|||
} else if (!strcmp(argv[0], "jc") && argc >= 2 && !peer) {
|
||||
if (!parse_uint16(&device->junk_packet_count, "jc", argv[1]))
|
||||
goto error;
|
||||
|
||||
|
||||
device->flags |= WGDEVICE_HAS_JC;
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
} else if (!strcmp(argv[0], "jmin") && argc >= 2 && !peer) {
|
||||
if (!parse_uint16(&device->junk_packet_min_size, "jmin", argv[1]))
|
||||
goto error;
|
||||
|
||||
|
||||
device->flags |= WGDEVICE_HAS_JMIN;
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
} else if (!strcmp(argv[0], "jmax") && argc >= 2 && !peer) {
|
||||
if (!parse_uint16(&device->junk_packet_max_size, "jmax", argv[1]))
|
||||
goto error;
|
||||
|
||||
|
||||
device->flags |= WGDEVICE_HAS_JMAX;
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
} else if (!strcmp(argv[0], "s1") && argc >= 2 && !peer) {
|
||||
if (!parse_uint16(&device->init_packet_junk_size, "s1", argv[1]))
|
||||
goto error;
|
||||
|
||||
|
||||
device->flags |= WGDEVICE_HAS_S1;
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
} else if (!strcmp(argv[0], "s2") && argc >= 2 && !peer) {
|
||||
if (!parse_uint16(&device->response_packet_junk_size, "s2", argv[1]))
|
||||
goto error;
|
||||
|
||||
|
||||
device->flags |= WGDEVICE_HAS_S2;
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
} else if (!strcmp(argv[0], "h1") && argc >= 2 && !peer) {
|
||||
if (!parse_uint32(&device->init_packet_magic_header, "h1", argv[1]))
|
||||
goto error;
|
||||
|
||||
|
||||
device->flags |= WGDEVICE_HAS_H1;
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
} else if (!strcmp(argv[0], "h2") && argc >= 2 && !peer) {
|
||||
if (!parse_uint32(&device->response_packet_magic_header, "h2", argv[1]))
|
||||
goto error;
|
||||
|
||||
|
||||
device->flags |= WGDEVICE_HAS_H2;
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
} else if (!strcmp(argv[0], "h3") && argc >= 2 && !peer) {
|
||||
if (!parse_uint32(&device->underload_packet_magic_header, "h3", argv[1]))
|
||||
goto error;
|
||||
|
||||
|
||||
device->flags |= WGDEVICE_HAS_H3;
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
} else if (!strcmp(argv[0], "h4") && argc >= 2 && !peer) {
|
||||
if (!parse_uint32(&device->transport_packet_magic_header, "h4", argv[1]))
|
||||
goto error;
|
||||
|
||||
|
||||
device->flags |= WGDEVICE_HAS_H4;
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
} else if (!strcmp(argv[0], "i1") && argc >= 2 && !peer) {
|
||||
if (!parse_string(&device->i1, "i1", argv[1]))
|
||||
goto error;
|
||||
|
||||
device->flags |= WGDEVICE_HAS_I1;
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
} else if (!strcmp(argv[0], "i2") && argc >= 2 && !peer) {
|
||||
if (!parse_string(&device->i2, "i2", argv[1]))
|
||||
goto error;
|
||||
|
||||
device->flags |= WGDEVICE_HAS_I2;
|
||||
argv += 2;
|
||||
argc -=2;
|
||||
} else if (!strcmp(argv[0], "i3") && argc >= 2 && !peer) {
|
||||
if (!parse_string(&device->i3, "i3", argv[1]))
|
||||
goto error;
|
||||
|
||||
device->flags |= WGDEVICE_HAS_I3;
|
||||
argv += 2;
|
||||
argc -=2;
|
||||
} else if (!strcmp(argv[0], "i4") && argc >= 2 && !peer) {
|
||||
if (!parse_string(&device->i4, "i4", argv[1]))
|
||||
goto error;
|
||||
|
||||
device->flags |= WGDEVICE_HAS_I4;
|
||||
argv += 2;
|
||||
argc -=2;
|
||||
} else if (!strcmp(argv[0], "i5") && argc >= 2 && !peer) {
|
||||
if (!parse_string(&device->i5, "i5", argv[1]))
|
||||
goto error;
|
||||
|
||||
device->flags |= WGDEVICE_HAS_I5;
|
||||
argv += 2;
|
||||
argc -=2;
|
||||
} else if (!strcmp(argv[0], "j1") && argc >= 2 && !peer) {
|
||||
if (!parse_string(&device->j1, "j1", argv[1]))
|
||||
goto error;
|
||||
|
||||
device->flags |= WGDEVICE_HAS_J1;
|
||||
argv += 2;
|
||||
argc -=2;
|
||||
} else if (!strcmp(argv[0], "j2") && argc >= 2 && !peer) {
|
||||
if (!parse_string(&device->j2, "j2", argv[1]))
|
||||
goto error;
|
||||
|
||||
device->flags |= WGDEVICE_HAS_J2;
|
||||
argv += 2;
|
||||
argc -=2;
|
||||
} else if (!strcmp(argv[0], "j3") && argc >= 2 && !peer) {
|
||||
if (!parse_string(&device->j3, "j3", argv[1]))
|
||||
goto error;
|
||||
|
||||
device->flags |= WGDEVICE_HAS_J3;
|
||||
argv += 2;
|
||||
argc -=2;
|
||||
} else if (!strcmp(argv[0], "itime") && argc >= 2 && !peer) {
|
||||
if (!parse_string(&device->itime, "itime", argv[1]))
|
||||
goto error;
|
||||
|
||||
device->flags |= WGDEVICE_HAS_ITIME;
|
||||
argv += 2;
|
||||
argc -=2;
|
||||
} else if (!strcmp(argv[0], "peer") && argc >= 2) {
|
||||
struct wgpeer *new_peer = calloc(1, sizeof(*new_peer));
|
||||
|
||||
|
|
248
src/containers.h
248
src/containers.h
|
@ -6,13 +6,13 @@
|
|||
#ifndef CONTAINERS_H
|
||||
#define CONTAINERS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
#include <netinet/in.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/socket.h>
|
||||
#include <time.h>
|
||||
#if defined(__linux__)
|
||||
#include <linux/wireguard.h>
|
||||
#elif defined(__OpenBSD__)
|
||||
|
@ -23,108 +23,146 @@
|
|||
#define WG_KEY_LEN 32
|
||||
#endif
|
||||
|
||||
#ifndef MAX_AWG_JUNK_LEN
|
||||
#define MAX_AWG_JUNK_LEN 5 * 1024
|
||||
#endif
|
||||
|
||||
/* Cross platform __kernel_timespec */
|
||||
struct timespec64 {
|
||||
int64_t tv_sec;
|
||||
int64_t tv_nsec;
|
||||
};
|
||||
|
||||
struct wgallowedip {
|
||||
uint16_t family;
|
||||
union {
|
||||
struct in_addr ip4;
|
||||
struct in6_addr ip6;
|
||||
};
|
||||
uint8_t cidr;
|
||||
struct wgallowedip *next_allowedip;
|
||||
};
|
||||
|
||||
enum {
|
||||
WGPEER_REMOVE_ME = 1U << 0,
|
||||
WGPEER_REPLACE_ALLOWEDIPS = 1U << 1,
|
||||
WGPEER_HAS_PUBLIC_KEY = 1U << 2,
|
||||
WGPEER_HAS_PRESHARED_KEY = 1U << 3,
|
||||
WGPEER_HAS_PERSISTENT_KEEPALIVE_INTERVAL = 1U << 4,
|
||||
WGPEER_HAS_ADVANCED_SECURITY = 1U << 5
|
||||
};
|
||||
|
||||
struct wgpeer {
|
||||
uint32_t flags;
|
||||
|
||||
uint8_t public_key[WG_KEY_LEN];
|
||||
uint8_t preshared_key[WG_KEY_LEN];
|
||||
|
||||
union {
|
||||
struct sockaddr addr;
|
||||
struct sockaddr_in addr4;
|
||||
struct sockaddr_in6 addr6;
|
||||
} endpoint;
|
||||
|
||||
struct timespec64 last_handshake_time;
|
||||
uint64_t rx_bytes, tx_bytes;
|
||||
uint16_t persistent_keepalive_interval;
|
||||
|
||||
bool advanced_security;
|
||||
|
||||
struct wgallowedip *first_allowedip, *last_allowedip;
|
||||
struct wgpeer *next_peer;
|
||||
};
|
||||
|
||||
enum {
|
||||
WGDEVICE_REPLACE_PEERS = 1U << 0,
|
||||
WGDEVICE_HAS_PRIVATE_KEY = 1U << 1,
|
||||
WGDEVICE_HAS_PUBLIC_KEY = 1U << 2,
|
||||
WGDEVICE_HAS_LISTEN_PORT = 1U << 3,
|
||||
WGDEVICE_HAS_FWMARK = 1U << 4,
|
||||
WGDEVICE_HAS_JC = 1U << 5,
|
||||
WGDEVICE_HAS_JMIN = 1U << 6,
|
||||
WGDEVICE_HAS_JMAX = 1U << 7,
|
||||
WGDEVICE_HAS_S1 = 1U << 8,
|
||||
WGDEVICE_HAS_S2 = 1U << 9,
|
||||
WGDEVICE_HAS_H1 = 1U << 10,
|
||||
WGDEVICE_HAS_H2 = 1U << 11,
|
||||
WGDEVICE_HAS_H3 = 1U << 12,
|
||||
WGDEVICE_HAS_H4 = 1U << 13
|
||||
};
|
||||
|
||||
struct wgdevice {
|
||||
char name[IFNAMSIZ];
|
||||
uint32_t ifindex;
|
||||
|
||||
uint32_t flags;
|
||||
|
||||
uint8_t public_key[WG_KEY_LEN];
|
||||
uint8_t private_key[WG_KEY_LEN];
|
||||
|
||||
uint32_t fwmark;
|
||||
uint16_t listen_port;
|
||||
|
||||
struct wgpeer *first_peer, *last_peer;
|
||||
|
||||
uint16_t junk_packet_count;
|
||||
uint16_t junk_packet_min_size;
|
||||
uint16_t junk_packet_max_size;
|
||||
uint16_t init_packet_junk_size;
|
||||
uint16_t response_packet_junk_size;
|
||||
uint32_t init_packet_magic_header;
|
||||
uint32_t response_packet_magic_header;
|
||||
uint32_t underload_packet_magic_header;
|
||||
uint32_t transport_packet_magic_header;
|
||||
};
|
||||
|
||||
#define for_each_wgpeer(__dev, __peer) for ((__peer) = (__dev)->first_peer; (__peer); (__peer) = (__peer)->next_peer)
|
||||
#define for_each_wgallowedip(__peer, __allowedip) for ((__allowedip) = (__peer)->first_allowedip; (__allowedip); (__allowedip) = (__allowedip)->next_allowedip)
|
||||
|
||||
static inline void free_wgdevice(struct wgdevice *dev)
|
||||
struct timespec64
|
||||
{
|
||||
if (!dev)
|
||||
return;
|
||||
for (struct wgpeer *peer = dev->first_peer, *np = peer ? peer->next_peer : NULL; peer; peer = np, np = peer ? peer->next_peer : NULL) {
|
||||
for (struct wgallowedip *allowedip = peer->first_allowedip, *na = allowedip ? allowedip->next_allowedip : NULL; allowedip; allowedip = na, na = allowedip ? allowedip->next_allowedip : NULL)
|
||||
free(allowedip);
|
||||
free(peer);
|
||||
}
|
||||
free(dev);
|
||||
int64_t tv_sec;
|
||||
int64_t tv_nsec;
|
||||
};
|
||||
|
||||
struct wgallowedip
|
||||
{
|
||||
uint16_t family;
|
||||
union
|
||||
{
|
||||
struct in_addr ip4;
|
||||
struct in6_addr ip6;
|
||||
};
|
||||
uint8_t cidr;
|
||||
struct wgallowedip* next_allowedip;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
WGPEER_REMOVE_ME = 1U << 0,
|
||||
WGPEER_REPLACE_ALLOWEDIPS = 1U << 1,
|
||||
WGPEER_HAS_PUBLIC_KEY = 1U << 2,
|
||||
WGPEER_HAS_PRESHARED_KEY = 1U << 3,
|
||||
WGPEER_HAS_PERSISTENT_KEEPALIVE_INTERVAL = 1U << 4,
|
||||
WGPEER_HAS_ADVANCED_SECURITY = 1U << 5
|
||||
};
|
||||
|
||||
struct wgpeer
|
||||
{
|
||||
uint32_t flags;
|
||||
|
||||
uint8_t public_key[WG_KEY_LEN];
|
||||
uint8_t preshared_key[WG_KEY_LEN];
|
||||
|
||||
union
|
||||
{
|
||||
struct sockaddr addr;
|
||||
struct sockaddr_in addr4;
|
||||
struct sockaddr_in6 addr6;
|
||||
} endpoint;
|
||||
|
||||
struct timespec64 last_handshake_time;
|
||||
uint64_t rx_bytes, tx_bytes;
|
||||
uint16_t persistent_keepalive_interval;
|
||||
|
||||
bool advanced_security;
|
||||
|
||||
struct wgallowedip *first_allowedip, *last_allowedip;
|
||||
struct wgpeer* next_peer;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
WGDEVICE_REPLACE_PEERS = 1U << 0,
|
||||
WGDEVICE_HAS_PRIVATE_KEY = 1U << 1,
|
||||
WGDEVICE_HAS_PUBLIC_KEY = 1U << 2,
|
||||
WGDEVICE_HAS_LISTEN_PORT = 1U << 3,
|
||||
WGDEVICE_HAS_FWMARK = 1U << 4,
|
||||
WGDEVICE_HAS_JC = 1U << 5,
|
||||
WGDEVICE_HAS_JMIN = 1U << 6,
|
||||
WGDEVICE_HAS_JMAX = 1U << 7,
|
||||
WGDEVICE_HAS_S1 = 1U << 8,
|
||||
WGDEVICE_HAS_S2 = 1U << 9,
|
||||
WGDEVICE_HAS_H1 = 1U << 10,
|
||||
WGDEVICE_HAS_H2 = 1U << 11,
|
||||
WGDEVICE_HAS_H3 = 1U << 12,
|
||||
WGDEVICE_HAS_H4 = 1U << 13,
|
||||
WGDEVICE_HAS_I1 = 1U << 14,
|
||||
WGDEVICE_HAS_I2 = 1U << 15,
|
||||
WGDEVICE_HAS_I3 = 1U << 16,
|
||||
WGDEVICE_HAS_I4 = 1U << 17,
|
||||
WGDEVICE_HAS_I5 = 1U << 18,
|
||||
WGDEVICE_HAS_J1 = 1U << 19,
|
||||
WGDEVICE_HAS_J2 = 1U << 20,
|
||||
WGDEVICE_HAS_J3 = 1U << 21,
|
||||
WGDEVICE_HAS_ITIME = 1U << 22
|
||||
};
|
||||
|
||||
struct wgdevice
|
||||
{
|
||||
char name[IFNAMSIZ];
|
||||
uint32_t ifindex;
|
||||
|
||||
uint32_t flags;
|
||||
|
||||
uint8_t public_key[WG_KEY_LEN];
|
||||
uint8_t private_key[WG_KEY_LEN];
|
||||
|
||||
uint32_t fwmark;
|
||||
uint16_t listen_port;
|
||||
|
||||
struct wgpeer *first_peer, *last_peer;
|
||||
|
||||
uint16_t junk_packet_count;
|
||||
uint16_t junk_packet_min_size;
|
||||
uint16_t junk_packet_max_size;
|
||||
uint16_t init_packet_junk_size;
|
||||
uint16_t response_packet_junk_size;
|
||||
uint32_t init_packet_magic_header;
|
||||
uint32_t response_packet_magic_header;
|
||||
uint32_t underload_packet_magic_header;
|
||||
uint32_t transport_packet_magic_header;
|
||||
char* i1;
|
||||
char* i2;
|
||||
char* i3;
|
||||
char* i4;
|
||||
char* i5;
|
||||
char* j1;
|
||||
char* j2;
|
||||
char* j3;
|
||||
char* itime;
|
||||
};
|
||||
|
||||
#define for_each_wgpeer(__dev, __peer) \
|
||||
for ((__peer) = (__dev)->first_peer; (__peer); (__peer) = (__peer)->next_peer)
|
||||
#define for_each_wgallowedip(__peer, __allowedip) \
|
||||
for ((__allowedip) = (__peer)->first_allowedip; (__allowedip); \
|
||||
(__allowedip) = (__allowedip)->next_allowedip)
|
||||
|
||||
static inline void free_wgdevice(struct wgdevice* dev)
|
||||
{
|
||||
if (!dev)
|
||||
return;
|
||||
for (struct wgpeer *peer = dev->first_peer, *np = peer ? peer->next_peer : NULL; peer;
|
||||
peer = np, np = peer ? peer->next_peer : NULL)
|
||||
{
|
||||
for (struct wgallowedip *allowedip = peer->first_allowedip,
|
||||
*na = allowedip ? allowedip->next_allowedip : NULL;
|
||||
allowedip;
|
||||
allowedip = na, na = allowedip ? allowedip->next_allowedip : NULL)
|
||||
free(allowedip);
|
||||
free(peer);
|
||||
}
|
||||
free(dev);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
1202
src/ipc-linux.h
1202
src/ipc-linux.h
File diff suppressed because it is too large
Load diff
|
@ -65,6 +65,25 @@ int showconf_main(int argc, const char *argv[])
|
|||
if (device->flags & WGDEVICE_HAS_H4)
|
||||
printf("H4 = %u\n", device->transport_packet_magic_header);
|
||||
|
||||
if (device->flags & WGDEVICE_HAS_I1)
|
||||
printf("I1 = %s\n", device->i1);
|
||||
if (device->flags & WGDEVICE_HAS_I2)
|
||||
printf("I2 = %s\n", device->i2);
|
||||
if (device->flags & WGDEVICE_HAS_I3)
|
||||
printf("I3 = %s\n", device->i3);
|
||||
if (device->flags & WGDEVICE_HAS_I4)
|
||||
printf("I4 = %s\n", device->i4);
|
||||
if (device->flags & WGDEVICE_HAS_I5)
|
||||
printf("I5 = %s\n", device->i5);
|
||||
if (device->flags & WGDEVICE_HAS_J1)
|
||||
printf("J1 = %s\n", device->j1);
|
||||
if (device->flags & WGDEVICE_HAS_J2)
|
||||
printf("J2 = %s\n", device->j2);
|
||||
if (device->flags & WGDEVICE_HAS_J3)
|
||||
printf("J3 = %s\n", device->j3);
|
||||
if (device->flags & WGDEVICE_HAS_ITIME)
|
||||
printf("Itime = %s\n", device->itime);
|
||||
|
||||
printf("\n");
|
||||
for_each_wgpeer(device, peer) {
|
||||
key_to_base64(base64, peer->public_key);
|
||||
|
|
|
@ -191,6 +191,15 @@ enum wgdevice_attribute {
|
|||
WGDEVICE_A_H2,
|
||||
WGDEVICE_A_H3,
|
||||
WGDEVICE_A_H4,
|
||||
WGDEVICE_A_I1,
|
||||
WGDEVICE_A_I2,
|
||||
WGDEVICE_A_I3,
|
||||
WGDEVICE_A_I4,
|
||||
WGDEVICE_A_I5,
|
||||
WGDEVICE_A_J1,
|
||||
WGDEVICE_A_J2,
|
||||
WGDEVICE_A_J3,
|
||||
WGDEVICE_A_ITIME,
|
||||
WGDEVICE_A_PEER,
|
||||
__WGDEVICE_A_LAST
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue