1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2025-07-13 19:24:57 +03:00

Supporting VLAN for Mac OS X using TunTapOSX

This commit is contained in:
nattoheaven
2014-01-14 23:19:37 +09:00
parent c32bf3b84f
commit 8779e59295
7 changed files with 91 additions and 28 deletions

View File

@ -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
{