Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/SoftEtherVPN/SoftEtherVPN_Stable.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornattoheaven <nattoheaven@gmail.com>2014-01-14 18:19:37 +0400
committernattoheaven <nattoheaven@gmail.com>2014-01-14 18:19:52 +0400
commit8779e59295b857c38f5f453080a5e87be07c1fc3 (patch)
treecdabdf395419f610f3919d1d817620b90f66c3a6 /src/Cedar/VLanUnix.c
parentc32bf3b84f0eeff7228edd0b545304ffa6d2c18f (diff)
Supporting VLAN for Mac OS X using TunTapOSX
Diffstat (limited to 'src/Cedar/VLanUnix.c')
-rw-r--r--src/Cedar/VLanUnix.c56
1 files changed, 46 insertions, 10 deletions
diff --git a/src/Cedar/VLanUnix.c b/src/Cedar/VLanUnix.c
index c3e77d0c..c987f14a 100644
--- a/src/Cedar/VLanUnix.c
+++ b/src/Cedar/VLanUnix.c
@@ -302,11 +302,7 @@ CANCEL *VLanGetCancel(VLAN *v)
fd = v->fd;
-#ifndef UNIX_MACOS
UnixSetSocketNonBlockingMode(fd, true);
-#else // UNIX_MACOS
- UnixSetSocketNonBlockingMode(fd, false);
-#endif // UNIX_MACOS
c->SpecialFlag = true;
c->pipe_read = fd;
@@ -402,6 +398,9 @@ int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address)
struct sockaddr sa;
char *tap_name = TAP_FILENAME_1;
int s;
+#ifdef UNIX_MACOS
+ char tap_macos_name[256] = TAP_MACOS_DIR TAP_MACOS_FILENAME;
+#endif
// Validate arguments
if (name == NULL)
{
@@ -445,13 +444,23 @@ int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address)
tap_name = TAP_FILENAME_2;
}
#else // UNIX_MACOS
- // MacOS X
- fd = open(TAP_MACOS_FILENAME, O_RDWR);
- if (fd == -1)
{
- return -1;
+ int i;
+ fd = -1;
+ for (i = 0; i < TAP_MACOS_NUMBER; i++) {
+ sprintf(tap_macos_name + strlen(TAP_MACOS_DIR TAP_MACOS_FILENAME), "%d", i);
+ fd = open(tap_macos_name, O_RDWR);
+ if (fd != -1)
+ {
+ tap_name = tap_macos_name;
+ break;
+ }
+ }
+ if (fd == -1)
+ {
+ return -1;
+ }
}
- tap_name = TAP_MACOS_FILENAME;
#endif // UNIX_MACOS
#ifdef UNIX_LINUX
@@ -479,7 +488,7 @@ int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address)
Zero(&ifr, sizeof(ifr));
StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), eth_name);
ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
- Copy(&ifr.ifr_hwaddr.sa_data, mac_address, 6);
+ Copy(&ifr.ifr_addr.sa_data, mac_address, 6);
ioctl(s, SIOCSIFHWADDR, &ifr);
}
@@ -494,6 +503,33 @@ int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address)
}
#else // UNIX_LINUX
+#ifdef UNIX_MACOS
+ // MAC address setting
+ s = socket(AF_INET, SOCK_DGRAM, 0);
+ if (s != -1)
+ {
+ char *macos_eth_name;
+ macos_eth_name = tap_macos_name + strlen(TAP_MACOS_DIR);
+
+ if (mac_address != NULL)
+ {
+ uint8_t macos_mac_address[19];
+ Zero(&ifr, sizeof(ifr));
+ StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), macos_eth_name);
+ Copy(&ifr.ifr_addr.sa_data, mac_address, 6);
+ ioctl(s, SIOCSIFLLADDR, &ifr);
+ }
+
+ Zero(&ifr, sizeof(ifr));
+ StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), macos_eth_name);
+ ioctl(s, SIOCGIFFLAGS, &ifr);
+
+ ifr.ifr_flags |= IFF_UP;
+ ioctl(s, SIOCSIFFLAGS, &ifr);
+
+ close(s);
+ }
+#endif
#ifdef UNIX_SOLARIS
// Create a tap for Solaris
{