60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package peer
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"runtime/debug"
|
|
)
|
|
|
|
func (peer *Peer) ifReader() {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
fmt.Println("stacktrace from panic: \n" + string(debug.Stack()))
|
|
}
|
|
}()
|
|
|
|
var (
|
|
sender = newConnSender(peer.conn, peer.ip, STREAM_DATA, peer.signPrivKey)
|
|
n int
|
|
destIP byte
|
|
router = peer.router
|
|
route *route
|
|
iface = peer.iface
|
|
err error
|
|
packet = make([]byte, BUFFER_SIZE)
|
|
version byte
|
|
)
|
|
|
|
for {
|
|
n, err = iface.Read(packet[:BUFFER_SIZE])
|
|
if err != nil {
|
|
log.Fatalf("Failed to read from interface: %v", err)
|
|
}
|
|
|
|
if n < 20 {
|
|
log.Printf("Dropping small packet: %d", n)
|
|
continue
|
|
}
|
|
|
|
packet = packet[:n]
|
|
version = packet[0] >> 4
|
|
|
|
switch version {
|
|
case 4:
|
|
destIP = packet[19]
|
|
case 6:
|
|
destIP = packet[39]
|
|
default:
|
|
log.Printf("Dropping packet with IP version: %d", version)
|
|
}
|
|
|
|
route = router.GetRoute(destIP)
|
|
if route == nil || !route.Up {
|
|
log.Printf("Dropping packet for non-existent IP: %d", destIP)
|
|
continue
|
|
}
|
|
|
|
sender.send(PACKET_TYPE_DATA, packet, route)
|
|
}
|
|
}
|