增加基于tap设备的桥接访问模式

This commit is contained in:
bjdgyc
2020-09-14 17:17:50 +08:00
parent 3b64de19b8
commit 31b1f12dbe
57 changed files with 2598 additions and 703 deletions

View File

@@ -2,16 +2,17 @@ package handler
import (
"encoding/binary"
"fmt"
"log"
"net"
"time"
"github.com/bjdgyc/anylink/common"
"github.com/bjdgyc/anylink/sessdata"
)
func LinkCstp(conn net.Conn, sess *ConnSession) {
// fmt.Println("HandlerCstp")
func LinkCstp(conn net.Conn, sess *sessdata.ConnSession) {
log.Println("HandlerCstp")
sessdata.Sess = sess
defer func() {
log.Println("LinkCstp return")
conn.Close()
@@ -20,6 +21,7 @@ func LinkCstp(conn net.Conn, sess *ConnSession) {
var (
err error
n int
dataLen uint16
dead = time.Duration(common.ServerCfg.CstpDpd+2) * time.Second
)
@@ -27,54 +29,53 @@ func LinkCstp(conn net.Conn, sess *ConnSession) {
go cstpWrite(conn, sess)
for {
// 设置超时限制
err = conn.SetDeadline(time.Now().Add(dead))
err = conn.SetReadDeadline(time.Now().Add(dead))
if err != nil {
log.Println("SetDeadline: ", err)
return
}
hdata := make([]byte, 1500)
_, err = conn.Read(hdata)
hdata := make([]byte, BufferSize)
n, err = conn.Read(hdata)
if err != nil {
log.Println("read hdata: ", err)
return
}
// 限流设置
err = sess.RateLimit(n, true)
if err != nil {
log.Println(err)
}
switch hdata[6] {
case 0x07: // KEEPALIVE
// do nothing
// fmt.Println("keepalive")
// log.Println("recv keepalive")
case 0x05: // DISCONNECT
// fmt.Println("DISCONNECT")
// log.Println("DISCONNECT")
return
case 0x03: // DPD-REQ
fmt.Println("DPD-REQ")
payload := &Payload{
ptype: 0x04, // DPD-RESP
}
// 直接返回给客户端 resp
select {
case sess.PayloadOut <- payload:
case <-sess.Closed:
// log.Println("recv DPD-REQ")
if payloadOut(sess, sessdata.LTypeIPData, 0x04, nil) {
return
}
break
case 0x00:
case 0x04:
// log.Println("recv DPD-RESP")
case 0x00: // DATA
dataLen = binary.BigEndian.Uint16(hdata[4:6]) // 4,5
payload := &Payload{
ptype: 0x00, // DPD-RESP
data: hdata[8 : 8+dataLen],
}
select {
case sess.PayloadIn <- payload:
case <-sess.Closed:
data := hdata[8 : 8+dataLen]
if payloadIn(sess, sessdata.LTypeIPData, 0x00, data) {
return
}
}
}
}
func cstpWrite(conn net.Conn, sess *ConnSession) {
func cstpWrite(conn net.Conn, sess *sessdata.ConnSession) {
defer func() {
log.Println("cstpWrite return")
conn.Close()
@@ -83,26 +84,37 @@ func cstpWrite(conn net.Conn, sess *ConnSession) {
var (
err error
n int
header []byte
payload *Payload
payload *sessdata.Payload
)
for {
select {
case payload = <-sess.PayloadOut:
case <-sess.Closed:
case <-sess.CloseChan:
return
}
header = []byte{'S', 'T', 'F', 0x01, 0x00, 0x00, payload.ptype, 0x00}
if payload.ptype == 0x00 { // data
binary.BigEndian.PutUint16(header[4:6], uint16(len(payload.data)))
header = append(header, payload.data...)
if payload.LType != sessdata.LTypeIPData {
continue
}
_, err = conn.Write(header)
header = []byte{'S', 'T', 'F', 0x01, 0x00, 0x00, payload.PType, 0x00}
if payload.PType == 0x00 { // data
binary.BigEndian.PutUint16(header[4:6], uint16(len(payload.Data)))
header = append(header, payload.Data...)
}
n, err = conn.Write(header)
if err != nil {
log.Println("write err", err)
return
}
// 限流设置
err = sess.RateLimit(n, false)
if err != nil {
log.Println(err)
}
}
}