void Request::handleRequest(boost::shared_ptr<libtorrent::socket_type>& socket, const libtorrent::rc4_handler& cipher) { if (!packet_ || packet_->expired()) { socket->close(); onRequestComplete(); return; } if (!!socket_) { /* we are currently handling exactly the same request for another peer */ socket->close(); /* note that we are closing the second connection only */ return; } socket_ = socket; cipher_ = cipher; channelReady_ = false; if (state_ == StateInitializing) { state_ = initializeState(socket); } if (state_ == StateArpUnresolved) { respond(BinaryBuffer()); closeSocket(); return; } if (state_ == StateArpResolved) { BinaryBuffer response = arpTable_.query(packet_->payload, externalEndpoint_); if (!response.empty()) { printf("Responding to an ARP request.\n"); respond(response); } closeSocket(); return; } if (state_ == StateComplete) { onRequestComplete(); return; } }
Request::State Request::initializeState(boost::shared_ptr<libtorrent::socket_type>& socket) { if (packet_->hopCount) { if (!respond(BinaryBuffer())) { return StateComplete; } printf("Setting up a tunnel.\n"); routePacket(); return StateTunnelling; } if (packet_->command == ArpRequest) { printf("Got an ARP request.\n"); BinaryBuffer response = arpTable_.query(packet_->payload, externalEndpoint_); if (!response.empty()) { return StateArpResolved; } else { broadcastArpRequest(); return StateArpUnresolved; } } if (packet_->command == PingRequest) { printf("Got a ping request.\n"); respond(BinaryBuffer()); return StateComplete; } if (packet_->command == KeyRequest) { printf("Got a key request.\n"); boost::shared_ptr<Persistence::State> state = Persistence::lock(); BinaryBuffer ourDigest = state->rsaSysDigest; Persistence::unlock(false); respond(ourDigest); return StateComplete; } /* unknown type? just shutdown */ return StateComplete; }