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) ) 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] destIP = packet[19] 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) } }