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) n int destIP byte router = peer.router viaRoute *route 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 } if route.useMediator { viaRoute = router.GetMediator() if viaRoute == nil || !viaRoute.Up { log.Printf("Dropping packet due to no mediator: %d", destIP) continue } } else { viaRoute = nil } sender.send(PACKET_TYPE_DATA, packet, route, viaRoute) } }