summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fastd.c7
-rw-r--r--src/fastd.h2
-rw-r--r--src/iface.c38
3 files changed, 15 insertions, 32 deletions
diff --git a/src/fastd.c b/src/fastd.c
index 3d5b3d4..2d0b47a 100644
--- a/src/fastd.c
+++ b/src/fastd.c
@@ -173,6 +173,10 @@ static inline uint16_t get_bind_port(const fastd_bind_address_t *addr) {
/** Initializes the configured sockets */
static void init_sockets(void) {
+ ctx.ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
+ if (ctx.ioctl_sock < 0)
+ exit_errno("unable to create ioctl socket");
+
ctx.socks = fastd_new_array(conf.n_bind_addrs, fastd_socket_t);
size_t i;
@@ -204,6 +208,9 @@ static void close_sockets(void) {
fastd_socket_close(&ctx.socks[i]);
free(ctx.socks);
+
+ if (close(ctx.ioctl_sock))
+ pr_error_errno("close");
}
/** Calls the on-pre-up command */
diff --git a/src/fastd.h b/src/fastd.h
index 1433509..7963505 100644
--- a/src/fastd.h
+++ b/src/fastd.h
@@ -325,6 +325,8 @@ struct fastd_context {
int android_ctrl_sock_fd; /**< The unix domain socket for communicating with Android GUI */
#endif
+ int ioctl_sock; /**< The global ioctl socket */
+
size_t n_socks; /**< The number of sockets in socks */
fastd_socket_t *socks; /**< Array of all sockets */
diff --git a/src/iface.c b/src/iface.c
index 4010c16..74dda30 100644
--- a/src/iface.c
+++ b/src/iface.c
@@ -33,6 +33,7 @@
Management of the TUN/TAP interface
*/
+#include "fastd.h"
#include "config.h"
#include "peer.h"
#include "poll.h"
@@ -94,7 +95,6 @@ static void open_iface(fastd_iface_t *iface, const char *ifname, uint16_t mtu);
/** Opens the TUN/TAP device helper shared by Android and Linux targets */
static void open_iface_linux(fastd_iface_t *iface, const char *ifname, uint16_t mtu, const char *dev_name) {
- int ctl_sock = -1;
struct ifreq ifr = {};
iface->fd = FASTD_POLL_FD(POLL_TYPE_IFACE, open(dev_name, O_RDWR|O_NONBLOCK));
@@ -125,32 +125,20 @@ static void open_iface_linux(fastd_iface_t *iface, const char *ifname, uint16_t
iface->name = fastd_strndup(ifr.ifr_name, IFNAMSIZ-1);
- ctl_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (ctl_sock < 0)
- exit_errno("socket");
-
- if (ioctl(ctl_sock, SIOCGIFMTU, &ifr) < 0)
+ if (ioctl(ctx.ioctl_sock, SIOCGIFMTU, &ifr) < 0)
exit_errno("SIOCGIFMTU ioctl failed");
if (ifr.ifr_mtu != mtu) {
ifr.ifr_mtu = mtu;
- if (ioctl(ctl_sock, SIOCSIFMTU, &ifr) < 0) {
+ if (ioctl(ctx.ioctl_sock, SIOCSIFMTU, &ifr) < 0) {
pr_error_errno("unable to set TUN/TAP interface MTU: SIOCSIFMTU ioctl failed");
goto error;
}
}
- if (close(ctl_sock))
- pr_error_errno("close");
-
return;
error:
- if (ctl_sock >= 0) {
- if (close(ctl_sock))
- pr_error_errno("close");
- }
-
close(iface->fd.fd);
iface->fd.fd = -1;
}
@@ -290,12 +278,8 @@ static void open_iface(fastd_iface_t *iface, const char *ifname, uint16_t mtu) {
static void set_link0(fastd_iface_t *iface, bool set) {
struct ifreq ifr = {};
- int ctl_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (ctl_sock < 0)
- exit_errno("socket");
-
strncpy(ifr.ifr_name, iface->name, IFNAMSIZ-1);
- if (ioctl(ctl_sock, SIOCGIFFLAGS, &ifr) < 0)
+ if (ioctl(ctx.ioctl_sock, SIOCGIFFLAGS, &ifr) < 0)
exit_errno("SIOCGIFFLAGS ioctl failed");
if (set)
@@ -303,11 +287,8 @@ static void set_link0(fastd_iface_t *iface, bool set) {
else
ifr.ifr_flags &= ~IFF_LINK0;
- if (ioctl(ctl_sock, SIOCSIFFLAGS, &ifr) < 0)
+ if (ioctl(ctx.ioctl_sock, SIOCSIFFLAGS, &ifr) < 0)
exit_errno("SIOCSIFFLAGS ioctl failed");
-
- if (close(ctl_sock))
- pr_error_errno("close");
}
/** Sets up the TUN device */
@@ -386,18 +367,11 @@ static void open_iface(fastd_iface_t *iface, const char *ifname, uint16_t mtu) {
iface->name = fastd_strndup(ifname, IFNAMSIZ-1);
- int ctl_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (ctl_sock < 0)
- exit_errno("socket");
-
struct ifreq ifr = {};
strncpy(ifr.ifr_name, ifname, IFNAMSIZ-1);
ifr.ifr_mtu = mtu;
- if (ioctl(ctl_sock, SIOCSIFMTU, &ifr) < 0)
+ if (ioctl(ctx.ioctl_sock, SIOCSIFMTU, &ifr) < 0)
exit_errno("SIOCSIFMTU ioctl failed");
-
- if (close(ctl_sock))
- pr_error_errno("close");
}
#else