int glite_wll_perftest_consumeEventIlMsg(const char *msg) { int ret = 0; il_octet_string_t event; assert(msg != NULL); if(pthread_mutex_lock(&perftest_lock) < 0) abort(); gettimeofday(&endtime, NULL); /* decode event */ if(decode_il_msg(&event, msg) < 0) { fprintf(stderr, "PERFTEST: error decoding consumed event, aborting!\n"); abort(); } /* check for the termination event */ if(_strnstr(event.data, termination_string, 1024) != NULL) { /* print the timestamp */ fprintf(stderr, "PERFTEST_END_TIMESTAMP=%lu.%06lu\n", endtime.tv_sec, endtime.tv_usec); ret = 1; } if(pthread_mutex_unlock(&perftest_lock) < 0) abort(); free(event.data); return(ret); }
int glite_wll_perftest_consumeEventString(const char *event_string) { int ret = 0; assert(event_string != NULL); if(pthread_mutex_lock(&perftest_lock) < 0) abort(); gettimeofday(&endtime, NULL); /* check for the termination event */ /* if it is not in the first 1k chars, it is not there */ if(_strnstr(event_string, termination_string, 1024) != NULL) { /* print the timestamp */ fprintf(stderr, "PERFTEST_END_TIMESTAMP=%lu.%06lu\n", (unsigned long)endtime.tv_sec,(unsigned long)endtime.tv_usec); ret = 1; } if(pthread_mutex_unlock(&perftest_lock) < 0) abort(); return(ret); }
/* * Create a request */ char* build_uac_req(str* method, str* headers, str* body, dlg_t* dialog, int branch, struct cell *t, int* len, struct dest_info* dst) { char* buf, *w, *p; str content_length, cseq, via; unsigned int maxfwd_len; int tbracket, fbracket; str fromtag = STR_NULL; str loc_tag = STR_NULL; if (!method || !dialog) { LM_ERR("invalid parameter value\n"); return 0; } if (dialog->id.loc_tag.len<=0) { /* From Tag is mandatory in RFC3261 - generate one if not provided */ generate_fromtag(&fromtag, &dialog->id.call_id); loc_tag = dialog->id.loc_tag; dialog->id.loc_tag = fromtag; } if (print_content_length(&content_length, body) < 0) { LM_ERR("error while printing content-length\n"); return 0; } if (print_cseq_num(&cseq, dialog) < 0) { LM_ERR("error while printing CSeq number\n"); return 0; } if(headers==NULL || headers->len<15 || _strnstr(headers->s, "Max-Forwards:", headers->len)==NULL) { maxfwd_len = MAXFWD_HEADER_LEN; } else { maxfwd_len = 0; } *len = method->len + 1 + dialog->hooks.request_uri->len + 1 + SIP_VERSION_LEN + CRLF_LEN; if (assemble_via(&via, t, dst, branch) < 0) { LM_ERR("error while assembling Via\n"); return 0; } *len += via.len; if((p=q_memrchr(dialog->rem_uri.s, '>', dialog->rem_uri.len))!=NULL) { if((p==dialog->rem_uri.s + dialog->rem_uri.len - 1) || *(p+1)==';') { tbracket = 0; } else { tbracket = 1; } } else { tbracket = 1; } if((p=q_memrchr(dialog->loc_uri.s, '>', dialog->loc_uri.len))!=NULL) { if((p==dialog->loc_uri.s + dialog->loc_uri.len - 1) || *(p+1)==';') { fbracket = 0; } else { fbracket = 1; } } else { fbracket = 1; } *len += TO_LEN + dialog->rem_uri.len + (dialog->id.rem_tag.len ? (TOTAG_LEN + dialog->id.rem_tag.len) : 0) + CRLF_LEN; /* To */ if(tbracket) *len += 2; /* To-URI < > */ *len += FROM_LEN + dialog->loc_uri.len + (dialog->id.loc_tag.len ? (FROMTAG_LEN + dialog->id.loc_tag.len) : 0) + CRLF_LEN; /* From */ if(fbracket) *len += 2; /* From-URI < > */ *len += CALLID_LEN + dialog->id.call_id.len + CRLF_LEN; /* Call-ID */ *len += CSEQ_LEN + cseq.len + 1 + method->len + CRLF_LEN; /* CSeq */ *len += calculate_routeset_length(dialog); /* Route set */ *len += maxfwd_len; /* Max-forwards */ *len += CONTENT_LENGTH_LEN + content_length.len + CRLF_LEN; /* Content-Length */ *len += ((server_signature && user_agent_hdr.len>0) ? (user_agent_hdr.len + CRLF_LEN) : 0); /* Signature */ if(headers && headers->len>2) { /* Additional headers */ *len += headers->len; /* End of header if missing */ if(headers->s[headers->len - 1] != '\n') *len += CRLF_LEN; } *len += (body ? body->len : 0); /* Message body */ *len += CRLF_LEN; /* End of Header */ buf = shm_malloc(*len + 1); if (!buf) { LM_ERR("no more shared memory (%d)\n", *len); goto error; } w = buf; w = print_request_uri(w, method, dialog, t, branch); /* Request-URI */ memapp(w, via.s, via.len); /* Top-most Via */ w = print_to(w, dialog, t, tbracket); /* To */ w = print_from(w, dialog, t, fbracket); /* From */ if(fromtag.len>0) { dialog->id.loc_tag = loc_tag; } w = print_cseq(w, &cseq, method, t); /* CSeq */ w = print_callid(w, dialog, t); /* Call-ID */ w = print_routeset(w, dialog); /* Route set */ if(maxfwd_len>0) memapp(w, MAXFWD_HEADER, MAXFWD_HEADER_LEN); /* Max-forwards */ /* Content-Length */ memapp(w, CONTENT_LENGTH, CONTENT_LENGTH_LEN); memapp(w, content_length.s, content_length.len); memapp(w, CRLF, CRLF_LEN); /* Server signature */ if (server_signature && user_agent_hdr.len>0) { memapp(w, user_agent_hdr.s, user_agent_hdr.len); memapp(w, CRLF, CRLF_LEN); } if(headers && headers->len>2) { memapp(w, headers->s, headers->len); if(headers->s[headers->len - 1] != '\n') memapp(w, CRLF, CRLF_LEN); } memapp(w, CRLF, CRLF_LEN); if (body) memapp(w, body->s, body->len); #ifdef EXTRA_DEBUG assert(w-buf == *len); #endif memapp(w, "\0", 1); pkg_free(via.s); return buf; error: pkg_free(via.s); return 0; }
int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd) { hdr_field_t *hdr; via_body_t *via; rr_t *rr; int i; int vlen; int r2; if(ptsd->cp==NULL) { ptsd->cp = ptsd->cbuf; } i = 0; for(hdr=msg->h_via1; hdr; hdr=next_sibling_hdr(hdr)) { for(via=(struct via_body*)hdr->parsed; via; via=via->next) { i++; vlen = tps_skip_rw(via->name.s, via->bsize); if(ptsd->cp + vlen + 2 >= ptsd->cbuf + TPS_DATA_SIZE) { LM_ERR("no more spage to pack via headers\n"); return -1; } if(i>1) { *ptsd->cp = ','; ptsd->cp++; if(i>2) { ptsd->x_via2.len++; } } memcpy(ptsd->cp, via->name.s, vlen); if(i==1) { ptsd->x_via1.s = ptsd->cp; ptsd->x_via1.len = vlen; if(via->branch!=NULL) { ptsd->x_vbranch1.s = ptsd->x_via1.s + (via->branch->value.s - via->name.s); ptsd->x_vbranch1.len = via->branch->value.len; } } else { if(i==2) { ptsd->x_via2.s = ptsd->cp; } ptsd->x_via2.len += vlen; } ptsd->cp += vlen; } } LM_DBG("compacted headers - x_via1: [%.*s](%d) - x_via2: [%.*s](%d)" " - x_vbranch1: [%.*s](%d)\n", ptsd->x_via1.len, ZSW(ptsd->x_via1.s), ptsd->x_via1.len, ptsd->x_via2.len, ZSW(ptsd->x_via2.s), ptsd->x_via2.len, ptsd->x_vbranch1.len, ZSW(ptsd->x_vbranch1.s), ptsd->x_vbranch1.len); ptsd->a_rr.len = 0; ptsd->s_rr.len = 0; i = 0; r2 = 0; for(hdr=msg->record_route; hdr; hdr=next_sibling_hdr(hdr)) { if (parse_rr(hdr) < 0) { LM_ERR("failed to parse RR\n"); return -1; } for(rr =(rr_t*)hdr->parsed; rr; rr=rr->next) { i++; if(ptsd->cp + rr->nameaddr.uri.len + 4 >= ptsd->cbuf + TPS_DATA_SIZE) { LM_ERR("no more spage to pack rr headers\n"); return -1; } if(i>1) { if(i==2 &&r2==0) { ptsd->s_rr.len = ptsd->a_rr.len; } if(i==3 &&r2==1) { ptsd->s_rr.len = ptsd->a_rr.len; } *ptsd->cp = ','; ptsd->cp++; ptsd->a_rr.len++; } *ptsd->cp = '<'; if(i==1) { ptsd->a_rr.s = ptsd->cp; ptsd->s_rr.s = ptsd->cp; } if(i==2 && r2==0) { ptsd->a_rr.s = ptsd->cp; ptsd->a_rr.len = 0; } if(i==3 && r2==1) { ptsd->a_rr.s = ptsd->cp; ptsd->a_rr.len = 0; } ptsd->cp++; ptsd->a_rr.len++; memcpy(ptsd->cp, rr->nameaddr.uri.s, rr->nameaddr.uri.len); if(i==1) { ptsd->bs_contact.s = ptsd->cp; ptsd->bs_contact.len = rr->nameaddr.uri.len; if(_strnstr(ptsd->bs_contact.s, ";r2=on", ptsd->bs_contact.len)==0) { LM_DBG("single record routing by proxy\n"); ptsd->as_contact.s = ptsd->cp; ptsd->as_contact.len = rr->nameaddr.uri.len; } else { r2 = 1; } } else { if(i==2 && ptsd->as_contact.len==0) { LM_DBG("double record routing by proxy\n"); ptsd->as_contact.s = ptsd->cp; ptsd->as_contact.len = rr->nameaddr.uri.len; } } ptsd->a_rr.len += rr->nameaddr.uri.len; ptsd->cp += rr->nameaddr.uri.len; *ptsd->cp = '>'; ptsd->cp++; ptsd->a_rr.len++; } } if(i==1) { ptsd->s_rr.len = ptsd->a_rr.len; ptsd->a_rr.len = 0; } if(i==2 && r2==1) { ptsd->s_rr.len = ptsd->a_rr.len; ptsd->a_rr.len = 0; } LM_DBG("compacted headers - a_rr: [%.*s](%d) - b_rr: [%.*s](%d)" " - s_rr: [%.*s](%d)\n", ptsd->a_rr.len, ZSW(ptsd->a_rr.s), ptsd->a_rr.len, ptsd->b_rr.len, ZSW(ptsd->b_rr.s), ptsd->b_rr.len, ptsd->s_rr.len, ZSW(ptsd->s_rr.s), ptsd->s_rr.len); LM_DBG("compacted headers - as_contact: [%.*s](%d) - bs_contact: [%.*s](%d)\n", ptsd->as_contact.len, ZSW(ptsd->as_contact.s), ptsd->as_contact.len, ptsd->bs_contact.len, ZSW(ptsd->bs_contact.s), ptsd->bs_contact.len); ptsd->x_rr = ptsd->a_rr; ptsd->s_method_id = get_cseq(msg)->method_id; return 0; }