void send_debug_packet_response(nabto_packet_header* header, uint32_t notification) { uint8_t* buf = nabtoCommunicationBuffer; uint8_t* ptr = nabtoCommunicationBuffer; uint8_t* end = nabtoCommunicationBuffer+nabtoCommunicationBufferSize; ptr = insert_header(ptr, header->nsi_cp, header->nsi_sp, U_DEBUG, true, header->seq, 0, NULL); if (ptr == NULL) { NABTO_LOG_ERROR(("Could not insert debug packet header")); return; } ptr = insert_notify_payload(ptr, end, NP_PAYLOAD_NOTIFY_DEBUG_OK); if (ptr == NULL) { NABTO_LOG_ERROR(("Could not insert notify payload")); return; } { uint16_t length = ptr - buf; insert_length(buf, length); send_to_basestation(buf, length, &nmc.context.gsp); } }
void send_connection_statistics(nabto_connect* con, uint8_t event) { size_t length; uint8_t* ptr = insert_header(nabtoCommunicationBuffer, 0, con->spnsi, NP_PACKET_HDR_TYPE_STATS, false, 0, 0, 0); uint8_t* end = nabtoCommunicationBuffer + nabtoCommunicationBufferSize; ptr = insert_stats_payload(ptr, end, event); if (ptr == NULL) { return; } ptr = insert_version_payload(ptr, end); if (ptr == NULL) { return; } #if NABTO_ENABLE_CLIENT_ID ptr = insert_cp_id_payload(ptr, end, con); if (ptr == NULL) { return; } #endif ptr = insert_sp_id_payload(ptr, end); if (ptr == NULL) { return; } ptr = insert_ipx_payload(ptr, end); if (ptr == NULL) { return; } ptr = insert_connect_stats_payload(ptr, end, con); if (ptr == NULL) { return; } if (!con->noRendezvous) { ptr = insert_rendezvous_stats_payload(ptr, end, con); if (ptr == NULL) { return; } } ptr = insert_connection_stats_payload(ptr, end, con); if (ptr == NULL) { return; } length = ptr - nabtoCommunicationBuffer; insert_length(nabtoCommunicationBuffer, length); send_to_basestation(nabtoCommunicationBuffer, length, &nmc.context.gsp); }
bool connect_event(message_event* event, nabto_packet_header* hdr) { nabto_endpoint* peer = &event->udpMessage.peer; bool isLocal = (event->udpMessage.socket == nmc.socketLocal); NABTO_LOG_TRACE(("U_CONNECT: Searching for hdr->nsi_cp=%" PRIu32 " (should not be found)", hdr->nsi_cp)); if (nabto_find_connection(hdr->nsi_cp) == NULL) { uint32_t nsi; uint32_t ec = 0; nabto_connect* con = nabto_init_connection(hdr, &nsi, &ec, isLocal); if (con) { size_t olen; NABTO_LOG_TRACE(("Couldn't find connection (good!). Created a new connection (nsi=%" PRIu32 ") con->spnsi=%" PRIu32, nsi, con->spnsi)); olen = mk_gsp_connect_rsp(nabtoCommunicationBuffer, hdr->seq, NOTIFY_CONNECT_OK, con->spnsi, hdr->nsi_cp, hdr->nsi_sp, isLocal); if (olen == 0) { NABTO_LOG_ERROR(("U_CONNECT out of resources in connect event.")); nabto_release_connection(con); // no resources available } else { if (EP_EQUAL(*peer, nmc.context.gsp)) { send_to_basestation(nabtoCommunicationBuffer, olen, peer); } else { nabto_write(event->udpMessage.socket, nabtoCommunicationBuffer, olen, peer->addr, peer->port); } con->state = CS_CONNECTING; if (!con->noRendezvous) { nabto_rendezvous_start(con); } #if NABTO_ENABLE_TCP_FALLBACK if (con->hasTcpFallbackCapabilities) { unabto_tcp_fallback_connect(con); } #endif return true; } } else if (nsi && ec) { // build negative answer size_t olen = mk_gsp_connect_rsp(nabtoCommunicationBuffer, hdr->seq, ec, nsi, hdr->nsi_cp, hdr->nsi_sp, isLocal); NABTO_LOG_TRACE((PRInsi " Deny connection, result: %" PRIu32, MAKE_NSI_PRINTABLE(0, nsi, 0), ec)); nabto_write(event->udpMessage.socket, nabtoCommunicationBuffer, olen, peer->addr, peer->port); return true; } else { NABTO_LOG_ERROR(("U_CONNECT was a malformed connect event.")); } } return false; }
void send_connection_ended_statistics(nabto_connect* con) { size_t length; uint8_t* ptr = insert_header(nabtoCommunicationBuffer, 0, con->spnsi, NP_PACKET_HDR_TYPE_STATS, false, 0, 0, 0); uint8_t* end = nabtoCommunicationBuffer + nabtoCommunicationBufferSize; ptr = insert_stats_payload(ptr, end, NP_PAYLOAD_STATS_TYPE_UNABTO_CONNECTION_ENDED); if (ptr == NULL) { return; } ptr = insert_version_payload(ptr, end); if (ptr == NULL) { return; } #if NABTO_ENABLE_CLIENT_ID ptr = insert_cp_id_payload(ptr, end, con); if (ptr == NULL) { return; } #endif ptr = insert_sp_id_payload(ptr, end); if (ptr == NULL) { return; } ptr = insert_connection_stats_payload(ptr, end, con); if (ptr == NULL) { return; } length = ptr - nabtoCommunicationBuffer; insert_length(nabtoCommunicationBuffer, length); send_to_basestation(nabtoCommunicationBuffer, length, &nmc.context.gsp); }