Răsfoiți Sursa

Add flags cIFF_MULTI_QUEUE

Signed-off-by: Tony Lu <[email protected]>
Tony Lu 8 ani în urmă
părinte
comite
c14726aabc
2 a modificat fișierele cu 23 adăugiri și 5 ștergeri
  1. 5 0
      params_linux.go
  2. 18 5
      syscalls_linux.go

+ 5 - 0
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 {

+ 18 - 5
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
 	}