move to ipv6

This commit is contained in:
2026-07-22 10:37:46 +02:00
parent 0ed69fbc70
commit e58731bd34
2 changed files with 30 additions and 20 deletions

View File

@@ -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 {

View File

@@ -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 {
log.Println(peer.InternalIP + " -> " + destIP)
case 0x86dd: // IPv6
rawDestIP := payload[24:40]
destIP := net.IP(rawDestIP).String()
resp := shared.BuildPkt(shared.RESP_DATA, frame)
sendTo(peer.RealAddr, resp)
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)
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
}