move to ipv6
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user