+static device_type_t device_type;
+char *device = NULL;
+char *iface = NULL;
+static char *type = NULL;
+static char ifrname[IFNAMSIZ];
+static char *device_info;
+
+static bool setup_device(void) {
+ if(!get_config_string(lookup_config(config_tree, "Device"), &device))
+ device = xstrdup(DEFAULT_DEVICE);
+
+ if(!get_config_string(lookup_config(config_tree, "Interface"), &iface))
+ if(netname)
+ iface = xstrdup(netname);
+
+ device_fd = open(device, O_RDWR | O_NONBLOCK);
+
+ if(device_fd < 0) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Could not open %s: %s", device, strerror(errno));
+ return false;
+ }
+
+#ifdef FD_CLOEXEC
+ fcntl(device_fd, F_SETFD, FD_CLOEXEC);
+#endif
+
+ struct ifreq ifr = {{{0}}};
+
+ get_config_string(lookup_config(config_tree, "DeviceType"), &type);
+
+ if(type && strcasecmp(type, "tun") && strcasecmp(type, "tap")) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Unknown device type %s!", type);
+ return false;
+ }
+
+ if((type && !strcasecmp(type, "tun")) || (!type && routing_mode == RMODE_ROUTER)) {
+ ifr.ifr_flags = IFF_TUN;
+ device_type = DEVICE_TYPE_TUN;
+ device_info = "Linux tun/tap device (tun mode)";
+ } else {
+ if (routing_mode == RMODE_ROUTER)
+ overwrite_mac = true;
+ ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
+ device_type = DEVICE_TYPE_TAP;
+ device_info = "Linux tun/tap device (tap mode)";
+ }
+
+#ifdef IFF_ONE_QUEUE
+ /* Set IFF_ONE_QUEUE flag... */
+
+ bool t1q = false;
+ if(get_config_bool(lookup_config(config_tree, "IffOneQueue"), &t1q) && t1q)
+ ifr.ifr_flags |= IFF_ONE_QUEUE;
+#endif