mirror of
https://github.com/wlynxg/NetHive.git
synced 2025-10-05 06:56:51 +08:00
94 lines
1.4 KiB
Go
94 lines
1.4 KiB
Go
package engine
|
|
|
|
import (
|
|
"NetHive/core/device"
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/libp2p/go-libp2p/core/host"
|
|
)
|
|
|
|
const (
|
|
BuffSize = 1024
|
|
)
|
|
|
|
type Engine struct {
|
|
ctx context.Context
|
|
option Option
|
|
// tun device
|
|
device device.Device
|
|
|
|
host host.Host
|
|
|
|
devWriter chan Payload
|
|
connWriter chan Payload
|
|
errChan chan error
|
|
}
|
|
|
|
func New(opt *Option) (*Engine, error) {
|
|
var (
|
|
e = new(Engine)
|
|
)
|
|
|
|
return e, nil
|
|
}
|
|
|
|
func (e *Engine) Start() error {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
e.ctx = ctx
|
|
defer cancel()
|
|
|
|
opt := e.option
|
|
|
|
// create tun
|
|
tun, err := device.CreateTUN(opt.Device.TUNName, opt.Device.MTU)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
e.device = tun
|
|
|
|
e.devWriter = make(chan Payload, 100)
|
|
e.connWriter = make(chan Payload, 100)
|
|
|
|
go e.RoutineTUNReader()
|
|
go e.RoutineTUNWriter()
|
|
|
|
if err := <-e.errChan; err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e *Engine) RoutineTUNReader() {
|
|
var (
|
|
payload Payload
|
|
buff = make([]byte, BuffSize)
|
|
err error
|
|
n int
|
|
)
|
|
for {
|
|
n, err = e.device.Read(buff)
|
|
if err != nil {
|
|
e.errChan <- fmt.Errorf("[RoutineTUNReader]: %s", err)
|
|
return
|
|
}
|
|
copy(payload.Data, buff[:n])
|
|
e.connWriter <- payload
|
|
}
|
|
}
|
|
|
|
func (e *Engine) RoutineTUNWriter() {
|
|
var (
|
|
payload Payload
|
|
err error
|
|
)
|
|
|
|
for payload = range e.connWriter {
|
|
_, err = e.device.Write(payload.Data)
|
|
if err != nil {
|
|
e.errChan <- fmt.Errorf("[RoutineTUNWriter]: %s", err)
|
|
return
|
|
}
|
|
}
|
|
}
|