move to ipv6
This commit is contained in:
@@ -118,7 +118,7 @@ func setupInterface() {
|
|||||||
panic(err)
|
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)
|
panic(err)
|
||||||
}
|
}
|
||||||
if err := exec.Command("ip", "link", "set", "dev", IFACE_NAME, "up").Run(); err != nil {
|
if err := exec.Command("ip", "link", "set", "dev", IFACE_NAME, "up").Run(); err != nil {
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
// TODO: slice bounds checking
|
// TODO: slice bounds checking
|
||||||
// TODO: authentication
|
// TODO: authentication
|
||||||
// TODO: encryption
|
// TODO: encryption
|
||||||
|
// TODO: somehow persist IPs
|
||||||
|
// TODO: handle multiple peers behind one NAT
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/rand"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
@@ -22,7 +24,6 @@ type Peer struct {
|
|||||||
var (
|
var (
|
||||||
peers = map[string]*Peer{}
|
peers = map[string]*Peer{}
|
||||||
peersMutex sync.Mutex
|
peersMutex sync.Mutex
|
||||||
nextIP = 3
|
|
||||||
conn *net.UDPConn
|
conn *net.UDPConn
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -83,8 +84,7 @@ func receivePacket(pkt []byte, addr *net.UDPAddr) {
|
|||||||
peersMutex.Lock()
|
peersMutex.Lock()
|
||||||
defer peersMutex.Unlock()
|
defer peersMutex.Unlock()
|
||||||
|
|
||||||
// TODO
|
internalIP := randomIP().String()
|
||||||
internalIP := fmt.Sprintf("10.1.0.%d", nextIP)
|
|
||||||
|
|
||||||
if destPeer, ok := peers[addr.IP.String()]; ok {
|
if destPeer, ok := peers[addr.IP.String()]; ok {
|
||||||
internalIP = destPeer.InternalIP
|
internalIP = destPeer.InternalIP
|
||||||
@@ -93,10 +93,9 @@ func receivePacket(pkt []byte, addr *net.UDPAddr) {
|
|||||||
RealAddr: addr,
|
RealAddr: addr,
|
||||||
InternalIP: internalIP,
|
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)
|
sendTo(addr, resp)
|
||||||
case shared.REQ_DATA:
|
case shared.REQ_DATA:
|
||||||
frame := pkt[4:]
|
frame := pkt[4:]
|
||||||
@@ -104,22 +103,20 @@ func receivePacket(pkt []byte, addr *net.UDPAddr) {
|
|||||||
payload := frame[14:]
|
payload := frame[14:]
|
||||||
|
|
||||||
switch etherType {
|
switch etherType {
|
||||||
case 0x0800: // IPv4
|
case 0x86dd: // IPv6
|
||||||
destIP := net.IP(payload[16:20]).String()
|
rawDestIP := payload[24:40]
|
||||||
if destPeer := getPeerByInternalIP(destIP); destPeer != nil {
|
destIP := net.IP(rawDestIP).String()
|
||||||
log.Println(peer.InternalIP + " -> " + destIP)
|
|
||||||
resp := shared.BuildPkt(shared.RESP_DATA, frame)
|
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 {
|
} else {
|
||||||
log.Println(peer.InternalIP + " -/> " + destIP + " (unrecognized IP)")
|
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:
|
default:
|
||||||
log.Printf("unhandled EtherType: 0x%x\n", etherType)
|
log.Printf("unhandled EtherType: 0x%x\n", etherType)
|
||||||
}
|
}
|
||||||
@@ -132,7 +129,7 @@ func broadcast(pkt []byte, except string) {
|
|||||||
peersMutex.Lock()
|
peersMutex.Lock()
|
||||||
defer peersMutex.Unlock()
|
defer peersMutex.Unlock()
|
||||||
for _, p := range peers {
|
for _, p := range peers {
|
||||||
if p.RealAddr.IP.String() == except {
|
if p.InternalIP == except {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
sendTo(p.RealAddr, pkt)
|
sendTo(p.RealAddr, pkt)
|
||||||
@@ -155,3 +152,16 @@ func getPeerByInternalIP(internalIP string) *Peer {
|
|||||||
}
|
}
|
||||||
return nil
|
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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user