... | ... |
@@ -762,7 +762,10 @@ int request(uac_req_t *uac_r, str* ruri, str* to, str* from, str *next_hop) |
762 | 762 |
|
763 | 763 |
if (check_params(uac_r, to, from) < 0) goto err; |
764 | 764 |
|
765 |
- generate_callid(&callid); |
|
765 |
+ if (uac_r->callid == NULL || uac_r->callid->len <= 0) |
|
766 |
+ generate_callid(&callid); |
|
767 |
+ else |
|
768 |
+ callid = *uac_r->callid; |
|
766 | 769 |
generate_fromtag(&fromtag, &callid); |
767 | 770 |
|
768 | 771 |
if (new_dlg_uac(&callid, &fromtag, DEFAULT_CSEQ, from, to, &dialog) < 0) { |
... | ... |
@@ -61,6 +61,8 @@ typedef struct _uac_send_info { |
61 | 61 |
char b_apasswd[64]; |
62 | 62 |
str s_apasswd; |
63 | 63 |
unsigned int onreply; |
64 |
+ char b_callid[128]; |
|
65 |
+ str s_callid; |
|
64 | 66 |
} uac_send_info_t; |
65 | 67 |
|
66 | 68 |
static struct _uac_send_info _uac_req; |
... | ... |
@@ -84,6 +86,7 @@ uac_send_info_t *uac_send_info_clone(uac_send_info_t *ur) |
84 | 86 |
tp->s_ouri.s = tp->b_ouri; |
85 | 87 |
tp->s_auser.s = tp->b_auser; |
86 | 88 |
tp->s_apasswd.s = tp->b_apasswd; |
89 |
+ tp->s_callid.s = tp->b_callid; |
|
87 | 90 |
|
88 | 91 |
return tp; |
89 | 92 |
} |
... | ... |
@@ -134,6 +137,10 @@ int pv_get_uac_req(struct sip_msg *msg, pv_param_t *param, |
134 | 137 |
if(_uac_req.s_apasswd.len<=0) |
135 | 138 |
return pv_get_null(msg, param, res); |
136 | 139 |
return pv_get_strval(msg, param, res, &_uac_req.s_apasswd); |
140 |
+ case 11: |
|
141 |
+ if(_uac_req.s_callid.len<=0) |
|
142 |
+ return pv_get_null(msg, param, res); |
|
143 |
+ return pv_get_strval(msg, param, res, &_uac_req.s_callid); |
|
137 | 144 |
default: |
138 | 145 |
return pv_get_uintval(msg, param, res, _uac_req.flags); |
139 | 146 |
} |
... | ... |
@@ -160,6 +167,7 @@ int pv_set_uac_req(struct sip_msg* msg, pv_param_t *param, |
160 | 167 |
_uac_req.s_body.len = 0; |
161 | 168 |
_uac_req.s_method.len = 0; |
162 | 169 |
_uac_req.onreply = 0; |
170 |
+ _uac_req.s_callid.len = 0; |
|
163 | 171 |
} |
164 | 172 |
break; |
165 | 173 |
case 1: |
... | ... |
@@ -360,6 +368,21 @@ int pv_set_uac_req(struct sip_msg* msg, pv_param_t *param, |
360 | 368 |
_uac_req.s_apasswd.s[val->rs.len] = '\0'; |
361 | 369 |
_uac_req.s_apasswd.len = val->rs.len; |
362 | 370 |
break; |
371 |
+ case 11: |
|
372 |
+ if(val==NULL) |
|
373 |
+ { |
|
374 |
+ _uac_req.s_callid.len = 0; |
|
375 |
+ return 0; |
|
376 |
+ } |
|
377 |
+ if(!(val->flags&PV_VAL_STR)) |
|
378 |
+ { |
|
379 |
+ LM_ERR("Invalid value type\n"); |
|
380 |
+ return -1; |
|
381 |
+ } |
|
382 |
+ memcpy(_uac_req.s_callid.s, val->rs.s, val->rs.len); |
|
383 |
+ _uac_req.s_callid.s[val->rs.len] = '\0'; |
|
384 |
+ _uac_req.s_callid.len = val->rs.len; |
|
385 |
+ break; |
|
363 | 386 |
} |
364 | 387 |
return 0; |
365 | 388 |
} |
... | ... |
@@ -399,6 +422,8 @@ int pv_parse_uac_req_name(pv_spec_p sp, str *in) |
399 | 422 |
case 6: |
400 | 423 |
if(strncmp(in->s, "method", 6)==0) |
401 | 424 |
sp->pvp.pvn.u.isname.name.n = 7; |
425 |
+ else if(strncmp(in->s, "callid", 6)==0) |
|
426 |
+ sp->pvp.pvn.u.isname.name.n = 11; |
|
402 | 427 |
else goto error; |
403 | 428 |
break; |
404 | 429 |
case 7: |
... | ... |
@@ -439,6 +464,7 @@ void uac_req_init(void) |
439 | 464 |
_uac_req.s_method.s = _uac_req.b_method; |
440 | 465 |
_uac_req.s_auser.s = _uac_req.b_auser; |
441 | 466 |
_uac_req.s_apasswd.s = _uac_req.b_apasswd; |
467 |
+ _uac_req.s_callid.s = _uac_req.b_callid; |
|
442 | 468 |
return; |
443 | 469 |
} |
444 | 470 |
|
... | ... |
@@ -612,6 +638,7 @@ int uac_req_send(struct sip_msg *msg, char *s1, char *s2) |
612 | 638 |
/* Callback parameter */ |
613 | 639 |
uac_r.cbp = (void*)tp; |
614 | 640 |
} |
641 |
+ uac_r.callid = (_uac_req.s_callid.len <= 0) ? NULL : &_uac_req.s_callid; |
|
615 | 642 |
ret = tmb.t_request(&uac_r, /* UAC Req */ |
616 | 643 |
&_uac_req.s_ruri, /* Request-URI */ |
617 | 644 |
(_uac_req.s_turi.len<=0)?&_uac_req.s_ruri:&_uac_req.s_turi, /* To */ |