From 28df4d850d12b6b03f7e529bc7c369ebfeb35b40 Mon Sep 17 00:00:00 2001 From: huangsimin Date: Fri, 26 Aug 2022 01:14:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- tap.go | 30 ++++++++++++++--------------- 2 files changed, 73 insertions(+), 16 deletions(-) diff --git a/main.go b/main.go index 74a18ac..6d5eecf 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,15 @@ package main -import "log" +import ( + "fmt" + "log" + "os/exec" + "strings" + + "github.com/songgao/packets/ethernet" + "github.com/songgao/water" + "github.com/songgao/water/waterutil" +) func init() { log.SetFlags(log.Llongfile | log.LstdFlags) @@ -8,5 +17,53 @@ func init() { //go:generate bash -c "protoc --go_out=plugins=grpc:. proto/*.proto" func main() { + // testmain() NewNetCard().Run() } + +func testmain() { + var a chan bool = make(chan bool) + go func() { + <-a + + cmdstr := fmt.Sprintf("ip addr add %s dev stun", config.Network.Self.Virt) + log.Println(cmdstr) + cmd := strings.Split(cmdstr, " ") + err := exec.Command(cmd[0], cmd[1:]...).Run() + if err != nil { + log.Panic(err) + } + + cmdstr = "ip link set dev stun up" + cmd = strings.Split(cmdstr, " ") + err = exec.Command(cmd[0], cmd[1:]...).Run() + if err != nil { + log.Panic(err) + } + }() + + config := water.Config{ + DeviceType: water.TUN, + } + config.Name = "stun" + + ifce, err := water.New(config) + if err != nil { + log.Fatal(err) + } + a <- true + var frame ethernet.Frame + + for { + frame.Resize(1500) + n, err := ifce.Read([]byte(frame)) + if err != nil { + log.Fatal(err) + } + frame = frame[:n] + log.Printf("Dst: %s\n", waterutil.IPv4Destination(frame)) + log.Printf("Src: %s\n", waterutil.IPv4Source(frame)) + log.Printf("Ethertype: % x\n", frame.Ethertype()) + // log.Printf("Payload: % x\n", frame.Payload()) + } +} diff --git a/tap.go b/tap.go index afdcdb7..e04a179 100644 --- a/tap.go +++ b/tap.go @@ -7,7 +7,6 @@ import ( "flag" "fmt" "log" - "net" "os/exec" gen "slimming/proto/gen" "strings" @@ -17,6 +16,7 @@ import ( "github.com/klauspost/compress/zstd" "github.com/songgao/packets/ethernet" "github.com/songgao/water" + "github.com/songgao/water/waterutil" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) @@ -97,7 +97,7 @@ func (nc *NetCard) Run() { // go nc.cli.run() time.Sleep(time.Second) - cmdstr := fmt.Sprintf("ip addr add %s dev stap", config.Network.Self.Virt) + cmdstr := fmt.Sprintf("ip addr add %s dev stun", config.Network.Self.Virt) log.Println(cmdstr) cmd := strings.Split(cmdstr, " ") err := exec.Command(cmd[0], cmd[1:]...).Run() @@ -105,7 +105,7 @@ func (nc *NetCard) Run() { log.Panic(err) } - cmdstr = "ip link set dev stap up" + cmdstr = "ip link set dev stun up" cmd = strings.Split(cmdstr, " ") err = exec.Command(cmd[0], cmd[1:]...).Run() if err != nil { @@ -120,7 +120,7 @@ func NewNetCard() *NetCard { config := water.Config{ DeviceType: water.TUN, } - config.Name = "stap" + config.Name = "stun" ifce, err := water.New(config) if err != nil { @@ -155,28 +155,27 @@ func (nc *NetCard) runRead() { for atomic.LoadInt32(&isLoop) > 0 { var rframe ethernet.Frame rframe.Resize(1500) + n, err := ifce.Read([]byte(rframe)) if err != nil { log.Fatal(err) } + rframe = rframe[:n] - log.Printf("%v %v", net.IP(rframe.Source()).To4().String(), net.IP(rframe.Destination()).To4()) + // log.Printf("Payload: % x\n", rframe.Payload()) - if rframe.Ethertype() != ethernet.IPv4 { - continue - } - - log.Println(net.IP(rframe.Destination()).String()) + log.Printf("Dst: %s\n", waterutil.IPv4Destination(rframe)) + log.Printf("Src: %s\n", waterutil.IPv4Source(rframe)) + log.Printf("Ethertype: % x\n", rframe.Ethertype()) var buffer *[][]byte - if buffer, ok = bytesMap[net.IP(rframe.Destination()).String()]; !ok { - mbuffer := make([][]byte, 100) + var key = waterutil.IPv4Destination(rframe).String() + if buffer, ok = bytesMap[key]; !ok { + mbuffer := make([][]byte, 0, 100) buffer = &mbuffer - bytesMap[net.IP(rframe.Destination()).String()] = buffer + bytesMap[key] = buffer } - rframe = rframe[:n] - *buffer = append(*buffer, []byte(rframe)) } @@ -192,6 +191,7 @@ func (nc *NetCard) runRead() { cli.connect(dst) } else { cli.FrameChan <- *buffer // 网卡数据 发到对方 + *buffer = (*buffer)[0:] } }