/* GoVPN -- simple secure free software virtual private network daemon Copyright (C) 2014-2015 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package govpn import ( "io" "golang.org/x/crypto/poly1305" ) const ( EtherSize = 14 ) type TAP struct { Name string dev io.ReadWriter buf []byte sink chan []byte ready chan struct{} synced bool } func TAPMaxMTU() int { return MTU - poly1305.TagSize - NonceSize - PktSizeSize - EtherSize } func NewTAP(ifaceName string) (*TAP, error) { maxIfacePktSize := TAPMaxMTU() + EtherSize tapRaw, err := newTAPer(ifaceName) if err != nil { return nil, err } tap := TAP{ Name: ifaceName, dev: tapRaw, buf: make([]byte, maxIfacePktSize), sink: make(chan []byte), ready: make(chan struct{}), synced: false, } go func() { var n int var err error for { <-tap.ready n, err = tap.dev.Read(tap.buf) if err != nil { panic(err) } tap.sink <- tap.buf[:n] } }() return &tap, nil } func (t *TAP) Write(data []byte) (n int, err error) { return t.dev.Write(data) }