/* * create a reply template from an given SIP request * * RETURNS a pointer to osip_message_t */ osip_message_t *msg_make_template_reply (sip_ticket_t *ticket, int code) { osip_message_t *request=ticket->sipmsg; osip_message_t *response; int pos; osip_message_init (&response); response->message=NULL; osip_message_set_version (response, osip_strdup ("SIP/2.0")); osip_message_set_status_code (response, code); osip_message_set_reason_phrase (response, osip_strdup(osip_message_get_reason (code))); if (request->to==NULL) { ERROR("msg_make_template_reply: empty To in request header"); return NULL; } if (request->from==NULL) { ERROR("msg_make_template_reply: empty From in request header"); return NULL; } osip_to_clone (request->to, &response->to); osip_from_clone (request->from, &response->from); /* if 3xx, also include 1st contact header */ if ((code==200) || ((code>=300) && (code<400))) { osip_contact_t *req_contact = NULL; osip_contact_t *res_contact = NULL; osip_message_get_contact(request, 0, &req_contact); if (req_contact) osip_contact_clone (req_contact, &res_contact); if (res_contact) osip_list_add(response->contacts,res_contact,0); } /* via headers */ pos = 0; while (!osip_list_eol (request->vias, pos)) { char *tmp; osip_via_t *via; via = (osip_via_t *) osip_list_get (request->vias, pos); osip_via_to_str (via, &tmp); osip_message_set_via (response, tmp); osip_free (tmp); pos++; } osip_call_id_clone(request->call_id,&response->call_id); osip_cseq_clone(request->cseq,&response->cseq); return response; }
int BuildResponse(const osip_message_t *request, osip_message_t **response) { osip_message_t *msg = NULL; char port[6]; char* pContact = osip_malloc(strlen(SERV_IP_ADDR) + strlen(USER_NAME) + sizeof(port) + 7 + 10 ); // 7 is "sip:...@..:. \0" 10 - zapas osip_message_init(&msg); osip_from_clone(request->from, &msg->from); osip_to_clone(request->to, &msg->to); osip_cseq_clone(request->cseq, &msg->cseq); osip_call_id_clone(request->call_id, &msg->call_id); int pos = 0;//copy vias from request to response while (!osip_list_eol(&request->vias, pos)) { osip_via_t *via; osip_via_t *via2; via = (osip_via_t *) osip_list_get(&request->vias, pos); int i = osip_via_clone(via, &via2); if (i != 0) { osip_message_free(msg); return i; } osip_list_add(&(msg->vias), via2, -1); pos++; } osip_message_set_max_forwards(msg, osip_strdup("70")); osip_to_set_tag(msg->to, osip_strdup("4893693")); // set to tag in response. todo: randomize osip_message_set_version(msg, osip_strdup("SIP/2.0")); // create contact strcat(pContact, osip_strdup("sip:")); strcat(pContact, osip_strdup(USER_NAME)); strcat(pContact, osip_strdup("@")); strcat(pContact, osip_strdup(SERV_IP_ADDR)); osip_message_set_contact(msg, osip_strdup(pContact)); osip_free(pContact); osip_message_set_user_agent(msg, osip_strdup("SipMore/0.1")); *response = msg; return 0; }
osip_message_t* init_sip_msg_from_src (const osip_message_t *sipmsg, const int code) { __tri(init_sip_msg_from_src); if (sipmsg->to && sipmsg->from) { osip_message_t* sipgen; osip_message_init (&sipgen); if (sipgen) { sipgen->message = NULL; osip_message_set_version (sipgen, osip_strdup ("SIP/2.0")); osip_message_set_status_code (sipgen, code); osip_message_set_reason_phrase (sipgen, osip_strdup(osip_message_get_reason (code))); if (code == SIP_MOVED_TEMPORARILY) { char contact[100]; snprintf (contact, sizeof(contact), "<sip:%s@%s:%s>", sipmsg->to->url->username, "sip.voipcheap.com", "5060"); osip_message_set_contact(sipgen, contact); osip_to_clone (sipmsg->to, &sipgen->from); osip_from_clone (sipmsg->from, &sipgen->to); } else { /*include 1st contact header if 3xx*/ if (code < SIP_BAD_REQUEST && (SIP_OK == code || code >= SIP_MULTIPLE_CHOICES) ) { osip_contact_t* src_contact = NULL; osip_message_get_contact(sipmsg, 0, &src_contact); if (src_contact) { osip_contact_t* res_contact = NULL; osip_contact_clone (src_contact, &res_contact); if (res_contact) { osip_list_add(&(sipgen->contacts),res_contact,0); } } } osip_to_clone (sipmsg->to, &sipgen->to); osip_from_clone (sipmsg->from, &sipgen->from); } /* via headers */ int pos = 0; while (!osip_list_eol (&sipmsg->vias, pos)) { osip_via_t*via = (osip_via_t*)osip_list_get (&sipmsg->vias, pos); char *tmp; osip_via_to_str (via, &tmp); osip_message_set_via (sipgen, tmp); osip_free (tmp); pos++; } osip_call_id_clone (sipmsg->call_id, &sipgen->call_id); osip_cseq_clone (sipmsg->cseq, &sipgen->cseq); __tre(return) sipgen; } }
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::SndResponse4Query(int status, const char *contact, osip_transaction_t *tr, osip_message_t *request) { char *message1; size_t length = 0; // osip_generic_param_t *tag; osip_message_t *response; osip_event_t *evt ; char *tmp; int pos; int i; i = osip_message_init (&response); if (i != 0) return -1; osip_message_set_version (response, osip_strdup ("SIP/2.0")); osip_message_set_status_code (response, status); tmp = osip_strdup(osip_message_get_reason (status)); if (tmp == NULL) osip_message_set_reason_phrase (response, osip_strdup ("Unknown status code")); else osip_message_set_reason_phrase (response, tmp); osip_message_set_method (response, NULL); osip_message_set_uri (response, NULL); i = osip_to_clone (request->to, &(response->to)); if (i != 0) goto si2perror1; i = osip_to_get_tag (response->to, &tag); if (i != 0) { /* we only add a tag if it does not already contains one! */ if (status == 200 && MSG_IS_REGISTER (request)) { osip_to_set_tag (response->to, osip_to_tag_new_random ()); } else if (status >= 200) { osip_to_set_tag (response->to, osip_to_tag_new_random ()); } } i = osip_from_clone (request->from, &(response->from)); if (i != 0) goto si2perror1; pos = 0; while (!osip_list_eol (request->vias, pos)) { osip_via_t *via; osip_via_t *via2; via = (osip_via_t *) osip_list_get (request->vias, pos); i = osip_via_clone (via, &via2); if (i != -0) goto si2perror1; osip_list_add (response->vias, via2, -1); pos++; } i = osip_call_id_clone (request->call_id, &(response->call_id)); if (i != 0) goto si2perror1; i = osip_cseq_clone (request->cseq, &(response->cseq)); if (i != 0) goto si2perror1; //set server osip_message_set_server (response, osip_strdup ("SI2P")); /*add contact*/ if(contact !=NULL) osip_message_set_contact(response,contact); i = osip_message_to_str(response, &message1, &length); LogStream("SEND======================================>>\n") ; LogStream(message1) ; if(message1) osip_free(message1) ; evt = osip_new_outgoing_sipmessage (response); evt->transactionid = tr->transactionid; osip_transaction_add_event(tr, evt); adosip->ThreadWakeUp(); return 0; si2perror1: osip_message_free (response); 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 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::SndResponse(int status , osip_message_t *request , osip_transaction_t *tr, REG_TYPE type , ChordId contact, BOOL IncludeSuccList) { char *message1; size_t length = 0; // osip_generic_param_t *tag; osip_message_t *response; osip_event_t *evt ; char *tmp; char * tmp_uri; int pos; int i; i = osip_message_init (&response); if (i != 0) return -1; osip_message_set_version (response, osip_strdup ("SIP/2.0")); osip_message_set_status_code (response, status); tmp = osip_strdup(osip_message_get_reason (status)); if (tmp == NULL) osip_message_set_reason_phrase (response, osip_strdup ("Unknown status code")); else osip_message_set_reason_phrase (response, tmp); osip_message_set_method (response, NULL); osip_message_set_uri (response, NULL); i = osip_to_clone (request->to, &(response->to)); if (i != 0) goto si2perror1; i = osip_to_get_tag (response->to, &tag); if (i != 0) { /* we only add a tag if it does not already contains one! */ if (status == 200 && MSG_IS_REGISTER (request)) { osip_to_set_tag (response->to, osip_to_tag_new_random ()); } else if (status >= 200) { osip_to_set_tag (response->to, osip_to_tag_new_random ()); } } i = osip_from_clone (request->from, &(response->from)); if (i != 0) goto si2perror1; pos = 0; while (!osip_list_eol (request->vias, pos)) { osip_via_t *via; osip_via_t *via2; via = (osip_via_t *) osip_list_get (request->vias, pos); i = osip_via_clone (via, &via2); if (i != -0) goto si2perror1; osip_list_add (response->vias, via2, -1); pos++; } i = osip_call_id_clone (request->call_id, &(response->call_id)); if (i != 0) goto si2perror1; i = osip_cseq_clone (request->cseq, &(response->cseq)); if (i != 0) goto si2perror1; //set server osip_message_set_server (response, osip_strdup ("SI2P")); /*add contact*/ //predecessor if(status == 200) { if(type == USER_REGISTRATION || type == TRANSFER_REGISTRATION || type == THIRD_PARTY) { osip_contact_t *tmp; char *dest; int pos=0; while(pos<osip_list_size(request->contacts)) { pos=osip_message_get_contact(request,0,&tmp); osip_contact_to_str(tmp,&dest); osip_message_set_contact(response,dest); if(dest) osip_free(dest) ; pos++; } } else { 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(response, ctt ); osip_free(ctt) ; } } else//302 { if(type == USER_REGISTRATION || type == TRANSFER_REGISTRATION || type == THIRD_PARTY) { tmp_uri = ChordId2Uri(contact,false); osip_message_set_contact(response,tmp_uri ); osip_free(tmp_uri) ; } else { tmp_uri = ChordId2Uri(contact,false) ; char *ctt = (char *) osip_malloc(strlen(tmp_uri) + strlen(";predecessor=notprovided") +1) ; if (ctt == NULL) return NULL; sprintf (ctt, "%s;predecessor=notprovided", tmp_uri); if(tmp_uri) osip_free(tmp_uri) ; osip_message_set_contact(response, ctt ); if(tmp_uri) osip_free(ctt) ; } } if(IncludeSuccList) { for(i = 0 ; i < getFingerTable()->getSuccNum() ; i++) { tmp_uri = ChordId2Uri(getFingerTable()->getSuccessor(i),false) ; osip_message_set_contact(response, tmp_uri ); osip_free(tmp_uri) ; } } i = osip_message_to_str(response, &message1, &length); LogStream("SEND======================================>>\n") ; LogStream(message1) ; if(message1) osip_free(message1) ; // printf("SEND======================================>>\n") ; // printf(message1) ; evt = osip_new_outgoing_sipmessage (response); evt->transactionid = tr->transactionid; osip_transaction_add_event(tr, evt); adosip->ThreadWakeUp(); return 0; si2perror1: osip_message_free (response); return -1; }
/* It is RECOMMENDED to only cancel INVITE request */ int generating_cancel (osip_message_t ** dest, osip_message_t * request_cancelled) { int i; osip_message_t *request; i = osip_message_init (&request); if (i != 0) return i; /* prepare the request-line */ osip_message_set_method (request, osip_strdup ("CANCEL")); osip_message_set_version (request, osip_strdup ("SIP/2.0")); osip_message_set_status_code (request, 0); osip_message_set_reason_phrase (request, NULL); i = osip_uri_clone (request_cancelled->req_uri, &(request->req_uri)); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } i = osip_to_clone (request_cancelled->to, &(request->to)); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } i = osip_from_clone (request_cancelled->from, &(request->from)); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } /* set the cseq and call_id header */ i = osip_call_id_clone (request_cancelled->call_id, &(request->call_id)); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } i = osip_cseq_clone (request_cancelled->cseq, &(request->cseq)); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } osip_free (request->cseq->method); request->cseq->method = osip_strdup ("CANCEL"); if (request->cseq->method == NULL) { osip_message_free (request); *dest = NULL; return OSIP_NOMEM; } /* copy ONLY the top most Via Field (this method is also used by proxy) */ { osip_via_t *via; osip_via_t *via2; i = osip_message_get_via (request_cancelled, 0, &via); if (i < 0) { osip_message_free (request); *dest = NULL; return i; } i = osip_via_clone (via, &via2); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } osip_list_add (&request->vias, via2, -1); } /* add the same route-set than in the previous request */ { int pos = 0; osip_route_t *route; osip_route_t *route2; while (!osip_list_eol (&request_cancelled->routes, pos)) { route = (osip_route_t *) osip_list_get (&request_cancelled->routes, pos); i = osip_route_clone (route, &route2); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } osip_list_add (&request->routes, route2, -1); pos++; } } osip_message_set_max_forwards (request, "70"); /* a UA should start a request with 70 */ osip_message_set_user_agent (request, eXosip.user_agent); *dest = request; return OSIP_SUCCESS; }
/* method is the type of request. ("INVITE", "REGISTER"...) to is the remote target URI transport is either "TCP" or "UDP" (by now, only UDP is implemented!) */ int generating_request_out_of_dialog (osip_message_t ** dest, const char *method, const char *to, const char *transport, const char *from, const char *proxy) { /* Section 8.1: A valid request contains at a minimum "To, From, Call-iD, Cseq, Max-Forwards and Via */ int i; osip_message_t *request; char locip[65]; int doing_register; char *register_callid_number = NULL; *dest = NULL; if (eXosip.eXtl == NULL) return OSIP_NO_NETWORK; /*guess the local ip since req uri is known */ memset (locip, '\0', sizeof (locip)); eXosip_guess_ip_for_via (eXosip.eXtl->proto_family, locip, 49); if (locip[0] == '\0') { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: no default interface defined\n")); return OSIP_NO_NETWORK; } i = osip_message_init (&request); if (i != 0) return i; /* prepare the request-line */ osip_message_set_method (request, osip_strdup (method)); osip_message_set_version (request, osip_strdup ("SIP/2.0")); osip_message_set_status_code (request, 0); osip_message_set_reason_phrase (request, NULL); doing_register = 0 == strcmp ("REGISTER", method); if (doing_register) { osip_uri_init (&(request->req_uri)); i = osip_uri_parse (request->req_uri, proxy); if (i != 0) { osip_message_free (request); return i; } i = osip_message_set_to (request, from); if (i != 0 || request->to == NULL) { if (i >= 0) i = OSIP_SYNTAXERROR; osip_message_free (request); return i; } } else { /* in any cases except REGISTER: */ i = osip_message_set_to (request, to); if (i != 0 || request->to == NULL) { if (i >= 0) i = OSIP_SYNTAXERROR; OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "ERROR: callee address does not seems to be a sipurl: %s\n", to)); osip_message_free (request); return i; } /* REMOVE ALL URL PARAMETERS from to->url headers and add them as headers */ if (request->to != NULL && request->to->url != NULL) { osip_uri_t *url = request->to->url; while (osip_list_size (&url->url_headers) > 0) { osip_uri_header_t *u_header; u_header = (osip_uri_param_t *) osip_list_get (&url->url_headers, 0); if (u_header == NULL) break; if (osip_strcasecmp (u_header->gname, "from") == 0) { } else if (osip_strcasecmp (u_header->gname, "to") == 0) { } else if (osip_strcasecmp (u_header->gname, "call-id") == 0) { } else if (osip_strcasecmp (u_header->gname, "cseq") == 0) { } else if (osip_strcasecmp (u_header->gname, "via") == 0) { } else if (osip_strcasecmp (u_header->gname, "contact") == 0) { } else osip_message_set_header (request, u_header->gname, u_header->gvalue); osip_list_remove (&url->url_headers, 0); osip_uri_param_free (u_header); } } if (proxy != NULL && proxy[0] != 0) { /* equal to a pre-existing route set */ /* if the pre-existing route set contains a "lr" (compliance with bis-08) then the req_uri should contains the remote target URI */ osip_uri_param_t *lr_param; osip_route_t *o_proxy; osip_route_init (&o_proxy); i = osip_route_parse (o_proxy, proxy); if (i != 0) { osip_route_free (o_proxy); osip_message_free (request); return i; } osip_uri_uparam_get_byname (o_proxy->url, "lr", &lr_param); if (lr_param != NULL) /* to is the remote target URI in this case! */ { osip_uri_clone (request->to->url, &(request->req_uri)); /* "[request] MUST includes a Route header field containing the route set values in order." */ osip_list_add (&request->routes, o_proxy, 0); } else /* if the first URI of route set does not contain "lr", the req_uri is set to the first uri of route set */ { request->req_uri = o_proxy->url; o_proxy->url = NULL; osip_route_free (o_proxy); /* add the route set */ /* "The UAC MUST add a route header field containing the remainder of the route set values in order. The UAC MUST then place the remote target URI into the route header field as the last value */ osip_message_set_route (request, to); } } else /* No route set (outbound proxy) is used */ { /* The UAC must put the remote target URI (to field) in the req_uri */ i = osip_uri_clone (request->to->url, &(request->req_uri)); if (i != 0) { osip_message_free (request); return i; } } } /* set To and From */ i = osip_message_set_from (request, from); if (i != 0 || request->from == NULL) { if (i >= 0) i = OSIP_SYNTAXERROR; osip_message_free (request); return i; } /* add a tag */ osip_from_set_tag (request->from, osip_from_tag_new_random ()); /* set the cseq and call_id header */ { osip_call_id_t *callid; osip_cseq_t *cseq; char *num; char *cidrand; /* call-id is always the same for REGISTRATIONS */ i = osip_call_id_init (&callid); if (i != 0) { osip_message_free (request); return i; } cidrand = osip_call_id_new_random (); osip_call_id_set_number (callid, cidrand); if (doing_register) register_callid_number = cidrand; request->call_id = callid; i = osip_cseq_init (&cseq); if (i != 0) { osip_message_free (request); return i; } num = osip_strdup (doing_register ? "1" : "20"); osip_cseq_set_number (cseq, num); osip_cseq_set_method (cseq, osip_strdup (method)); request->cseq = cseq; if (cseq->method == NULL || cseq->number == NULL) { osip_message_free (request); return OSIP_NOMEM; } } i = _eXosip_request_add_via (request, transport, locip); if (i != 0) { osip_message_free (request); return i; } /* always add the Max-Forward header */ osip_message_set_max_forwards (request, "70"); /* a UA should start a request with 70 */ if (0 == strcmp ("REGISTER", method)) { } else if (0 == strcmp ("INFO", method)) { } else if (0 == strcmp ("OPTIONS", method)) { osip_message_set_accept (request, "application/sdp"); } osip_message_set_user_agent (request, eXosip.user_agent); /* else if ... */ *dest = request; return OSIP_SUCCESS; }
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; }