import (
"io"
-
- "golang.org/x/crypto/poly1305"
-)
-
-const (
- EtherSize = 14
)
type TAP struct {
taps = make(map[string]*TAP)
)
-// Return maximal acceptable TAP interface MTU. This is daemon's MTU
-// minus nonce, MAC, pad and Ethernet header sizes.
-func TAPMaxMTU() int {
- return MTU - poly1305.TagSize - NonceSize - 1 - EtherSize
-}
-
-func NewTAP(ifaceName string) (*TAP, error) {
- maxIfacePktSize := TAPMaxMTU() + EtherSize
+func NewTAP(ifaceName string, mtu int) (*TAP, error) {
tapRaw, err := newTAPer(ifaceName)
if err != nil {
return nil, err
tap := TAP{
Name: ifaceName,
dev: tapRaw,
- buf0: make([]byte, maxIfacePktSize),
- buf1: make([]byte, maxIfacePktSize),
+ buf0: make([]byte, mtu),
+ buf1: make([]byte, mtu),
Sink: make(chan []byte),
}
go func() {
return t.dev.Write(data)
}
-func TAPListen(ifaceName string) (*TAP, error) {
+func TAPListen(ifaceName string, mtu int) (*TAP, error) {
tap, exists := taps[ifaceName]
if exists {
return tap, nil
}
- tap, err := NewTAP(ifaceName)
+ tap, err := NewTAP(ifaceName, mtu)
if err != nil {
return nil, err
}