void CDlg_H323::RegistrationRequest() { int ret; H225RegistrationRequest *regRequest; OOCTXT *pctxt; H225TransportAddress *CallSignalAddress,*RasAddress; H225TransportAddress_ipAddress *IpAddr1,*IpAddr2; int addr_seg1,addr_seg2,addr_seg3,addr_seg4; char hexIp[20]; H225AliasAddress *alias1,*alias2; int bindPort; ret = ooSocketCreateUDP(&myContext->RASChannel); if(ret != ASN_OK) { OOTRACEERR2(myContext, "ERROR: Creating RAS channel failed..."); return; } bindPort = ooBindPort(myContext,OOUDP,myContext->RASChannel); if(bindPort == OO_FAILED) { OOTRACEERR2(myContext, "ERROR: Bind port failed..."); return; } myContext->RASCallback = &CH323MsgHandler::OnReceivedRasMsg; strncpy(myContext->GkIp,LPCTSTR(m_strGatekeeper),20); myContext->RasChanPort = 1719; //build and send RAS registration message ret = ooCreateRasMessage(myContext,T_H225RasMessage_registrationRequest); if(ret == OO_FAILED) { OOTRACEERR2(myContext,"Error:Failed to create Ras message"); return; } myContext->outgoingRas->msgType = OORegistrationRequest; regRequest = myContext->outgoingRas->RasMsg.u.registrationRequest; pctxt = myContext->outgoingRas->pctxt; regRequest->requestSeqNum = (myContext->seqNumber++) % 65536; regRequest->protocolIdentifier = gRasProtocolID; regRequest->discoveryComplete = FALSE; CallSignalAddress = (H225TransportAddress*)ASN1MALLOC(pctxt,sizeof(H225TransportAddress)); memset(CallSignalAddress,0,sizeof(H225TransportAddress)); CallSignalAddress->t = T_H225TransportAddress_ipAddress; IpAddr1 = (H225TransportAddress_ipAddress*)ASN1MALLOC(pctxt,sizeof(H225TransportAddress_ipAddress)); memset(IpAddr1,0,sizeof(H225TransportAddress_ipAddress)); ooGetLocalIPAddress(myContext->localIP); sscanf(myContext->localIP,"%d.%d.%d.%d",&addr_seg1,&addr_seg2,&addr_seg3,&addr_seg4); sprintf(hexIp,"%x %x %x %x",addr_seg1,addr_seg2,addr_seg3,addr_seg4); sscanf(hexIp,"%x %x %x %x",&IpAddr1->ip.data[0],&IpAddr1->ip.data[1], &IpAddr1->ip.data[2],&IpAddr1->ip.data[3]); IpAddr1->ip.numocts = 4; IpAddr1->port = 1720; CallSignalAddress->u.ipAddress = IpAddr1; dListInit(&(regRequest->callSignalAddress)); dListAppend(pctxt,&(regRequest->callSignalAddress),CallSignalAddress); RasAddress = (H225TransportAddress*)ASN1MALLOC(pctxt,sizeof(H225TransportAddress)); memset(RasAddress,0,sizeof(H225TransportAddress)); RasAddress->t = T_H225TransportAddress_ipAddress; IpAddr2 = (H225TransportAddress_ipAddress*)ASN1MALLOC(pctxt,sizeof(H225TransportAddress_ipAddress)); memset(IpAddr2,0,sizeof(H225TransportAddress_ipAddress)); sscanf(/*myContext->GkIp*/myContext->localIP,"%d.%d.%d.%d",&addr_seg1,&addr_seg2,&addr_seg3,&addr_seg4); sprintf(hexIp,"%x %x %x %x",addr_seg1,addr_seg2,addr_seg3,addr_seg4); sscanf(hexIp,"%x %x %x %x",&IpAddr2->ip.data[0],&IpAddr2->ip.data[1], &IpAddr2->ip.data[2],&IpAddr2->ip.data[3]); IpAddr2->ip.numocts = 4; IpAddr2->port = bindPort; RasAddress->u.ipAddress = IpAddr2; dListInit(&(regRequest->rasAddress)); dListAppend(pctxt,&(regRequest->rasAddress),RasAddress); //terminal type regRequest->terminalType.mc = FALSE; regRequest->terminalType.undefinedNode = FALSE; regRequest->terminalType.terminal.m.nonStandardDataPresent = FALSE; regRequest->terminalType.m.terminalPresent = TRUE; //terminal alias if(m_bName || m_bNumber) { regRequest->m.terminalAliasPresent = 1; dListInit(&(regRequest->terminalAlias)); } else regRequest->m.terminalAliasPresent = 0; if(m_bName) { alias1 = (H225AliasAddress*)ASN1MALLOC(pctxt,sizeof(H225AliasAddress)); memset(alias1,0,sizeof(H225AliasAddress)); alias1->t = T_H225AliasAddress_h323_ID; Asn116BitCharString *str = &(alias1->u.h323_ID); int nCount = m_strName.GetLength(); str->nchars = nCount; str->data = (ASN116BITCHAR*)ASN1MALLOC(pctxt,sizeof(ASN116BITCHAR) * nCount); memset(str->data,0,sizeof(ASN116BITCHAR) * nCount); for(int i = 0; i < nCount; i++) //这里需要进一步转换成16进制吗? str->data[i] = (ASN116BITCHAR)m_strName.GetAt(i); dListAppend(pctxt,&(regRequest->terminalAlias),alias1); } if(m_bNumber) { alias2 = (H225AliasAddress*)ASN1MALLOC(pctxt,sizeof(H225AliasAddress)); memset(alias2,0,sizeof(H225AliasAddress)); alias2->t = T_H225AliasAddress_dialedDigits; alias2->u.dialedDigits = LPCTSTR(m_strNumber); dListAppend(pctxt,&(regRequest->terminalAlias),alias2); } //endpoint Vendor regRequest->endpointVendor.vendor.t35CountryCode = 9; regRequest->endpointVendor.vendor.t35Extension = 0; regRequest->endpointVendor.vendor.manufacturerCode= 61; regRequest->endpointVendor.productId.numocts = ASN1MIN(strlen("GiantVoip"), sizeof(regRequest->endpointVendor.productId.data)); strncpy((char*)regRequest->endpointVendor.productId.data, "GiantVoip", regRequest->endpointVendor.productId.numocts); regRequest->endpointVendor.versionId.numocts = ASN1MIN(strlen("Version 1.0"), sizeof(regRequest->endpointVendor.versionId.data)); strncpy((char*)regRequest->endpointVendor.versionId.data, "Version 1.0", regRequest->endpointVendor.versionId.numocts); regRequest->endpointVendor.m.productIdPresent=TRUE; regRequest->endpointVendor.m.versionIdPresent=TRUE; regRequest->keepAlive = FALSE; regRequest->willSupplyUUIEs = FALSE; regRequest->maintainConnection = FALSE; ooSendRasMsg(myContext); OOTRACEINFO2(myContext, "Sending registration request message"); }
int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList) { OOSOCKET sock; struct ifconf ifc; int ifNum; OOInterface *pIf=NULL; struct sockaddr_in sin; OOTRACEDBGA1("Retrieving local interfaces\n"); if(ooSocketCreateUDP(&sock, 4)!= ASN_OK) { OOTRACEERR1("Error:Failed to create udp socket - " "ooSocketGetInterfaceList\n"); return -1; } #ifdef SIOCGIFNUM if(ioctl(sock, SIOCGIFNUM, &ifNum) >= 0) { OOTRACEERR1("Error: ioctl for ifNum failed\n"); return -1; } #else ifNum = 50; #endif ifc.ifc_len = ifNum * sizeof(struct ifreq); ifc.ifc_req = (struct ifreq *)memAlloc(pctxt, ifNum *sizeof(struct ifreq)); if(!ifc.ifc_req) { OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - ifc.ifc_req\n"); return -1; } if (ioctl(sock, SIOCGIFCONF, &ifc) >= 0) { void * ifEndList = (char *)ifc.ifc_req + ifc.ifc_len; struct ifreq *ifName; struct ifreq ifReq; int flags; for (ifName = ifc.ifc_req; (void*)ifName < ifEndList; ifName++) { char *pName=NULL; char addr[50]; #ifdef ifr_netmask char mask[50]; #endif pIf = (struct OOInterface*)memAlloc(pctxt, sizeof(struct OOInterface)); pName = (char*)memAlloc(pctxt, strlen(ifName->ifr_name)+1); if(!pIf) { OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - " "pIf/pName\n"); return -1; } OOTRACEDBGA2("\tInterface name: %s\n", ifName->ifr_name); strcpy(ifReq.ifr_name, ifName->ifr_name); strcpy(pName, ifName->ifr_name); pIf->name = pName; /* Check whether the interface is up*/ if (ioctl(sock, SIOCGIFFLAGS, &ifReq) < 0) { OOTRACEERR2("Error:Unable to determine status of interface %s\n", pName); memFreePtr(pctxt, pIf->name); memFreePtr(pctxt, pIf); continue; } flags = ifReq.ifr_flags; if (!(flags & IFF_UP)) { OOTRACEWARN2("Warn:Interface %s is not up\n", pName); memFreePtr(pctxt, pIf->name); memFreePtr(pctxt, pIf); continue; } /* Retrieve interface address */ if (ioctl(sock, SIOCGIFADDR, &ifReq) < 0) { OOTRACEWARN2("Warn:Unable to determine address of interface %s\n", pName); memFreePtr(pctxt, pIf->name); memFreePtr(pctxt, pIf); continue; } memcpy(&sin, &ifReq.ifr_addr, sizeof(struct sockaddr_in)); strcpy(addr, ast_inet_ntoa(sin.sin_addr)); OOTRACEDBGA2("\tIP address is %s\n", addr); pIf->addr = (char*)memAlloc(pctxt, strlen(addr)+1); if(!pIf->addr) { OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - " "pIf->addr\n"); memFreePtr(pctxt, pIf->name); memFreePtr(pctxt, pIf); return -1; } strcpy(pIf->addr, addr); #ifdef ifr_netmask if (ioctl(sock, SIOCGIFNETMASK, &ifReq) < 0) { OOTRACEWARN2("Warn:Unable to determine mask for interface %s\n", pName); memFreePtr(pctxt, pIf->name); memFreePtr(pctxt, pIf->addr); memFreePtr(pctxt, pIf); continue; } memcpy(&sin, &ifReq.ifr_netmask, sizeof(struct sockaddr_in)); strcpy(mask, ast_inet_ntoa(sin.sin_addr)); OOTRACEDBGA2("\tMask is %s\n", mask); pIf->mask = (char*)memAlloc(pctxt, strlen(mask)+1); if(!pIf->mask) { OOTRACEERR1("Error:Memory - ooSocketGetInterfaceList - " "pIf->mask\n"); memFreePtr(pctxt, pIf->name); memFreePtr(pctxt, pIf->addr); memFreePtr(pctxt, pIf); return -1; } strcpy(pIf->mask, mask); #endif pIf->next = NULL; /* Add to the list */ if(!*ifList) { *ifList = pIf; pIf = NULL; } else{ pIf->next = *ifList; *ifList = pIf; pIf=NULL; } /* #if defined(OO_FREEBSD) || defined(OO_OPENBSD) || defined(OO_NETBSD) || defined(OO_MACOSX) || defined(OO_VXWORKS) || defined(OO_RTEMS) || defined(OO_QNX) #ifndef _SIZEOF_ADDR_IFREQ #define _SIZEOF_ADDR_IFREQ(ifr) \ ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \ (sizeof(struct ifreq) - sizeof(struct sockaddr) + \ (ifr).ifr_addr.sa_len) : sizeof(struct ifreq)) #endif ifName = (struct ifreq *)((char *)ifName + _SIZEOF_ADDR_IFREQ(*ifName)); #else ifName++; */ } } return ASN_OK; }