int dlg_th_onroute(struct dlg_cell *dlg, struct sip_msg *req, int dir) { struct hdr_field *it; char* buf = req->buf; /* delete vias */ if(dlg_del_vias(req) < 0) { LM_ERR("Failed to remove via headers\n"); return -1; } /* delete record route */ for (it=req->record_route;it;it=it->sibling) { if (del_lump(req, it->name.s - buf, it->len,HDR_RECORDROUTE_T) == 0) { LM_ERR("del_lump failed\n"); return -1; } LM_DBG("Delete record route: [%.*s]\n", it->len, it->name.s); } /* add route headers */ fix_route_dialog(req, dlg); /* replace contact*/ if(dlg_replace_contact(req, dlg) < 0) { LM_ERR("Failed to replace contact\n"); return -1; } /* register tm callback for response in */ ref_dlg( dlg , 1); if ( d_tmb.register_tmcb( req, 0, TMCB_RESPONSE_FWDED, (dir==DLG_DIR_UPSTREAM)?dlg_th_down_onreply:dlg_th_up_onreply, (void*)dlg, unreference_dialog)<0 ) { LM_ERR("failed to register TMCB\n"); unref_dlg( dlg , 1); } if (dir == DLG_DIR_UPSTREAM) { /* destination leg is the caller - force the send socket * as the one the caller was inited from */ req->force_send_socket = dlg->legs[DLG_CALLER_LEG].bind_addr; LM_DBG("forcing send socket for req going to caller\n"); } else { /* destination leg is the callee - force the send socket * as the one the callee was inited from */ req->force_send_socket = dlg->legs[callee_idx(dlg)].bind_addr; LM_DBG("forcing send socket for req going to callee\n"); } return 0; }
static int w_fix_route_dialog(struct sip_msg *req) { struct dlg_cell *dlg; dlg = get_current_dialog(); if (dlg==NULL) return -1; if (fix_route_dialog( req, dlg )!=0) return -1; return 1; }
int dlg_th_onroute(struct dlg_cell *dlg, struct sip_msg *req, int dir) { struct hdr_field *it; char* buf = req->buf; int leg_id; if(dir == DLG_DIR_UPSTREAM) leg_id = callee_idx(dlg); else leg_id = DLG_CALLER_LEG; /* delete vias */ if(dlg_save_del_vias(req, &dlg->legs[leg_id]) < 0) { LM_ERR("Failed to save and remove via headers\n"); return -1; } /* delete record route */ for (it=req->record_route;it;it=it->sibling) { if (del_lump(req, it->name.s - buf, it->len,HDR_RECORDROUTE_T) == 0) { LM_ERR("del_lump failed \n"); return -1; } LM_DBG("Delete record route: [%.*s]\n", it->len, it->name.s); } /* add route headers */ fix_route_dialog(req, dlg); /* replace contact*/ if(dlg_replace_contact(req, dlg) < 0) { LM_ERR("Failed to replace contact\n"); return -1; } /* register tm callback for response in */ ref_dlg( dlg , 1); if ( d_tmb.register_tmcb( req, 0, TMCB_RESPONSE_FWDED, (dir==DLG_DIR_UPSTREAM)?dlg_th_down_onreply:dlg_th_up_onreply, (void*)dlg, unreference_dialog)<0 ) { LM_ERR("failed to register TMCB\n"); unref_dlg( dlg , 1); } return 0; }