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..a47b8aa 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_TUN | cIFF_NO_PI | 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_TUN | cIFF_NO_PI | cIFF_MULTI_QUEUE + } + name, err := createInterface(file.Fd(), config.Name, flags) if err != nil { return nil, err }