int Node::SndRegister(REG_TYPE type , ChordId req_uri , ChordId to , ChordId contact , BOOL IncludeSuccList) { char *message1; unsigned int len = 0; osip_transaction_t *transaction; osip_event_t *sipevent; osip_message_t *request; /* temp uri */ char * tmp_uri; int i; i = osip_message_init(&request); if (i!=0) goto si2perror1; /* prepare the request-line */ osip_message_set_method(request, osip_strdup("REGISTER")); osip_message_set_version(request, osip_strdup("SIP/2.0")); osip_message_set_status_code(request, 0); osip_message_set_reason_phrase(request, NULL); //requset uri if(type == MULTICAST) { tmp_uri = osip_strdup("sip:224.0.1.75") ; } else tmp_uri = ChordId2Uri(req_uri,false) ; osip_uri_t *uri; i=osip_uri_init(&uri); if (i!=0) goto si2perror2; i=osip_uri_parse(uri, tmp_uri ); if(tmp_uri) osip_free(tmp_uri) ; if (i!=0) goto si2perror2; osip_message_set_uri(request , uri) ; if(type == JOIN) { tmp_uri = ChordId2Uri(to,false) ; /* when JOIN , to and from are same */ osip_message_set_to(request, tmp_uri ); osip_message_set_from(request, tmp_uri); if (tmp_uri) osip_free(tmp_uri) ; osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("join")); } else if(type == FINDSUCC) { tmp_uri = ChordId2Uri(to,true) ; osip_message_set_to(request, tmp_uri ); if (tmp_uri) osip_free(tmp_uri) ; tmp_uri = ChordId2Uri(chordId,false); osip_message_set_from(request, tmp_uri ); if (tmp_uri) osip_free(tmp_uri) ; osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("findsucc")); //has no contact } else if(type == STABILIZE) { tmp_uri = ChordId2Uri(to,false); osip_message_set_to(request, tmp_uri); if (tmp_uri) osip_free(tmp_uri) ; tmp_uri = ChordId2Uri(chordId,false) ; osip_message_set_from(request, tmp_uri ); osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("stabilize")); if (tmp_uri) osip_free(tmp_uri) ; //contact tmp_uri = ChordId2Uri(chordId,false); char * pre_uri = ChordId2Uri(getFingerTable()->getPredecessor(),false) ; char *ctt = (char *) osip_malloc(strlen(tmp_uri) + strlen(";predecessor=") + strlen(pre_uri) +1) ; if (ctt == NULL) return NULL; sprintf (ctt, "%s;predecessor=%s", tmp_uri,pre_uri); osip_free(tmp_uri) ; osip_free(pre_uri) ; osip_message_set_contact(request, ctt ); osip_free(ctt) ; } else if(type == LEAVE) { tmp_uri = ChordId2Uri(to,false) ; osip_message_set_to(request, tmp_uri ); if (tmp_uri) osip_free(tmp_uri) ; tmp_uri = ChordId2Uri(chordId,false) ; osip_message_set_from(request, tmp_uri ); if (tmp_uri) osip_free(tmp_uri) ; osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("leave")); //contact tmp_uri = ChordId2Uri(chordId,false); char * pre_uri = ChordId2Uri(getFingerTable()->getPredecessor(),false) ; char *ctt = (char *) osip_malloc(strlen(tmp_uri) + strlen(";predecessor=") + strlen(pre_uri) +1) ; if (ctt == NULL) return NULL; sprintf (ctt, "%s;predecessor=%s", tmp_uri,pre_uri); osip_free(tmp_uri) ; osip_free(pre_uri) ; osip_message_set_contact(request, ctt ); osip_free(ctt) ; //succlist if(IncludeSuccList) { for(i = 0 ; i < getFingerTable()->getSuccNum() ; i++) { tmp_uri = ChordId2Uri(getFingerTable()->getSuccessor(i),false) ; osip_message_set_contact(request, tmp_uri ); osip_free(tmp_uri) ; } } }//type == LEAVE if(type == MULTICAST) { tmp_uri = ChordId2Uri(chordId,false); /* when JOIN , to and from are same */ osip_message_set_to(request, tmp_uri ); osip_message_set_from(request, tmp_uri); osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("multicast")); osip_free(tmp_uri) ; //no contact }//type == MULTIPL //---set call_id and cseq osip_call_id_t *callid; osip_cseq_t *cseq; char *num; char *cidrand; char *register_callid_number ; /* call-id is always the same for REGISTRATIONS */ i = osip_call_id_init(&callid); if (i!=0) goto si2perror2; cidrand = osip_strdup("BF9598C48B184EBBAFADFE527EED8186") ; osip_call_id_set_number(callid, cidrand); register_callid_number = cidrand; osip_call_id_set_host(callid, osip_strdup("SI2P.COM")); request->call_id = callid; //cseq i = osip_cseq_init(&cseq); if (i!=0) goto si2perror2 ; num = osip_strdup("1"); osip_cseq_set_number(cseq, num); osip_cseq_set_method(cseq, osip_strdup("REGISTER")); request->cseq = cseq; /*the Max-Forward header */ osip_message_set_max_forwards(request, "5"); /* a UA should start a request with 70 */ /* the via header */ char tmp[200]; unsigned int branch; branch=osip_build_random_number(); snprintf(tmp, 200, "SIP/2.0/%s %s:%s;rport;branch=z9hG4bK%u", "UDP", localip, localport, branch ); osip_message_set_via(request, tmp); /* the UA header */ osip_message_set_user_agent(request, user_agent); /* the expires header */ char exp[10]; /* MUST never be ouside 1 and 3600 */ snprintf(exp, 9, "%i", expires); osip_message_set_expires(request, exp); osip_message_set_content_length(request, "0"); /*** then must wake up osip ***/ i = osip_transaction_init(&transaction, NICT, adosip->j_osip, request); if (i!=0) goto si2perror2 ; //jr->r_last_tr = transaction; /* send REGISTER */ i = osip_message_to_str(request, &message1, &len); LogStream("SEND======================================>>\n") ; LogStream(message1) ; if(message1) osip_free(message1) ; // printf("SEND======================================>>\n") ; // printf(message1) ; sipevent = osip_new_outgoing_sipmessage(request); sipevent->transactionid = transaction->transactionid; osip_message_force_update(request); osip_transaction_add_event(transaction, sipevent); adosip->ThreadWakeUp(); return 0; si2perror1: if(request != NULL)osip_message_free(request); return -1 ; si2perror2: if(request != NULL)osip_message_free(request); return -1; }
int Node::SndUserRegisterRequest(REG_TYPE type, uinfo_t *user_info, const char *registrar, int expires) { char *message1; unsigned int len = 0; osip_message_t *request; osip_event_t *sipevent; osip_transaction_t *transaction; osip_uri_t *uri; char *tmp_uri; int i; i=osip_message_init(&request); if(i!=0) goto si2perror1; osip_message_set_method(request,strdup("REGISTER")); osip_message_set_version(request,strdup("SIP/2.0")); osip_message_set_status_code(request,0); osip_message_set_reason_phrase(request,NULL); i=osip_uri_init(&uri); if(i!=0) goto si2perror2; i=osip_uri_parse(uri,osip_strdup(registrar)); osip_message_set_uri(request,uri); //*set to,from and header if(type==USER_REGISTRATION) { char *dest1; char *dest2; osip_uri_to_str(user_info->aor->uri,&dest1); i=osip_message_set_to(request,dest1); i=osip_message_set_from(request,dest1); if(dest1) osip_free(dest1) ; osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("user_registration")); osip_contact_to_str(user_info->bindings->contact,&dest2); i=osip_message_set_contact(request,osip_strdup(dest2)); if(dest2) osip_free(dest2) ; } if(type == RED_REGISTER) { char *dest1; char *dest2; osip_uri_to_str(user_info->aor->uri,&dest1); i=osip_message_set_to(request,dest1); i=osip_message_set_from(request,dest1); if(dest1) osip_free(dest1) ; osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("red_register")); osip_contact_to_str(user_info->bindings->contact,&dest2); i=osip_message_set_contact(request,osip_strdup(dest2)); if(dest2) osip_free(dest2) ; } if(type==TRANSFER_REGISTRATION) { char *dest1; char *dest2; //string tmp_uri; osip_uri_to_str(user_info->aor->uri,&dest1); osip_message_set_to(request,dest1); if(dest1) osip_free(dest1) ; tmp_uri = ChordId2Uri(chordId,false); osip_message_set_from(request,tmp_uri); osip_from_param_add (request->from, osip_strdup ("user"), osip_strdup("transfer_registration")); if(tmp_uri) osip_free(tmp_uri) ; osip_contact_to_str(user_info->bindings->contact,&dest2); osip_message_set_contact(request,dest2); if(dest2) osip_free(dest2) ; } if(type==THIRD_PARTY) { //todo } //---set call_id and cseq osip_call_id_t *callid; osip_cseq_t *cseq; char *num; char *cidrand; char *register_callid_number ; //* call-id is always the same for REGISTRATIONS i = osip_call_id_init(&callid); if (i!=0) goto si2perror2; cidrand = osip_strdup("BF9598C48B184EBBAFADFE527EED8186") ; osip_call_id_set_number(callid, cidrand); register_callid_number = cidrand; osip_call_id_set_host(callid, osip_strdup("SI2P.COM")); request->call_id = callid; //cseq i = osip_cseq_init(&cseq); if (i!=0) goto si2perror2 ; num = osip_strdup("1"); osip_cseq_set_number(cseq, num); osip_cseq_set_method(cseq, osip_strdup("REGISTER")); request->cseq = cseq; //*the Max-Forward header osip_message_set_max_forwards(request, "5"); //* a UA should start a request with 70 //* the via header char tmp[200]; snprintf(tmp, 200, "SIP/2.0/%s %s:%s;rport;branch=z9hG4bK%u", "UDP", localip, localport, via_branch_new_random() ); osip_message_set_via(request, tmp); //* the UA header osip_message_set_user_agent(request, user_agent); //* the expires header char exp[10]; //* MUST never be ouside 1 and 3600 snprintf(exp, 9, "%i", expires); osip_message_set_expires(request, exp); osip_message_set_content_length(request, "0"); //*** then must wake up osip i = osip_transaction_init(&transaction, NICT, adosip->j_osip, request); if (i!=0) goto si2perror3 ; //* send REGISTER i = osip_message_to_str(request, &message1, &len); LogStream("SEND======================================>>\n") ; LogStream(message1) ; if(message1) osip_free(message1) ; // printf("SEND======================================>>\n") ; // printf(message1) ; sipevent = osip_new_outgoing_sipmessage(request); sipevent->transactionid = transaction->transactionid; osip_message_force_update(request); osip_transaction_add_event(transaction, sipevent); adosip->ThreadWakeUp(); return 0; si2perror1: return -1; si2perror2: if(request!=NULL) osip_message_free(request); return -1; si2perror3: if(transaction!=NULL) osip_message_free(request); return -1; }
int Node::SndUserRegisterRequest(char *aor ,const char *requri) { char *message1; unsigned int len = 0; osip_transaction_t *transaction; osip_event_t *sipevent; osip_message_t *request; int i; i = osip_message_init(&request); if (i!=0) goto si2perror1; /* prepare the request-line */ osip_message_set_method(request, osip_strdup("REGISTER")); osip_message_set_version(request, osip_strdup("SIP/2.0")); osip_message_set_status_code(request, 0); osip_message_set_reason_phrase(request, NULL); //requset uri osip_uri_t *uri; i=osip_uri_init(&uri); if (i!=0) goto si2perror2; i=osip_uri_parse(uri, requri); if (i!=0) goto si2perror2; osip_message_set_uri(request , uri) ; //to from ,no contact osip_message_set_to(request,aor); osip_message_set_from(request,aor); osip_from_param_add(request->from,osip_strdup("user"),osip_strdup("user_query")); //---set call_id and cseq osip_call_id_t *callid; osip_cseq_t *cseq; char *num; char *cidrand; char *register_callid_number ; /* call-id is always the same for REGISTRATIONS */ i = osip_call_id_init(&callid); if (i!=0) goto si2perror2; cidrand = osip_strdup("BF9598C48B184EBBAFADFE527EED8186") ; osip_call_id_set_number(callid, cidrand); register_callid_number = cidrand; osip_call_id_set_host(callid, osip_strdup("SI2P.COM")); request->call_id = callid; //cseq i = osip_cseq_init(&cseq); if (i!=0) goto si2perror2 ; num = osip_strdup("1"); osip_cseq_set_number(cseq, num); osip_cseq_set_method(cseq, osip_strdup("REGISTER")); request->cseq = cseq; /*the Max-Forward header */ osip_message_set_max_forwards(request, "5"); /* a UA should start a request with 70 */ /* the via header */ char tmp[200]; unsigned int branch; branch=osip_build_random_number(); snprintf(tmp, 200, "SIP/2.0/%s %s:%s;rport;branch=z9hG4bK%u", "UDP", localip, localport, branch ); osip_message_set_via(request, tmp); /* the UA header */ osip_message_set_user_agent(request, user_agent); /* the expires header */ char exp[10]; /* MUST never be ouside 1 and 3600 */ snprintf(exp, 9, "%i", expires); osip_message_set_expires(request, exp); osip_message_set_content_length(request, "0"); /*** then must wake up osip ***/ i = osip_transaction_init(&transaction, NICT, adosip->j_osip, request); if (i!=0) goto si2perror2 ; /* send REGISTER */ i = osip_message_to_str(request, &message1, &len); LogStream("SEND======================================>>\n") ; LogStream(message1) ; if(message1) osip_free(message1) ; sipevent = osip_new_outgoing_sipmessage(request); sipevent->transactionid = transaction->transactionid; osip_message_force_update(request); osip_transaction_add_event(transaction, sipevent); adosip->ThreadWakeUp(); return 0; si2perror1: if(request != NULL)osip_message_free(request); return -1 ; si2perror2: if(request != NULL)osip_message_free(request); return -1; return 0; }
int bSipRegisterBuild(osip_message_t **regMsgPtrPtr) { static int gSeqNum = 1; int status; char *callidNumberStr = NULL; char *seqNumStr = NULL; osip_call_id_t *callidPtr; char temp[MESSAGE_ENTRY_MAX_LENGTH]; char sipPort[MESSAGE_ENTRY_MAX_LENGTH]; osip_cseq_t *cseqPtr; unsigned int number; osip_message_t *regMsgPtr; char expires[10]; if((status = osip_message_init(®MsgPtr)) != 0){ OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"Can't init message!\n")); return -1; } osip_message_set_method(regMsgPtr, osip_strdup("OPTIONS")); osip_uri_init(&(regMsgPtr->req_uri)); if ( ( status = osip_uri_parse(regMsgPtr->req_uri, SIP_PROXY) ) != 0) { OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"uri parse failed!\n")); osip_message_free(regMsgPtr); return -1; } osip_message_set_version(regMsgPtr, osip_strdup("SIP/2.0")); osip_message_set_status_code(regMsgPtr, 0); osip_message_set_reason_phrase(regMsgPtr, NULL); osip_message_set_to(regMsgPtr, SIP_TO); osip_message_set_from(regMsgPtr, SIP_FROM); if((status = osip_call_id_init(&callidPtr)) != 0 ){ OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"call id failed!\n")); osip_message_free(regMsgPtr); return -1; } callidNumberStr = (char *)osip_malloc(MAX_ADDR_STR); number = osip_build_random_number(); sprintf(callidNumberStr,"%u",number); osip_call_id_set_number(callidPtr, callidNumberStr); osip_call_id_set_host(callidPtr, osip_strdup("10.1.1.63")); regMsgPtr->call_id = callidPtr; if((status = osip_cseq_init(&cseqPtr)) != 0 ){ OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_BUG,NULL,"seq init failed!\n")); osip_message_free(regMsgPtr); return -1; } gSeqNum++; seqNumStr = (char *)osip_malloc(MAX_ADDR_STR); sprintf(seqNumStr,"%i", gSeqNum); osip_cseq_set_number(cseqPtr, seqNumStr); osip_cseq_set_method(cseqPtr, osip_strdup("OPTIONS")); regMsgPtr->cseq = cseqPtr; osip_message_set_max_forwards(regMsgPtr, "70"); sprintf(sipPort, "%i", SIP_PORT); sprintf(temp, "SIP/2.0/%s %s;branch=z9hG4bK%u", "UDP",LOCAL_IP,osip_build_random_number() ); osip_message_set_via(regMsgPtr, temp); osip_message_set_contact(regMsgPtr, SIP_CONTACT); sprintf(expires, "%i", EXPIRES_TIME_INSECS); osip_message_set_expires(regMsgPtr, expires); osip_message_set_content_length(regMsgPtr, "0"); osip_message_set_user_agent(regMsgPtr, "TotalView 1.0"); AddSupportedMethods(regMsgPtr); *regMsgPtrPtr = regMsgPtr; return 0; }