void iq_test(void) { int i ; for(i=1;i<10000000;i++) { iq_t iq = iq_create(name) ; if ((i % 1) == 0) { eprintf("IQ:test(%d)\n", i) ; } while (1) { switch(util_random(2)) { case 0: { marsh_t marsh = marsh_create(NULL) ; marsh_buf_t buf = marsh_to_buf(name, marsh) ; marsh_free(marsh) ; if (!iq_assign(iq, util_random(IQ_CHECK_SIZE), buf, iov)) { iovec_free(iov) ; marsh_buf_free(buf) ; } } break ; case 1: { marsh_buf_t buf ; seqno_t seqno ; iovec_t iov ; if (!iq_get_prefix(iq, &seqno, &buf, &iov)) { break ; } //eprintf("seqno=%d\n", seqno) ; iovec_free(iov) ; marsh_buf_free(buf) ; if (seqno >= IQ_CHECK_SIZE - 1) { goto out ; } } break ; case 2: { marsh_t marsh = marsh_create(NULL) ; marsh_buf_t buf = marsh_to_buf(name, marsh) ; iovec_t iov = iovec_empty(name) ; marsh_free(marsh) ; iq_add(iq, buf, iov) ; } break ; case 3: { marsh_t marsh = marsh_create(NULL) ; marsh_buf_t buf = marsh_to_buf(name, marsh) ; iovec_t iov = iovec_empty(name) ; marsh_free(marsh) ; if (!iq_opt_insert_check_doread(iq, util_random(IQ_CHECK_SIZE), buf, iov)) { iovec_free(iov) ; marsh_buf_free(buf) ; } } break ; } } out: iq_free(iq) ; } }
int ILibWrapper_BlockToSDPEx(char* block, int blockLen, char** username, char** password, char **sdp, char* serverReflexiveCandidateAddress, unsigned short serverReflexiveCandidatePort) { char* sdpTemplate1 = "v=0\r\no=MeshAgent %u 0 IN IP4 0.0.0.0\r\ns=SIP Call\r\nt=0 0\r\na=ice-ufrag:%s\r\na=ice-pwd:%s\r\na=fingerprint:sha-256 %s\r\nm=application 1 DTLS/SCTP 5000\r\nc=IN IP4 0.0.0.0\r\na=sctpmap:5000 webrtc-datachannel 16\r\na=setup:%s\r\n"; char* sdpTemplateRelay = "a=candidate:%d %d UDP %d %s %d typ relay raddr %u.%u.%u.%u %d\r\n"; char* sdpTemplateLocalCand = "a=candidate:%d %d UDP %d %u.%u.%u.%u %u typ host\r\n"; char* sdpTemplateSrflxCand = "a=candidate:%d %d UDP %d %s %u typ srflx raddr %u.%u.%u.%u rport %u\r\n"; int sdpLen; int c,x,i,ptr; char junk[4]; struct sockaddr_in6 *relayEndPoint = NULL; char relayAddressString[128]; unsigned short relayAddressPort = 0; // Decode the block //This value is commented out to prevent a compiler warning for unused variables, but I left it here to show how to fetch it // //short blockversion = ILibWrapper_ReadShort(block, 0); // int blockflags = ILibWrapper_ReadInt(block, 2); int isActive = (blockflags & ILibWebRTC_SDP_Flags_DTLS_SERVER) == ILibWebRTC_SDP_Flags_DTLS_SERVER ? 0:1; int usernamelen = (int)block[6]; int passwordlen = (int)block[7 + usernamelen]; int dtlshashlen = (int)block[8 + usernamelen + passwordlen]; int candidatecount = (int)block[9 + usernamelen + passwordlen + dtlshashlen]; char dtlshash[128]; int rlen = 10 + usernamelen + passwordlen + dtlshashlen + (candidatecount * 6); char* candidates = block + 10 + usernamelen + passwordlen + dtlshashlen; *username = ILibWrapper_ReadString(block, 7, usernamelen); *password = ILibWrapper_ReadString(block, 8 + usernamelen, passwordlen); util_tohex2(block + 9 + usernamelen + passwordlen, dtlshashlen, dtlshash); if (rlen < blockLen) { relayEndPoint = (struct sockaddr_in6*)(block+rlen+1); ILibInet_ntop2((struct sockaddr*)relayEndPoint, relayAddressString, 128); switch(((struct sockaddr_in*)relayEndPoint)->sin_family) { case AF_INET: relayAddressPort = ntohs(((struct sockaddr_in*)relayEndPoint)->sin_port); break; case AF_INET6: relayAddressPort = ntohs(relayEndPoint->sin6_port); break; } } // Build the sdp sdpLen = 2 + strlen(sdpTemplate1) + usernamelen + passwordlen + 7 + (dtlshashlen*3) + 7 + (2 * (candidatecount * (12 + 21 + strlen(sdpTemplateLocalCand))) ); if(serverReflexiveCandidateAddress!=NULL) { sdpLen += (2* (12 + 21 + strlen(sdpTemplateSrflxCand))); } if(relayEndPoint!=NULL) { sdpLen += (2* (12 + 21 + strlen(sdpTemplateRelay))); } if((*sdp = (char*)malloc(sdpLen))==NULL){ILIBCRITICALEXIT(254);} util_random(4, junk); x = snprintf(*sdp, sdpLen, sdpTemplate1, ((unsigned int*)junk)[0]%1000000, *username, *password, dtlshash, isActive==0?"passive":"actpass"); for(c = 1; c <= 2; ++c) { for (i = 0; i < candidatecount; i++) { ptr = i*6; x += snprintf(*sdp+x, sdpLen-x, sdpTemplateLocalCand, i, c, 2128609535-i, (unsigned char)candidates[ptr], (unsigned char)candidates[ptr+1], (unsigned char)candidates[ptr+2], (unsigned char)candidates[ptr+3], ntohs(((unsigned short*)(candidates+ptr+4))[0])); } if(serverReflexiveCandidateAddress!=NULL) { x += snprintf(*sdp+x, sdpLen-x, sdpTemplateSrflxCand, i, c, 2128609535-i, serverReflexiveCandidateAddress, serverReflexiveCandidatePort, (unsigned char)candidates[0], (unsigned char)candidates[1], (unsigned char)candidates[2], (unsigned char)candidates[3], ntohs(((unsigned short*)(candidates+4))[0])); ++i; } if(relayEndPoint!=NULL) { x += snprintf(*sdp+x, sdpLen-x, sdpTemplateRelay, i, c, 2128609535-i, relayAddressString, relayAddressPort, (unsigned char)candidates[0], (unsigned char)candidates[1], (unsigned char)candidates[2], (unsigned char)candidates[3]); } } return(x); }