From 0512ce197ab3aebef867c9c71f9647c6ffdf4fbf Mon Sep 17 00:00:00 2001 From: bjdgyc Date: Sat, 29 May 2021 17:31:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96gc=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/base/app_ver.go | 2 +- server/handler/link_cstp.go | 19 +++++++++----- server/handler/link_dtls.go | 25 +++++++++++++----- server/handler/link_tun.go | 11 +++++--- server/handler/payload.go | 33 +++++++++++------------ server/handler/pool.go | 52 +++++++++++++++++++++++++++++++++++++ 6 files changed, 106 insertions(+), 36 deletions(-) create mode 100644 server/handler/pool.go diff --git a/server/base/app_ver.go b/server/base/app_ver.go index 5494255..52fe698 100644 --- a/server/base/app_ver.go +++ b/server/base/app_ver.go @@ -2,5 +2,5 @@ package base const ( APP_NAME = "AnyLink" - APP_VER = "0.2.1" + APP_VER = "0.3.1" ) diff --git a/server/handler/link_cstp.go b/server/handler/link_cstp.go index 4613de9..431cefb 100644 --- a/server/handler/link_cstp.go +++ b/server/handler/link_cstp.go @@ -33,7 +33,8 @@ func LinkCstp(conn net.Conn, cSess *sessdata.ConnSession) { base.Error("SetDeadline: ", err) return } - hdata := make([]byte, BufferSize) + // hdata := make([]byte, BufferSize) + hdata := getByteFull() n, err = conn.Read(hdata) if err != nil { base.Error("read hdata: ", err) @@ -65,8 +66,9 @@ func LinkCstp(conn net.Conn, cSess *sessdata.ConnSession) { if payloadIn(cSess, sessdata.LTypeIPData, 0x00, hdata[8:8+dataLen]) { return } - } + + putByte(hdata) } } @@ -78,9 +80,9 @@ func cstpWrite(conn net.Conn, cSess *sessdata.ConnSession) { }() var ( - err error - n int - header []byte + err error + n int + // header []byte payload *sessdata.Payload ) @@ -95,7 +97,9 @@ func cstpWrite(conn net.Conn, cSess *sessdata.ConnSession) { continue } - header = []byte{'S', 'T', 'F', 0x01, 0x00, 0x00, payload.PType, 0x00} + h := []byte{'S', 'T', 'F', 0x01, 0x00, 0x00, payload.PType, 0x00} + header := getByteZero() + header = append(header, h...) if payload.PType == 0x00 { // data binary.BigEndian.PutUint16(header[4:6], uint16(len(payload.Data))) header = append(header, payload.Data...) @@ -106,6 +110,9 @@ func cstpWrite(conn net.Conn, cSess *sessdata.ConnSession) { return } + putByte(header) + putPayload(payload) + // 限流设置 err = cSess.RateLimit(n, false) if err != nil { diff --git a/server/handler/link_dtls.go b/server/handler/link_dtls.go index 4883a42..d94daaf 100644 --- a/server/handler/link_dtls.go +++ b/server/handler/link_dtls.go @@ -9,7 +9,7 @@ import ( ) func LinkDtls(conn net.Conn, cSess *sessdata.ConnSession) { - base.Debug("LinkDtls connect", cSess.IpAddr, conn.RemoteAddr()) + base.Debug("LinkDtls connect ip:", cSess.IpAddr, "udp-rip:", conn.RemoteAddr()) dSess := cSess.NewDtlsConn() if dSess == nil { // 创建失败,直接关闭链接 @@ -35,7 +35,9 @@ func LinkDtls(conn net.Conn, cSess *sessdata.ConnSession) { base.Error("SetDeadline: ", err) return } - hdata := make([]byte, BufferSize) + + // hdata := make([]byte, BufferSize) + hdata := getByteFull() n, err := conn.Read(hdata) if err != nil { base.Error("read hdata: ", err) @@ -51,9 +53,9 @@ func LinkDtls(conn net.Conn, cSess *sessdata.ConnSession) { switch hdata[0] { case 0x07: // KEEPALIVE // do nothing - base.Debug("recv keepalive", cSess.IpAddr) + // base.Debug("recv keepalive", cSess.IpAddr) case 0x05: // DISCONNECT - base.Debug("DISCONNECT", cSess.IpAddr) + base.Debug("DISCONNECT DTLS", cSess.IpAddr) return case 0x03: // DPD-REQ // base.Debug("recv DPD-REQ", cSess.IpAddr) @@ -67,6 +69,8 @@ func LinkDtls(conn net.Conn, cSess *sessdata.ConnSession) { return } } + + putByte(hdata) } } @@ -78,7 +82,7 @@ func dtlsWrite(conn net.Conn, dSess *sessdata.DtlsSession, cSess *sessdata.ConnS }() var ( - header []byte + // header []byte payload *sessdata.Payload ) @@ -94,14 +98,21 @@ func dtlsWrite(conn net.Conn, dSess *sessdata.DtlsSession, cSess *sessdata.ConnS continue } - header = []byte{payload.PType} - header = append(header, payload.Data...) + // header = []byte{payload.PType} + header := getByteZero() + header = append(header, payload.PType) + if payload.PType == 0x00 { // data + header = append(header, payload.Data...) + } n, err := conn.Write(header) if err != nil { base.Error("write err", err) return } + putByte(header) + putPayload(payload) + // 限流设置 err = cSess.RateLimit(n, false) if err != nil { diff --git a/server/handler/link_tun.go b/server/handler/link_tun.go index 13b7ee2..0a7c3d8 100644 --- a/server/handler/link_tun.go +++ b/server/handler/link_tun.go @@ -84,6 +84,8 @@ func tunWrite(ifce *water.Interface, cSess *sessdata.ConnSession) { base.Error("tun Write err", err) return } + + putPayload(payload) } } @@ -98,15 +100,15 @@ func tunRead(ifce *water.Interface, cSess *sessdata.ConnSession) { ) for { - data := make([]byte, BufferSize) + // data := make([]byte, BufferSize) + data := getByteFull() n, err = ifce.Read(data) if err != nil { base.Error("tun Read err", n, err) return } - data = data[:n] - + // data = data[:n] // ip_src := waterutil.IPv4Source(data) // ip_dst := waterutil.IPv4Destination(data) // ip_port := waterutil.IPv4DestinationPort(data) @@ -114,9 +116,10 @@ func tunRead(ifce *water.Interface, cSess *sessdata.ConnSession) { // packet := gopacket.NewPacket(data, layers.LayerTypeIPv4, gopacket.Default) // fmt.Println("read:", packet) - if payloadOut(cSess, sessdata.LTypeIPData, 0x00, data) { + if payloadOut(cSess, sessdata.LTypeIPData, 0x00, data[:n]) { return } + putByte(data) } } diff --git a/server/handler/payload.go b/server/handler/payload.go index 3264b23..91dd0cc 100644 --- a/server/handler/payload.go +++ b/server/handler/payload.go @@ -7,13 +7,12 @@ import ( ) func payloadIn(cSess *sessdata.ConnSession, lType sessdata.LType, pType byte, data []byte) bool { - payload := &sessdata.Payload{ - LType: lType, - PType: pType, - Data: data, - } + pl := getPayload() + pl.LType = lType + pl.PType = pType + pl.Data = append(pl.Data, data...) - return payloadInData(cSess, payload) + return payloadInData(cSess, pl) } func payloadInData(cSess *sessdata.ConnSession, payload *sessdata.Payload) bool { @@ -44,16 +43,15 @@ func payloadOut(cSess *sessdata.ConnSession, lType sessdata.LType, pType byte, d } func payloadOutCstp(cSess *sessdata.ConnSession, lType sessdata.LType, pType byte, data []byte) bool { - payload := &sessdata.Payload{ - LType: lType, - PType: pType, - Data: data, - } + pl := getPayload() + pl.LType = lType + pl.PType = pType + pl.Data = append(pl.Data, data...) closed := false select { - case cSess.PayloadOutCstp <- payload: + case cSess.PayloadOutCstp <- pl: case <-cSess.CloseChan: closed = true } @@ -62,14 +60,13 @@ func payloadOutCstp(cSess *sessdata.ConnSession, lType sessdata.LType, pType byt } func payloadOutDtls(cSess *sessdata.ConnSession, dSess *sessdata.DtlsSession, lType sessdata.LType, pType byte, data []byte) bool { - payload := &sessdata.Payload{ - LType: lType, - PType: pType, - Data: data, - } + pl := getPayload() + pl.LType = lType + pl.PType = pType + pl.Data = append(pl.Data, data...) select { - case cSess.PayloadOutDtls <- payload: + case cSess.PayloadOutDtls <- pl: case <-dSess.CloseChan: } diff --git a/server/handler/pool.go b/server/handler/pool.go new file mode 100644 index 0000000..27ddffb --- /dev/null +++ b/server/handler/pool.go @@ -0,0 +1,52 @@ +package handler + +import ( + "sync" + + "github.com/bjdgyc/anylink/sessdata" +) + +var plPool = sync.Pool{ + New: func() interface{} { + pl := sessdata.Payload{ + Data: make([]byte, 0, BufferSize), + } + // fmt.Println("plPool-init", len(pl.Data), cap(pl.Data)) + return &pl + }, +} + +func getPayload() *sessdata.Payload { + pl := plPool.Get().(*sessdata.Payload) + return pl +} + +func putPayload(pl *sessdata.Payload) { + pl.LType = 0 + pl.PType = 0 + pl.Data = pl.Data[:0] + plPool.Put(pl) +} + +var bytePool = sync.Pool{ + New: func() interface{} { + b := make([]byte, 0, BufferSize) + // fmt.Println("bytePool-init") + return b + }, +} + +func getByteZero() []byte { + b := bytePool.Get().([]byte) + return b +} + +func getByteFull() []byte { + b := bytePool.Get().([]byte) + b = b[:BufferSize] + return b +} +func putByte(b []byte) { + b = b[:0] + bytePool.Put(b) +}