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