From e58731bd34eebe03be8a625864e00819097c1d7d Mon Sep 17 00:00:00 2001 From: Toni Date: Wed, 22 Jul 2026 10:37:46 +0200 Subject: [PATCH] move to ipv6 --- client/main.go | 2 +- server/main.go | 48 +++++++++++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/client/main.go b/client/main.go index 58b92ed..e34d271 100644 --- a/client/main.go +++ b/client/main.go @@ -118,7 +118,7 @@ func setupInterface() { panic(err) } - if err := exec.Command("ip", "addr", "add", internalIP.String()+"/24", "dev", IFACE_NAME).Run(); err != nil { + if err := exec.Command("ip", "addr", "add", internalIP.String()+"/32", "dev", IFACE_NAME).Run(); err != nil { panic(err) } if err := exec.Command("ip", "link", "set", "dev", IFACE_NAME, "up").Run(); err != nil { diff --git a/server/main.go b/server/main.go index 594985a..c02a93e 100644 --- a/server/main.go +++ b/server/main.go @@ -1,11 +1,13 @@ // TODO: slice bounds checking // TODO: authentication // TODO: encryption +// TODO: somehow persist IPs +// TODO: handle multiple peers behind one NAT package main import ( + "crypto/rand" "encoding/binary" - "fmt" "log" "net" "os" @@ -22,7 +24,6 @@ type Peer struct { var ( peers = map[string]*Peer{} peersMutex sync.Mutex - nextIP = 3 conn *net.UDPConn ) @@ -83,8 +84,7 @@ func receivePacket(pkt []byte, addr *net.UDPAddr) { peersMutex.Lock() defer peersMutex.Unlock() - // TODO - internalIP := fmt.Sprintf("10.1.0.%d", nextIP) + internalIP := randomIP().String() if destPeer, ok := peers[addr.IP.String()]; ok { internalIP = destPeer.InternalIP @@ -93,10 +93,9 @@ func receivePacket(pkt []byte, addr *net.UDPAddr) { RealAddr: addr, InternalIP: internalIP, } - nextIP++ } - resp := shared.BuildPkt(shared.RESP_REGISTER, net.ParseIP(internalIP).To4()) + resp := shared.BuildPkt(shared.RESP_REGISTER, net.ParseIP(internalIP)) sendTo(addr, resp) case shared.REQ_DATA: frame := pkt[4:] @@ -104,22 +103,20 @@ func receivePacket(pkt []byte, addr *net.UDPAddr) { payload := frame[14:] switch etherType { - case 0x0800: // IPv4 - destIP := net.IP(payload[16:20]).String() - if destPeer := getPeerByInternalIP(destIP); destPeer != nil { + case 0x86dd: // IPv6 + rawDestIP := payload[24:40] + destIP := net.IP(rawDestIP).String() + resp := shared.BuildPkt(shared.RESP_DATA, frame) + + if rawDestIP[0] == 0xff { // multicast + log.Println(peer.InternalIP + " -> " + destIP + " (*)") + broadcast(resp, peer.InternalIP) + } else if destPeer := getPeerByInternalIP(destIP); destPeer != nil { log.Println(peer.InternalIP + " -> " + destIP) - resp := shared.BuildPkt(shared.RESP_DATA, frame) - sendTo(peer.RealAddr, resp) + sendTo(destPeer.RealAddr, resp) } else { log.Println(peer.InternalIP + " -/> " + destIP + " (unrecognized IP)") } - case 0x0806: // ARP - log.Println(peer.InternalIP + " -> *") - resp := shared.BuildPkt(shared.RESP_DATA, frame) - broadcast(resp, peer.InternalIP) - case 0x86dd: // IPv6 - destIP := net.IP(payload[24:40]).String() - log.Println(peer.InternalIP + " -/> " + destIP + " (IPv6)") // TODO default: log.Printf("unhandled EtherType: 0x%x\n", etherType) } @@ -132,7 +129,7 @@ func broadcast(pkt []byte, except string) { peersMutex.Lock() defer peersMutex.Unlock() for _, p := range peers { - if p.RealAddr.IP.String() == except { + if p.InternalIP == except { continue } sendTo(p.RealAddr, pkt) @@ -155,3 +152,16 @@ func getPeerByInternalIP(internalIP string) *Peer { } return nil } + +// fd00:baa1::/32 +func randomIP() net.IP { + ip := make(net.IP, 16) + ip[0] = 0xfd + ip[1] = 0x00 + ip[2] = 0xba + ip[3] = 0xa1 + if _, err := rand.Read(ip[4:]); err != nil { + panic(err) + } + return ip +}