From eead5b9d5f882856ba4c87d613c53480df7c90e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=80=9D=E6=95=8F?= Date: Thu, 25 Aug 2022 11:54:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tap.go | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/tap.go b/tap.go index 462640c..d7e67e8 100644 --- a/tap.go +++ b/tap.go @@ -6,11 +6,13 @@ import ( "os/exec" gen "slimming/proto/gen" "strings" + "sync/atomic" "time" "github.com/songgao/packets/ethernet" "github.com/songgao/water" "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" "google.golang.org/grpc/credentials/insecure" ) @@ -37,18 +39,31 @@ func (cli *RPCClient) connect() { log.Printf("did not connect: %v", err) return } + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + log.Println(conn.WaitForStateChange(ctx, connectivity.Idle)) cli.conn = conn go cli.run() + time.Sleep(time.Millisecond) } func (cli *RPCClient) run() { + defer func() { + if err := recover(); err != nil { + log.Println("recover") + cli.conn = nil + } + }() + c := gen.NewFrameServiceClient(cli.conn) ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() stream, err := c.SendFrames(ctx) if err != nil { - panic(err) + log.Panic(err) } for { @@ -60,7 +75,7 @@ func (cli *RPCClient) run() { }) 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", " ") err := exec.Command(cmd[0], cmd[1:]...).Run() if err != nil { - panic(err) + log.Panic(err) } cmd = strings.Split("ip link set dev stap up", " ") err = exec.Command(cmd[0], cmd[1:]...).Run() if err != nil { - panic(err) + log.Panic(err) } nc.server.run() } @@ -92,7 +107,7 @@ func NewNetCard() *NetCard { ifce, err := water.New(config) if err != nil { - log.Fatal(err) + log.Panic(err) } nc := &NetCard{ @@ -105,13 +120,20 @@ func NewNetCard() *NetCard { } func (nc *NetCard) runRead() { + log.Println("start netcard read") var ifce *water.Interface = nc.ifce - var ticker time.Ticker = *time.NewTicker(time.Millisecond * 20) + for { 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 rframe.Resize(1500) n, err := ifce.Read([]byte(rframe))