wg: compile on non-Linux
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
573bd7f303
commit
91416b0caf
1 changed files with 22 additions and 16 deletions
38
src/ipc.c
38
src/ipc.c
|
@ -38,6 +38,12 @@
|
||||||
|
|
||||||
#define SOCK_PATH RUNSTATEDIR "/wireguard/"
|
#define SOCK_PATH RUNSTATEDIR "/wireguard/"
|
||||||
#define SOCK_SUFFIX ".sock"
|
#define SOCK_SUFFIX ".sock"
|
||||||
|
#ifdef __linux__
|
||||||
|
#define SOCKET_BUFFER_SIZE MNL_SOCKET_BUFFER_SIZE
|
||||||
|
#else
|
||||||
|
#define SOCKET_BUFFER_SIZE 8192
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
struct inflatable_buffer {
|
struct inflatable_buffer {
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
@ -478,7 +484,7 @@ static int kernel_get_wireguard_interfaces(struct inflatable_buffer *buffer)
|
||||||
struct ifinfomsg *ifm;
|
struct ifinfomsg *ifm;
|
||||||
|
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
rtnl_buffer = calloc(MNL_SOCKET_BUFFER_SIZE, 1);
|
rtnl_buffer = calloc(SOCKET_BUFFER_SIZE, 1);
|
||||||
if (!rtnl_buffer)
|
if (!rtnl_buffer)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -509,7 +515,7 @@ static int kernel_get_wireguard_interfaces(struct inflatable_buffer *buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
another:
|
another:
|
||||||
if ((len = mnl_socket_recvfrom(nl, rtnl_buffer, MNL_SOCKET_BUFFER_SIZE)) < 0) {
|
if ((len = mnl_socket_recvfrom(nl, rtnl_buffer, SOCKET_BUFFER_SIZE)) < 0) {
|
||||||
ret = -errno;
|
ret = -errno;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -565,10 +571,10 @@ again:
|
||||||
peers_nest = mnl_attr_nest_start(nlh, WGDEVICE_A_PEERS);
|
peers_nest = mnl_attr_nest_start(nlh, WGDEVICE_A_PEERS);
|
||||||
for (i = 0, peer = peer ? peer : dev->first_peer; peer; peer = peer->next_peer) {
|
for (i = 0, peer = peer ? peer : dev->first_peer; peer; peer = peer->next_peer) {
|
||||||
uint32_t flags = 0;
|
uint32_t flags = 0;
|
||||||
peer_nest = mnl_attr_nest_start_check(nlh, MNL_SOCKET_BUFFER_SIZE, i++);
|
peer_nest = mnl_attr_nest_start_check(nlh, SOCKET_BUFFER_SIZE, i++);
|
||||||
if (!peer_nest)
|
if (!peer_nest)
|
||||||
goto toobig_peers;
|
goto toobig_peers;
|
||||||
if (!mnl_attr_put_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGPEER_A_PUBLIC_KEY, sizeof(peer->public_key), peer->public_key))
|
if (!mnl_attr_put_check(nlh, SOCKET_BUFFER_SIZE, WGPEER_A_PUBLIC_KEY, sizeof(peer->public_key), peer->public_key))
|
||||||
goto toobig_peers;
|
goto toobig_peers;
|
||||||
if (peer->flags & WGPEER_REMOVE_ME)
|
if (peer->flags & WGPEER_REMOVE_ME)
|
||||||
flags |= WGPEER_F_REMOVE_ME;
|
flags |= WGPEER_F_REMOVE_ME;
|
||||||
|
@ -576,45 +582,45 @@ again:
|
||||||
if (peer->flags & WGPEER_REPLACE_ALLOWEDIPS)
|
if (peer->flags & WGPEER_REPLACE_ALLOWEDIPS)
|
||||||
flags |= WGPEER_F_REPLACE_ALLOWEDIPS;
|
flags |= WGPEER_F_REPLACE_ALLOWEDIPS;
|
||||||
if (peer->flags & WGPEER_HAS_PRESHARED_KEY) {
|
if (peer->flags & WGPEER_HAS_PRESHARED_KEY) {
|
||||||
if (!mnl_attr_put_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGPEER_A_PRESHARED_KEY, sizeof(peer->preshared_key), peer->preshared_key))
|
if (!mnl_attr_put_check(nlh, SOCKET_BUFFER_SIZE, WGPEER_A_PRESHARED_KEY, sizeof(peer->preshared_key), peer->preshared_key))
|
||||||
goto toobig_peers;
|
goto toobig_peers;
|
||||||
}
|
}
|
||||||
if (peer->endpoint.addr.sa_family == AF_INET) {
|
if (peer->endpoint.addr.sa_family == AF_INET) {
|
||||||
if (!mnl_attr_put_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGPEER_A_ENDPOINT, sizeof(peer->endpoint.addr4), &peer->endpoint.addr4))
|
if (!mnl_attr_put_check(nlh, SOCKET_BUFFER_SIZE, WGPEER_A_ENDPOINT, sizeof(peer->endpoint.addr4), &peer->endpoint.addr4))
|
||||||
goto toobig_peers;
|
goto toobig_peers;
|
||||||
} else if (peer->endpoint.addr.sa_family == AF_INET6) {
|
} else if (peer->endpoint.addr.sa_family == AF_INET6) {
|
||||||
if (!mnl_attr_put_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGPEER_A_ENDPOINT, sizeof(peer->endpoint.addr6), &peer->endpoint.addr6))
|
if (!mnl_attr_put_check(nlh, SOCKET_BUFFER_SIZE, WGPEER_A_ENDPOINT, sizeof(peer->endpoint.addr6), &peer->endpoint.addr6))
|
||||||
goto toobig_peers;
|
goto toobig_peers;
|
||||||
}
|
}
|
||||||
if (peer->flags & WGPEER_HAS_PERSISTENT_KEEPALIVE_INTERVAL) {
|
if (peer->flags & WGPEER_HAS_PERSISTENT_KEEPALIVE_INTERVAL) {
|
||||||
if (!mnl_attr_put_u16_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL, peer->persistent_keepalive_interval))
|
if (!mnl_attr_put_u16_check(nlh, SOCKET_BUFFER_SIZE, WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL, peer->persistent_keepalive_interval))
|
||||||
goto toobig_peers;
|
goto toobig_peers;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (flags) {
|
if (flags) {
|
||||||
if (!mnl_attr_put_u32_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGPEER_A_FLAGS, flags))
|
if (!mnl_attr_put_u32_check(nlh, SOCKET_BUFFER_SIZE, WGPEER_A_FLAGS, flags))
|
||||||
goto toobig_peers;
|
goto toobig_peers;
|
||||||
}
|
}
|
||||||
if (peer->first_allowedip) {
|
if (peer->first_allowedip) {
|
||||||
if (!allowedip)
|
if (!allowedip)
|
||||||
allowedip = peer->first_allowedip;
|
allowedip = peer->first_allowedip;
|
||||||
allowedips_nest = mnl_attr_nest_start_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGPEER_A_ALLOWEDIPS);
|
allowedips_nest = mnl_attr_nest_start_check(nlh, SOCKET_BUFFER_SIZE, WGPEER_A_ALLOWEDIPS);
|
||||||
if (!allowedips_nest)
|
if (!allowedips_nest)
|
||||||
goto toobig_allowedips;
|
goto toobig_allowedips;
|
||||||
for (j = 0; allowedip; allowedip = allowedip->next_allowedip) {
|
for (j = 0; allowedip; allowedip = allowedip->next_allowedip) {
|
||||||
allowedip_nest = mnl_attr_nest_start_check(nlh, MNL_SOCKET_BUFFER_SIZE, j++);
|
allowedip_nest = mnl_attr_nest_start_check(nlh, SOCKET_BUFFER_SIZE, j++);
|
||||||
if (!allowedip_nest)
|
if (!allowedip_nest)
|
||||||
goto toobig_allowedips;
|
goto toobig_allowedips;
|
||||||
if (!mnl_attr_put_u16_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGALLOWEDIP_A_FAMILY, allowedip->family))
|
if (!mnl_attr_put_u16_check(nlh, SOCKET_BUFFER_SIZE, WGALLOWEDIP_A_FAMILY, allowedip->family))
|
||||||
goto toobig_allowedips;
|
goto toobig_allowedips;
|
||||||
if (allowedip->family == AF_INET) {
|
if (allowedip->family == AF_INET) {
|
||||||
if (!mnl_attr_put_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGALLOWEDIP_A_IPADDR, sizeof(allowedip->ip4), &allowedip->ip4))
|
if (!mnl_attr_put_check(nlh, SOCKET_BUFFER_SIZE, WGALLOWEDIP_A_IPADDR, sizeof(allowedip->ip4), &allowedip->ip4))
|
||||||
goto toobig_allowedips;
|
goto toobig_allowedips;
|
||||||
} else if (allowedip->family == AF_INET6) {
|
} else if (allowedip->family == AF_INET6) {
|
||||||
if (!mnl_attr_put_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGALLOWEDIP_A_IPADDR, sizeof(allowedip->ip6), &allowedip->ip6))
|
if (!mnl_attr_put_check(nlh, SOCKET_BUFFER_SIZE, WGALLOWEDIP_A_IPADDR, sizeof(allowedip->ip6), &allowedip->ip6))
|
||||||
goto toobig_allowedips;
|
goto toobig_allowedips;
|
||||||
}
|
}
|
||||||
if (!mnl_attr_put_u8_check(nlh, MNL_SOCKET_BUFFER_SIZE, WGALLOWEDIP_A_CIDR_MASK, allowedip->cidr))
|
if (!mnl_attr_put_u8_check(nlh, SOCKET_BUFFER_SIZE, WGALLOWEDIP_A_CIDR_MASK, allowedip->cidr))
|
||||||
goto toobig_allowedips;
|
goto toobig_allowedips;
|
||||||
mnl_attr_nest_end(nlh, allowedip_nest);
|
mnl_attr_nest_end(nlh, allowedip_nest);
|
||||||
allowedip_nest = NULL;
|
allowedip_nest = NULL;
|
||||||
|
@ -888,7 +894,7 @@ out:
|
||||||
/* first\0second\0third\0forth\0last\0\0 */
|
/* first\0second\0third\0forth\0last\0\0 */
|
||||||
char *ipc_list_devices(void)
|
char *ipc_list_devices(void)
|
||||||
{
|
{
|
||||||
struct inflatable_buffer buffer = { .len = MNL_SOCKET_BUFFER_SIZE };
|
struct inflatable_buffer buffer = { .len = SOCKET_BUFFER_SIZE };
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
|
Loading…
Reference in a new issue