/* Send one stateless request */ static pj_status_t submit_stateless_job(void) { pjsip_tx_data *tdata; pj_status_t status; status = pjsip_endpt_create_request(app.sip_endpt, &app.client.method, &app.client.dst_uri, &app.local_uri, &app.client.dst_uri, &app.local_contact, NULL, -1, NULL, &tdata); if (status != PJ_SUCCESS) { app_perror(THIS_FILE, "Error creating request", status); report_completion(701); return status; } status = pjsip_endpt_send_request_stateless(app.sip_endpt, tdata, NULL, NULL); if (status != PJ_SUCCESS) { pjsip_tx_data_dec_ref(tdata); app_perror(THIS_FILE, "Error sending stateless request", status); report_completion(701); return status; } return PJ_SUCCESS; }
/* Send one stateful request */ static pj_status_t submit_job(void) { pjsip_tx_data *tdata; pj_status_t status; status = pjsip_endpt_create_request(app.sip_endpt, &app.client.method, &app.client.dst_uri, &app.local_uri, &app.client.dst_uri, &app.local_contact, NULL, -1, NULL, &tdata); if (status != PJ_SUCCESS) { app_perror(THIS_FILE, "Error creating request", status); report_completion(701); return status; } status = pjsip_endpt_send_request(app.sip_endpt, tdata, -1, NULL, &tsx_completion_cb); if (status != PJ_SUCCESS) { app_perror(THIS_FILE, "Error sending stateful request", status); //should have been reported by tsx_completion_cb(). //report_completion(701); //No longer necessary (r777) //pjsip_tx_data_dec_ref(tdata); } return status; }
static pj_status_t rt_send_request(int thread_id) { pj_status_t status; pj_str_t target, from, to, contact, call_id; pjsip_tx_data *tdata; pj_time_val timeout_delay; pj_mutex_lock(rt_test_data[thread_id].mutex); /* Create a request message. */ target = pj_str(rt_target_uri); from = pj_str(FROM_HDR); to = pj_str(rt_target_uri); contact = pj_str(CONTACT_HDR); call_id = rt_test_data[thread_id].call_id; status = pjsip_endpt_create_request( endpt, &pjsip_options_method, &target, &from, &to, &contact, &call_id, -1, NULL, &tdata ); if (status != PJ_SUCCESS) { app_perror(" error: unable to create request", status); pj_mutex_unlock(rt_test_data[thread_id].mutex); return -610; } /* Start time. */ pj_get_timestamp(&rt_test_data[thread_id].send_time); /* Send the message (statelessly). */ status = pjsip_endpt_send_request_stateless( endpt, tdata, NULL, NULL); if (status != PJ_SUCCESS) { /* Immediate error! */ app_perror(" error: send request", status); pjsip_tx_data_dec_ref(tdata); pj_mutex_unlock(rt_test_data[thread_id].mutex); return -620; } /* Update counter. */ rt_test_data[thread_id].sent_request_count++; /* Set timeout timer. */ if (rt_test_data[thread_id].timeout_timer.user_data != NULL) { pjsip_endpt_cancel_timer(endpt, &rt_test_data[thread_id].timeout_timer); } timeout_delay.sec = 100; timeout_delay.msec = 0; rt_test_data[thread_id].timeout_timer.user_data = (void*)1; pjsip_endpt_schedule_timer(endpt, &rt_test_data[thread_id].timeout_timer, &timeout_delay); pj_mutex_unlock(rt_test_data[thread_id].mutex); return PJ_SUCCESS; }
pjsip_messaging_create_msg( pjsip_endpoint *endpt, const pj_str_t *target, const pj_str_t *param_from, const pj_str_t *param_to, const pj_str_t *param_call_id, int param_cseq, const pj_str_t *param_text) { return pjsip_endpt_create_request( endpt, &message_method, target, param_from, param_to, NULL, param_call_id, param_cseq, param_text); }
/* * create request benchmark */ static int create_request_bench(pj_timestamp *p_elapsed) { enum { COUNT = 100 }; unsigned i, j; pjsip_tx_data *tdata[COUNT]; pj_timestamp t1, t2, elapsed; pj_status_t status; pj_str_t str_target = pj_str("sip:[email protected]"); pj_str_t str_from = pj_str("\"Local User\" <sip:[email protected]>"); pj_str_t str_to = pj_str("\"Remote User\" <sip:[email protected]>"); pj_str_t str_contact = str_from; elapsed.u64 = 0; for (i=0; i<LOOP; i+=COUNT) { pj_bzero(tdata, sizeof(tdata)); pj_get_timestamp(&t1); for (j=0; j<COUNT; ++j) { status = pjsip_endpt_create_request(endpt, &pjsip_invite_method, &str_target, &str_from, &str_to, &str_contact, NULL, -1, NULL, &tdata[j]); if (status != PJ_SUCCESS) { app_perror(" error: unable to create request", status); goto on_error; } } pj_get_timestamp(&t2); pj_sub_timestamp(&t2, &t1); pj_add_timestamp(&elapsed, &t2); for (j=0; j<COUNT; ++j) pjsip_tx_data_dec_ref(tdata[j]); } p_elapsed->u64 = elapsed.u64; return PJ_SUCCESS; on_error: for (i=0; i<COUNT; ++i) { if (tdata[i]) pjsip_tx_data_dec_ref(tdata[i]); } return -400; }
/* Test transaction layer. */ static int tsx_layer_test(void) { pj_str_t target, from, tsx_key; pjsip_tx_data *tdata; pjsip_transaction *tsx, *found; pj_status_t status; PJ_LOG(3,(THIS_FILE, " transaction layer test")); target = pj_str(TARGET_URI); from = pj_str(FROM_URI); status = pjsip_endpt_create_request(endpt, &pjsip_invite_method, &target, &from, &target, NULL, NULL, -1, NULL, &tdata); if (status != PJ_SUCCESS) { app_perror(" error: unable to create request", status); return -110; } status = pjsip_tsx_create_uac(NULL, tdata, &tsx); if (status != PJ_SUCCESS) { app_perror(" error: unable to create transaction", status); return -120; } pj_strdup(tdata->pool, &tsx_key, &tsx->transaction_key); found = pjsip_tsx_layer_find_tsx(&tsx_key, PJ_FALSE); if (found != tsx) { return -130; } pjsip_tsx_terminate(tsx, PJSIP_SC_REQUEST_TERMINATED); flush_events(500); if (pjsip_tx_data_dec_ref(tdata) != PJSIP_EBUFDESTROYED) { return -140; } return 0; }
/* * The generic test framework, used by most of the tests. */ static int perform_tsx_test(int dummy, char *target_uri, char *from_uri, char *branch_param, int test_time, const pjsip_method *method) { pjsip_tx_data *tdata; pjsip_transaction *tsx; pj_str_t target, from, tsx_key; pjsip_via_hdr *via; pj_time_val timeout; pj_status_t status; PJ_LOG(3,(THIS_FILE, " please standby, this will take at most %d seconds..", test_time)); /* Reset test. */ recv_count = 0; test_complete = 0; /* Init headers. */ target = pj_str(target_uri); from = pj_str(from_uri); /* Create request. */ status = pjsip_endpt_create_request( endpt, method, &target, &from, &target, NULL, NULL, -1, NULL, &tdata); if (status != PJ_SUCCESS) { app_perror(" Error: unable to create request", status); return -100; } /* Set the branch param for test 1. */ via = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL); via->branch_param = pj_str(branch_param); /* Add additional reference to tdata to prevent transaction from * deleting it. */ pjsip_tx_data_add_ref(tdata); /* Create transaction. */ status = pjsip_tsx_create_uac( &tsx_user, tdata, &tsx); if (status != PJ_SUCCESS) { app_perror(" Error: unable to create UAC transaction", status); pjsip_tx_data_dec_ref(tdata); return -110; } /* Get transaction key. */ pj_strdup(tdata->pool, &tsx_key, &tsx->transaction_key); /* Send the message. */ status = pjsip_tsx_send_msg(tsx, NULL); // Ignore send result. Some tests do deliberately triggers error // when sending message. if (status != PJ_SUCCESS) { // app_perror(" Error: unable to send request", status); pjsip_tx_data_dec_ref(tdata); // return -120; } /* Set test completion time. */ pj_gettimeofday(&timeout); timeout.sec += test_time; /* Wait until test complete. */ while (!test_complete) { pj_time_val now, poll_delay = {0, 10}; pjsip_endpt_handle_events(endpt, &poll_delay); pj_gettimeofday(&now); if (now.sec > timeout.sec) { PJ_LOG(3,(THIS_FILE, " Error: test has timed out")); pjsip_tx_data_dec_ref(tdata); return -130; } } if (test_complete < 0) { tsx = pjsip_tsx_layer_find_tsx(&tsx_key, PJ_TRUE); if (tsx) { pjsip_tsx_terminate(tsx, PJSIP_SC_REQUEST_TERMINATED); pj_mutex_unlock(tsx->mutex); flush_events(1000); } pjsip_tx_data_dec_ref(tdata); return test_complete; } else { pj_time_val now; /* Allow transaction to destroy itself */ flush_events(500); /* Wait until test completes */ pj_gettimeofday(&now); if (PJ_TIME_VAL_LT(now, timeout)) { pj_time_val interval; interval = timeout; PJ_TIME_VAL_SUB(interval, now); flush_events(PJ_TIME_VAL_MSEC(interval)); } } /* Make sure transaction has been destroyed. */ if (pjsip_tsx_layer_find_tsx(&tsx_key, PJ_FALSE) != NULL) { PJ_LOG(3,(THIS_FILE, " Error: transaction has not been destroyed")); pjsip_tx_data_dec_ref(tdata); return -140; } /* Check tdata reference counter. */ if (pj_atomic_get(tdata->ref_cnt) != 1) { PJ_LOG(3,(THIS_FILE, " Error: tdata reference counter is %d", pj_atomic_get(tdata->ref_cnt))); pjsip_tx_data_dec_ref(tdata); return -150; } /* Destroy txdata */ pjsip_tx_data_dec_ref(tdata); return PJ_SUCCESS; }
/* This tests the request creating functions against the following * requirements: * - header params in URI creates header in the request. * - method and headers params are correctly shown or hidden in * request URI, From, To, and Contact header. */ static int txdata_test_uri_params(void) { char msgbuf[512]; pj_str_t target = pj_str("sip:alice@wonderland:5061;x-param=param%201" "?X-Hdr-1=Header%201" "&X-Empty-Hdr="); pj_str_t contact; pj_str_t pname = pj_str("x-param"); pj_str_t hname = pj_str("X-Hdr-1"); pj_str_t hemptyname = pj_str("X-Empty-Hdr"); pjsip_from_hdr *from_hdr; pjsip_to_hdr *to_hdr; pjsip_contact_hdr *contact_hdr; pjsip_generic_string_hdr *hdr; pjsip_tx_data *tdata; pjsip_sip_uri *uri; pjsip_param *param; pjsip_via_hdr *via; pjsip_parser_err_report err_list; pjsip_msg *msg; int len; pj_status_t status; PJ_LOG(3,(THIS_FILE, " header param in URI to create request")); /* Due to #930, contact argument is now parsed as Contact header, so * must enclose it with <> to make it be parsed as URI. */ pj_ansi_snprintf(msgbuf, sizeof(msgbuf), "<%.*s>", (int)target.slen, target.ptr); contact.ptr = msgbuf; contact.slen = strlen(msgbuf); /* Create request with header param in target URI. */ status = pjsip_endpt_create_request(endpt, &pjsip_invite_method, &target, &target, &target, &contact, NULL, -1, NULL, &tdata); if (status != 0) { app_perror(" error: Unable to create request", status); return -200; } /* Fill up the Via header to prevent syntax error on parsing */ via = (pjsip_via_hdr*) pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL); via->transport = pj_str("TCP"); via->sent_by.host = pj_str("127.0.0.1"); /* Print and parse the request. * We'll check that header params are not present in */ len = pjsip_msg_print(tdata->msg, msgbuf, sizeof(msgbuf)); if (len < 1) { PJ_LOG(3,(THIS_FILE, " error: printing message")); pjsip_tx_data_dec_ref(tdata); return -250; } msgbuf[len] = '\0'; PJ_LOG(5,(THIS_FILE, "%d bytes request created:--begin-msg--\n" "%s\n" "--end-msg--", len, msgbuf)); /* Now parse the message. */ pj_list_init(&err_list); msg = pjsip_parse_msg( 0, tdata->pool, msgbuf, len, &err_list); if (msg == NULL) { pjsip_parser_err_report *e; PJ_LOG(3,(THIS_FILE, " error: parsing message message")); e = err_list.next; while (e != &err_list) { PJ_LOG(3,(THIS_FILE, " %s in line %d col %d hname=%.*s", pj_exception_id_name(0, e->except_code), e->line, e->col+1, (int)e->hname.slen, e->hname.ptr)); e = e->next; } pjsip_tx_data_dec_ref(tdata); return -256; } /* Check the existence of port, other_param, and header param. * Port is now allowed in To and From header. */ /* Port in request URI. */ uri = (pjsip_sip_uri*) pjsip_uri_get_uri(msg->line.req.uri); if (uri->port != 5061) { PJ_LOG(3,(THIS_FILE, " error: port not present in request URI")); pjsip_tx_data_dec_ref(tdata); return -260; } /* other_param in request_uri */ param = pjsip_param_find(&uri->other_param, &pname); if (param == NULL || pj_strcmp2(¶m->value, "param 1") != 0) { PJ_LOG(3,(THIS_FILE, " error: x-param not present in request URI")); pjsip_tx_data_dec_ref(tdata); return -261; } /* header param in request uri. */ if (!pj_list_empty(&uri->header_param)) { PJ_LOG(3,(THIS_FILE, " error: hparam in request URI")); pjsip_tx_data_dec_ref(tdata); return -262; } /* Port in From header. */ from_hdr = (pjsip_from_hdr*) pjsip_msg_find_hdr(msg, PJSIP_H_FROM, NULL); uri = (pjsip_sip_uri*) pjsip_uri_get_uri(from_hdr->uri); if (uri->port != 0) { PJ_LOG(3,(THIS_FILE, " error: port most not exist in From header")); pjsip_tx_data_dec_ref(tdata); return -270; } /* other_param in From header */ param = pjsip_param_find(&uri->other_param, &pname); if (param == NULL || pj_strcmp2(¶m->value, "param 1") != 0) { PJ_LOG(3,(THIS_FILE, " error: x-param not present in From header")); pjsip_tx_data_dec_ref(tdata); return -271; } /* header param in From header. */ if (!pj_list_empty(&uri->header_param)) { PJ_LOG(3,(THIS_FILE, " error: hparam in From header")); pjsip_tx_data_dec_ref(tdata); return -272; } /* Port in To header. */ to_hdr = (pjsip_to_hdr*) pjsip_msg_find_hdr(msg, PJSIP_H_TO, NULL); uri = (pjsip_sip_uri*) pjsip_uri_get_uri(to_hdr->uri); if (uri->port != 0) { PJ_LOG(3,(THIS_FILE, " error: port most not exist in To header")); pjsip_tx_data_dec_ref(tdata); return -280; } /* other_param in To header */ param = pjsip_param_find(&uri->other_param, &pname); if (param == NULL || pj_strcmp2(¶m->value, "param 1") != 0) { PJ_LOG(3,(THIS_FILE, " error: x-param not present in To header")); pjsip_tx_data_dec_ref(tdata); return -281; } /* header param in From header. */ if (!pj_list_empty(&uri->header_param)) { PJ_LOG(3,(THIS_FILE, " error: hparam in To header")); pjsip_tx_data_dec_ref(tdata); return -282; } /* Port in Contact header. */ contact_hdr = (pjsip_contact_hdr*) pjsip_msg_find_hdr(msg, PJSIP_H_CONTACT, NULL); uri = (pjsip_sip_uri*) pjsip_uri_get_uri(contact_hdr->uri); if (uri->port != 5061) { PJ_LOG(3,(THIS_FILE, " error: port not present in Contact header")); pjsip_tx_data_dec_ref(tdata); return -290; } /* other_param in Contact header */ param = pjsip_param_find(&uri->other_param, &pname); if (param == NULL || pj_strcmp2(¶m->value, "param 1") != 0) { PJ_LOG(3,(THIS_FILE, " error: x-param not present in Contact header")); pjsip_tx_data_dec_ref(tdata); return -291; } /* header param in Contact header. */ if (pj_list_empty(&uri->header_param)) { PJ_LOG(3,(THIS_FILE, " error: hparam is missing in Contact header")); pjsip_tx_data_dec_ref(tdata); return -292; } /* Check for X-Hdr-1 */ param = pjsip_param_find(&uri->header_param, &hname); if (param == NULL || pj_strcmp2(¶m->value, "Header 1")!=0) { PJ_LOG(3,(THIS_FILE, " error: hparam is missing in Contact header")); pjsip_tx_data_dec_ref(tdata); return -293; } /* Check for X-Empty-Hdr */ param = pjsip_param_find(&uri->header_param, &hemptyname); if (param == NULL || pj_strcmp2(¶m->value, "")!=0) { PJ_LOG(3,(THIS_FILE, " error: hparam is missing in Contact header")); pjsip_tx_data_dec_ref(tdata); return -294; } /* Check that headers are present in the request. */ hdr = (pjsip_generic_string_hdr*) pjsip_msg_find_hdr_by_name(msg, &hname, NULL); if (hdr == NULL || pj_strcmp2(&hdr->hvalue, "Header 1")!=0) { PJ_LOG(3,(THIS_FILE, " error: header X-Hdr-1 not created")); pjsip_tx_data_dec_ref(tdata); return -300; } hdr = (pjsip_generic_string_hdr*) pjsip_msg_find_hdr_by_name(msg, &hemptyname, NULL); if (hdr == NULL || pj_strcmp2(¶m->value, "")!=0) { PJ_LOG(3,(THIS_FILE, " error: header X-Empty-Hdr not created")); pjsip_tx_data_dec_ref(tdata); return -330; } pjsip_tx_data_dec_ref(tdata); return 0; }
/* * This tests various core message creation functions. */ static int core_txdata_test(void) { pj_status_t status; pj_str_t target, from, to, contact, body; pjsip_rx_data dummy_rdata; pjsip_tx_data *invite, *invite2, *cancel, *response, *ack; PJ_LOG(3,(THIS_FILE, " core transmit data test")); /* Create INVITE request. */ target = pj_str("tel:+1"); from = pj_str("tel:+0"); to = pj_str("tel:+1"); contact = pj_str("Bob <sip:[email protected];user=phone>"); body = pj_str("Hello world!"); status = pjsip_endpt_create_request( endpt, &pjsip_invite_method, &target, &from, &to, &contact, NULL, 10, &body, &invite); if (status != PJ_SUCCESS) { app_perror(" error: unable to create request", status); return -10; } /* Buffer must be invalid. */ if (pjsip_tx_data_is_valid(invite) != 0) { PJ_LOG(3,(THIS_FILE, " error: buffer must be invalid")); return -14; } /* Reference counter must be set to 1. */ if (pj_atomic_get(invite->ref_cnt) != 1) { PJ_LOG(3,(THIS_FILE, " error: invalid reference counter")); return -15; } /* Check message type. */ if (invite->msg->type != PJSIP_REQUEST_MSG) return -16; /* Check method. */ if (invite->msg->line.req.method.id != PJSIP_INVITE_METHOD) return -17; /* Check that mandatory headers are present. */ if (HFIND(invite->msg, from, FROM) == 0) return -20; if (HFIND(invite->msg, to, TO) == 0) return -21; if (HFIND(invite->msg, contact, CONTACT) == 0) return -22; if (HFIND(invite->msg, cid, CALL_ID) == 0) return -23; if (HFIND(invite->msg, cseq, CSEQ) == 0) return -24; do { pjsip_via_hdr *via = HFIND(invite->msg, via, VIA); if (via == NULL) return -25; /* Branch param must be empty. */ if (via->branch_param.slen != 0) return -26; } while (0); if (invite->msg->body == NULL) return -28; /* Create another INVITE request from first request. */ status = pjsip_endpt_create_request_from_hdr( endpt, &pjsip_invite_method, invite->msg->line.req.uri, HFIND(invite->msg,from,FROM), HFIND(invite->msg,to,TO), HFIND(invite->msg,contact,CONTACT), HFIND(invite->msg,cid,CALL_ID), 10, &body, &invite2); if (status != PJ_SUCCESS) { app_perror(" error: create second request failed", status); return -30; } /* Buffer must be invalid. */ if (pjsip_tx_data_is_valid(invite2) != 0) { PJ_LOG(3,(THIS_FILE, " error: buffer must be invalid")); return -34; } /* Reference counter must be set to 1. */ if (pj_atomic_get(invite2->ref_cnt) != 1) { PJ_LOG(3,(THIS_FILE, " error: invalid reference counter")); return -35; } /* Check message type. */ if (invite2->msg->type != PJSIP_REQUEST_MSG) return -36; /* Check method. */ if (invite2->msg->line.req.method.id != PJSIP_INVITE_METHOD) return -37; /* Check that mandatory headers are again present. */ if (HFIND(invite2->msg, from, FROM) == 0) return -40; if (HFIND(invite2->msg, to, TO) == 0) return -41; if (HFIND(invite2->msg, contact, CONTACT) == 0) return -42; if (HFIND(invite2->msg, cid, CALL_ID) == 0) return -43; if (HFIND(invite2->msg, cseq, CSEQ) == 0) return -44; if (HFIND(invite2->msg, via, VIA) == 0) return -45; /* if (HFIND(invite2->msg, ctype, CONTENT_TYPE) == 0) return -46; if (HFIND(invite2->msg, clen, CONTENT_LENGTH) == 0) return -47; */ if (invite2->msg->body == NULL) return -48; /* Done checking invite2. We can delete this. */ if (pjsip_tx_data_dec_ref(invite2) != PJSIP_EBUFDESTROYED) { PJ_LOG(3,(THIS_FILE, " error: request buffer not destroyed!")); return -49; } /* Initialize dummy rdata (to simulate receiving a request) * We should never do this in real application, as there are many * many more fields need to be initialized!! */ dummy_rdata.msg_info.cid = HFIND(invite->msg, cid, CALL_ID); dummy_rdata.msg_info.clen = NULL; dummy_rdata.msg_info.cseq = HFIND(invite->msg, cseq, CSEQ); dummy_rdata.msg_info.ctype = NULL; dummy_rdata.msg_info.from = HFIND(invite->msg, from, FROM); dummy_rdata.msg_info.max_fwd = NULL; dummy_rdata.msg_info.msg = invite->msg; dummy_rdata.msg_info.record_route = NULL; dummy_rdata.msg_info.require = NULL; dummy_rdata.msg_info.route = NULL; dummy_rdata.msg_info.to = HFIND(invite->msg, to, TO); dummy_rdata.msg_info.via = HFIND(invite->msg, via, VIA); /* Create a response message for the request. */ status = pjsip_endpt_create_response( endpt, &dummy_rdata, 301, NULL, &response); if (status != PJ_SUCCESS) { app_perror(" error: unable to create response", status); return -50; } /* Buffer must be invalid. */ if (pjsip_tx_data_is_valid(response) != 0) { PJ_LOG(3,(THIS_FILE, " error: buffer must be invalid")); return -54; } /* Check reference counter. */ if (pj_atomic_get(response->ref_cnt) != 1) { PJ_LOG(3,(THIS_FILE, " error: invalid ref count in response")); return -55; } /* Check message type. */ if (response->msg->type != PJSIP_RESPONSE_MSG) return -56; /* Check correct status is set. */ if (response->msg->line.status.code != 301) return -57; /* Check that mandatory headers are again present. */ if (HFIND(response->msg, from, FROM) == 0) return -60; if (HFIND(response->msg, to, TO) == 0) return -61; /* if (HFIND(response->msg, contact, CONTACT) == 0) return -62; */ if (HFIND(response->msg, cid, CALL_ID) == 0) return -63; if (HFIND(response->msg, cseq, CSEQ) == 0) return -64; if (HFIND(response->msg, via, VIA) == 0) return -65; /* This response message will be used later when creating ACK */ /* Create CANCEL request for the original request. */ status = pjsip_endpt_create_cancel( endpt, invite, &cancel); if (status != PJ_SUCCESS) { app_perror(" error: unable to create CANCEL request", status); return -80; } /* Buffer must be invalid. */ if (pjsip_tx_data_is_valid(cancel) != 0) { PJ_LOG(3,(THIS_FILE, " error: buffer must be invalid")); return -84; } /* Check reference counter. */ if (pj_atomic_get(cancel->ref_cnt) != 1) { PJ_LOG(3,(THIS_FILE, " error: invalid ref count in CANCEL request")); return -85; } /* Check message type. */ if (cancel->msg->type != PJSIP_REQUEST_MSG) return -86; /* Check method. */ if (cancel->msg->line.req.method.id != PJSIP_CANCEL_METHOD) return -87; /* Check that mandatory headers are again present. */ if (HFIND(cancel->msg, from, FROM) == 0) return -90; if (HFIND(cancel->msg, to, TO) == 0) return -91; /* if (HFIND(cancel->msg, contact, CONTACT) == 0) return -92; */ if (HFIND(cancel->msg, cid, CALL_ID) == 0) return -93; if (HFIND(cancel->msg, cseq, CSEQ) == 0) return -94; if (HFIND(cancel->msg, via, VIA) == 0) return -95; /* Done checking CANCEL request. */ if (pjsip_tx_data_dec_ref(cancel) != PJSIP_EBUFDESTROYED) { PJ_LOG(3,(THIS_FILE, " error: response buffer not destroyed!")); return -99; } /* Modify dummy_rdata to simulate receiving response. */ pj_bzero(&dummy_rdata, sizeof(dummy_rdata)); dummy_rdata.msg_info.msg = response->msg; dummy_rdata.msg_info.to = HFIND(response->msg, to, TO); /* Create ACK request */ status = pjsip_endpt_create_ack( endpt, invite, &dummy_rdata, &ack ); if (status != PJ_SUCCESS) { PJ_LOG(3,(THIS_FILE, " error: unable to create ACK")); return -100; } /* Buffer must be invalid. */ if (pjsip_tx_data_is_valid(ack) != 0) { PJ_LOG(3,(THIS_FILE, " error: buffer must be invalid")); return -104; } /* Check reference counter. */ if (pj_atomic_get(ack->ref_cnt) != 1) { PJ_LOG(3,(THIS_FILE, " error: invalid ref count in ACK request")); return -105; } /* Check message type. */ if (ack->msg->type != PJSIP_REQUEST_MSG) return -106; /* Check method. */ if (ack->msg->line.req.method.id != PJSIP_ACK_METHOD) return -107; /* Check Request-URI is present. */ if (ack->msg->line.req.uri == NULL) return -108; /* Check that mandatory headers are again present. */ if (HFIND(ack->msg, from, FROM) == 0) return -110; if (HFIND(ack->msg, to, TO) == 0) return -111; if (HFIND(ack->msg, cid, CALL_ID) == 0) return -112; if (HFIND(ack->msg, cseq, CSEQ) == 0) return -113; if (HFIND(ack->msg, via, VIA) == 0) return -114; if (ack->msg->body != NULL) return -115; /* Done checking invite message. */ if (pjsip_tx_data_dec_ref(invite) != PJSIP_EBUFDESTROYED) { PJ_LOG(3,(THIS_FILE, " error: response buffer not destroyed!")); return -120; } /* Done checking response message. */ if (pjsip_tx_data_dec_ref(response) != PJSIP_EBUFDESTROYED) { PJ_LOG(3,(THIS_FILE, " error: response buffer not destroyed!")); return -130; } /* Done checking ack message. */ if (pjsip_tx_data_dec_ref(ack) != PJSIP_EBUFDESTROYED) { PJ_LOG(3,(THIS_FILE, " error: response buffer not destroyed!")); return -140; } /* Done. */ return 0; }
static int gcc_test() { char msgbuf[512]; pj_str_t target = pj_str("sip:alice@wonderland:5061;x-param=param%201" "?X-Hdr-1=Header%201" "&X-Empty-Hdr="); pjsip_tx_data *tdata; pjsip_parser_err_report err_list; pjsip_msg *msg; int len; pj_status_t status; PJ_LOG(3,(THIS_FILE, " header param in URI to create request")); /* Create request with header param in target URI. */ status = pjsip_endpt_create_request(endpt, &pjsip_invite_method, &target, &target, &target, &target, NULL, -1, NULL, &tdata); if (status != 0) { app_perror(" error: Unable to create request", status); return -200; } /* Print and parse the request. * We'll check that header params are not present in */ len = pjsip_msg_print(tdata->msg, msgbuf, sizeof(msgbuf)); if (len < 1) { PJ_LOG(3,(THIS_FILE, " error: printing message")); pjsip_tx_data_dec_ref(tdata); return -250; } msgbuf[len] = '\0'; PJ_LOG(5,(THIS_FILE, "%d bytes request created:--begin-msg--\n" "%s\n" "--end-msg--", len, msgbuf)); /* Now parse the message. */ pj_list_init(&err_list); msg = pjsip_parse_msg( tdata->pool, msgbuf, len, &err_list); if (msg == NULL) { pjsip_parser_err_report *e; PJ_LOG(3,(THIS_FILE, " error: parsing message message")); e = err_list.next; while (e != &err_list) { PJ_LOG(3,(THIS_FILE, " %s in line %d col %d hname=%.*s", pj_exception_id_name(e->except_code), e->line, e->col+1, (int)e->hname.slen, e->hname.ptr)); e = e->next; } pjsip_tx_data_dec_ref(tdata); return -255; } pjsip_tx_data_dec_ref(tdata); return 0; }
/* * Create UAC subscription. */ PJ_DEF(pjsip_event_sub*) pjsip_event_sub_create( pjsip_endpoint *endpt, const pj_str_t *from, const pj_str_t *to, const pj_str_t *event, int expires, int accept_cnt, const pj_str_t accept[], void *user_data, const pjsip_event_sub_cb *cb) { pjsip_tx_data *tdata; pj_pool_t *pool; const pjsip_hdr *hdr; pjsip_event_sub *sub; PJ_USE_EXCEPTION; PJ_LOG(5,(THIS_FILE, "Creating event subscription %.*s to %.*s", event->slen, event->ptr, to->slen, to->ptr)); /* Create pool for the event subscription. */ pool = pjsip_endpt_create_pool(endpt, "esub", SUB_POOL_SIZE, SUB_POOL_INC); if (!pool) { return NULL; } /* Init subscription. */ sub = pj_pool_calloc(pool, 1, sizeof(*sub)); sub->pool = pool; sub->endpt = endpt; sub->role = PJSIP_ROLE_UAC; sub->state = PJSIP_EVENT_SUB_STATE_PENDING; sub->state_str = state[sub->state]; sub->user_data = user_data; sub->timer.id = 0; sub->default_interval = expires; pj_memcpy(&sub->cb, cb, sizeof(*cb)); pj_list_init(&sub->auth_sess); pj_list_init(&sub->route_set); sub->mutex = pj_mutex_create(pool, "esub", PJ_MUTEX_RECURSE); if (!sub->mutex) { pjsip_endpt_destroy_pool(endpt, pool); return NULL; } /* The easiest way to parse the parameters is to create a dummy request! */ tdata = pjsip_endpt_create_request( endpt, &SUBSCRIBE, to, from, to, from, NULL, -1, NULL); if (!tdata) { pj_mutex_destroy(sub->mutex); pjsip_endpt_destroy_pool(endpt, pool); return NULL; } /* * Duplicate headers in the request to our structure. */ PJ_TRY { int i; /* From */ hdr = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_FROM, NULL); pj_assert(hdr != NULL); sub->from = pjsip_hdr_clone(pool, hdr); /* To */ hdr = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_TO, NULL); pj_assert(hdr != NULL); sub->to = pjsip_hdr_clone(pool, hdr); /* Contact. */ sub->contact = pjsip_contact_hdr_create(pool); sub->contact->uri = sub->from->uri; /* Call-ID */ hdr = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_CALL_ID, NULL); pj_assert(hdr != NULL); sub->call_id = pjsip_hdr_clone(pool, hdr); /* CSeq */ sub->cseq = pj_rand() % 0xFFFF; /* Event. */ sub->event = pjsip_event_hdr_create(sub->pool); pj_strdup(pool, &sub->event->event_type, event); /* Expires. */ sub->uac_expires = pjsip_expires_hdr_create(pool); sub->uac_expires->ivalue = expires; /* Accept. */ sub->local_accept = pjsip_accept_hdr_create(pool); for (i=0; i<accept_cnt && i < PJSIP_MAX_ACCEPT_COUNT; ++i) { sub->local_accept->count++; pj_strdup(sub->pool, &sub->local_accept->values[i], &accept[i]); } /* Register to hash table. */ create_subscriber_key( &sub->key, pool, PJSIP_ROLE_UAC, &sub->call_id->id, &sub->from->tag); pj_mutex_lock( mgr.mutex ); pj_hash_set( pool, mgr.ht, sub->key.ptr, sub->key.slen, sub); pj_mutex_unlock( mgr.mutex ); } PJ_DEFAULT { PJ_LOG(4,(THIS_FILE, "event_sub%p (%s): caught exception %d during init", sub, state[sub->state].ptr, PJ_GET_EXCEPTION())); pjsip_tx_data_dec_ref(tdata); pj_mutex_destroy(sub->mutex); pjsip_endpt_destroy_pool(endpt, sub->pool); return NULL; } PJ_END; /* All set, delete temporary transmit data as we don't need it. */ pjsip_tx_data_dec_ref(tdata); PJ_LOG(4,(THIS_FILE, "event_sub%p (%s): client created, target=%.*s, event=%.*s", sub, state[sub->state].ptr, to->slen, to->ptr, event->slen, event->ptr)); return sub; }
/* * Send typing indication outside dialog. */ PJ_DEF(pj_status_t) pjsua_im_typing( pjsua_acc_id acc_id, const pj_str_t *to, pj_bool_t is_typing, const pjsua_msg_data *msg_data) { pjsua_im_data *im_data; pjsip_tx_data *tdata; pjsua_acc *acc; pj_status_t status; acc = &pjsua_var.acc[acc_id]; /* Create request. */ status = pjsip_endpt_create_request( pjsua_var.endpt, &pjsip_message_method, to, &acc->cfg.id, to, NULL, NULL, -1, NULL, &tdata); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to create request", status); return status; } /* If account is locked to specific transport, then set transport to * the request. */ if (acc->cfg.transport_id != PJSUA_INVALID_ID) { pjsip_tpselector tp_sel; pjsua_init_tpselector(acc->cfg.transport_id, &tp_sel); pjsip_tx_data_set_transport(tdata, &tp_sel); } /* Add accept header. */ pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*)pjsua_im_create_accept(tdata->pool)); /* Create suitable Contact header unless a Contact header has been * set in the account. */ /* Ticket #1632: According to RFC 3428: * MESSAGE requests do not initiate dialogs. * User Agents MUST NOT insert Contact header fields into MESSAGE requests */ /* if (acc->contact.slen) { contact = acc->contact; } else { status = pjsua_acc_create_uac_contact(tdata->pool, &contact, acc_id, to); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to generate Contact header", status); pjsip_tx_data_dec_ref(tdata); return status; } } pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*) pjsip_generic_string_hdr_create(tdata->pool, &STR_CONTACT, &contact)); */ /* Create "application/im-iscomposing+xml" msg body. */ tdata->msg->body = pjsip_iscomposing_create_body( tdata->pool, is_typing, NULL, NULL, -1); /* Add additional headers etc. */ pjsua_process_msg_data(tdata, msg_data); /* Add route set */ pjsua_set_msg_route_set(tdata, &acc->route_set); /* If via_addr is set, use this address for the Via header. */ if (acc->cfg.allow_via_rewrite && acc->via_addr.host.slen > 0) { tdata->via_addr = acc->via_addr; tdata->via_tp = acc->via_tp; } /* Create data to reauthenticate */ im_data = PJ_POOL_ZALLOC_T(tdata->pool, pjsua_im_data); im_data->acc_id = acc_id; /* Send request (statefully) */ status = pjsip_endpt_send_request( pjsua_var.endpt, tdata, -1, im_data, &typing_callback); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to send request", status); return status; } return PJ_SUCCESS; }
/* Test that we receive loopback message. */ int transport_send_recv_test( pjsip_transport_type_e tp_type, pjsip_transport *ref_tp, char *target_url, int *p_usec_rtt) { pj_bool_t msg_log_enabled; pj_status_t status; pj_str_t target, from, to, contact, call_id, body; pjsip_method method; pjsip_tx_data *tdata; pj_time_val timeout; PJ_UNUSED_ARG(tp_type); PJ_UNUSED_ARG(ref_tp); PJ_LOG(3,(THIS_FILE, " single message round-trip test...")); /* Register out test module to receive the message (if necessary). */ if (my_module.id == -1) { status = pjsip_endpt_register_module( endpt, &my_module ); if (status != PJ_SUCCESS) { app_perror(" error: unable to register module", status); return -500; } } /* Disable message logging. */ msg_log_enabled = msg_logger_set_enabled(0); /* Create a request message. */ target = pj_str(target_url); from = pj_str(FROM_HDR); to = pj_str(target_url); contact = pj_str(CONTACT_HDR); call_id = pj_str(CALL_ID_HDR); body = pj_str(BODY); pjsip_method_set(&method, PJSIP_OPTIONS_METHOD); status = pjsip_endpt_create_request( endpt, &method, &target, &from, &to, &contact, &call_id, CSEQ_VALUE, &body, &tdata ); if (status != PJ_SUCCESS) { app_perror(" error: unable to create request", status); return -510; } /* Reset statuses */ send_status = recv_status = NO_STATUS; /* Start time. */ pj_get_timestamp(&my_send_time); /* Send the message (statelessly). */ PJ_LOG(5,(THIS_FILE, "Sending request to %.*s", (int)target.slen, target.ptr)); status = pjsip_endpt_send_request_stateless( endpt, tdata, NULL, &send_msg_callback); if (status != PJ_SUCCESS) { /* Immediate error! */ pjsip_tx_data_dec_ref(tdata); send_status = status; } /* Set the timeout (2 seconds from now) */ pj_gettimeofday(&timeout); timeout.sec += 2; /* Loop handling events until we get status */ do { pj_time_val now; pj_time_val poll_interval = { 0, 10 }; pj_gettimeofday(&now); if (PJ_TIME_VAL_GTE(now, timeout)) { PJ_LOG(3,(THIS_FILE, " error: timeout in send/recv test")); status = -540; goto on_return; } if (send_status!=NO_STATUS && send_status!=PJ_SUCCESS) { app_perror(" error sending message", send_status); status = -550; goto on_return; } if (recv_status!=NO_STATUS && recv_status!=PJ_SUCCESS) { app_perror(" error receiving message", recv_status); status = -560; goto on_return; } if (send_status!=NO_STATUS && recv_status!=NO_STATUS) { /* Success! */ break; } pjsip_endpt_handle_events(endpt, &poll_interval); } while (1); if (status == PJ_SUCCESS) { unsigned usec_rt; usec_rt = pj_elapsed_usec(&my_send_time, &my_recv_time); PJ_LOG(3,(THIS_FILE, " round-trip = %d usec", usec_rt)); *p_usec_rtt = usec_rt; } /* Restore message logging. */ msg_logger_set_enabled(msg_log_enabled); status = PJ_SUCCESS; on_return: return status; }
/* * create response benchmark */ static int create_response_bench(pj_timestamp *p_elapsed) { enum { COUNT = 100 }; unsigned i, j; pjsip_via_hdr *via; pjsip_rx_data rdata; pjsip_tx_data *request; pjsip_tx_data *tdata[COUNT]; pj_timestamp t1, t2, elapsed; pj_status_t status; /* Create the request first. */ pj_str_t str_target = pj_str("sip:[email protected]"); pj_str_t str_from = pj_str("\"Local User\" <sip:[email protected]>"); pj_str_t str_to = pj_str("\"Remote User\" <sip:[email protected]>"); pj_str_t str_contact = str_from; status = pjsip_endpt_create_request(endpt, &pjsip_invite_method, &str_target, &str_from, &str_to, &str_contact, NULL, -1, NULL, &request); if (status != PJ_SUCCESS) { app_perror(" error: unable to create request", status); return status; } /* Create several Via headers */ via = pjsip_via_hdr_create(request->pool); via->sent_by.host = pj_str("192.168.0.7"); via->sent_by.port = 5061; via->transport = pj_str("udp"); via->rport_param = 0; via->branch_param = pj_str("012345678901234567890123456789"); via->recvd_param = pj_str("192.168.0.7"); pjsip_msg_insert_first_hdr(request->msg, (pjsip_hdr*) pjsip_hdr_clone(request->pool, via)); pjsip_msg_insert_first_hdr(request->msg, (pjsip_hdr*) pjsip_hdr_clone(request->pool, via)); pjsip_msg_insert_first_hdr(request->msg, (pjsip_hdr*)via); /* Create "dummy" rdata from the tdata */ pj_bzero(&rdata, sizeof(pjsip_rx_data)); rdata.tp_info.pool = request->pool; rdata.msg_info.msg = request->msg; rdata.msg_info.from = (pjsip_from_hdr*) pjsip_msg_find_hdr(request->msg, PJSIP_H_FROM, NULL); rdata.msg_info.to = (pjsip_to_hdr*) pjsip_msg_find_hdr(request->msg, PJSIP_H_TO, NULL); rdata.msg_info.cseq = (pjsip_cseq_hdr*) pjsip_msg_find_hdr(request->msg, PJSIP_H_CSEQ, NULL); rdata.msg_info.cid = (pjsip_cid_hdr*) pjsip_msg_find_hdr(request->msg, PJSIP_H_FROM, NULL); rdata.msg_info.via = via; /* * Now benchmark create_response */ elapsed.u64 = 0; for (i=0; i<LOOP; i+=COUNT) { pj_bzero(tdata, sizeof(tdata)); pj_get_timestamp(&t1); for (j=0; j<COUNT; ++j) { status = pjsip_endpt_create_response(endpt, &rdata, 200, NULL, &tdata[j]); if (status != PJ_SUCCESS) { app_perror(" error: unable to create request", status); goto on_error; } } pj_get_timestamp(&t2); pj_sub_timestamp(&t2, &t1); pj_add_timestamp(&elapsed, &t2); for (j=0; j<COUNT; ++j) pjsip_tx_data_dec_ref(tdata[j]); } p_elapsed->u64 = elapsed.u64; pjsip_tx_data_dec_ref(request); return PJ_SUCCESS; on_error: for (i=0; i<COUNT; ++i) { if (tdata[i]) pjsip_tx_data_dec_ref(tdata[i]); } return -400; }
/* * The generic test framework, used by most of the tests. */ static int perform_test( char *target_uri, char *from_uri, char *branch_param, int test_time, const pjsip_method *method, int request_cnt, int request_interval_msec, int expecting_timeout) { pjsip_tx_data *tdata; pj_str_t target, from; pjsip_via_hdr *via; pj_time_val timeout, next_send; int sent_cnt; pj_status_t status; PJ_LOG(3,(THIS_FILE, " please standby, this will take at most %d seconds..", test_time)); /* Reset test. */ recv_count = 0; test_complete = 0; tsx_key.slen = 0; /* Init headers. */ target = pj_str(target_uri); from = pj_str(from_uri); /* Create request. */ status = pjsip_endpt_create_request( endpt, method, &target, &from, &target, NULL, NULL, -1, NULL, &tdata); if (status != PJ_SUCCESS) { app_perror(" Error: unable to create request", status); return -10; } /* Set the branch param for test 1. */ via = (pjsip_via_hdr*) pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL); via->branch_param = pj_str(branch_param); /* Schedule first send. */ sent_cnt = 0; pj_gettimeofday(&next_send); pj_time_val_normalize(&next_send); /* Set test completion time. */ pj_gettimeofday(&timeout); timeout.sec += test_time; /* Wait until test complete. */ while (!test_complete) { pj_time_val now, poll_delay = {0, 10}; pjsip_endpt_handle_events(endpt, &poll_delay); pj_gettimeofday(&now); if (sent_cnt < request_cnt && PJ_TIME_VAL_GTE(now, next_send)) { /* Add additional reference to tdata to prevent transaction from * deleting it. */ pjsip_tx_data_add_ref(tdata); /* (Re)Send the request. */ PJ_LOG(4,(THIS_FILE, " (re)sending request %d", sent_cnt)); status = pjsip_endpt_send_request_stateless(endpt, tdata, 0, 0); if (status != PJ_SUCCESS) { app_perror(" Error: unable to send request", status); pjsip_tx_data_dec_ref(tdata); return -20; } /* Schedule next send, if any. */ sent_cnt++; if (sent_cnt < request_cnt) { pj_gettimeofday(&next_send); next_send.msec += request_interval_msec; pj_time_val_normalize(&next_send); } } if (now.sec > timeout.sec) { if (!expecting_timeout) PJ_LOG(3,(THIS_FILE, " Error: test has timed out")); pjsip_tx_data_dec_ref(tdata); return TEST_TIMEOUT_ERROR; } } if (test_complete < 0) { pjsip_transaction *tsx; tsx = pjsip_tsx_layer_find_tsx(&tsx_key, PJ_TRUE); if (tsx) { pjsip_tsx_terminate(tsx, PJSIP_SC_REQUEST_TERMINATED); pj_mutex_unlock(tsx->mutex); flush_events(1000); } pjsip_tx_data_dec_ref(tdata); return test_complete; } /* Allow transaction to destroy itself */ flush_events(500); /* Make sure transaction has been destroyed. */ if (pjsip_tsx_layer_find_tsx(&tsx_key, PJ_FALSE) != NULL) { PJ_LOG(3,(THIS_FILE, " Error: transaction has not been destroyed")); pjsip_tx_data_dec_ref(tdata); return -40; } /* Check tdata reference counter. */ if (pj_atomic_get(tdata->ref_cnt) != 1) { PJ_LOG(3,(THIS_FILE, " Error: tdata reference counter is %d", pj_atomic_get(tdata->ref_cnt))); pjsip_tx_data_dec_ref(tdata); return -50; } /* Destroy txdata */ pjsip_tx_data_dec_ref(tdata); return PJ_SUCCESS; }
/* Cualquier REQUEST SIP pasa por aquí Aquí es dónde hacemos la magia negra de coger la header, desencapsular y tal */ static pj_bool_t on_rx_request( pjsip_rx_data *rdata ) { if ( (rdata->msg_info.msg->line.req.method.id != PJSIP_OPTIONS_METHOD)) { debug(2,"Received no OPTIONS Request, reply 500 sent"); pj_str_t reason = pj_str("Go home"); pjsip_endpt_respond_stateless( g_endpt, rdata,500, &reason,NULL, NULL); return PJ_TRUE; } debug(1,"Received INFO/OPTIONS Request, lets parse it"); pjsip_cid_hdr *headerMultivpn; pj_str_t hdrname = { .ptr = "Multivpn", .slen = 8 }; headerMultivpn = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg ,&hdrname,NULL); if (!headerMultivpn) { debug(2,"No multivpn header found! Nothing to parse"); pj_str_t reason = pj_str("Go home and sleep"); pjsip_endpt_respond_stateless( g_endpt, rdata,500, &reason,NULL, NULL); return PJ_TRUE; } else debug(1,"Header multivpn found ! Lets play with it"); char payload[2048]; memset(payload, 0, sizeof(payload)); strncpy(payload, headerMultivpn->id.ptr, headerMultivpn->id.slen); debug(1,"Received payload is: %s with len %d",payload,strlen(payload)); unsigned char *decodedpayload; size_t lenDecoded; decodedpayload = base64_decode(payload,strlen(payload),&lenDecoded); debug(1,"Decoded %d bytes",lenDecoded); debug(1,"Decoded payload with len %d and value %.3s",lenDecoded, decodedpayload); debug(1,"Now sending to PIPE for TUNDRIVER !"); int nBytes = lenDecoded; nBytes=write(global_v.pipe_from_plugin[1],decodedpayload,nBytes); if (nBytes<=0) debug(3,"SIP Plugin: Failed Writing to Pipe"); else debug(3,"SIP Plugin: Write %d bytes to pipe",nBytes); // Tras el parsing, contestamos: pj_str_t reason = pj_str("Traffic Accepted"); pjsip_endpt_respond_stateless( g_endpt, rdata,666, &reason,NULL, NULL); debug(1,"End process of request"); return PJ_TRUE; } int sip_envia_datos(unsigned char *datos,int longitud) { debug(1,"Starting function to send %d bytes", longitud); debug(1,"Now base64 encoding %d bytes",longitud); int longitudEncodeado; char * payload; payload = base64_encode(datos,longitud,(size_t *)&longitudEncodeado); pj_status_t status; pjsip_tx_data *tdata; pj_str_t target = pj_str(global_v.sip_remoteuri); pj_str_t from = pj_str(global_v.sip_fromuri); status = pjsip_endpt_create_request( g_endpt, &pjsip_options_method, &target, &from, &target, NULL, NULL, -1, NULL, &tdata ); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); pjsip_transaction *tsx; status = pjsip_tsx_create_uac(NULL, tdata, &tsx); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); // Create Custom header pj_str_t hdr_name = { .ptr = "Multivpn", .slen = 8 }; pj_str_t hdr_value = { .ptr = payload, .slen = longitudEncodeado }; pjsip_generic_string_hdr *multivpn_hdr = pjsip_generic_string_hdr_create( tdata->pool, &hdr_name, &hdr_value ); // Add to message pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *) multivpn_hdr); status = pjsip_tsx_send_msg(tsx, NULL); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); return 0; } void* sip_loop_sip_events(void *none) { for (;!g_complete;) { //pj_time_val timeout = {0, 10}; //pjsip_endpt_handle_events(g_endpt, &timeout); pjsip_endpt_handle_events(g_endpt, NULL); debug(1,"Looping SIP"); } return NULL; } void sip_loop_tun_events() { unsigned char buffer[BLOCK_SIZE]; int nBytes; fd_set setReading; int maxfd; debug(2,"SIP Plugin: Starting LOOPING for events from TUN"); maxfd = global_v.pipe_to_plugin[0]+1; while (1) { FD_SET(global_v.pipe_to_plugin[0],&setReading); debug(3,"SIP Plugin: Blocking now, until data from tundriver is received"); select(maxfd,&setReading,NULL,NULL,NULL); debug(1,"SIP PLUGIN: Select unlocked !"); if (FD_ISSET(global_v.pipe_to_plugin[0],&setReading)) { // Message is from pipe nBytes=read(global_v.pipe_to_plugin[0],buffer, BLOCK_SIZE-1); if (nBytes<=0) debug(3,"SIP Plugin: failed reading From Pipe"); else { debug(3,"SIP Plugin: Read %d bytes from pipe",nBytes); sip_envia_datos(buffer,nBytes); } } } }
/* * Send typing indication outside dialog. */ PJ_DEF(pj_status_t) pjsua_im_typing( pjsua_acc_id acc_id, const pj_str_t *to, pj_bool_t is_typing, const pjsua_msg_data *msg_data) { const pj_str_t STR_CONTACT = { "Contact", 7 }; pjsua_im_data *im_data; pjsip_tx_data *tdata; pj_str_t contact; pj_status_t status; /* Create request. */ status = pjsip_endpt_create_request( pjsua_var.endpt, &pjsip_message_method, to, &pjsua_var.acc[acc_id].cfg.id, to, NULL, NULL, -1, NULL, &tdata); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to create request", status); return status; } /* If account is locked to specific transport, then set transport to * the request. */ if (pjsua_var.acc[acc_id].cfg.transport_id != PJSUA_INVALID_ID) { pjsip_tpselector tp_sel; pjsua_init_tpselector(pjsua_var.acc[acc_id].cfg.transport_id, &tp_sel); pjsip_tx_data_set_transport(tdata, &tp_sel); } /* Add accept header. */ pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*)pjsua_im_create_accept(tdata->pool)); /* Add contact. */ status = pjsua_acc_create_uac_contact(tdata->pool, &contact, acc_id, to); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to generate Contact header", status); pjsip_tx_data_dec_ref(tdata); return status; } pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*) pjsip_generic_string_hdr_create(tdata->pool, &STR_CONTACT, &contact)); /* Create "application/im-iscomposing+xml" msg body. */ tdata->msg->body = pjsip_iscomposing_create_body( tdata->pool, is_typing, NULL, NULL, -1); /* Add additional headers etc. */ pjsua_process_msg_data(tdata, msg_data); /* Add route set */ pjsua_set_msg_route_set(tdata, &pjsua_var.acc[acc_id].route_set); /* Create data to reauthenticate */ im_data = PJ_POOL_ZALLOC_T(tdata->pool, pjsua_im_data); im_data->acc_id = acc_id; /* Send request (statefully) */ status = pjsip_endpt_send_request( pjsua_var.endpt, tdata, -1, im_data, &typing_callback); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to send request", status); return status; } return PJ_SUCCESS; }
/* * Send instant messaging outside dialog, using the specified account for * route set and authentication. */ PJ_DEF(pj_status_t) pjsua_im_send( pjsua_acc_id acc_id, const pj_str_t *to, const pj_str_t *mime_type, const pj_str_t *content, const pjsua_msg_data *msg_data, void *user_data) { pjsip_tx_data *tdata; const pj_str_t mime_text_plain = pj_str("text/plain"); const pj_str_t STR_CONTACT = { "Contact", 7 }; pjsip_media_type media_type; pjsua_im_data *im_data; pj_str_t contact; pj_status_t status; /* To and message body must be specified. */ PJ_ASSERT_RETURN(to && content, PJ_EINVAL); /* Create request. */ status = pjsip_endpt_create_request(pjsua_var.endpt, &pjsip_message_method, to, &pjsua_var.acc[acc_id].cfg.id, to, NULL, NULL, -1, NULL, &tdata); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to create request", status); return status; } /* If account is locked to specific transport, then set transport to * the request. */ if (pjsua_var.acc[acc_id].cfg.transport_id != PJSUA_INVALID_ID) { pjsip_tpselector tp_sel; pjsua_init_tpselector(pjsua_var.acc[acc_id].cfg.transport_id, &tp_sel); pjsip_tx_data_set_transport(tdata, &tp_sel); } /* Add accept header. */ pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*)pjsua_im_create_accept(tdata->pool)); /* Add contact. */ status = pjsua_acc_create_uac_contact(tdata->pool, &contact, acc_id, to); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to generate Contact header", status); pjsip_tx_data_dec_ref(tdata); return status; } pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*) pjsip_generic_string_hdr_create(tdata->pool, &STR_CONTACT, &contact)); /* Create IM data to keep message details and give it back to * application on the callback */ im_data = PJ_POOL_ZALLOC_T(tdata->pool, pjsua_im_data); im_data->acc_id = acc_id; im_data->call_id = PJSUA_INVALID_ID; pj_strdup_with_null(tdata->pool, &im_data->to, to); pj_strdup_with_null(tdata->pool, &im_data->body, content); im_data->user_data = user_data; /* Set default media type if none is specified */ if (mime_type == NULL) { mime_type = &mime_text_plain; } /* Parse MIME type */ pjsua_parse_media_type(tdata->pool, mime_type, &media_type); /* Add message body */ tdata->msg->body = pjsip_msg_body_create( tdata->pool, &media_type.type, &media_type.subtype, &im_data->body); if (tdata->msg->body == NULL) { pjsua_perror(THIS_FILE, "Unable to create msg body", PJ_ENOMEM); pjsip_tx_data_dec_ref(tdata); return PJ_ENOMEM; } /* Add additional headers etc. */ pjsua_process_msg_data(tdata, msg_data); /* Add route set */ pjsua_set_msg_route_set(tdata, &pjsua_var.acc[acc_id].route_set); /* Send request (statefully) */ status = pjsip_endpt_send_request( pjsua_var.endpt, tdata, -1, im_data, &im_callback); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to send request", status); return status; } return PJ_SUCCESS; }
/* * Send instant messaging outside dialog, using the specified account for * route set and authentication. */ PJ_DEF(pj_status_t) pjsua_im_send( pjsua_acc_id acc_id, const pj_str_t *to, const pj_str_t *mime_type, const pj_str_t *content, const pjsua_msg_data *msg_data, void *user_data) { pjsip_tx_data *tdata; const pj_str_t mime_text_plain = pj_str("text/plain"); pjsip_media_type media_type; pjsua_im_data *im_data; pjsua_acc *acc; pj_status_t status; /* To and message body must be specified. */ PJ_ASSERT_RETURN(to && content, PJ_EINVAL); acc = &pjsua_var.acc[acc_id]; /* Create request. */ status = pjsip_endpt_create_request(pjsua_var.endpt, &pjsip_message_method, (msg_data && msg_data->target_uri.slen? &msg_data->target_uri: to), &acc->cfg.id, to, NULL, NULL, -1, NULL, &tdata); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to create request", status); return status; } /* If account is locked to specific transport, then set transport to * the request. */ if (acc->cfg.transport_id != PJSUA_INVALID_ID) { pjsip_tpselector tp_sel; pjsua_init_tpselector(acc->cfg.transport_id, &tp_sel); pjsip_tx_data_set_transport(tdata, &tp_sel); } /* Add accept header. */ pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*)pjsua_im_create_accept(tdata->pool)); /* Create suitable Contact header unless a Contact header has been * set in the account. */ /* Ticket #1632: According to RFC 3428: * MESSAGE requests do not initiate dialogs. * User Agents MUST NOT insert Contact header fields into MESSAGE requests */ /* if (acc->contact.slen) { contact = acc->contact; } else { status = pjsua_acc_create_uac_contact(tdata->pool, &contact, acc_id, to); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to generate Contact header", status); pjsip_tx_data_dec_ref(tdata); return status; } } pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*) pjsip_generic_string_hdr_create(tdata->pool, &STR_CONTACT, &contact)); */ /* Create IM data to keep message details and give it back to * application on the callback */ im_data = PJ_POOL_ZALLOC_T(tdata->pool, pjsua_im_data); im_data->acc_id = acc_id; im_data->call_id = PJSUA_INVALID_ID; pj_strdup_with_null(tdata->pool, &im_data->to, to); pj_strdup_with_null(tdata->pool, &im_data->body, content); im_data->user_data = user_data; /* Set default media type if none is specified */ if (mime_type == NULL) { mime_type = &mime_text_plain; } /* Parse MIME type */ pjsua_parse_media_type(tdata->pool, mime_type, &media_type); /* Add message body */ tdata->msg->body = pjsip_msg_body_create( tdata->pool, &media_type.type, &media_type.subtype, &im_data->body); if (tdata->msg->body == NULL) { pjsua_perror(THIS_FILE, "Unable to create msg body", PJ_ENOMEM); pjsip_tx_data_dec_ref(tdata); return PJ_ENOMEM; } /* Add additional headers etc. */ pjsua_process_msg_data(tdata, msg_data); /* Add route set */ pjsua_set_msg_route_set(tdata, &acc->route_set); /* If via_addr is set, use this address for the Via header. */ if (acc->cfg.allow_via_rewrite && acc->via_addr.host.slen > 0) { tdata->via_addr = acc->via_addr; tdata->via_tp = acc->via_tp; } /* Send request (statefully) */ status = pjsip_endpt_send_request( pjsua_var.endpt, tdata, -1, im_data, &im_callback); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to send request", status); return status; } return PJ_SUCCESS; }
static int uas_tsx_bench(unsigned working_set, pj_timestamp *p_elapsed) { unsigned i; pjsip_tx_data *request; pjsip_via_hdr *via; pjsip_rx_data rdata; pj_sockaddr_in remote; pjsip_transaction **tsx; pj_timestamp t1, t2, elapsed; char branch_buf[80] = PJSIP_RFC3261_BRANCH_ID "0000000000"; pj_status_t status; /* Create the request first. */ pj_str_t str_target = pj_str("sip:[email protected]"); pj_str_t str_from = pj_str("\"Local User\" <sip:[email protected]>"); pj_str_t str_to = pj_str("\"Remote User\" <sip:[email protected]>"); pj_str_t str_contact = str_from; status = pjsip_endpt_create_request(endpt, &pjsip_invite_method, &str_target, &str_from, &str_to, &str_contact, NULL, -1, NULL, &request); if (status != PJ_SUCCESS) { app_perror(" error: unable to create request", status); return status; } /* Create Via */ via = pjsip_via_hdr_create(request->pool); via->sent_by.host = pj_str("192.168.0.7"); via->sent_by.port = 5061; via->transport = pj_str("udp"); via->rport_param = 1; via->recvd_param = pj_str("192.168.0.7"); pjsip_msg_insert_first_hdr(request->msg, (pjsip_hdr*)via); /* Create "dummy" rdata from the tdata */ pj_bzero(&rdata, sizeof(pjsip_rx_data)); rdata.tp_info.pool = request->pool; rdata.msg_info.msg = request->msg; rdata.msg_info.from = (pjsip_from_hdr*) pjsip_msg_find_hdr(request->msg, PJSIP_H_FROM, NULL); rdata.msg_info.to = (pjsip_to_hdr*) pjsip_msg_find_hdr(request->msg, PJSIP_H_TO, NULL); rdata.msg_info.cseq = (pjsip_cseq_hdr*) pjsip_msg_find_hdr(request->msg, PJSIP_H_CSEQ, NULL); rdata.msg_info.cid = (pjsip_cid_hdr*) pjsip_msg_find_hdr(request->msg, PJSIP_H_FROM, NULL); rdata.msg_info.via = via; pj_sockaddr_in_init(&remote, 0, 0); status = pjsip_endpt_acquire_transport(endpt, PJSIP_TRANSPORT_LOOP_DGRAM, &remote, sizeof(pj_sockaddr_in), NULL, &rdata.tp_info.transport); if (status != PJ_SUCCESS) { app_perror(" error: unable to get loop transport", status); return status; } /* Create transaction array */ tsx = (pjsip_transaction**) pj_pool_zalloc(request->pool, working_set * sizeof(pj_pool_t*)); pj_bzero(&mod_tsx_user, sizeof(mod_tsx_user)); mod_tsx_user.id = -1; /* Benchmark */ elapsed.u64 = 0; pj_get_timestamp(&t1); for (i=0; i<working_set; ++i) { via->branch_param.ptr = branch_buf; via->branch_param.slen = PJSIP_RFC3261_BRANCH_LEN + pj_ansi_sprintf(branch_buf+PJSIP_RFC3261_BRANCH_LEN, "-%d", i); status = pjsip_tsx_create_uas(&mod_tsx_user, &rdata, &tsx[i]); if (status != PJ_SUCCESS) goto on_error; } pj_get_timestamp(&t2); pj_sub_timestamp(&t2, &t1); pj_add_timestamp(&elapsed, &t2); p_elapsed->u64 = elapsed.u64; status = PJ_SUCCESS; on_error: for (i=0; i<working_set; ++i) { if (tsx[i]) { pjsip_tsx_terminate(tsx[i], 601); tsx[i] = NULL; } } pjsip_tx_data_dec_ref(request); flush_events(2000); return status; }
static int uac_tsx_bench(unsigned working_set, pj_timestamp *p_elapsed) { unsigned i; pjsip_tx_data *request; pjsip_transaction **tsx; pj_timestamp t1, t2, elapsed; pjsip_via_hdr *via; pj_status_t status; /* Create the request first. */ pj_str_t str_target = pj_str("sip:[email protected]"); pj_str_t str_from = pj_str("\"Local User\" <sip:[email protected]>"); pj_str_t str_to = pj_str("\"Remote User\" <sip:[email protected]>"); pj_str_t str_contact = str_from; status = pjsip_endpt_create_request(endpt, &pjsip_invite_method, &str_target, &str_from, &str_to, &str_contact, NULL, -1, NULL, &request); if (status != PJ_SUCCESS) { app_perror(" error: unable to create request", status); return status; } via = (pjsip_via_hdr*) pjsip_msg_find_hdr(request->msg, PJSIP_H_VIA, NULL); /* Create transaction array */ tsx = (pjsip_transaction**) pj_pool_zalloc(request->pool, working_set * sizeof(pj_pool_t*)); pj_bzero(&mod_tsx_user, sizeof(mod_tsx_user)); mod_tsx_user.id = -1; /* Benchmark */ elapsed.u64 = 0; pj_get_timestamp(&t1); for (i=0; i<working_set; ++i) { status = pjsip_tsx_create_uac(&mod_tsx_user, request, &tsx[i]); if (status != PJ_SUCCESS) goto on_error; /* Reset branch param */ via->branch_param.slen = 0; } pj_get_timestamp(&t2); pj_sub_timestamp(&t2, &t1); pj_add_timestamp(&elapsed, &t2); p_elapsed->u64 = elapsed.u64; status = PJ_SUCCESS; on_error: for (i=0; i<working_set; ++i) { if (tsx[i]) { pjsip_tsx_terminate(tsx[i], 601); tsx[i] = NULL; } } pjsip_tx_data_dec_ref(request); flush_events(2000); return status; }
/* Double terminate test. */ static int double_terminate(void) { pj_str_t target, from, tsx_key; pjsip_tx_data *tdata; pjsip_transaction *tsx; pj_status_t status; PJ_LOG(3,(THIS_FILE, " double terminate test")); target = pj_str(TARGET_URI); from = pj_str(FROM_URI); /* Create request. */ status = pjsip_endpt_create_request(endpt, &pjsip_invite_method, &target, &from, &target, NULL, NULL, -1, NULL, &tdata); if (status != PJ_SUCCESS) { app_perror(" error: unable to create request", status); return -10; } /* Create transaction. */ status = pjsip_tsx_create_uac(NULL, tdata, &tsx); if (status != PJ_SUCCESS) { app_perror(" error: unable to create transaction", status); return -20; } /* Save transaction key for later. */ pj_strdup_with_null(tdata->pool, &tsx_key, &tsx->transaction_key); /* Add reference to transmit buffer (tsx_send_msg() will dec txdata). */ pjsip_tx_data_add_ref(tdata); /* Send message to start timeout timer. */ status = pjsip_tsx_send_msg(tsx, NULL); /* Terminate transaction. */ status = pjsip_tsx_terminate(tsx, PJSIP_SC_REQUEST_TERMINATED); if (status != PJ_SUCCESS) { app_perror(" error: unable to terminate transaction", status); return -30; } tsx = pjsip_tsx_layer_find_tsx(&tsx_key, PJ_TRUE); if (tsx) { /* Terminate transaction again. */ pjsip_tsx_terminate(tsx, PJSIP_SC_REQUEST_TERMINATED); if (status != PJ_SUCCESS) { app_perror(" error: unable to terminate transaction", status); return -40; } pj_mutex_unlock(tsx->mutex); } flush_events(500); if (pjsip_tx_data_dec_ref(tdata) != PJSIP_EBUFDESTROYED) { return -50; } return PJ_SUCCESS; }
void RegistrationUtils::register_with_application_servers(Ifcs& ifcs, RegStore* store, pjsip_rx_data *received_register, pjsip_tx_data *ok_response, // Can only be NULL if received_register is int expires, bool is_initial_registration, const std::string& served_user, SAS::TrailId trail) { // Function preconditions if (received_register == NULL) { // We should have both messages or neither assert(ok_response == NULL); } else { // We should have both messages or neither assert(ok_response != NULL); } std::vector<AsInvocation> as_list; // Choice of SessionCase::Originating is not arbitrary - we don't expect iFCs to specify SessionCase // constraints for REGISTER messages, but we only get the served user from the From address in an // Originating message, otherwise we use the Request-URI. We need to use the From for REGISTERs. // See 3GPP TS 23.218 s5.2.1 note 2: "REGISTER is considered part of the UE-originating". if (received_register == NULL) { pj_status_t status; pjsip_method method; pjsip_method_set(&method, PJSIP_REGISTER_METHOD); pjsip_tx_data *tdata; std::string served_user_uri_string = "<"+served_user+">"; const pj_str_t served_user_uri = pj_str(const_cast<char *>(served_user_uri_string.c_str())); LOG_INFO("Generating a fake REGISTER to send to IfcHandler using AOR %s", served_user.c_str()); SAS::Event event(trail, SASEvent::REGISTER_AS_START, 0); event.add_var_param(served_user); SAS::report_event(event); status = pjsip_endpt_create_request(stack_data.endpt, &method, // Method &stack_data.scscf_uri, // Target &served_user_uri, // From &served_user_uri, // To &served_user_uri, // Contact NULL, // Auto-generate Call-ID 1, // CSeq NULL, // No body &tdata); // OUT assert(status == PJ_SUCCESS); // As per TS 24.229, section 5.4.1.7, note 1, we don't fill in any P-Associated-URI details. ifcs.interpret(SessionCase::Originating, true, is_initial_registration, tdata->msg, as_list, trail); status = pjsip_tx_data_dec_ref(tdata); assert(status == PJSIP_EBUFDESTROYED); } else { ifcs.interpret(SessionCase::Originating, true, is_initial_registration, received_register->msg_info.msg, as_list, trail); } LOG_INFO("Found %d Application Servers", as_list.size()); // Loop through the as_list for (std::vector<AsInvocation>::iterator as_iter = as_list.begin(); as_iter != as_list.end(); as_iter++) { send_register_to_as(received_register, ok_response, *as_iter, expires, served_user, trail); } }
int UE::send_message(std::string dest, std::string contents) { timeval before; timeval after; pthread_mutex_lock(&_msg_mutex); pj_str_t to; stra(&to, dest.c_str()); pj_str_t data; stra(&data, contents.c_str()); pj_str_t message; stra(&message, "MESSAGE"); pjsip_tx_data* tdata; pjsip_method msg_method; pjsip_method_init(&msg_method, _pool, &message); pjsip_endpt_create_request(get_global_endpoint(), &msg_method, &to, &_my_uri, &to, &_contact, NULL, -1, &data, &tdata); pjsip_tsx_create_uac(ua_module(), tdata, &_msg_tsx); pjsip_tpselector sel; sel.type = PJSIP_TPSELECTOR_TRANSPORT; sel.u.transport = _transport; pjsip_tsx_set_transport(_msg_tsx, &sel); pjsip_route_hdr* rt_hdr = pjsip_route_hdr_create(tdata->pool); rt_hdr->name_addr.uri = _server_uri; pjsip_msg_insert_first_hdr(tdata->msg, (pjsip_hdr*)rt_hdr); _msg_tsx->mod_data[ua_module()->id] = this; pj_grp_lock_add_ref(_msg_tsx->grp_lock); gettimeofday(&before, NULL); pj_status_t status = pjsip_tsx_send_msg(_msg_tsx, NULL); if (status != PJ_SUCCESS) { pthread_mutex_unlock(&_msg_mutex); return -1; } while (_msg_tsx->state < PJSIP_TSX_STATE_COMPLETED) { pthread_cond_wait(&_msg_cond, &_msg_mutex); } gettimeofday(&after, NULL); //unsigned long latency = ((after.tv_sec - before.tv_sec) * 1000000) + (after.tv_usec - before.tv_usec); //printf("Message latency is %lu\n", latency); int ret = _msg_tsx->status_code; pj_grp_lock_dec_ref(_msg_tsx->grp_lock); _msg_tsx = NULL; pthread_mutex_unlock(&_msg_mutex); return ret; }
int transport_load_test(char *target_url) { enum { COUNT = 2000 }; unsigned i; pj_status_t status = PJ_SUCCESS; /* exhaust packets */ do { pj_time_val delay = {1, 0}; i = 0; pjsip_endpt_handle_events2(endpt, &delay, &i); } while (i != 0); PJ_LOG(3,(THIS_FILE, " transport load test...")); if (mod_load.mod.id == -1) { status = pjsip_endpt_register_module( endpt, &mod_load.mod); if (status != PJ_SUCCESS) { app_perror("error registering module", status); return -1; } } mod_load.err = PJ_FALSE; mod_load.next_seq = 0; for (i=0; i<COUNT && !mod_load.err; ++i) { pj_str_t target, from, call_id; pjsip_tx_data *tdata; target = pj_str(target_url); from = pj_str("<sip:user@host>"); call_id = pj_str("thecallid"); status = pjsip_endpt_create_request(endpt, &pjsip_invite_method, &target, &from, &target, &from, &call_id, i, NULL, &tdata ); if (status != PJ_SUCCESS) { app_perror("error creating request", status); goto on_return; } status = pjsip_endpt_send_request_stateless(endpt, tdata, NULL, NULL); if (status != PJ_SUCCESS) { app_perror("error sending request", status); goto on_return; } } do { pj_time_val delay = {1, 0}; i = 0; pjsip_endpt_handle_events2(endpt, &delay, &i); } while (i != 0); if (mod_load.next_seq != COUNT) { PJ_LOG(1,("THIS_FILE", " err: expecting %u msg, got only %u", COUNT, mod_load.next_seq)); status = -2; goto on_return; } on_return: if (mod_load.mod.id != -1) { pjsip_endpt_unregister_module( endpt, &mod_load.mod); mod_load.mod.id = -1; } if (status != PJ_SUCCESS || mod_load.err) { return -2; } PJ_LOG(3,(THIS_FILE, " success")); return 0; }
void send_register_to_as(pjsip_rx_data *received_register, pjsip_tx_data *ok_response, AsInvocation& as, int expires, const std::string& served_user, SAS::TrailId trail) { pj_status_t status; pjsip_tx_data *tdata; pjsip_method method; pjsip_method_set(&method, PJSIP_REGISTER_METHOD); pj_str_t user_uri; pj_cstr(&user_uri, served_user.c_str()); pj_str_t as_uri; pj_cstr(&as_uri, as.server_name.c_str()); status = pjsip_endpt_create_request(stack_data.endpt, &method, // Method &as_uri, // Target &stack_data.scscf_uri, // From &user_uri, // To &stack_data.scscf_uri, // Contact NULL, // Auto-generate Call-ID 1, // CSeq NULL, // No body &tdata); // OUT if (status != PJ_SUCCESS) { //LCOV_EXCL_START LOG_ERROR("Failed to build third-party REGISTER request for server %s", as.server_name.c_str()); return; //LCOV_EXCL_STOP } // Expires header based on 200 OK response pjsip_expires_hdr_create(tdata->pool, expires); pjsip_expires_hdr* expires_hdr = pjsip_expires_hdr_create(tdata->pool, expires); pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*)expires_hdr); // TODO: modify orig-ioi of P-Charging-Vector and remove term-ioi if (received_register && ok_response) { // Copy P-Access-Network-Info, P-Visited-Network-Id and P-Charging-Vector // from original message PJUtils::clone_header(&STR_P_A_N_I, received_register->msg_info.msg, tdata->msg, tdata->pool); PJUtils::clone_header(&STR_P_V_N_I, received_register->msg_info.msg, tdata->msg, tdata->pool); PJUtils::clone_header(&STR_P_C_V, received_register->msg_info.msg, tdata->msg, tdata->pool); // Copy P-Charging-Function-Addresses from the OK response. PJUtils::clone_header(&STR_P_C_F_A, ok_response->msg, tdata->msg, tdata->pool); // Generate a message body based on Filter Criteria values char buf[MAX_SIP_MSG_SIZE]; pj_str_t sip_type = pj_str("message"); pj_str_t sip_subtype = pj_str("sip"); pj_str_t xml_type = pj_str("application"); pj_str_t xml_subtype = pj_str("3gpp-ims+xml"); // Build up this multipart body incrementally, based on the ServiceInfo, IncludeRegisterRequest and IncludeRegisterResponse fields pjsip_msg_body *final_body = pjsip_multipart_create(tdata->pool, NULL, NULL); // If we only have one part, we don't want a multipart MIME body - store the reference to each one here to use instead pjsip_msg_body *possible_final_body = NULL; int multipart_parts = 0; if (!as.service_info.empty()) { pjsip_multipart_part *xml_part = pjsip_multipart_create_part(tdata->pool); std::string xml_str = "<ims-3gpp><service-info>"+as.service_info+"</service-info></ims-3gpp>"; pj_str_t xml_pj_str; pj_cstr(&xml_pj_str, xml_str.c_str()); xml_part->body = pjsip_msg_body_create(tdata->pool, &xml_type, &xml_subtype, &xml_pj_str), possible_final_body = xml_part->body; multipart_parts++; pjsip_multipart_add_part(tdata->pool, final_body, xml_part); } if (as.include_register_request) { pjsip_multipart_part *request_part = pjsip_multipart_create_part(tdata->pool); pjsip_msg_print(received_register->msg_info.msg, buf, sizeof(buf)); pj_str_t request_str = pj_str(buf); request_part->body = pjsip_msg_body_create(tdata->pool, &sip_type, &sip_subtype, &request_str), possible_final_body = request_part->body; multipart_parts++; pjsip_multipart_add_part(tdata->pool, final_body, request_part); } if (as.include_register_response) { pjsip_multipart_part *response_part = pjsip_multipart_create_part(tdata->pool); pjsip_msg_print(ok_response->msg, buf, sizeof(buf)); pj_str_t response_str = pj_str(buf); response_part->body = pjsip_msg_body_create(tdata->pool, &sip_type, &sip_subtype, &response_str), possible_final_body = response_part->body; multipart_parts++; pjsip_multipart_add_part(tdata->pool, final_body, response_part); } if (multipart_parts == 0) { final_body = NULL; } else if (multipart_parts == 1) { final_body = possible_final_body; } else { // Just use the multipart MIME body you've built up } tdata->msg->body = final_body; } // Set the SAS trail on the request. set_trail(tdata, trail); // Allocate a temporary structure to record the default handling for this // REGISTER, and send it statefully. ThirdPartyRegData* tsxdata = new ThirdPartyRegData; tsxdata->default_handling = as.default_handling; tsxdata->trail = trail; tsxdata->public_id = served_user; pj_status_t resolv_status = PJUtils::send_request(tdata, 0, tsxdata, &send_register_cb); if (resolv_status != PJ_SUCCESS) { delete tsxdata; // LCOV_EXCL_LINE } }
int dummy_function() { pj_caching_pool cp; sprintf(NULL, "%d", 0); rand(); #ifdef HAS_PJLIB pj_init(); pj_caching_pool_init(&cp, NULL, 0); pj_array_erase(NULL, 0, 0, 0); pj_create_unique_string(NULL, NULL); pj_hash_create(NULL, 0); pj_hash_get(NULL, NULL, 0, NULL); pj_hash_set(NULL, NULL, NULL, 0, 0, NULL); pj_ioqueue_create(NULL, 0, NULL); pj_ioqueue_register_sock(NULL, NULL, 0, NULL, NULL, NULL); pj_pool_alloc(NULL, 0); pj_timer_heap_create(NULL, 0, NULL); #endif #ifdef HAS_PJLIB_STUN pjstun_get_mapped_addr(&cp.factory, 0, NULL, NULL, 80, NULL, 80, NULL); #endif #ifdef HAS_PJLIB_GETOPT pj_getopt_long(0, NULL, NULL, NULL, NULL); #endif #ifdef HAS_PJLIB_XML pj_xml_parse(NULL, NULL, 100); pj_xml_print(NULL, NULL, 10, PJ_FALSE); pj_xml_clone(NULL, NULL); pj_xml_node_new(NULL, NULL); pj_xml_attr_new(NULL, NULL, NULL); pj_xml_add_node(NULL, NULL); pj_xml_add_attr(NULL, NULL); pj_xml_find_node(NULL, NULL); pj_xml_find_next_node(NULL, NULL, NULL); pj_xml_find_attr(NULL, NULL, NULL); pj_xml_find(NULL, NULL, NULL, NULL); #endif #ifdef HAS_PJLIB_SCANNER pj_cis_buf_init(NULL); pj_cis_init(NULL, NULL); pj_cis_dup(NULL, NULL); pj_cis_add_alpha(NULL); pj_cis_add_str(NULL, NULL); pj_scan_init(NULL, NULL, 0, 0, NULL); pj_scan_fini(NULL); pj_scan_peek(NULL, NULL, NULL); pj_scan_peek_n(NULL, 0, NULL); pj_scan_peek_until(NULL, NULL, NULL); pj_scan_get(NULL, NULL, NULL); pj_scan_get_unescape(NULL, NULL, NULL); pj_scan_get_quote(NULL, 0, 0, NULL); pj_scan_get_n(NULL, 0, NULL); pj_scan_get_char(NULL); pj_scan_get_until(NULL, NULL, NULL); pj_scan_strcmp(NULL, NULL, 0); pj_scan_stricmp(NULL, NULL, 0); pj_scan_stricmp_alnum(NULL, NULL, 0); pj_scan_get_newline(NULL); pj_scan_restore_state(NULL, NULL); #endif #ifdef HAS_PJLIB_DNS pj_dns_make_query(NULL, NULL, 0, 0, NULL); pj_dns_parse_packet(NULL, NULL, 0, NULL); pj_dns_packet_dup(NULL, NULL, 0, NULL); #endif #ifdef HAS_PJLIB_RESOLVER pj_dns_resolver_create(NULL, NULL, 0, NULL, NULL, NULL); pj_dns_resolver_set_ns(NULL, 0, NULL, NULL); pj_dns_resolver_handle_events(NULL, NULL); pj_dns_resolver_destroy(NULL, 0); pj_dns_resolver_start_query(NULL, NULL, 0, 0, NULL, NULL, NULL); pj_dns_resolver_cancel_query(NULL, 0); pj_dns_resolver_add_entry(NULL, NULL, 0); #endif #ifdef HAS_PJLIB_SRV_RESOLVER pj_dns_srv_resolve(NULL, NULL, 0, NULL, NULL, PJ_FALSE, NULL, NULL); #endif #ifdef HAS_PJLIB_CRC32 pj_crc32_init(NULL); pj_crc32_update(NULL, NULL, 0); pj_crc32_final(NULL); #endif #ifdef HAS_PJLIB_HMAC_MD5 pj_hmac_md5(NULL, 0, NULL, 0, NULL); #endif #ifdef HAS_PJLIB_HMAC_SHA1 pj_hmac_sha1(NULL, 0, NULL, 0, NULL); #endif #ifdef HAS_PJNATH_STUN pj_stun_session_create(NULL, NULL, NULL, PJ_FALSE, NULL); pj_stun_session_destroy(NULL); pj_stun_session_set_credential(NULL, NULL); pj_stun_session_create_req(NULL, 0, NULL, NULL); pj_stun_session_create_ind(NULL, 0, NULL); pj_stun_session_create_res(NULL, NULL, 0, NULL, NULL); pj_stun_session_send_msg(NULL, PJ_FALSE, NULL, 0, NULL); #endif #ifdef HAS_PJNATH_ICE pj_ice_strans_create(NULL, NULL, 0, NULL, NULL, NULL); pj_ice_strans_set_stun_domain(NULL, NULL, NULL); pj_ice_strans_create_comp(NULL, 0, 0, NULL); pj_ice_strans_add_cand(NULL, 0, PJ_ICE_CAND_TYPE_HOST, 0, NULL, PJ_FALSE); pj_ice_strans_init_ice(NULL, PJ_ICE_SESS_ROLE_CONTROLLED, NULL, NULL); pj_ice_strans_start_ice(NULL, NULL, NULL, 0, NULL); pj_ice_strans_stop_ice(NULL); pj_ice_strans_sendto(NULL, 0, NULL, 0, NULL, 0); #endif #ifdef HAS_PJSIP_CORE_MSG_ELEM /* Parameter container */ pjsip_param_find(NULL, NULL); pjsip_param_print_on(NULL, NULL, 0, NULL, NULL, 0); /* SIP URI */ pjsip_sip_uri_create(NULL, 0); pjsip_name_addr_create(NULL); /* TEL URI */ pjsip_tel_uri_create(NULL); /* Message and headers */ pjsip_msg_create(NULL, PJSIP_REQUEST_MSG); pjsip_msg_print(NULL, NULL, 0); pjsip_accept_hdr_create(NULL); pjsip_allow_hdr_create(NULL); pjsip_cid_hdr_create(NULL); pjsip_clen_hdr_create(NULL); pjsip_cseq_hdr_create(NULL); pjsip_contact_hdr_create(NULL); pjsip_ctype_hdr_create(NULL); pjsip_expires_hdr_create(NULL, 0); pjsip_from_hdr_create(NULL); pjsip_max_fwd_hdr_create(NULL, 0); pjsip_min_expires_hdr_create(NULL, 0); pjsip_rr_hdr_create(NULL); pjsip_require_hdr_create(NULL); pjsip_retry_after_hdr_create(NULL, 0); pjsip_supported_hdr_create(NULL); pjsip_unsupported_hdr_create(NULL); pjsip_via_hdr_create(NULL); pjsip_warning_hdr_create(NULL, 0, NULL, NULL); pjsip_parse_uri(NULL, NULL, 0, 0); pjsip_parse_msg(NULL, NULL, 0, NULL); pjsip_parse_rdata(NULL, 0, NULL); pjsip_find_msg(NULL, 0, 0, NULL); #endif #ifdef HAS_PJSIP_CORE pjsip_endpt_create(NULL, NULL, NULL); pjsip_tpmgr_create(NULL, NULL, NULL, NULL, NULL); pjsip_tpmgr_destroy(NULL); pjsip_transport_send(NULL, NULL, NULL, 0, NULL, NULL); #endif #ifdef HAS_PJSIP_CORE_MSG_UTIL pjsip_endpt_create_request(NULL, NULL, NULL, NULL, NULL, NULL, NULL, -1, NULL, NULL); pjsip_endpt_create_request_from_hdr(NULL, NULL, NULL, NULL, NULL, NULL, NULL, -1, NULL, NULL); pjsip_endpt_create_response(NULL, NULL, -1, NULL, NULL); pjsip_endpt_create_ack(NULL, NULL, NULL, NULL); pjsip_endpt_create_cancel(NULL, NULL, NULL); pjsip_get_request_dest(NULL, NULL); pjsip_endpt_send_request_stateless(NULL, NULL, NULL, NULL); pjsip_get_response_addr(NULL, NULL, NULL); pjsip_endpt_send_response(NULL, NULL, NULL, NULL, NULL); pjsip_endpt_respond_stateless(NULL, NULL, -1, NULL, NULL, NULL); #endif #ifdef HAS_PJSIP_UDP_TRANSPORT pjsip_udp_transport_start(NULL, NULL, NULL, 1, NULL); #endif #ifdef HAS_PJSIP_TCP_TRANSPORT pjsip_tcp_transport_start(NULL, NULL, 1, NULL); #endif #ifdef HAS_PJSIP_TLS_TRANSPORT pjsip_tls_transport_start(NULL, NULL, NULL, NULL, 0, NULL); #endif #ifdef HAS_PJSIP_TRANSACTION pjsip_tsx_layer_init_module(NULL); pjsip_tsx_layer_destroy(); pjsip_tsx_create_uac(NULL, NULL, NULL); pjsip_tsx_create_uas(NULL, NULL, NULL); pjsip_tsx_recv_msg(NULL, NULL); pjsip_tsx_send_msg(NULL, NULL); pjsip_tsx_terminate(NULL, 200); pjsip_endpt_send_request(NULL, NULL, -1, NULL, NULL); pjsip_endpt_respond(NULL, NULL, NULL, -1, NULL, NULL, NULL, NULL); #endif #ifdef HAS_PJMEDIA_SDP pjmedia_sdp_parse(NULL, NULL, 1024, NULL); pjmedia_sdp_print(NULL, NULL, 1024); pjmedia_sdp_validate(NULL); pjmedia_sdp_session_clone(NULL, NULL); pjmedia_sdp_session_cmp(NULL, NULL, 0); pjmedia_sdp_attr_to_rtpmap(NULL, NULL, NULL); pjmedia_sdp_attr_get_fmtp(NULL, NULL); pjmedia_sdp_attr_get_rtcp(NULL, NULL); pjmedia_sdp_conn_clone(NULL, NULL); pjmedia_sdp_media_clone(NULL, NULL); pjmedia_sdp_media_find_attr(NULL, NULL, NULL); #endif #ifdef HAS_PJMEDIA_SDP_NEGOTIATOR pjmedia_sdp_neg_create_w_local_offer(NULL, NULL, NULL); pjmedia_sdp_neg_create_w_remote_offer(NULL, NULL, NULL, NULL); pjmedia_sdp_neg_get_state(NULL); pjmedia_sdp_neg_negotiate(NULL, NULL, PJ_FALSE); #endif #ifdef HAS_PJSIP_UA_LAYER pjsip_ua_init_module(NULL, NULL); pjsip_ua_destroy(); pjsip_dlg_create_uac(NULL, NULL, NULL, NULL, NULL, NULL); pjsip_dlg_create_uas_and_inc_lock(NULL, NULL, NULL, NULL); pjsip_dlg_terminate(NULL); pjsip_dlg_set_route_set(NULL, NULL); pjsip_dlg_create_request(NULL, NULL, -1, NULL); pjsip_dlg_send_request(NULL, NULL, -1, NULL); pjsip_dlg_create_response(NULL, NULL, -1, NULL, NULL); pjsip_dlg_modify_response(NULL, NULL, -1, NULL); pjsip_dlg_send_response(NULL, NULL, NULL); pjsip_dlg_respond(NULL, NULL, -1, NULL, NULL, NULL); #endif #ifdef HAS_PJSIP_AUTH_CLIENT pjsip_auth_clt_init(NULL, NULL, NULL, 0); pjsip_auth_clt_clone(NULL, NULL, NULL); pjsip_auth_clt_set_credentials(NULL, 0, NULL); pjsip_auth_clt_init_req(NULL, NULL); pjsip_auth_clt_reinit_req(NULL, NULL, NULL, NULL); #endif #ifdef HAS_PJSIP_INV_SESSION pjsip_inv_usage_init(NULL, NULL); pjsip_inv_create_uac(NULL, NULL, 0, NULL); pjsip_inv_verify_request(NULL, NULL, NULL, NULL, NULL, NULL); pjsip_inv_create_uas(NULL, NULL, NULL, 0, NULL); pjsip_inv_terminate(NULL, 200, PJ_FALSE); pjsip_inv_invite(NULL, NULL); pjsip_inv_initial_answer(NULL, NULL, 200, NULL, NULL, NULL); pjsip_inv_answer(NULL, 200, NULL, NULL, NULL); pjsip_inv_end_session(NULL, 200, NULL, NULL); pjsip_inv_reinvite(NULL, NULL, NULL, NULL); pjsip_inv_update(NULL, NULL, NULL, NULL); pjsip_inv_send_msg(NULL, NULL); pjsip_dlg_get_inv_session(NULL); //pjsip_tsx_get_inv_session(NULL); pjsip_inv_state_name(PJSIP_INV_STATE_NULL); #endif #ifdef HAS_PJSIP_REGC //pjsip_regc_get_module(); pjsip_regc_create(NULL, NULL, NULL, NULL); pjsip_regc_destroy(NULL); pjsip_regc_get_info(NULL, NULL); pjsip_regc_get_pool(NULL); pjsip_regc_init(NULL, NULL, NULL, NULL, 0, NULL, 600); pjsip_regc_set_credentials(NULL, 1, NULL); pjsip_regc_set_route_set(NULL, NULL); pjsip_regc_register(NULL, PJ_TRUE, NULL); pjsip_regc_unregister(NULL, NULL); pjsip_regc_update_contact(NULL, 10, NULL); pjsip_regc_update_expires(NULL, 600); pjsip_regc_send(NULL, NULL); #endif #ifdef HAS_PJSIP_EVENT_FRAMEWORK pjsip_evsub_init_module(NULL); pjsip_evsub_instance(); pjsip_evsub_register_pkg(NULL, NULL, 30, 10, NULL); pjsip_evsub_create_uac(NULL, NULL, NULL, 10, NULL); pjsip_evsub_create_uas(NULL, NULL, NULL, 10, NULL); pjsip_evsub_terminate(NULL, PJ_FALSE); pjsip_evsub_get_state(NULL); pjsip_evsub_get_state_name(NULL); pjsip_evsub_initiate(NULL, NULL, -1, NULL); pjsip_evsub_accept(NULL, NULL, 200, NULL); pjsip_evsub_notify(NULL, PJSIP_EVSUB_STATE_ACTIVE, NULL, NULL, NULL); pjsip_evsub_current_notify(NULL, NULL); pjsip_evsub_send_request(NULL, NULL); pjsip_tsx_get_evsub(NULL); pjsip_evsub_set_mod_data(NULL, 1, NULL); pjsip_evsub_get_mod_data(NULL, 1); #endif #ifdef HAS_PJSIP_CALL_TRANSFER pjsip_xfer_init_module(NULL); pjsip_xfer_create_uac(NULL, NULL, NULL); pjsip_xfer_create_uas(NULL, NULL, NULL, NULL); pjsip_xfer_initiate(NULL, NULL, NULL); pjsip_xfer_accept(NULL, NULL, 200, NULL); pjsip_xfer_notify(NULL, PJSIP_EVSUB_STATE_ACTIVE, 200, NULL, NULL); pjsip_xfer_current_notify(NULL, NULL); pjsip_xfer_send_request(NULL, NULL); #endif #ifdef HAS_PJSIP_PRESENCE pjsip_pres_init_module(NULL, NULL); pjsip_pres_instance(); pjsip_pres_create_uac(NULL, NULL, 0, NULL); pjsip_pres_create_uas(NULL, NULL, NULL, NULL); pjsip_pres_terminate(NULL, PJ_FALSE); pjsip_pres_initiate(NULL, 100, NULL); pjsip_pres_accept(NULL, NULL, 200, NULL); pjsip_pres_notify(NULL, PJSIP_EVSUB_STATE_ACTIVE, NULL, NULL, NULL); pjsip_pres_current_notify(NULL, NULL); pjsip_pres_send_request(NULL, NULL); pjsip_pres_get_status(NULL, NULL); pjsip_pres_set_status(NULL, NULL); #endif #ifdef HAS_PJSIP_IS_COMPOSING pjsip_iscomposing_create_xml(NULL, PJ_TRUE, NULL, NULL, 0); pjsip_iscomposing_create_body(NULL, PJ_TRUE, NULL, NULL, 0); pjsip_iscomposing_parse(NULL, NULL, 0, NULL, NULL, NULL, NULL); #endif #ifdef HAS_PJMEDIA pjmedia_endpt_create(NULL, NULL, 1, NULL); pjmedia_endpt_destroy(NULL); pjmedia_endpt_create_sdp(NULL, NULL, 1, NULL, NULL); #endif #ifdef HAS_PJMEDIA_EC pjmedia_echo_create(NULL, 0, 0, 0, 0, 0, NULL); pjmedia_echo_destroy(NULL); pjmedia_echo_playback(NULL, NULL); pjmedia_echo_capture(NULL, NULL, 0); pjmedia_echo_cancel(NULL, NULL, NULL, 0, NULL); #endif #ifdef HAS_PJMEDIA_SND_DEV pjmedia_snd_init(NULL); pjmedia_snd_get_dev_count(); pjmedia_snd_get_dev_info(0); pjmedia_snd_open(-1, -1, 8000, 1, 80, 16, NULL, NULL, NULL, NULL); pjmedia_snd_open_rec(-1, 8000, 1, 160, 16, NULL, NULL, NULL); pjmedia_snd_open_player(-1, 8000, 1, 160, 16, NULL, NULL, NULL); pjmedia_snd_stream_start(NULL); pjmedia_snd_stream_stop(NULL); pjmedia_snd_stream_close(NULL); pjmedia_snd_deinit(); #endif #ifdef HAS_PJMEDIA_SND_PORT pjmedia_snd_port_create(NULL, -1, -1, 8000, 1, 180, 16, 0, NULL); pjmedia_snd_port_create_rec(NULL, -1, 8000, 1, 160, 16, 0, NULL); pjmedia_snd_port_create_player(NULL, -1, 8000, 1, 160, 16, 0, NULL); pjmedia_snd_port_destroy(NULL); pjmedia_snd_port_get_snd_stream(NULL); pjmedia_snd_port_connect(NULL, NULL); pjmedia_snd_port_get_port(NULL); pjmedia_snd_port_disconnect(NULL); #endif #ifdef HAS_PJMEDIA_RESAMPLE pjmedia_resample_create(NULL, PJ_TRUE, PJ_TRUE, 0, 0, 0, 0, NULL); pjmedia_resample_run(NULL, NULL, NULL); #endif #ifdef HAS_PJMEDIA_SILENCE_DET pjmedia_silence_det_create(NULL, 8000, 80, NULL); pjmedia_silence_det_detect(NULL, NULL, 0, NULL); pjmedia_silence_det_apply(NULL, 0); #endif #ifdef HAS_PJMEDIA_PLC pjmedia_plc_create(NULL, 8000, 80, 0, NULL); pjmedia_plc_save(NULL, NULL); pjmedia_plc_generate(NULL, NULL); #endif #ifdef HAS_PJMEDIA_CONFERENCE pjmedia_conf_create(NULL, 10, 8000, 1, 160, 16, 0, NULL); pjmedia_conf_destroy(NULL); pjmedia_conf_get_master_port(NULL); pjmedia_conf_add_port(NULL, NULL, NULL, NULL, NULL); pjmedia_conf_configure_port(NULL, 1, 0, 0); pjmedia_conf_connect_port(NULL, 0, 0, 0); pjmedia_conf_disconnect_port(NULL, 0, 0); pjmedia_conf_remove_port(NULL, 0); pjmedia_conf_enum_ports(NULL, NULL, NULL); pjmedia_conf_get_port_info(NULL, 0, NULL); pjmedia_conf_get_ports_info(NULL, NULL, NULL); pjmedia_conf_get_signal_level(NULL, 0, NULL, NULL); pjmedia_conf_adjust_rx_level(NULL, 0, 0); pjmedia_conf_adjust_tx_level(NULL, 0, 0); #endif #ifdef HAS_PJMEDIA_MASTER_PORT pjmedia_master_port_create(NULL, NULL, NULL, 0, NULL); pjmedia_master_port_start(NULL); pjmedia_master_port_stop(NULL); pjmedia_master_port_set_uport(NULL, NULL); pjmedia_master_port_get_uport(NULL); pjmedia_master_port_set_dport(NULL, NULL); pjmedia_master_port_get_dport(NULL); pjmedia_master_port_destroy(NULL, PJ_FALSE); #endif #ifdef HAS_PJMEDIA_RTP pjmedia_rtp_session_init(NULL, 0, 0); pjmedia_rtp_encode_rtp(NULL, 0, 0, 0, 0, NULL, NULL); pjmedia_rtp_decode_rtp(NULL, NULL, 0, NULL, NULL, NULL); pjmedia_rtp_session_update(NULL, NULL, NULL); #endif #ifdef HAS_PJMEDIA_RTCP pjmedia_rtcp_init(NULL, NULL, 0, 0, 0); pjmedia_rtcp_get_ntp_time(NULL, NULL); pjmedia_rtcp_fini(NULL); pjmedia_rtcp_rx_rtp(NULL, 0, 0, 0); pjmedia_rtcp_tx_rtp(NULL, 0); pjmedia_rtcp_rx_rtcp(NULL, NULL, 0); pjmedia_rtcp_build_rtcp(NULL, NULL, NULL); #endif #ifdef HAS_PJMEDIA_JBUF pjmedia_jbuf_create(NULL, NULL, 0, 0, 0, NULL); pjmedia_jbuf_set_fixed(NULL, 0); pjmedia_jbuf_set_adaptive(NULL, 0, 0, 0); pjmedia_jbuf_destroy(NULL); pjmedia_jbuf_put_frame(NULL, NULL, 0, 0); pjmedia_jbuf_get_frame(NULL, NULL, NULL); #endif #ifdef HAS_PJMEDIA_STREAM pjmedia_stream_create(NULL, NULL, NULL, NULL, NULL, NULL); pjmedia_stream_destroy(NULL); pjmedia_stream_get_port(NULL, NULL); pjmedia_stream_get_transport(NULL); pjmedia_stream_start(NULL); pjmedia_stream_get_stat(NULL, NULL); pjmedia_stream_pause(NULL, PJMEDIA_DIR_ENCODING); pjmedia_stream_resume(NULL, PJMEDIA_DIR_ENCODING); pjmedia_stream_dial_dtmf(NULL, NULL); pjmedia_stream_check_dtmf(NULL); pjmedia_stream_get_dtmf(NULL, NULL, NULL); #endif #ifdef HAS_PJMEDIA_TONEGEN pjmedia_tonegen_create(NULL, 0, 0, 0, 0, 0, NULL); pjmedia_tonegen_is_busy(NULL); pjmedia_tonegen_stop(NULL); pjmedia_tonegen_play(NULL, 0, NULL, 0); pjmedia_tonegen_play_digits(NULL, 0, NULL, 0); pjmedia_tonegen_get_digit_map(NULL, NULL); pjmedia_tonegen_set_digit_map(NULL, NULL); #endif #ifdef HAS_PJMEDIA_UDP_TRANSPORT pjmedia_transport_udp_create(NULL, NULL, 0, 0, NULL); pjmedia_transport_udp_close(NULL); #endif #ifdef HAS_PJMEDIA_FILE_PLAYER pjmedia_wav_player_port_create(NULL, NULL, 0, 0, 0, NULL); pjmedia_wav_player_port_set_pos(NULL, 0); pjmedia_wav_player_port_get_pos(NULL); pjmedia_wav_player_set_eof_cb(NULL, NULL, NULL); #endif #ifdef HAS_PJMEDIA_FILE_CAPTURE pjmedia_wav_writer_port_create(NULL, NULL, 8000, 1, 80, 16, 0, 0, NULL); pjmedia_wav_writer_port_get_pos(NULL); pjmedia_wav_writer_port_set_cb(NULL, 0, NULL, NULL); #endif #ifdef HAS_PJMEDIA_MEM_PLAYER pjmedia_mem_player_create(NULL, NULL, 1000, 8000, 1, 80, 16, 0, NULL); #endif #ifdef HAS_PJMEDIA_MEM_CAPTURE pjmedia_mem_capture_create(NULL, NULL, 1000, 8000, 1, 80, 16, 0, NULL); #endif #ifdef HAS_PJMEDIA_ICE pjmedia_ice_create(NULL, NULL, 0, NULL, NULL); pjmedia_ice_destroy(NULL); pjmedia_ice_start_init(NULL, 0, NULL, NULL, NULL); pjmedia_ice_init_ice(NULL, PJ_ICE_SESS_ROLE_CONTROLLED, NULL, NULL); pjmedia_ice_modify_sdp(NULL, NULL, NULL); pjmedia_ice_start_ice(NULL, NULL, NULL, 0); pjmedia_ice_stop_ice(NULL); #endif #ifdef HAS_PJMEDIA_G711_CODEC pjmedia_codec_g711_init(NULL); pjmedia_codec_g711_deinit(); #endif #ifdef HAS_PJMEDIA_GSM_CODEC pjmedia_codec_gsm_init(NULL); pjmedia_codec_gsm_deinit(); #endif #ifdef HAS_PJMEDIA_SPEEX_CODEC pjmedia_codec_speex_init(NULL, 0, 0, 0); pjmedia_codec_speex_deinit(); #endif #ifdef HAS_PJMEDIA_ILBC_CODEC pjmedia_codec_ilbc_init(NULL, 0); pjmedia_codec_ilbc_deinit(); #endif return 0; }