1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2024-11-22 09:29:52 +03:00

Merge pull request #10 from nattoheaven/tuntaposx

Supporting VLAN for Mac OS X using TunTapOSX
This commit is contained in:
Daiyuu Nobori 2014-02-06 01:35:26 +09:00
commit cdd4540baa
7 changed files with 91 additions and 28 deletions

View File

@ -705,7 +705,15 @@
#define TAP_FILENAME_1 "/dev/net/tun"
#define TAP_FILENAME_2 "/dev/tun"
#ifdef UNIX_MACOS
#ifdef NO_VLAN
#define TAP_MACOS_FILENAME "/dev/tap0"
#else
#define TAP_MACOS_FILENAME "tap"
#endif
#define TAP_MACOS_DIR "/dev/"
#define TAP_MACOS_NUMBER (16)
#endif

View File

@ -7455,12 +7455,14 @@ bool CtDisableVLan(CLIENT *c, RPC_CLIENT_CREATE_VLAN *vlan)
#ifndef OS_WIN32
#ifdef NO_VLAN
if (GetOsInfo()->OsType == OSTYPE_MACOS_X)
{
// Can not be added or removed the virtual LAN card in MacOS X
CiSetError(c, ERR_NOT_SUPPORTED);
return false;
}
#endif
// Check whether the virtual LAN card with the specified name is not
// being used by one or more accounts
@ -7606,12 +7608,14 @@ bool CtEnableVLan(CLIENT *c, RPC_CLIENT_CREATE_VLAN *vlan)
#ifndef OS_WIN32
#ifdef NO_VLAN
if (GetOsInfo()->OsType == OSTYPE_MACOS_X)
{
// Can not be added or removed the virtual LAN card in MacOS X
CiSetError(c, ERR_NOT_SUPPORTED);
return false;
}
#endif
// Search the virtual LAN card
LockList(c->UnixVLanList);
@ -7702,12 +7706,14 @@ bool CtDeleteVLan(CLIENT *c, RPC_CLIENT_CREATE_VLAN *d)
#ifndef OS_WIN32
#ifdef NO_VLAN
if (GetOsInfo()->OsType == OSTYPE_MACOS_X)
{
// Can not be added or removed the virtual LAN card in MacOS X
CiSetError(c, ERR_NOT_SUPPORTED);
return false;
}
#endif
// Check whether the virtual LAN card with the specified name is not
// being used by one or more accounts
@ -8274,12 +8280,14 @@ bool CtCreateVLan(CLIENT *c, RPC_CLIENT_CREATE_VLAN *create)
#ifndef OS_WIN32
// Non-Win32
#ifdef NO_VLAN
if (GetOsInfo()->OsType == OSTYPE_MACOS_X)
{
// A virtual LAN card can not be added or removed in MacOS X
CiSetError(c, ERR_NOT_SUPPORTED);
return false;
}
#endif
// Check whether the specified name is valid or not
if (IsSafeStr(create->DeviceName) == false)
@ -9801,7 +9809,11 @@ bool CiReadSettingFromCfg(CLIENT *c, FOLDER *root)
// Eraser
c->Eraser = NewEraser(c->Logger, CfgGetInt64(config, "AutoDeleteCheckDiskFreeSpaceMin"));
if (OS_IS_UNIX(GetOsInfo()->OsType) && GetOsInfo()->OsType != OSTYPE_MACOS_X)
if (OS_IS_UNIX(GetOsInfo()->OsType)
#ifdef NO_VLAN
&& GetOsInfo()->OsType != OSTYPE_MACOS_X
#endif
)
{
// Read the UNIX version virtual LAN card list (except MacOS)
vlan = CfgGetFolder(root, "UnixVLan");
@ -9811,6 +9823,7 @@ bool CiReadSettingFromCfg(CLIENT *c, FOLDER *root)
}
}
#ifdef NO_VLAN
if (GetOsInfo()->OsType == OSTYPE_MACOS_X)
{
#ifdef OS_UNIX
@ -9831,6 +9844,7 @@ bool CiReadSettingFromCfg(CLIENT *c, FOLDER *root)
Add(c->UnixVLanList, uv);
#endif // OS_UNIX
}
#endif
CiLoadAccountDatabase(c, db);
@ -10337,7 +10351,11 @@ void CiWriteSettingToCfg(CLIENT *c, FOLDER *root)
CiWriteCAList(c, ca);
// VLAN
if (OS_IS_UNIX(GetOsInfo()->OsType) && GetOsInfo()->OsType != OSTYPE_MACOS_X)
if (OS_IS_UNIX(GetOsInfo()->OsType)
#ifdef NO_VLAN
&& GetOsInfo()->OsType != OSTYPE_MACOS_X
#endif
)
{
vlan = CfgCreateFolder(root, "UnixVLan");
CiWriteVLanList(c, vlan);

View File

@ -311,11 +311,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;
@ -411,6 +407,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)
{
@ -454,13 +453,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
@ -488,7 +497,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);
}
@ -503,6 +512,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
{

View File

@ -236,11 +236,14 @@ struct tundladdr {
#else // UNIX_SOLARIS
#ifdef UNIX_BSD
#if defined(UNIX_BSD) || (!defined(NO_VLAN) && defined(UNIX_MACOS))
// -----------------------------------------------------------------
// Tap header for FreeBSD
// -----------------------------------------------------------------
// -----------------------------------------------------------------
// Tap header For MacOS
// -----------------------------------------------------------------
/* $NetBSD: if_tun.h,v 1.5 1994/06/29 06:36:27 cgd Exp $ */
/*
@ -292,17 +295,7 @@ struct tuninfo {
#else // UNIX_BSD
#ifdef UNIX_MACOS
// -----------------------------------------------------------------
// Tap header For MacOS
// -----------------------------------------------------------------
#else // UNIX_MACOS
#endif // UNIX_MACOS
#endif // UNIX_BSD
#endif // UNIX_BSD || UNIX_MACOS
#endif // UNIX_SOLARIS

View File

@ -106,6 +106,7 @@
// Struct statfs for MacOS X
#ifdef UNIX_MACOS
#ifdef NO_VLAN
typedef struct fsid { int32_t val[2]; } fsid_t;
struct statfs {
short f_otype; /* TEMPORARY SHADOW COPY OF f_type */
@ -127,6 +128,9 @@ struct statfs {
char f_mntonname[90]; /* directory on which mounted */
char f_mntfromname[90];/* mounted filesystem */
};
#else
#include <sys/mount.h>
#endif
#endif // UNIX_MACOS
// Scandir() function for Solaris

View File

@ -24,11 +24,13 @@
# Variables
CC=gcc
OPTIONS_COMPILE_DEBUG=-D_DEBUG -DDEBUG -DUNIX -DUNIX_MACOS -DBRIDGE_PCAP -DNO_VLAN -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -g -fsigned-char
NO_VLAN?=-DNO_VLAN
OPTIONS_COMPILE_DEBUG=-D_DEBUG -DDEBUG -DUNIX -DUNIX_MACOS -DBRIDGE_PCAP $(NO_VLAN) -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -g -fsigned-char
OPTIONS_LINK_DEBUG=-g -fsigned-char -lm -lpthread -lssl -lcrypto -liconv -lreadline -lncurses -lz -lpcap
OPTIONS_COMPILE_RELEASE=-DNDEBUG -DVPN_SPEED -DUNIX -DUNIX_MACOS -DBRIDGE_PCAP -DNO_VLAN -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -O2 -fsigned-char
OPTIONS_COMPILE_RELEASE=-DNDEBUG -DVPN_SPEED -DUNIX -DUNIX_MACOS -DBRIDGE_PCAP $(NO_VLAN) -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -O2 -fsigned-char
OPTIONS_LINK_RELEASE=-O2 -fsigned-char -lm -lpthread -lssl -lcrypto -liconv -lreadline -lncurses -lz -lpcap

View File

@ -24,11 +24,13 @@
# Variables
CC=gcc
OPTIONS_COMPILE_DEBUG=-D_DEBUG -DDEBUG -DUNIX -DUNIX_MACOS -DBRIDGE_PCAP -DNO_VLAN -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -g -fsigned-char -m64
NO_VLAN?=-DNO_VLAN
OPTIONS_COMPILE_DEBUG=-D_DEBUG -DDEBUG -DUNIX -DUNIX_MACOS -DBRIDGE_PCAP $(NO_VLAN) -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -g -fsigned-char -m64
OPTIONS_LINK_DEBUG=-g -fsigned-char -m64 -lm -lpthread -lssl -lcrypto -liconv -lreadline -lncurses -lz -lpcap
OPTIONS_COMPILE_RELEASE=-DNDEBUG -DVPN_SPEED -DUNIX -DUNIX_MACOS -DBRIDGE_PCAP -DNO_VLAN -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -O2 -fsigned-char -m64
OPTIONS_COMPILE_RELEASE=-DNDEBUG -DVPN_SPEED -DUNIX -DUNIX_MACOS -DBRIDGE_PCAP $(NO_VLAN) -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -O2 -fsigned-char -m64
OPTIONS_LINK_RELEASE=-O2 -fsigned-char -m64 -lm -lpthread -lssl -lcrypto -liconv -lreadline -lncurses -lz -lpcap