CTEST(stunserver, SendDiscussResp_Valid) { bool useRelay = false; discussData.streamType = 0x004; discussData.interactivity = 0x01; discussData.networkStatus_flags = 0; discussData.networkStatus_nodeCnt = 0; discussData.networkStatus_tbd = 0; discussData.networkStatus_upMaxBandwidth = 0; discussData.networkStatus_downMaxBandwidth = 0; sockaddr_initFromString( (struct sockaddr*)&stunServerAddr, "193.200.93.152:3478" ); StunClient_Alloc(&stunInstance); ASSERT_TRUE( StunServer_SendConnectivityBindingResp(stunInstance, 0, /* sockhandle */ LastTransId, "pem", (struct sockaddr*)& stunServerAddr, (struct sockaddr*)& stunServerAddr, 2, 2, NULL, SendRawStun, 0, useRelay, 0, /* responseCode */ &discussData) ); }
CTEST(stunserver, SendResp_Valid_IPv6) { bool useRelay = false; struct sockaddr_storage mappedAddr,servAddr; sockaddr_reset( &servAddr); sockaddr_reset( &mappedAddr); sockaddr_initFromString( (struct sockaddr*)&servAddr, "[2a02:fe0:c410:cb31:e4d:e93f:fecb:bf6b]:1234" ); StunClient_Alloc(&stunInstance); ASSERT_FALSE( StunServer_SendConnectivityBindingResp(stunInstance, 0, /* sockhandle */ LastTransId, "pem", (struct sockaddr*)& mappedAddr, (struct sockaddr*)& servAddr, 0, 0, NULL, SendRawStun, 0, useRelay, 0, /* responseCode */ NULL) ); sockaddr_initFromString( (struct sockaddr*)&mappedAddr, "[2a02:fe0:c410:cb31:e4d:e93f:fecb:bf6b]:1234" ); ASSERT_TRUE( StunServer_SendConnectivityBindingResp(stunInstance, 0, LastTransId, "pem", (struct sockaddr*)& mappedAddr, (struct sockaddr*)& servAddr, 0, 0, NULL, SendRawStun, 0, useRelay, 0, NULL) ); }
CTEST(stunserver, SendResp_Valid) { bool useRelay = false; struct sockaddr_storage mappedAddr,servAddr; sockaddr_initFromString( (struct sockaddr*)&servAddr, "193.200.93.152:3478" ); StunClient_Alloc(&stunInstance); ASSERT_FALSE( StunServer_SendConnectivityBindingResp(stunInstance, 0, /* sockhandle */ LastTransId, "pem", (struct sockaddr*)& mappedAddr, (struct sockaddr*)& servAddr, 0, 0, NULL, SendRawStun, 0, useRelay, 0, /* responseCode */ NULL) ); sockaddr_initFromString( (struct sockaddr*)&mappedAddr, "193.200.93.152:3478" ); ASSERT_TRUE( StunServer_SendConnectivityBindingResp(stunInstance, 0, LastTransId, "pem", (struct sockaddr*)& mappedAddr, (struct sockaddr*)& servAddr, 2, 3, NULL, SendRawStun, 0, useRelay, 0, NULL) ); }
void stunHandler(struct socketConfig* config, struct sockaddr* from_addr, void* cb, unsigned char* buf, int buflen) { StunMessage stunRequest; STUN_INCOMING_REQ_DATA pReq; STUN_CLIENT_DATA* clientData = (STUN_CLIENT_DATA*)cb; char realm[STUN_MSG_MAX_REALM_LENGTH]; printf("Got a STUN message... (%i)\n", buflen); stunlib_DecodeMessage(buf, buflen, &stunRequest, NULL, stdout); printf("Finished decoding..\n"); if (stunRequest.msgHdr.msgType == STUN_MSG_DataIndicationMsg) { if (stunRequest.hasData) { /* Decode and do something with the data? */ /* config->data_handler(config->socketConfig[i].sockfd, */ /* config->socketConfig[i].tInst, */ /* &buf[stunResponse.data.offset]); */ } } if (stunRequest.hasRealm) { memcpy(&realm, stunRequest.realm.value, STUN_MSG_MAX_REALM_LENGTH); } if (stunRequest.hasMessageIntegrity) { printf("Checking integrity..%s\n", config->pass); if ( stunlib_checkIntegrity( buf, buflen, &stunRequest, (uint8_t*)config->pass, strlen(config->pass) ) ) { printf(" - Integrity check OK\n"); } else { printf(" - Integrity check NOT OK\n"); } } StunServer_HandleStunIncomingBindReqMsg(clientData, &pReq, &stunRequest, false); StunServer_SendConnectivityBindingResp(clientData, config->sockfd, stunRequest.msgHdr.id, PASSWORD, from_addr, from_addr, NULL, sendPacket, SOCK_DGRAM, false, 200, NULL); }
void stunHandler(struct socketConfig* config, struct sockaddr* from_addr, void* cb, unsigned char* buf, int buflen) { StunMessage stunRequest; /* STUN_INCOMING_REQ_DATA pReq; */ STUN_CLIENT_DATA* clientData = (STUN_CLIENT_DATA*)cb; char realm[STUN_MSG_MAX_REALM_LENGTH]; uint8_t enf_flags = 0; uint8_t enf_nodeCnt = 0; uint16_t enf_upMaxBandwidth = 0; uint16_t enf_downMaxBandwidth = 0; stun_pkt_cnt++; byte_cnt += buflen; /* printf("Got a STUN message... (%i)\n", buflen); */ stunlib_DecodeMessage(buf, buflen, &stunRequest, NULL, NULL); /* printf("Finished decoding..\n"); */ if (stunRequest.msgHdr.msgType == STUN_MSG_DataIndicationMsg) { if (stunRequest.hasData) { /* Decode and do something with the data? */ /* config->data_handler(config->socketConfig[i].sockfd, */ /* config->socketConfig[i].tInst, */ /* &buf[stunResponse.data.offset]); */ } } if (stunRequest.hasRealm) { memcpy(&realm, stunRequest.realm.value, STUN_MSG_MAX_REALM_LENGTH); } if (stunRequest.hasEnfNetworkStatus) { enf_flags = stunRequest.enfNetworkStatusResp.flags; enf_nodeCnt = stunRequest.enfNetworkStatusResp.nodeCnt; enf_upMaxBandwidth = stunRequest.enfNetworkStatusResp.upMaxBandwidth; enf_downMaxBandwidth = stunRequest.enfNetworkStatusResp.downMaxBandwidth; } if (stunRequest.hasMessageIntegrity) { /* printf("Checking integrity..%s\n", config->pass); */ if ( !stunlib_checkIntegrity( buf, buflen, &stunRequest, (uint8_t*)config->pass, strlen(config->pass) ) ) { printf(" - Integrity check NOT OK\n"); return; } } uint32_t lastReqCnt = 0; if (stunRequest.hasTransCount) { lastReqCnt = stunRequest.transCount.reqCnt; /* lastRespCnt = stunRequest.transCount.respCnt; */ } if (lastReqCnt >= upstream_loss) { /* Store some stats.. */ int32_t num = insertTransId(&stunRequest.msgHdr.id); StunServer_SendConnectivityBindingResp(clientData, config->sockfd, stunRequest.msgHdr.id, PASSWORD, from_addr, from_addr, lastReqCnt, num, enf_flags, enf_nodeCnt + 1, enf_upMaxBandwidth, enf_downMaxBandwidth, NULL, sendPacket, SOCK_DGRAM, false, 200); } else { printf("Weird...\n"); } }