This commit is contained in:
黄思敏 2022-08-25 11:54:48 +08:00
parent c6f340a5ae
commit eead5b9d5f

36
tap.go
View File

@ -6,11 +6,13 @@ import (
"os/exec" "os/exec"
gen "slimming/proto/gen" gen "slimming/proto/gen"
"strings" "strings"
"sync/atomic"
"time" "time"
"github.com/songgao/packets/ethernet" "github.com/songgao/packets/ethernet"
"github.com/songgao/water" "github.com/songgao/water"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/connectivity"
"google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/credentials/insecure"
) )
@ -37,18 +39,31 @@ func (cli *RPCClient) connect() {
log.Printf("did not connect: %v", err) log.Printf("did not connect: %v", err)
return return
} }
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
log.Println(conn.WaitForStateChange(ctx, connectivity.Idle))
cli.conn = conn cli.conn = conn
go cli.run() go cli.run()
time.Sleep(time.Millisecond)
} }
func (cli *RPCClient) run() { func (cli *RPCClient) run() {
defer func() {
if err := recover(); err != nil {
log.Println("recover")
cli.conn = nil
}
}()
c := gen.NewFrameServiceClient(cli.conn) c := gen.NewFrameServiceClient(cli.conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel() defer cancel()
stream, err := c.SendFrames(ctx) stream, err := c.SendFrames(ctx)
if err != nil { if err != nil {
panic(err) log.Panic(err)
} }
for { for {
@ -60,7 +75,7 @@ func (cli *RPCClient) run() {
}) })
if err != nil { if err != nil {
panic(err) log.Panic(err)
} }
} }
} }
@ -73,12 +88,12 @@ func (nc *NetCard) Run() {
cmd := strings.Split("ip addr add 10.10.10.10/24 dev stap", " ") cmd := strings.Split("ip addr add 10.10.10.10/24 dev stap", " ")
err := exec.Command(cmd[0], cmd[1:]...).Run() err := exec.Command(cmd[0], cmd[1:]...).Run()
if err != nil { if err != nil {
panic(err) log.Panic(err)
} }
cmd = strings.Split("ip link set dev stap up", " ") cmd = strings.Split("ip link set dev stap up", " ")
err = exec.Command(cmd[0], cmd[1:]...).Run() err = exec.Command(cmd[0], cmd[1:]...).Run()
if err != nil { if err != nil {
panic(err) log.Panic(err)
} }
nc.server.run() nc.server.run()
} }
@ -92,7 +107,7 @@ func NewNetCard() *NetCard {
ifce, err := water.New(config) ifce, err := water.New(config)
if err != nil { if err != nil {
log.Fatal(err) log.Panic(err)
} }
nc := &NetCard{ nc := &NetCard{
@ -105,13 +120,20 @@ func NewNetCard() *NetCard {
} }
func (nc *NetCard) runRead() { func (nc *NetCard) runRead() {
log.Println("start netcard read")
var ifce *water.Interface = nc.ifce var ifce *water.Interface = nc.ifce
var ticker time.Ticker = *time.NewTicker(time.Millisecond * 20)
for { for {
var framesBytes [][]byte var framesBytes [][]byte
for range ticker.C { var isLoop int32 = 1
go func() {
var after = time.NewTimer(time.Millisecond * 20)
<-after.C
atomic.StoreInt32(&isLoop, 0)
}()
for atomic.LoadInt32(&isLoop) > 0 {
var rframe ethernet.Frame var rframe ethernet.Frame
rframe.Resize(1500) rframe.Resize(1500)
n, err := ifce.Read([]byte(rframe)) n, err := ifce.Read([]byte(rframe))