int tps_request_sent(sip_msg_t *msg, int dialog, int direction, int local) { tps_data_t mtsd; tps_data_t stsd; tps_data_t *ptsd; str lkey; memset(&mtsd, 0, sizeof(tps_data_t)); memset(&stsd, 0, sizeof(tps_data_t)); ptsd = &mtsd; if(tps_pack_request(msg, &mtsd)<0) { LM_ERR("failed to extract and pack the headers\n"); return -1; } if(direction==TPS_DIR_DOWNSTREAM) { lkey = get_from(msg)->tag_value; } else { lkey = get_to(msg)->tag_value; } tps_storage_lock_get(&lkey); if(dialog==0) { if(tps_storage_record(msg, ptsd)<0) { goto error; } } /* local generated requests */ if(local) { /* ACK and CANCEL go downstream */ if(get_cseq(msg)->method_id==METHOD_ACK || get_cseq(msg)->method_id==METHOD_CANCEL || local==2) { // th_mask_callid(&msg); goto done; } else { /* should be for upstream */ goto done; } } tps_remove_headers(msg, HDR_RECORDROUTE_T); tps_remove_headers(msg, HDR_CONTACT_T); tps_remove_headers(msg, HDR_VIA_T); tps_reinsert_via(msg, ptsd, &ptsd->x_via1); if(direction==TPS_DIR_UPSTREAM) { tps_reinsert_contact(msg, ptsd, &ptsd->as_contact); } else { tps_reinsert_contact(msg, ptsd, &ptsd->bs_contact); } done: tps_storage_lock_release(&lkey); return 0; error: tps_storage_lock_release(&lkey); return -1; }
int tps_response_sent(sip_msg_t *msg) { tps_data_t mtsd; tps_data_t stsd; tps_data_t btsd; str lkey; int direction = TPS_DIR_UPSTREAM; str xvbranch = {0, 0}; LM_DBG("handling outgoing response\n"); memset(&mtsd, 0, sizeof(tps_data_t)); memset(&stsd, 0, sizeof(tps_data_t)); memset(&btsd, 0, sizeof(tps_data_t)); if(tps_get_xbranch(msg, &xvbranch)<0) { LM_DBG("no x-branch header - nothing to do\n"); return 0; } if(tps_pack_message(msg, &mtsd)<0) { LM_ERR("failed to extract and pack the headers\n"); return -1; } mtsd.x_vbranch1 = xvbranch; tps_remove_xbranch(msg); if(get_cseq(msg)->method_id==METHOD_MESSAGE) { tps_remove_headers(msg, HDR_RECORDROUTE_T); tps_remove_headers(msg, HDR_CONTACT_T); return 0; } lkey = msg->callid->body; tps_storage_lock_get(&lkey); if(tps_storage_load_branch(msg, &mtsd, &btsd)<0) { goto error; } LM_DBG("loaded dialog a_uuid [%.*s]\n", btsd.a_uuid.len, ZSW(btsd.a_uuid.s)); if(tps_storage_load_dialog(msg, &btsd, &stsd)<0) { goto error; } tps_storage_lock_release(&lkey); tps_remove_headers(msg, HDR_RECORDROUTE_T); tps_remove_headers(msg, HDR_CONTACT_T); if(direction==TPS_DIR_UPSTREAM) { tps_reinsert_contact(msg, &stsd, &stsd.as_contact); } else { tps_reinsert_contact(msg, &stsd, &stsd.bs_contact); } tps_reappend_rr(msg, &btsd, &btsd.x_rr); return 0; error: tps_storage_lock_release(&lkey); return -1; }
int tps_response_received(sip_msg_t *msg) { tps_data_t mtsd; tps_data_t stsd; tps_data_t btsd; str lkey; str ftag; uint32_t direction; LM_DBG("handling incoming response\n"); if(msg->first_line.u.reply.statuscode==100) { /* nothing to do - it should be absorbed */ return 0; } memset(&mtsd, 0, sizeof(tps_data_t)); memset(&stsd, 0, sizeof(tps_data_t)); memset(&btsd, 0, sizeof(tps_data_t)); lkey = msg->callid->body; if(tps_pack_message(msg, &mtsd)<0) { LM_ERR("failed to extract and pack the headers\n"); return -1; } tps_storage_lock_get(&lkey); if(tps_storage_load_branch(msg, &mtsd, &btsd)<0) { goto error; } LM_DBG("loaded dialog a_uuid [%.*s]\n", btsd.a_uuid.len, ZSW(btsd.a_uuid.s)); if(tps_storage_load_dialog(msg, &btsd, &stsd)<0) { goto error; } /* detect direction - get from-tag */ if(parse_from_header(msg)<0 || msg->from==NULL) { LM_ERR("failed getting 'from' header!\n"); goto error; } ftag = get_from(msg)->tag_value; if(stsd.a_tag.len!=ftag.len) { direction = TPS_DIR_UPSTREAM; } else { if(memcmp(stsd.a_tag.s, ftag.s, ftag.len)==0) { direction = TPS_DIR_DOWNSTREAM; } else { direction = TPS_DIR_UPSTREAM; } } mtsd.direction = direction; if(tps_storage_update_branch(msg, &mtsd, &btsd)<0) { goto error; } if(tps_storage_update_dialog(msg, &mtsd, &stsd)<0) { goto error; } tps_storage_lock_release(&lkey); tps_reappend_via(msg, &btsd, &btsd.x_via); tps_reappend_rr(msg, &btsd, &btsd.s_rr); tps_reappend_rr(msg, &btsd, &btsd.x_rr); tps_append_xbranch(msg, &mtsd.x_vbranch1); return 0; error: tps_storage_lock_release(&lkey); return -1; }
int tps_request_sent(sip_msg_t *msg, int dialog, int local) { tps_data_t mtsd; tps_data_t btsd; tps_data_t stsd; tps_data_t *ptsd; str lkey; str xuuid; int direction = TPS_DIR_DOWNSTREAM; LM_DBG("handling outgoing request\n"); memset(&mtsd, 0, sizeof(tps_data_t)); memset(&btsd, 0, sizeof(tps_data_t)); memset(&stsd, 0, sizeof(tps_data_t)); ptsd = &mtsd; if(tps_pack_message(msg, &mtsd)<0) { LM_ERR("failed to extract and pack the headers\n"); return -1; } if(dialog!=0) { if(tps_get_xuuid(msg, &xuuid)<0) { LM_DBG("no x-uuid header - nothing to do\n"); return 0; } mtsd.a_uuid = xuuid; tps_remove_xuuid(msg); } lkey = msg->callid->body; tps_storage_lock_get(&lkey); if(tps_storage_load_branch(msg, &mtsd, &btsd)!=0) { if(tps_storage_record(msg, ptsd, dialog)<0) { goto error; } } else { ptsd = &btsd; } if(dialog!=0) { if(tps_storage_load_dialog(msg, &mtsd, &stsd)==0) { ptsd = &stsd; } } /* local generated requests */ if(local) { /* ACK and CANCEL go downstream */ if(get_cseq(msg)->method_id==METHOD_ACK || get_cseq(msg)->method_id==METHOD_CANCEL || local==2) { // ts_mask_callid(&msg); goto done; } else { /* should be for upstream */ goto done; } } tps_remove_headers(msg, HDR_RECORDROUTE_T); tps_remove_headers(msg, HDR_CONTACT_T); tps_remove_headers(msg, HDR_VIA_T); tps_reinsert_via(msg, &mtsd, &mtsd.x_via1); if(direction==TPS_DIR_UPSTREAM) { tps_reinsert_contact(msg, ptsd, &ptsd->as_contact); } else { tps_reinsert_contact(msg, ptsd, &ptsd->bs_contact); } if(dialog!=0) { tps_storage_end_dialog(msg, &mtsd, ptsd); } done: tps_storage_lock_release(&lkey); return 0; error: tps_storage_lock_release(&lkey); return -1; }
int tps_request_received(sip_msg_t *msg, int dialog) { tps_data_t mtsd; tps_data_t stsd; str lkey; str ftag; str nuri; uint32_t direction = TPS_DIR_DOWNSTREAM; int ret; LM_DBG("handling incoming request\n"); if(dialog==0) { /* nothing to do for initial request */ return 0; } memset(&mtsd, 0, sizeof(tps_data_t)); memset(&stsd, 0, sizeof(tps_data_t)); if(tps_pack_message(msg, &mtsd)<0) { LM_ERR("failed to extract and pack the headers\n"); return -1; } ret = tps_dlg_message_update(msg, &mtsd); if(ret<0) { LM_ERR("failed to update on dlg message\n"); return -1; } lkey = msg->callid->body; tps_storage_lock_get(&lkey); if(tps_storage_load_dialog(msg, &mtsd, &stsd)<0) { goto error; } /* detect direction - get from-tag */ if(parse_from_header(msg)<0 || msg->from==NULL) { LM_ERR("failed getting 'from' header!\n"); goto error; } ftag = get_from(msg)->tag_value; if(stsd.a_tag.len!=ftag.len) { direction = TPS_DIR_UPSTREAM; } else { if(memcmp(stsd.a_tag.s, ftag.s, ftag.len)==0) { direction = TPS_DIR_DOWNSTREAM; } else { direction = TPS_DIR_UPSTREAM; } } mtsd.direction = direction; tps_storage_lock_release(&lkey); if(direction == TPS_DIR_UPSTREAM) { nuri = stsd.a_contact; } else { nuri = stsd.b_contact; } if(nuri.len>0) { if(rewrite_uri(msg, &nuri)<0) { LM_ERR("failed to update r-uri\n"); return -1; } } if(tps_reappend_route(msg, &stsd, &stsd.s_rr, (direction==TPS_DIR_UPSTREAM)?0:1)<0) { LM_ERR("failed to reappend s-route\n"); return -1; } if(direction == TPS_DIR_UPSTREAM) { if(tps_reappend_route(msg, &stsd, &stsd.a_rr, 0)<0) { LM_ERR("failed to reappend a-route\n"); return -1; } } else { if(tps_reappend_route(msg, &stsd, &stsd.b_rr, 0)<0) { LM_ERR("failed to reappend b-route\n"); return -1; } } if(dialog!=0) { tps_append_xuuid(msg, &stsd.a_uuid); } return 0; error: tps_storage_lock_release(&lkey); return -1; }