Beispiel #1
0
void WebSocketWorker::doRead()
{
    if (!m_isRunning)
        return;

    if (!m_webSocketServer.IsRunning() || !m_socket->isOpen())
    {
        CloseConnection();
        return;
    }

    if (m_webSocketMode)
    {
        ProcessFrames(m_socket);
    }
    else
    {
        if (!ProcessHandshake(m_socket))
            SendClose(kCloseProtocolError);
    }

    if (!m_webSocketMode)
    {
        LOG(VB_HTTP, LOG_WARNING, "WebSocketServer: Timed out waiting for connection upgrade");
        CloseConnection();
    }
}
Beispiel #2
0
/*-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
void SSLStream::ProcessMessage() {
  SSL_HEADER * header = (SSL_HEADER *)message_;

  switch (header->type) {
    case MSG_CHANGE_CIPHER_SPEC: ProcessChangeCipherSpec(); break;
    case MSG_ALERT: ProcessAlert(); break;
    case MSG_HANDSHAKE: ProcessHandshake(); break;
    case MSG_APPLICATION_DATA: ProcessApplicationData(); break;
    default: {
      ATLTRACE("SSLStream: Unknown Message 0x%02X - %d bytes", header->type, message_size_);
    } break;
  }
}
Beispiel #3
0
	void DtlsTransport::SetRemoteFingerprint(Fingerprint fingerprint)
	{
		MS_TRACE();

		MS_ASSERT(fingerprint.algorithm != FingerprintAlgorithm::NONE, "no fingerprint algorithm provided");

		this->remoteFingerprint = fingerprint;

		// The remote fingerpring may have been set after DTLS handshake was done,
		// so we may need to process it now.
		if (this->handshakeDone && this->state != DtlsState::CONNECTED)
		{
			MS_DEBUG("handshake already done, processing it right now");

			ProcessHandshake();
		}
	}
Beispiel #4
0
	inline
	bool DtlsTransport::CheckStatus(int return_code)
	{
		MS_TRACE();

		int err;
		bool was_handshake_done = this->handshakeDone;

		err = SSL_get_error(this->ssl, return_code);
		switch (err)
		{
			case SSL_ERROR_NONE:
				break;
			case SSL_ERROR_SSL:
				LOG_OPENSSL_ERROR("SSL status: SSL_ERROR_SSL");
				break;
			case SSL_ERROR_WANT_READ:
				break;
			case SSL_ERROR_WANT_WRITE:
				MS_DEBUG("SSL status: SSL_ERROR_WANT_WRITE");
				break;
			case SSL_ERROR_WANT_X509_LOOKUP:
				MS_DEBUG("SSL status: SSL_ERROR_WANT_X509_LOOKUP");
				break;
			case SSL_ERROR_SYSCALL:
				LOG_OPENSSL_ERROR("SSL status: SSL_ERROR_SYSCALL");
				break;
			case SSL_ERROR_ZERO_RETURN:
				break;
			case SSL_ERROR_WANT_CONNECT:
				MS_DEBUG("SSL status: SSL_ERROR_WANT_CONNECT");
				break;
			case SSL_ERROR_WANT_ACCEPT:
				MS_DEBUG("SSL status: SSL_ERROR_WANT_ACCEPT");
				break;
		}

		// Check if the handshake (or re-handshake) has been done right now.
		if (this->handshakeDoneNow)
		{
			this->handshakeDoneNow = false;
			this->handshakeDone = true;

			// Stop the timer.
			this->timer->Stop();

			// Process the handshake just once (ignore if DTLS renegotiation).
			if (!was_handshake_done)
				ProcessHandshake();
		}
		// Check if the peer sent close alert or a fatal error happened.
		else if ((SSL_get_shutdown(this->ssl) & SSL_RECEIVED_SHUTDOWN) || err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL)
		{
			if (this->state == DtlsState::CONNECTED)
			{
				MS_DEBUG("disconnected");

				Reset();

				// Set state and notify the listener.
				this->state = DtlsState::CLOSED;
				this->listener->onDtlsClosed(this);
			}
			else
			{
				MS_DEBUG("connection failed");

				Reset();

				// Set state and notify the listener.
				this->state = DtlsState::FAILED;
				this->listener->onDtlsFailed(this);
			}

			return false;
		}

		return true;
	}
void McuMessageHandler::HandlePacket()
{
    unsigned short seq = MCU_GET_SHORT(m_rxPacket, 2);
    unsigned short id = MCU_GET_SHORT(m_rxPacket, 4);
    unsigned char len = MCU_GET_BYTE(m_rxPacket, 6);
    unsigned char checksum = 0;
    int packetsize = m_rxPacket.size();
    printf("rx:");
    for(int j = 0; j<packetsize; j++)
    {
        printf("%02x ",m_rxPacket[j]);
    }
    printf("\n");

    if((packetsize - 8) != len)
    {
        LogUtility::Log(LOG_LEVEL_ERROR, "McuMessageHandler::HandlePacket length not matching(%d, %d).", packetsize, len);
        return;
    }

    for(int i = 2; i < packetsize - 1; i ++)
    {
        checksum ^= m_rxPacket[i];
    }
    
    if(checksum != m_rxPacket[1])
    {
        LogUtility::Log(LOG_LEVEL_ERROR, "McuMessageHandler::HandlePacket checksum not matching(%02x, %02x).", checksum, m_rxPacket[1]);
        return;
    }
    
    LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::HandlePacket check pass(%04x, %d, %d).", id, len, seq);
    
    switch(id)
    {
        case MCU_PACKET_STATION_REPORT:
        case MCU_PACKET_LED1:
        case MCU_PACKET_LED2:
        case MCU_PACKET_LED3:
        case MCU_PACKET_LED4:
            ProcessCommonReply(len, id, seq);
            break;
        case MCU_PACKET_HANDSHAKE:
            if(m_handshake == false)
            {
                ProcessHandshake(len, seq);
            }
            if(m_handshake == false)
            {
                SendHandshake();
            }
            break;
        case MCU_POS_STATION:
            ProcessPosStation(len, seq);
            break;
        case MCU_POS_DATE:
            ProcessPosDate(len, seq);
            break;
        case MCU_POS_TIME:
            ProcessPosTime(len, seq);
            break;
        case MCU_POS_GET_PASSENGER:
            ProcessGetPassenger(len, seq);
            break;
        case MCU_POS_GET_DEAL:
            ProcessGetDeal(len, seq);
            break;
        case MCU_CAN_GET_DATA:
            ProcessGetCanData(len, seq);
            break;
        default:
            LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::HandlePacket unknown message.");
            break;
    }
}