1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
package ip
import (
"fmt"
"github.com/vishvananda/netlink"
)
// Tuntap represents arguments for tuntap manipulation.
type Tuntap struct {
Name string
Mode string
MultiQueue bool
Master string
}
// Add adds new tuntap interface.
func (t *Tuntap) Add() error {
var mode netlink.TuntapMode
switch t.Mode {
case "tun":
mode = netlink.TUNTAP_MODE_TUN
case "tap":
mode = netlink.TUNTAP_MODE_TAP
default:
return fmt.Errorf("Invalid tuntap mode %q", t.Mode)
}
var flags netlink.TuntapFlag
if t.MultiQueue {
flags = netlink.TUNTAP_MULTI_QUEUE_DEFAULTS
} else {
flags = netlink.TUNTAP_DEFAULTS
}
tuntap := &netlink.Tuntap{
LinkAttrs: netlink.LinkAttrs{
Name: t.Name,
},
Mode: mode,
Flags: flags,
}
err := netlink.LinkAdd(tuntap)
if err != nil {
return fmt.Errorf("Failed to create tuntap %q: %w", t.Name, err)
}
return nil
}
|