mirror of https://github.com/bjdgyc/anylink.git
优化pool
This commit is contained in:
parent
2ad65039f3
commit
712f57940c
|
@ -102,9 +102,10 @@ func cstpWrite(conn net.Conn, cSess *sessdata.ConnSession) {
|
||||||
hb := getByteZero()
|
hb := getByteZero()
|
||||||
header := *hb
|
header := *hb
|
||||||
header = append(header, h...)
|
header = append(header, h...)
|
||||||
if payload.PType == 0x00 { // data
|
if payload.PType == 0x00 {
|
||||||
binary.BigEndian.PutUint16(header[4:6], uint16(len(payload.Data)))
|
data := *payload.Data
|
||||||
header = append(header, payload.Data...)
|
binary.BigEndian.PutUint16(header[4:6], uint16(len(data)))
|
||||||
|
header = append(header, data...)
|
||||||
}
|
}
|
||||||
n, err = conn.Write(header)
|
n, err = conn.Write(header)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -103,7 +103,7 @@ func dtlsWrite(conn net.Conn, dSess *sessdata.DtlsSession, cSess *sessdata.ConnS
|
||||||
header := *hb
|
header := *hb
|
||||||
header = append(header, payload.PType)
|
header = append(header, payload.PType)
|
||||||
if payload.PType == 0x00 { // data
|
if payload.PType == 0x00 { // data
|
||||||
header = append(header, payload.Data...)
|
header = append(header, *payload.Data...)
|
||||||
}
|
}
|
||||||
n, err := conn.Write(header)
|
n, err := conn.Write(header)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -103,17 +103,16 @@ func tapWrite(ifce *water.Interface, cSess *sessdata.ConnSession) {
|
||||||
// var frame ethernet.Frame
|
// var frame ethernet.Frame
|
||||||
fb := getByteFull()
|
fb := getByteFull()
|
||||||
frame = *fb
|
frame = *fb
|
||||||
|
pData := *payload.Data
|
||||||
switch payload.LType {
|
switch payload.LType {
|
||||||
default:
|
default:
|
||||||
// log.Println(payload)
|
// log.Println(payload)
|
||||||
case sessdata.LTypeEthernet:
|
case sessdata.LTypeEthernet:
|
||||||
copy(frame, payload.Data)
|
copy(frame, pData)
|
||||||
frame = frame[:len(payload.Data)]
|
frame = frame[:len(pData)]
|
||||||
case sessdata.LTypeIPData: // 需要转换成 Ethernet 数据
|
case sessdata.LTypeIPData: // 需要转换成 Ethernet 数据
|
||||||
data := payload.Data
|
ip_src := waterutil.IPv4Source(pData)
|
||||||
|
if waterutil.IsIPv6(pData) || !ip_src.Equal(cSess.IpAddr) {
|
||||||
ip_src := waterutil.IPv4Source(data)
|
|
||||||
if waterutil.IsIPv6(data) || !ip_src.Equal(cSess.IpAddr) {
|
|
||||||
// 过滤掉IPv6的数据
|
// 过滤掉IPv6的数据
|
||||||
// 非分配给客户端ip,直接丢弃
|
// 非分配给客户端ip,直接丢弃
|
||||||
continue
|
continue
|
||||||
|
@ -122,7 +121,7 @@ func tapWrite(ifce *water.Interface, cSess *sessdata.ConnSession) {
|
||||||
// packet := gopacket.NewPacket(data, layers.LayerTypeIPv4, gopacket.Default)
|
// packet := gopacket.NewPacket(data, layers.LayerTypeIPv4, gopacket.Default)
|
||||||
// fmt.Println("get:", packet)
|
// fmt.Println("get:", packet)
|
||||||
|
|
||||||
ip_dst := waterutil.IPv4Destination(data)
|
ip_dst := waterutil.IPv4Destination(pData)
|
||||||
// fmt.Println("get:", ip_src, ip_dst)
|
// fmt.Println("get:", ip_src, ip_dst)
|
||||||
|
|
||||||
var dstHw net.HardwareAddr
|
var dstHw net.HardwareAddr
|
||||||
|
@ -142,8 +141,8 @@ func tapWrite(ifce *water.Interface, cSess *sessdata.ConnSession) {
|
||||||
}
|
}
|
||||||
// fmt.Println("Gateway", ip_dst, dstAddr.HardwareAddr)
|
// fmt.Println("Gateway", ip_dst, dstAddr.HardwareAddr)
|
||||||
|
|
||||||
frame.Prepare(dstHw, cSess.MacHw, ethernet.NotTagged, ethernet.IPv4, len(data))
|
frame.Prepare(dstHw, cSess.MacHw, ethernet.NotTagged, ethernet.IPv4, len(pData))
|
||||||
copy(frame[12+2:], data)
|
copy(frame[12+2:], pData)
|
||||||
}
|
}
|
||||||
|
|
||||||
// packet := gopacket.NewPacket(frame, layers.LayerTypeEthernet, gopacket.Default)
|
// packet := gopacket.NewPacket(frame, layers.LayerTypeEthernet, gopacket.Default)
|
||||||
|
|
|
@ -80,7 +80,7 @@ func tunWrite(ifce *water.Interface, cSess *sessdata.ConnSession) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = ifce.Write(payload.Data)
|
_, err = ifce.Write(*payload.Data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
base.Error("tun Write err", err)
|
base.Error("tun Write err", err)
|
||||||
return
|
return
|
||||||
|
|
|
@ -10,7 +10,7 @@ func payloadIn(cSess *sessdata.ConnSession, lType sessdata.LType, pType byte, da
|
||||||
pl := getPayload()
|
pl := getPayload()
|
||||||
pl.LType = lType
|
pl.LType = lType
|
||||||
pl.PType = pType
|
pl.PType = pType
|
||||||
pl.Data = append(pl.Data, data...)
|
*pl.Data = append(*pl.Data, data...)
|
||||||
|
|
||||||
return payloadInData(cSess, pl)
|
return payloadInData(cSess, pl)
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ func payloadOutCstp(cSess *sessdata.ConnSession, lType sessdata.LType, pType byt
|
||||||
pl := getPayload()
|
pl := getPayload()
|
||||||
pl.LType = lType
|
pl.LType = lType
|
||||||
pl.PType = pType
|
pl.PType = pType
|
||||||
pl.Data = append(pl.Data, data...)
|
*pl.Data = append(*pl.Data, data...)
|
||||||
|
|
||||||
closed := false
|
closed := false
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ func payloadOutDtls(cSess *sessdata.ConnSession, dSess *sessdata.DtlsSession, lT
|
||||||
pl := getPayload()
|
pl := getPayload()
|
||||||
pl.LType = lType
|
pl.LType = lType
|
||||||
pl.PType = pType
|
pl.PType = pType
|
||||||
pl.Data = append(pl.Data, data...)
|
*pl.Data = append(*pl.Data, data...)
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case cSess.PayloadOutDtls <- pl:
|
case cSess.PayloadOutDtls <- pl:
|
||||||
|
@ -80,9 +80,10 @@ func checkLinkAcl(group *dbdata.Group, payload *sessdata.Payload) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
ip_dst := waterutil.IPv4Destination(payload.Data)
|
data := *payload.Data
|
||||||
ip_port := waterutil.IPv4DestinationPort(payload.Data)
|
ip_dst := waterutil.IPv4Destination(data)
|
||||||
ip_proto := waterutil.IPv4Protocol(payload.Data)
|
ip_port := waterutil.IPv4DestinationPort(data)
|
||||||
|
ip_proto := waterutil.IPv4Protocol(data)
|
||||||
// fmt.Println("sent:", ip_dst, ip_port)
|
// fmt.Println("sent:", ip_dst, ip_port)
|
||||||
|
|
||||||
// 优先放行dns端口
|
// 优先放行dns端口
|
||||||
|
|
|
@ -8,8 +8,9 @@ import (
|
||||||
|
|
||||||
var plPool = sync.Pool{
|
var plPool = sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
|
b := make([]byte, 0, BufferSize)
|
||||||
pl := sessdata.Payload{
|
pl := sessdata.Payload{
|
||||||
Data: make([]byte, 0, BufferSize),
|
Data: &b,
|
||||||
}
|
}
|
||||||
// fmt.Println("plPool-init", len(pl.Data), cap(pl.Data))
|
// fmt.Println("plPool-init", len(pl.Data), cap(pl.Data))
|
||||||
return &pl
|
return &pl
|
||||||
|
@ -24,7 +25,7 @@ func getPayload() *sessdata.Payload {
|
||||||
func putPayload(pl *sessdata.Payload) {
|
func putPayload(pl *sessdata.Payload) {
|
||||||
pl.LType = 0
|
pl.LType = 0
|
||||||
pl.PType = 0
|
pl.PType = 0
|
||||||
pl.Data = pl.Data[:0]
|
*pl.Data = (*pl.Data)[:0]
|
||||||
plPool.Put(pl)
|
plPool.Put(pl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ const (
|
||||||
type Payload struct {
|
type Payload struct {
|
||||||
PType byte // payload types
|
PType byte // payload types
|
||||||
LType LType // LinkType
|
LType LType // LinkType
|
||||||
Data []byte
|
Data *[]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue