Beispiel #1
0
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;
  }
}
Beispiel #2
0
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;
}