优化payload

This commit is contained in:
bjdgyc 2021-07-29 19:02:55 +08:00
parent 3937d1eb65
commit 583ca4d635
5 changed files with 69 additions and 72 deletions

View File

@ -20,6 +20,7 @@ func LinkCstp(conn net.Conn, cSess *sessdata.ConnSession) {
err error err error
n int n int
dataLen uint16 dataLen uint16
data []byte
dead = time.Duration(cSess.CstpDpd+5) * time.Second dead = time.Duration(cSess.CstpDpd+5) * time.Second
) )
@ -34,9 +35,9 @@ func LinkCstp(conn net.Conn, cSess *sessdata.ConnSession) {
return return
} }
// hdata := make([]byte, BufferSize) // hdata := make([]byte, BufferSize)
hb := getByteFull() pl := getPayload()
hdata := *hb data = *pl.Data
n, err = conn.Read(hdata) n, err = conn.Read(data)
if err != nil { if err != nil {
base.Error("read hdata: ", err) base.Error("read hdata: ", err)
return return
@ -48,7 +49,7 @@ func LinkCstp(conn net.Conn, cSess *sessdata.ConnSession) {
base.Error(err) base.Error(err)
} }
switch hdata[6] { switch data[6] {
case 0x07: // KEEPALIVE case 0x07: // KEEPALIVE
// do nothing // do nothing
// base.Debug("recv keepalive", cSess.IpAddr) // base.Debug("recv keepalive", cSess.IpAddr)
@ -57,19 +58,20 @@ func LinkCstp(conn net.Conn, cSess *sessdata.ConnSession) {
return return
case 0x03: // DPD-REQ case 0x03: // DPD-REQ
// base.Debug("recv DPD-REQ", cSess.IpAddr) // base.Debug("recv DPD-REQ", cSess.IpAddr)
if payloadOutCstp(cSess, sessdata.LTypeIPData, 0x04, nil) { pl.PType = 0x04
if payloadOutCstp(cSess, pl) {
return return
} }
case 0x04: case 0x04:
// log.Println("recv DPD-RESP") // log.Println("recv DPD-RESP")
case 0x00: // DATA case 0x00: // DATA
dataLen = binary.BigEndian.Uint16(hdata[4:6]) // 4,5 dataLen = binary.BigEndian.Uint16(data[4:6]) // 4,5
if payloadIn(cSess, sessdata.LTypeIPData, 0x00, hdata[8:8+dataLen]) { copy(data, data[8:8+dataLen])
*pl.Data = data[:dataLen]
if payloadIn(cSess, pl) {
return return
} }
} }
putByte(hb)
} }
} }
@ -83,38 +85,40 @@ func cstpWrite(conn net.Conn, cSess *sessdata.ConnSession) {
var ( var (
err error err error
n int n int
// header []byte data []byte
payload *sessdata.Payload pl *sessdata.Payload
) )
for { for {
select { select {
case payload = <-cSess.PayloadOutCstp: case pl = <-cSess.PayloadOutCstp:
case <-cSess.CloseChan: case <-cSess.CloseChan:
return return
} }
if payload.LType != sessdata.LTypeIPData { if pl.LType != sessdata.LTypeIPData {
continue continue
} }
h := []byte{'S', 'T', 'F', 0x01, 0x00, 0x00, payload.PType, 0x00} data = *pl.Data
hb := getByteZero() if pl.PType == 0x00 {
header := *hb l := len(data)
header = append(header, h...) data = data[:l+8]
if payload.PType == 0x00 { copy(data[8:], data)
data := *payload.Data copy(data[:8], plHeader)
binary.BigEndian.PutUint16(header[4:6], uint16(len(data))) binary.BigEndian.PutUint16(data[4:6], uint16(l))
header = append(header, data...) } else {
data = append(data[:0], plHeader...)
data[6] = pl.PType
} }
n, err = conn.Write(header) *pl.Data = data
n, err = conn.Write(*pl.Data)
if err != nil { if err != nil {
base.Error("write err", err) base.Error("write err", err)
return return
} }
putByte(hb) putPayload(pl)
putPayload(payload)
// 限流设置 // 限流设置
err = cSess.RateLimit(n, false) err = cSess.RateLimit(n, false)

View File

@ -70,23 +70,23 @@ func tunWrite(ifce *water.Interface, cSess *sessdata.ConnSession) {
var ( var (
err error err error
payload *sessdata.Payload pl *sessdata.Payload
) )
for { for {
select { select {
case payload = <-cSess.PayloadIn: case pl = <-cSess.PayloadIn:
case <-cSess.CloseChan: case <-cSess.CloseChan:
return return
} }
_, err = ifce.Write(*payload.Data) _, err = ifce.Write(*pl.Data)
if err != nil { if err != nil {
base.Error("tun Write err", err) base.Error("tun Write err", err)
return return
} }
putPayload(payload) putPayload(pl)
} }
} }
@ -102,14 +102,15 @@ func tunRead(ifce *water.Interface, cSess *sessdata.ConnSession) {
for { for {
// data := make([]byte, BufferSize) // data := make([]byte, BufferSize)
hb := getByteFull() pl := getPayload()
data := *hb n, err = ifce.Read(*pl.Data)
n, err = ifce.Read(data)
if err != nil { if err != nil {
base.Error("tun Read err", n, err) base.Error("tun Read err", n, err)
return return
} }
*pl.Data = (*pl.Data)[:n]
// data = data[:n] // data = data[:n]
// ip_src := waterutil.IPv4Source(data) // ip_src := waterutil.IPv4Source(data)
// ip_dst := waterutil.IPv4Destination(data) // ip_dst := waterutil.IPv4Destination(data)
@ -118,10 +119,8 @@ func tunRead(ifce *water.Interface, cSess *sessdata.ConnSession) {
// packet := gopacket.NewPacket(data, layers.LayerTypeIPv4, gopacket.Default) // packet := gopacket.NewPacket(data, layers.LayerTypeIPv4, gopacket.Default)
// fmt.Println("read:", packet) // fmt.Println("read:", packet)
if payloadOut(cSess, sessdata.LTypeIPData, 0x00, data[:n]) { if payloadOut(cSess, pl) {
return return
} }
putByte(hb)
} }
} }

View File

@ -6,18 +6,9 @@ import (
"github.com/songgao/water/waterutil" "github.com/songgao/water/waterutil"
) )
func payloadIn(cSess *sessdata.ConnSession, lType sessdata.LType, pType byte, data []byte) bool { func payloadIn(cSess *sessdata.ConnSession, pl *sessdata.Payload) bool {
pl := getPayload()
pl.LType = lType
pl.PType = pType
*pl.Data = append(*pl.Data, data...)
return payloadInData(cSess, pl)
}
func payloadInData(cSess *sessdata.ConnSession, payload *sessdata.Payload) bool {
// 进行Acl规则判断 // 进行Acl规则判断
check := checkLinkAcl(cSess.Group, payload) check := checkLinkAcl(cSess.Group, pl)
if !check { if !check {
// 校验不通过直接丢弃 // 校验不通过直接丢弃
return false return false
@ -25,7 +16,7 @@ func payloadInData(cSess *sessdata.ConnSession, payload *sessdata.Payload) bool
closed := false closed := false
select { select {
case cSess.PayloadIn <- payload: case cSess.PayloadIn <- pl:
case <-cSess.CloseChan: case <-cSess.CloseChan:
closed = true closed = true
} }
@ -33,21 +24,16 @@ func payloadInData(cSess *sessdata.ConnSession, payload *sessdata.Payload) bool
return closed return closed
} }
func payloadOut(cSess *sessdata.ConnSession, lType sessdata.LType, pType byte, data []byte) bool { func payloadOut(cSess *sessdata.ConnSession, pl *sessdata.Payload) bool {
dSess := cSess.GetDtlsSession() dSess := cSess.GetDtlsSession()
if dSess == nil { if dSess == nil {
return payloadOutCstp(cSess, lType, pType, data) return payloadOutCstp(cSess, pl)
} else { } else {
return payloadOutDtls(cSess, dSess, lType, pType, data) return payloadOutDtls(cSess, dSess, pl)
} }
} }
func payloadOutCstp(cSess *sessdata.ConnSession, lType sessdata.LType, pType byte, data []byte) bool { func payloadOutCstp(cSess *sessdata.ConnSession, pl *sessdata.Payload) bool {
pl := getPayload()
pl.LType = lType
pl.PType = pType
*pl.Data = append(*pl.Data, data...)
closed := false closed := false
select { select {
@ -59,12 +45,7 @@ func payloadOutCstp(cSess *sessdata.ConnSession, lType sessdata.LType, pType byt
return closed return closed
} }
func payloadOutDtls(cSess *sessdata.ConnSession, dSess *sessdata.DtlsSession, lType sessdata.LType, pType byte, data []byte) bool { func payloadOutDtls(cSess *sessdata.ConnSession, dSess *sessdata.DtlsSession, pl *sessdata.Payload) bool {
pl := getPayload()
pl.LType = lType
pl.PType = pType
*pl.Data = append(*pl.Data, data...)
select { select {
case cSess.PayloadOutDtls <- pl: case cSess.PayloadOutDtls <- pl:
case <-dSess.CloseChan: case <-dSess.CloseChan:

View File

@ -3,13 +3,20 @@ package handler
import ( import (
"sync" "sync"
"github.com/bjdgyc/anylink/base"
"github.com/bjdgyc/anylink/sessdata" "github.com/bjdgyc/anylink/sessdata"
) )
var plPool = sync.Pool{ // 不允许直接修改
// [6] => PType
var plHeader = []byte{'S', 'T', 'F', 0x01, 0x00, 0x00, 0x00, 0x00}
var plPool = &sync.Pool{
New: func() interface{} { New: func() interface{} {
b := make([]byte, 0, BufferSize) b := make([]byte, BufferSize)
pl := sessdata.Payload{ pl := sessdata.Payload{
LType: sessdata.LTypeIPData,
PType: 0x00,
Data: &b, Data: &b,
} }
// fmt.Println("plPool-init", len(pl.Data), cap(pl.Data)) // fmt.Println("plPool-init", len(pl.Data), cap(pl.Data))
@ -23,13 +30,19 @@ func getPayload() *sessdata.Payload {
} }
func putPayload(pl *sessdata.Payload) { func putPayload(pl *sessdata.Payload) {
pl.LType = 0 // 错误数据丢弃
pl.PType = 0 if cap(*pl.Data) != BufferSize {
*pl.Data = (*pl.Data)[:0] base.Warn("payload cap is err", cap(*pl.Data))
return
}
pl.LType = sessdata.LTypeIPData
pl.PType = 0x00
*pl.Data = (*pl.Data)[:BufferSize]
plPool.Put(pl) plPool.Put(pl)
} }
var bytePool = sync.Pool{ var bytePool = &sync.Pool{
New: func() interface{} { New: func() interface{} {
b := make([]byte, 0, BufferSize) b := make([]byte, 0, BufferSize)
// fmt.Println("bytePool-init") // fmt.Println("bytePool-init")

View File

@ -8,8 +8,8 @@ const (
) )
type Payload struct { type Payload struct {
PType byte // payload types
LType LType // LinkType LType LType // LinkType
PType byte // payload types
Data *[]byte Data *[]byte
} }