diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 3a84f44..ded5b3f 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -4,4 +4,5 @@ KOJIMA Takanori Sean Purser-Haskell daregod Lucus Lee -Arroyo Networks, LLC \ No newline at end of file +Arroyo Networks, LLC +Tony Lu diff --git a/if.go b/if.go index 9f90485..965f2ac 100644 --- a/if.go +++ b/if.go @@ -6,6 +6,10 @@ import ( ) // Interface is a TUN/TAP interface. +// +// MultiQueue(Linux kernel > 3.8): With MultiQueue enabled, user should hold multiple +// interfaces to send/receive packet in parallel. +// Kernel document about MultiQueue: https://www.kernel.org/doc/Documentation/networking/tuntap.txt type Interface struct { isTAP bool io.ReadWriteCloser diff --git a/params_linux.go b/params_linux.go index 41203f6..ffbd3a6 100644 --- a/params_linux.go +++ b/params_linux.go @@ -31,6 +31,11 @@ type PlatformSpecificParams struct { // A zero-value of this field, i.e. nil, indicates that no changes to owner // or group will be made. Permissions *DevicePermissions + + // Support multiqueue tun/tap interface. + // From version 3.8, Linux supports multiqueue tuntap which can uses multiple + // file descriptors (queues) to parallelize packets sending or receiving. + MultiQueue bool } func defaultPlatformSpecificParams() PlatformSpecificParams { diff --git a/syscalls_linux.go b/syscalls_linux.go index 50a945c..28ad259 100644 --- a/syscalls_linux.go +++ b/syscalls_linux.go @@ -10,9 +10,10 @@ import ( ) const ( - cIFF_TUN = 0x0001 - cIFF_TAP = 0x0002 - cIFF_NO_PI = 0x1000 + cIFF_TUN = 0x0001 + cIFF_TAP = 0x0002 + cIFF_NO_PI = 0x1000 + cIFF_MULTI_QUEUE = 0x0100 ) type ifReq struct { @@ -34,7 +35,13 @@ func newTAP(config Config) (ifce *Interface, err error) { if err != nil { return nil, err } - name, err := createInterface(file.Fd(), config.Name, cIFF_TAP|cIFF_NO_PI) + + var flags uint16 + flags = cIFF_TUN | cIFF_NO_PI + if config.PlatformSpecificParams.MultiQueue { + flags |= cIFF_MULTI_QUEUE + } + name, err := createInterface(file.Fd(), config.Name, flags) if err != nil { return nil, err } @@ -52,7 +59,13 @@ func newTUN(config Config) (ifce *Interface, err error) { if err != nil { return nil, err } - name, err := createInterface(file.Fd(), config.Name, cIFF_TUN|cIFF_NO_PI) + + var flags uint16 + flags = cIFF_TUN | cIFF_NO_PI + if config.PlatformSpecificParams.MultiQueue { + flags |= cIFF_MULTI_QUEUE + } + name, err := createInterface(file.Fd(), config.Name, flags) if err != nil { return nil, err }