Commit 66cb6bd3 authored by nanahira's avatar nanahira

test replace packets

parent 4f209e64
Pipeline #839 passed with stage
in 4 minutes and 6 seconds
package main package main
import ( import (
"bytes"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"log" "log"
...@@ -14,6 +15,8 @@ import ( ...@@ -14,6 +15,8 @@ import (
var IP = os.Getenv("ADDRESS") var IP = os.Getenv("ADDRESS")
var IPinObject = net.ParseIP(IP)
// funcs from shitama // funcs from shitama
func UDPAddrToSockAddr(addr *net.UDPAddr) []byte { func UDPAddrToSockAddr(addr *net.UDPAddr) []byte {
...@@ -41,67 +44,60 @@ func SockAddrToUDPAddr(buf []byte) *net.UDPAddr { ...@@ -41,67 +44,60 @@ func SockAddrToUDPAddr(buf []byte) *net.UDPAddr {
} }
func PackData(addr *net.UDPAddr, data []byte) []byte { func translateGuestToHostPackets(data *([]byte), len int, list *(map[string]*net.UDPAddr)) {
if (*data)[0] == 0x1 {
buf := make([]byte, len(data)+6) if len < 34 {
return
copy(buf[:4], addr.IP[len(addr.IP)-4:]) }
binary.BigEndian.PutUint16(buf[4:6], uint16(addr.Port)) if bytes.Compare((*data)[1:17], (*data)[17:33]) != 0 {
copy(buf[6:], data)
return buf
}
func UnpackData(buf []byte) (addr *net.UDPAddr, data []byte) {
addr = new(net.UDPAddr)
addr.IP = make([]byte, 16)
addr.IP[10] = 255
addr.IP[11] = 255
copy(addr.IP[len(addr.IP)-4:], buf[:4])
addr.Port = int(binary.BigEndian.Uint16(buf[4:6]))
data = make([]byte, len(buf)-6)
copy(data, buf[6:])
return addr, data
}
func UDPAddrToSockAddr2(addr *net.UDPAddr, outBuf []byte) []byte {
binary.BigEndian.PutUint16(outBuf[:2], 0x200) src := SockAddrToUDPAddr((*data)[17:25])
binary.BigEndian.PutUint16(outBuf[2:4], uint16(addr.Port)) dest := (*list)[src.String()]
copy(outBuf[4:8], addr.IP[len(addr.IP)-4:])
return outBuf if dest != nil {
copy((*data)[17:], UDPAddrToSockAddr(dest))
log.Println("Translated g-to-h 0x1 packet success:", src.String(), dest.String())
} else {
log.Println("Translated g-to-h 0x1 packet failed:", src.String())
}
}
}
} }
func PackData2(addr *net.UDPAddr, data []byte, outBuf []byte) []byte { func translateHostToGuestPackets(data *([]byte), len int, list *(map[string]*net.UDPAddr)) {
if (*data)[0] == 0x8 {
len := int(binary.LittleEndian.Uint32((*data)[1:5]))
copy(outBuf[:4], addr.IP[len(addr.IP)-4:]) for i := 0; i < len; i++ {
binary.BigEndian.PutUint16(outBuf[4:6], uint16(addr.Port))
copy(outBuf[6:], data)
return outBuf src := SockAddrToUDPAddr((*data)[5+i*16:])
dest := (*list)[src.String()]
}
func UnpackData2(buf []byte) (addr *net.UDPAddr, data []byte) { if dest != nil {
copy((*data)[5+i*16:], UDPAddrToSockAddr(dest))
log.Println("Translated h-to-g 0x8 packet success:", src.String(), dest.String())
} else {
log.Println("Translated h-to-g 0x8 packet failed:", src.String())
}
addr = new(net.UDPAddr) }
addr.IP = make([]byte, 16) }
addr.IP[10] = 255 if (*data)[0] == 0x2 {
addr.IP[11] = 255
copy(addr.IP[len(addr.IP)-4:], buf[:4])
addr.Port = int(binary.BigEndian.Uint16(buf[4:6]))
return addr, buf[6:] src := SockAddrToUDPAddr((*data)[1:])
dest := (*list)[src.String()]
if dest != nil {
copy((*data)[1:], UDPAddrToSockAddr(dest))
log.Println("Translated h-to-g 0x2 packet success:", src.String(), dest.String())
} else {
log.Println("Translated h-to-g 0x2 packet failed:", src.String())
}
}
} }
func transferHostTrafficToGuest(host *net.UDPConn, guest *net.UDPConn, guestAddr *net.UDPAddr) { func transferHostTrafficToGuest(host *net.UDPConn, guest *net.UDPConn, guestAddr *net.UDPAddr, htogAddressTranslateList *(map[string]*net.UDPAddr), hostRemoteAddr *net.UDPAddr) {
buffer := make([]byte, 2048) buffer := make([]byte, 2048)
for { for {
derr := host.SetReadDeadline(time.Now().Add(2 * time.Minute)) derr := host.SetReadDeadline(time.Now().Add(2 * time.Minute))
...@@ -116,8 +112,9 @@ func transferHostTrafficToGuest(host *net.UDPConn, guest *net.UDPConn, guestAddr ...@@ -116,8 +112,9 @@ func transferHostTrafficToGuest(host *net.UDPConn, guest *net.UDPConn, guestAddr
} }
guest.WriteToUDP(buffer[:length], guestAddr) guest.WriteToUDP(buffer[:length], guestAddr)
} }
(*htogAddressTranslateList)[hostRemoteAddr.String()] = nil
} }
func transferGuestTrafficToHost(host *net.UDPConn, hostAddr *net.UDPAddr, guestAddr *net.UDPAddr, channel chan GuestToHostMessage, plist *(map[string]chan GuestToHostMessage)) { func transferGuestTrafficToHost(host *net.UDPConn, hostAddr *net.UDPAddr, guestAddr *net.UDPAddr, channel chan GuestToHostMessage, plist *(map[string]chan GuestToHostMessage), gtohAddressTranslateList *(map[string]*net.UDPAddr)) {
for { for {
exit := false exit := false
select { select {
...@@ -138,6 +135,7 @@ func transferGuestTrafficToHost(host *net.UDPConn, hostAddr *net.UDPAddr, guestA ...@@ -138,6 +135,7 @@ func transferGuestTrafficToHost(host *net.UDPConn, hostAddr *net.UDPAddr, guestA
} }
} }
(*plist)[guestAddr.String()] = nil (*plist)[guestAddr.String()] = nil
(*gtohAddressTranslateList)[guestAddr.String()] = nil
} }
type GuestToHostMessage struct { type GuestToHostMessage struct {
...@@ -152,6 +150,8 @@ func listenUDP(ws *websocket.Conn) { ...@@ -152,6 +150,8 @@ func listenUDP(ws *websocket.Conn) {
return return
} }
guestChannelList := make(map[string]chan GuestToHostMessage) guestChannelList := make(map[string]chan GuestToHostMessage)
htogAddressTranslateList := make(map[string]*net.UDPAddr)
gtohAddressTranslateList := make(map[string]*net.UDPAddr)
reply := fmt.Sprintf("LISTEN %s:%d", IP, guest.LocalAddr().(*net.UDPAddr).Port) reply := fmt.Sprintf("LISTEN %s:%d", IP, guest.LocalAddr().(*net.UDPAddr).Port)
ws.Write([]byte(reply)) ws.Write([]byte(reply))
...@@ -189,10 +189,18 @@ func listenUDP(ws *websocket.Conn) { ...@@ -189,10 +189,18 @@ func listenUDP(ws *websocket.Conn) {
reply = fmt.Sprintf("CONNECTED %s:%d", IP, host.LocalAddr().(*net.UDPAddr).Port) reply = fmt.Sprintf("CONNECTED %s:%d", IP, host.LocalAddr().(*net.UDPAddr).Port)
ws.Write([]byte(reply)) ws.Write([]byte(reply))
host.WriteToUDP(message[:length], hostAddr) host.WriteToUDP(message[:length], hostAddr)
go transferHostTrafficToGuest(host, guest, guestAddr)
hostRemoteAddr := new(net.UDPAddr)
hostRemoteAddr.IP = IPinObject
hostRemoteAddr.Port = host.LocalAddr().(*net.UDPAddr).Port
htogAddressTranslateList[hostRemoteAddr.String()] = guestAddr
gtohAddressTranslateList[guestAddr.String()] = hostRemoteAddr
go transferHostTrafficToGuest(host, guest, guestAddr, &htogAddressTranslateList, hostRemoteAddr)
channel := make(chan GuestToHostMessage) channel := make(chan GuestToHostMessage)
guestChannelList[guestAddr.String()] = channel guestChannelList[guestAddr.String()] = channel
go transferGuestTrafficToHost(host, hostAddr, guestAddr, channel, &guestChannelList) go transferGuestTrafficToHost(host, hostAddr, guestAddr, channel, &guestChannelList, &gtohAddressTranslateList)
} else { } else {
msg := GuestToHostMessage{data: message[:length], exit: false} msg := GuestToHostMessage{data: message[:length], exit: false}
channel <- msg channel <- msg
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment