void NetInterface::disconnect(NetConnection *conn, NetConnection::TerminationReason reason, const char *reasonString) { if(conn->getConnectionState() == NetConnection::AwaitingChallengeResponse || conn->getConnectionState() == NetConnection::AwaitingConnectResponse) { conn->onConnectTerminated(reason, reasonString); removePendingConnection(conn); } else if(conn->getConnectionState() == NetConnection::Connected) { conn->setConnectionState(NetConnection::Disconnected); conn->onConnectionTerminated(reason, reasonString); if(conn->isNetworkConnection()) { // send a disconnect packet... PacketStream out; out.write(U8(Disconnect)); ConnectionParameters &theParams = conn->getConnectionParameters(); theParams.mNonce.write(&out); theParams.mServerNonce.write(&out); U32 encryptPos = out.getBytePosition(); out.setBytePosition(encryptPos); out.writeString(reasonString); if(theParams.mUsingCrypto) { SymmetricCipher theCipher(theParams.mSharedSecret); out.hashAndEncrypt(NetConnection::MessageSignatureBytes, encryptPos, &theCipher); } out.sendto(mSocket, conn->getNetAddress()); } removeConnection(conn); } }
void NetInterface::sendConnectReject(ConnectionParameters *conn, const Address &theAddress, const char *reason) { if(!reason) return; // if the stream is NULL, we reject silently PacketStream out; out.write(U8(ConnectReject)); conn->mNonce.write(&out); conn->mServerNonce.write(&out); out.writeString(reason); out.sendto(mSocket, theAddress); }
void NetInterface::sendConnectReject(ConnectionParameters *conn, const Address &theAddress, NetConnection::TerminationReason reason) { //if(!reason) // return; // if the stream is NULL, we reject silently PacketStream out; out.write(U8(ConnectReject)); conn->mNonce.write(&out); conn->mServerNonce.write(&out); out.writeEnum(reason, NetConnection::TerminationReasons); out.writeString(""); out.sendto(mSocket, theAddress); }
void NetInterface::sendConnectRequest(NetConnection *conn) { PacketStream out; ConnectionParameters &theParams = conn->getConnectionParameters(); const char *destDescr; if(theParams.mIsLocal) destDescr = "local in-process server"; else destDescr = conn->getNetAddress().toString(); logprintf(LogConsumer::LogNetInterface, "Sending connect request to %s", destDescr); out.write(U8(ConnectRequest)); theParams.mNonce.write(&out); theParams.mServerNonce.write(&out); out.write(theParams.mClientIdentity); out.write(theParams.mPuzzleDifficulty); out.write(theParams.mPuzzleSolution); U32 encryptPos = 0; if(out.writeFlag(theParams.mUsingCrypto)) { out.write(theParams.mPrivateKey->getPublicKey()); encryptPos = out.getBytePosition(); out.setBytePosition(encryptPos); out.write(SymmetricCipher::KeySize, theParams.mSymmetricKey); } out.writeFlag(theParams.mDebugObjectSizes); out.write(conn->getInitialSendSequence()); out.writeString(conn->getClassName()); conn->writeConnectRequest(&out); if(encryptPos) { // if we're using crypto on this connection, // then write a hash of everything we wrote into the packet // key. Then we'll symmetrically encrypt the packet from // the end of the public key to the end of the signature. SymmetricCipher theCipher(theParams.mSharedSecret); out.hashAndEncrypt(NetConnection::MessageSignatureBytes, encryptPos, &theCipher); } conn->mConnectSendCount++; conn->mConnectLastSendTime = getCurrentTime(); out.sendto(mSocket, conn->getNetAddress()); }