mirror of https://github.com/sipwise/kamailio.git
It does not contain ./pkg folder yet. If a patch is sent upstream we can remove afterwards. It makes also easier to sync with upstream and just apply the list of patches. Con: Each change to kamailio code will need to be stored as patch too. Do you read me Richard and Andi? :)remotes/origin/3.3+ngcp2.6
parent
de61a7b4ca
commit
045457862f
@ -0,0 +1,110 @@
|
||||
Index: modules_k/acc/acc_api.h
|
||||
===================================================================
|
||||
--- modules_k/acc/acc_api.h (revisión: 9210)
|
||||
+++ modules_k/acc/acc_api.h (revisión: 9211)
|
||||
@@ -57,6 +57,7 @@
|
||||
struct hdr_field *to;
|
||||
str text;
|
||||
time_t ts;
|
||||
+ uint64_t time_hires;
|
||||
} acc_enviroment_t;
|
||||
|
||||
/* acc extra parameter */
|
||||
Index: modules_k/acc/acc_mod.c
|
||||
===================================================================
|
||||
--- modules_k/acc/acc_mod.c (revisión: 9210)
|
||||
+++ modules_k/acc/acc_mod.c (revisión: 9211)
|
||||
@@ -193,6 +193,7 @@
|
||||
str acc_sipcode_col = str_init("sip_code");
|
||||
str acc_sipreason_col = str_init("sip_reason");
|
||||
str acc_time_col = str_init("time");
|
||||
+str acc_time_hires_col = str_init("time_hires");
|
||||
int acc_db_insert_mode = 0;
|
||||
#endif
|
||||
|
||||
@@ -287,6 +288,7 @@
|
||||
{"acc_sip_code_column", STR_PARAM, &acc_sipcode_col.s },
|
||||
{"acc_sip_reason_column",STR_PARAM, &acc_sipreason_col.s },
|
||||
{"acc_time_column", STR_PARAM, &acc_time_col.s },
|
||||
+ {"acc_time_hires_column", STR_PARAM, &acc_time_hires_col.s },
|
||||
{"db_insert_mode", INT_PARAM, &acc_db_insert_mode },
|
||||
#endif
|
||||
{0,0,0}
|
||||
@@ -429,6 +431,7 @@
|
||||
acc_sipcode_col.len = strlen(acc_sipcode_col.s);
|
||||
acc_sipreason_col.len = strlen(acc_sipreason_col.s);
|
||||
acc_time_col.len = strlen(acc_time_col.s);
|
||||
+ acc_time_hires_col.len = strlen(acc_time_hires_col.s);
|
||||
#endif
|
||||
|
||||
if (log_facility_str) {
|
||||
Index: modules_k/acc/acc.c
|
||||
===================================================================
|
||||
--- modules_k/acc/acc.c (revisión: 9210)
|
||||
+++ modules_k/acc/acc.c (revisión: 9211)
|
||||
@@ -125,6 +125,14 @@
|
||||
struct hdr_field *from;
|
||||
struct hdr_field *to;
|
||||
|
||||
+ struct timeval tv;
|
||||
+ struct timezone tz;
|
||||
+ struct tm *tm;
|
||||
+ uint64_t time_hires;
|
||||
+
|
||||
+ gettimeofday(&tv, &tz);
|
||||
+ tm = localtime(&tv.tv_sec);
|
||||
+
|
||||
/* method : request/reply - cseq parsed in acc_preparse_req() */
|
||||
c_vals[0] = get_cseq(req)->method;
|
||||
t_vals[0] = TYPE_STR;
|
||||
@@ -174,6 +182,10 @@
|
||||
t_vals[5] = TYPE_STR;
|
||||
|
||||
acc_env.ts = time(NULL);
|
||||
+
|
||||
+ time_hires = (tv.tv_sec * 1000) + tv.tv_usec / 1000;
|
||||
+ acc_env.time_hires = time_hires;
|
||||
+
|
||||
return ACC_CORE_LEN;
|
||||
}
|
||||
|
||||
@@ -306,7 +318,8 @@
|
||||
db_keys[n++] = &acc_sipcode_col;
|
||||
db_keys[n++] = &acc_sipreason_col;
|
||||
db_keys[n++] = &acc_time_col;
|
||||
- time_idx = n-1;
|
||||
+ db_keys[n++] = &acc_time_hires_col;
|
||||
+ time_idx = n-2;
|
||||
|
||||
/* init the extra db keys */
|
||||
for(extra=db_extra; extra ; extra=extra->next)
|
||||
@@ -322,6 +335,7 @@
|
||||
VAL_NULL(db_vals+i)=0;
|
||||
}
|
||||
VAL_TYPE(db_vals+time_idx)=DB1_DATETIME;
|
||||
+ VAL_TYPE(db_vals+time_idx+1)=DB1_DOUBLE;
|
||||
}
|
||||
|
||||
|
||||
@@ -380,7 +394,8 @@
|
||||
VAL_STR(db_vals+i) = val_arr[i];
|
||||
/* time value */
|
||||
VAL_TIME(db_vals+(m++)) = acc_env.ts;
|
||||
-
|
||||
+ VAL_DOUBLE(db_vals+(m++)) = ((double) acc_env.time_hires) / 1000;
|
||||
+ i = m;
|
||||
/* extra columns */
|
||||
m += extra2strar( db_extra, rq, val_arr+m, int_arr+m, type_arr+m);
|
||||
|
||||
Index: modules_k/acc/acc_mod.h
|
||||
===================================================================
|
||||
--- modules_k/acc/acc_mod.h (revisión: 9210)
|
||||
+++ modules_k/acc/acc_mod.h (revisión: 9211)
|
||||
@@ -90,6 +90,7 @@
|
||||
extern str acc_sipcode_col;
|
||||
extern str acc_sipreason_col;
|
||||
extern str acc_time_col;
|
||||
+extern str acc_time_hires_col;
|
||||
#endif /* SQL_ACC */
|
||||
|
||||
|
@ -0,0 +1,304 @@
|
||||
Index: modules/dialplan/dialplan.c
|
||||
===================================================================
|
||||
--- modules/dialplan/dialplan.c (revisión: 9230)
|
||||
+++ modules/dialplan/dialplan.c (revisión: 9231)
|
||||
@@ -277,7 +277,7 @@
|
||||
int no_change;
|
||||
pv_value_t val;
|
||||
|
||||
- no_change = (dest->type == PVT_NONE) || (!repl->s) || (!repl->len);
|
||||
+ no_change = (dest->type == PVT_NONE) || (!repl->s);
|
||||
|
||||
if (no_change)
|
||||
goto set_attr_pvar;
|
||||
Index: modules/dialplan/dp_repl.c
|
||||
===================================================================
|
||||
--- modules/dialplan/dp_repl.c (revisión: 9230)
|
||||
+++ modules/dialplan/dp_repl.c (revisión: 9231)
|
||||
@@ -147,41 +147,9 @@
|
||||
subst_comp = rule->subst_comp;
|
||||
repl_comp = rule->repl_comp;
|
||||
|
||||
- if(!repl_comp){
|
||||
- LM_DBG("null replacement\n");
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- if(subst_comp){
|
||||
- /*just in case something went wrong at load time*/
|
||||
- rc = pcre_fullinfo(subst_comp, NULL, PCRE_INFO_CAPTURECOUNT,
|
||||
- &cap_cnt);
|
||||
- if (rc != 0) {
|
||||
- LM_ERR("pcre_fullinfo on compiled pattern yielded error: %d\n",
|
||||
- rc);
|
||||
- return -1;;
|
||||
- }
|
||||
- if(repl_comp->max_pmatch > cap_cnt){
|
||||
- LM_ERR("illegal access to the %i-th subexpr of the subst expr\n",
|
||||
- repl_comp->max_pmatch);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- /*search for the pattern from the compiled subst_exp*/
|
||||
- if (pcre_exec(rule->subst_comp, NULL, string.s, string.len,
|
||||
- 0, 0, ovector, 3 * (MAX_REPLACE_WITH + 1)) <= 0) {
|
||||
- LM_ERR("the string %.*s matched "
|
||||
- "the match_exp %.*s but not the subst_exp %.*s!\n",
|
||||
- string.len, string.s,
|
||||
- rule->match_exp.len, rule->match_exp.s,
|
||||
- rule->subst_exp.len, rule->subst_exp.s);
|
||||
- return -1;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- /*simply copy from the replacing string*/
|
||||
- if(!subst_comp || (repl_comp->n_escapes <=0)){
|
||||
- if(!repl_comp->replacement.s || repl_comp->replacement.len == 0){
|
||||
+ if (!subst_comp) {
|
||||
+ /*simply copy from the replacing string*/
|
||||
+ if(!repl_comp || !repl_comp->replacement.s || repl_comp->replacement.len == 0){
|
||||
LM_ERR("invalid replacing string\n");
|
||||
goto error;
|
||||
}
|
||||
@@ -194,108 +162,156 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
- /* offset- offset in the replacement string */
|
||||
- result->len = repl_nb = offset = 0;
|
||||
- p=repl_comp->replacement.s;
|
||||
+ /*just in case something went wrong at load time*/
|
||||
+ rc = pcre_fullinfo(subst_comp, NULL, PCRE_INFO_CAPTURECOUNT,
|
||||
+ &cap_cnt);
|
||||
+ if (rc != 0) {
|
||||
+ LM_ERR("pcre_fullinfo on compiled pattern yielded error: %d\n",
|
||||
+ rc);
|
||||
+ return -1;;
|
||||
+ }
|
||||
+ if(repl_comp && repl_comp->max_pmatch > cap_cnt){
|
||||
+ LM_ERR("illegal access to the %i-th subexpr of the subst expr\n",
|
||||
+ repl_comp->max_pmatch);
|
||||
+ return -1;
|
||||
+ }
|
||||
|
||||
- while( repl_nb < repl_comp->n_escapes){
|
||||
+ /*search for the pattern from the compiled subst_exp*/
|
||||
+ if (pcre_exec(rule->subst_comp, NULL, string.s, string.len,
|
||||
+ 0, 0, ovector, 3 * (MAX_REPLACE_WITH + 1)) <= 0) {
|
||||
+ LM_ERR("the string %.*s matched "
|
||||
+ "the match_exp %.*s but not the subst_exp %.*s!\n",
|
||||
+ string.len, string.s,
|
||||
+ rule->match_exp.len, rule->match_exp.s,
|
||||
+ rule->subst_exp.len, rule->subst_exp.s);
|
||||
+ return -1;
|
||||
+ }
|
||||
|
||||
- token = repl_comp->replace[repl_nb];
|
||||
+ /* copy non-matched prefix of string to output */
|
||||
+ if (ovector[0] > 0) {
|
||||
+ if (ovector[0] >= MAX_PHONE_NB_DIGITS) {
|
||||
+ LM_ERR("overflow\n");
|
||||
+ goto error;
|
||||
+ }
|
||||
+ memcpy(result->s, string.s, ovector[0]);
|
||||
+ result->len += ovector[0];
|
||||
+ }
|
||||
|
||||
- if(offset< token.offset){
|
||||
- if((repl_comp->replacement.len < offset)||
|
||||
+ if (repl_comp) {
|
||||
+ /* offset- offset in the replacement string */
|
||||
+ repl_nb = offset = 0;
|
||||
+ p=repl_comp->replacement.s;
|
||||
+
|
||||
+ while( repl_nb < repl_comp->n_escapes){
|
||||
+
|
||||
+ token = repl_comp->replace[repl_nb];
|
||||
+
|
||||
+ if(offset< token.offset){
|
||||
+ if((repl_comp->replacement.len < offset)||
|
||||
(result->len + token.offset -offset >= MAX_PHONE_NB_DIGITS)){
|
||||
- LM_ERR("invalid length\n");
|
||||
- goto error;
|
||||
- }
|
||||
- /*copy from the replacing string*/
|
||||
- size = token.offset - offset;
|
||||
- memcpy(result->s + result->len, p + offset, size);
|
||||
- LM_DBG("copying <%.*s> from replacing string\n",
|
||||
- size, p + offset);
|
||||
- result->len += size;
|
||||
- offset = token.offset;
|
||||
- }
|
||||
-
|
||||
- switch(token.type) {
|
||||
- case REPLACE_NMATCH:
|
||||
- /*copy from the match subexpression*/
|
||||
- match_nb = token.u.nmatch * 2;
|
||||
- match.s = string.s + ovector[match_nb];
|
||||
- match.len = ovector[match_nb + 1] - ovector[match_nb];
|
||||
- if(result->len + match.len >= MAX_PHONE_NB_DIGITS){
|
||||
- LM_ERR("overflow\n");
|
||||
+ LM_ERR("invalid length\n");
|
||||
goto error;
|
||||
}
|
||||
+ /*copy from the replacing string*/
|
||||
+ size = token.offset - offset;
|
||||
+ memcpy(result->s + result->len, p + offset, size);
|
||||
+ LM_DBG("copying <%.*s> from replacing string\n",
|
||||
+ size, p + offset);
|
||||
+ result->len += size;
|
||||
+ offset = token.offset;
|
||||
+ }
|
||||
|
||||
- memcpy(result->s + result->len, match.s, match.len);
|
||||
- LM_DBG("copying match <%.*s> token size %d\n",
|
||||
- match.len, match.s, token.size);
|
||||
- result->len += match.len;
|
||||
- offset += token.size;
|
||||
+ switch(token.type) {
|
||||
+ case REPLACE_NMATCH:
|
||||
+ /*copy from the match subexpression*/
|
||||
+ match_nb = token.u.nmatch * 2;
|
||||
+ match.s = string.s + ovector[match_nb];
|
||||
+ match.len = ovector[match_nb + 1] - ovector[match_nb];
|
||||
+ if(result->len + match.len >= MAX_PHONE_NB_DIGITS){
|
||||
+ LM_ERR("overflow\n");
|
||||
+ goto error;
|
||||
+ }
|
||||
+
|
||||
+ memcpy(result->s + result->len, match.s, match.len);
|
||||
+ LM_DBG("copying match <%.*s> token size %d\n",
|
||||
+ match.len, match.s, token.size);
|
||||
+ result->len += match.len;
|
||||
+ offset += token.size;
|
||||
break;
|
||||
- case REPLACE_CHAR:
|
||||
- if(result->len + 1>= MAX_PHONE_NB_DIGITS){
|
||||
- LM_ERR("overflow\n");
|
||||
- goto error;
|
||||
- }
|
||||
- *(result->s + result->len) = token.u.c;
|
||||
- LM_DBG("copying char <%c> token size %d\n",
|
||||
+ case REPLACE_CHAR:
|
||||
+ if(result->len + 1>= MAX_PHONE_NB_DIGITS){
|
||||
+ LM_ERR("overflow\n");
|
||||
+ goto error;
|
||||
+ }
|
||||
+ *(result->s + result->len) = token.u.c;
|
||||
+ LM_DBG("copying char <%c> token size %d\n",
|
||||
token.u.c, token.size);
|
||||
- result->len++;
|
||||
- offset += token.size;
|
||||
+ result->len++;
|
||||
+ offset += token.size;
|
||||
break;
|
||||
- case REPLACE_URI:
|
||||
- if ( msg== NULL || msg->first_line.type!=SIP_REQUEST){
|
||||
- LM_CRIT("uri substitution attempt on no request"
|
||||
+ case REPLACE_URI:
|
||||
+ if ( msg== NULL || msg->first_line.type!=SIP_REQUEST){
|
||||
+ LM_CRIT("uri substitution attempt on no request"
|
||||
" message\n");
|
||||
- break; /* ignore, we can continue */
|
||||
- }
|
||||
- uri= (msg->new_uri.s)?(&msg->new_uri):
|
||||
- (&msg->first_line.u.request.uri);
|
||||
- if(result->len+uri->len>=MAX_PHONE_NB_DIGITS){
|
||||
- LM_ERR("overflow\n");
|
||||
- goto error;
|
||||
- }
|
||||
- memcpy(result->s + result->len, uri->s, uri->len);
|
||||
- LM_DBG("copying uri <%.*s> token size %d\n",
|
||||
+ break; /* ignore, we can continue */
|
||||
+ }
|
||||
+ uri= (msg->new_uri.s)?(&msg->new_uri):
|
||||
+ (&msg->first_line.u.request.uri);
|
||||
+ if(result->len+uri->len>=MAX_PHONE_NB_DIGITS){
|
||||
+ LM_ERR("overflow\n");
|
||||
+ goto error;
|
||||
+ }
|
||||
+ memcpy(result->s + result->len, uri->s, uri->len);
|
||||
+ LM_DBG("copying uri <%.*s> token size %d\n",
|
||||
uri->len, uri->s, token.size);
|
||||
- result->len+=uri->len;
|
||||
- offset += token.size;
|
||||
+ result->len+=uri->len;
|
||||
+ offset += token.size;
|
||||
break;
|
||||
- case REPLACE_SPEC:
|
||||
- if (msg== NULL) {
|
||||
- LM_DBG("replace spec attempted on no message\n");
|
||||
- break;
|
||||
- }
|
||||
- if (pv_get_spec_value(msg, &token.u.spec, &sv) != 0) {
|
||||
- LM_CRIT("item substitution returned error\n");
|
||||
- break; /* ignore, we can continue */
|
||||
- }
|
||||
- if(result->len+sv.rs.len>=MAX_PHONE_NB_DIGITS){
|
||||
- LM_ERR("rule_translate: overflow\n");
|
||||
- goto error;
|
||||
- }
|
||||
- memcpy(result->s + result->len, sv.rs.s,
|
||||
- sv.rs.len);
|
||||
- LM_DBG("copying pvar value <%.*s> token size %d\n",
|
||||
+ case REPLACE_SPEC:
|
||||
+ if (msg== NULL) {
|
||||
+ LM_DBG("replace spec attempted on no message\n");
|
||||
+ break;
|
||||
+ }
|
||||
+ if (pv_get_spec_value(msg, &token.u.spec, &sv) != 0) {
|
||||
+ LM_CRIT("item substitution returned error\n");
|
||||
+ break; /* ignore, we can continue */
|
||||
+ }
|
||||
+ if(result->len+sv.rs.len>=MAX_PHONE_NB_DIGITS){
|
||||
+ LM_ERR("rule_translate: overflow\n");
|
||||
+ goto error;
|
||||
+ }
|
||||
+ memcpy(result->s + result->len, sv.rs.s,
|
||||
+ sv.rs.len);
|
||||
+ LM_DBG("copying pvar value <%.*s> token size %d\n",
|
||||
sv.rs.len, sv.rs.s, token.size);
|
||||
- result->len+=sv.rs.len;
|
||||
- offset += token.size;
|
||||
+ result->len+=sv.rs.len;
|
||||
+ offset += token.size;
|
||||
break;
|
||||
- default:
|
||||
- LM_CRIT("unknown type %d\n", repl_comp->replace[repl_nb].type);
|
||||
- /* ignore it */
|
||||
+ default:
|
||||
+ LM_CRIT("unknown type %d\n", repl_comp->replace[repl_nb].type);
|
||||
+ /* ignore it */
|
||||
+ }
|
||||
+ repl_nb++;
|
||||
}
|
||||
- repl_nb++;
|
||||
+ /* anything left? */
|
||||
+ if(offset < repl_comp->replacement.len){
|
||||
+ /*copy from the replacing string*/
|
||||
+ size = repl_comp->replacement.len - offset;
|
||||
+ memcpy(result->s + result->len, p + offset, size);
|
||||
+ LM_DBG("copying leftover <%.*s> from replacing string\n",
|
||||
+ size, p + offset);
|
||||
+ result->len += size;
|
||||
+ }
|
||||
}
|
||||
- /* anything left? */
|
||||
- if( repl_nb && offset < repl_comp->replacement.len){
|
||||
- /*copy from the replacing string*/
|
||||
- size = repl_comp->replacement.len - offset;
|
||||
- memcpy(result->s + result->len, p + offset, size);
|
||||
- LM_DBG("copying leftover <%.*s> from replacing string\n",
|
||||
- size, p + offset);
|
||||
+
|
||||
+ /* copy non-matched suffix of string to output */
|
||||
+ size = string.len - ovector[1];
|
||||
+ if (size > 0) {
|
||||
+ if (result->len + size >= MAX_PHONE_NB_DIGITS) {
|
||||
+ LM_ERR("overflow\n");
|
||||
+ goto error;
|
||||
+ }
|
||||
+ memcpy(result->s + result->len, string.s + ovector[1], size);
|
||||
result->len += size;
|
||||
}
|
||||
|
@ -0,0 +1,77 @@
|
||||
Index: modules/rtpproxy/rtpproxy.c
|
||||
===================================================================
|
||||
--- modules/rtpproxy/rtpproxy.c (revisión: 9232)
|
||||
+++ modules/rtpproxy/rtpproxy.c (revisión: 9233)
|
||||
@@ -283,7 +283,8 @@
|
||||
static int alter_rtcp(struct sip_msg *msg, str *body, str *oldport, str *newport);
|
||||
static char *gencookie();
|
||||
static int rtpp_test(struct rtpp_node*, int, int);
|
||||
-static int unforce_rtp_proxy_f(struct sip_msg *, char *, char *);
|
||||
+static int unforce_rtp_proxy0_f(struct sip_msg *, char *, char *);
|
||||
+static int unforce_rtp_proxy1_f(struct sip_msg *, char *, char *);
|
||||
static int force_rtp_proxy(struct sip_msg *, char *, char *, int, int);
|
||||
static int start_recording_f(struct sip_msg *, char *, char *);
|
||||
static int rtpproxy_answer1_f(struct sip_msg *, char *, char *);
|
||||
@@ -349,12 +350,18 @@
|
||||
{"set_rtp_proxy_set", (cmd_function)set_rtp_proxy_set_f, 1,
|
||||
fixup_set_id, 0,
|
||||
ANY_ROUTE},
|
||||
- {"unforce_rtp_proxy", (cmd_function)unforce_rtp_proxy_f, 0,
|
||||
+ {"unforce_rtp_proxy", (cmd_function)unforce_rtp_proxy0_f, 0,
|
||||
0, 0,
|
||||
ANY_ROUTE},
|
||||
- {"rtpproxy_destroy", (cmd_function)unforce_rtp_proxy_f, 0,
|
||||
+ {"unforce_rtp_proxy", (cmd_function)unforce_rtp_proxy1_f, 1,
|
||||
0, 0,
|
||||
ANY_ROUTE},
|
||||
+ {"rtpproxy_destroy", (cmd_function)unforce_rtp_proxy0_f, 0,
|
||||
+ 0, 0,
|
||||
+ ANY_ROUTE},
|
||||
+ {"rtpproxy_destroy", (cmd_function)unforce_rtp_proxy1_f, 1,
|
||||
+ 0, 0,
|
||||
+ ANY_ROUTE},
|
||||
{"start_recording", (cmd_function)start_recording_f, 0,
|
||||
0, 0,
|
||||
ANY_ROUTE },
|
||||
@@ -1638,8 +1645,15 @@
|
||||
}
|
||||
|
||||
static int
|
||||
-unforce_rtp_proxy_f(struct sip_msg* msg, char* str1, char* str2)
|
||||
+unforce_rtp_proxy0_f(struct sip_msg* msg, char* str1, char* str2)
|
||||
{
|
||||
+ char arg[1] = {'\0'};
|
||||
+ return unforce_rtp_proxy1_f(msg, arg, str2);
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+unforce_rtp_proxy1_f(struct sip_msg* msg, char* str1, char* str2)
|
||||
+{
|
||||
str callid, from_tag, to_tag, viabranch;
|
||||
char *cp;
|
||||
int via = 0;
|
||||
@@ -1740,7 +1754,7 @@
|
||||
return -1;
|
||||
|
||||
if(method==METHOD_CANCEL || method==METHOD_BYE)
|
||||
- return unforce_rtp_proxy_f(msg, 0, 0);
|
||||
+ return unforce_rtp_proxy0_f(msg, 0, 0);
|
||||
|
||||
if(ip==NULL)
|
||||
{
|
||||
@@ -1766,13 +1780,13 @@
|
||||
&& tmb.t_gett()!=T_UNDEFINED)
|
||||
tmb.t_gett()->uas.request->msg_flags |= FL_SDP_BODY;
|
||||
if(route_type==FAILURE_ROUTE)
|
||||
- return unforce_rtp_proxy_f(msg, 0, 0);
|
||||
+ return unforce_rtp_proxy0_f(msg, 0, 0);
|
||||
return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 1,
|
||||
(ip!=NULL)?1:0);
|
||||
}
|
||||
} else if(msg->first_line.type == SIP_REPLY) {
|
||||
if(msg->first_line.u.reply.statuscode>=300)
|
||||
- return unforce_rtp_proxy_f(msg, 0, 0);
|
||||
+ return unforce_rtp_proxy0_f(msg, 0, 0);
|
||||
if(nosdp==0) {
|
||||
if(method==METHOD_UPDATE)
|
||||
return force_rtp_proxy(msg, flags, (cp!=NULL)?newip:ip, 0,
|
@ -0,0 +1,47 @@
|
||||
Index: modules_k/usrloc/ul_mi.c
|
||||
===================================================================
|
||||
--- modules_k/usrloc/ul_mi.c (revisión: 9238)
|
||||
+++ modules_k/usrloc/ul_mi.c (revisión: 9239)
|
||||
@@ -525,8 +525,10 @@
|
||||
if (str2q( &ci.q, node->value.s, node->value.len) < 0)
|
||||
goto bad_syntax;
|
||||
|
||||
- /* unused value (param 6) FIXME */
|
||||
+ /* path value (param 6) */
|
||||
node = node->next;
|
||||
+ if(strncmp(node->value.s, "0", 1) != 0 && node->value.len > 1)
|
||||
+ ci.path = &node->value;
|
||||
|
||||
/* flags value (param 7) */
|
||||
node = node->next;
|
||||
Index: utils/kamctl/kamctl
|
||||
===================================================================
|
||||
--- utils/kamctl/kamctl (revisión: 9238)
|
||||
+++ utils/kamctl/kamctl (revisión: 9239)
|
||||
@@ -2201,10 +2201,17 @@
|
||||
UL_EXPIRES=0
|
||||
UL_FLAGS=0
|
||||
BR_FLAGS=0
|
||||
+ UL_PATH=0
|
||||
elif [ $# -eq 4 ] ; then
|
||||
UL_EXPIRES=$4
|
||||
UL_FLAGS=0
|
||||
BR_FLAGS=0
|
||||
+ UL_PATH=0
|
||||
+ elif [ $# -eq 5 ] ; then
|
||||
+ UL_EXPIRES=$4
|
||||
+ UL_FLAGS=0
|
||||
+ BR_FLAGS=0
|
||||
+ UL_PATH="$5"
|
||||
else
|
||||
usage_usrloc
|
||||
exit 1
|
||||
@@ -2237,7 +2244,7 @@
|
||||
fi
|
||||
|
||||
$CTLCMD ul_add "$USRLOC_TABLE" "$OSERUSER@$OSERDOMAIN" "$2" \
|
||||
-"$UL_EXPIRES" "1.00" "0" "$UL_FLAGS" "$BR_FLAGS" "$ALL_METHODS"
|
||||
+"$UL_EXPIRES" "1.00" "$UL_PATH" "$UL_FLAGS" "$BR_FLAGS" "$ALL_METHODS"
|
||||
exit $?
|
||||
;;
|
||||
rm)
|
@ -0,0 +1,424 @@
|
||||
Index: modules_k/pcem/pcem_logic.c
|
||||
===================================================================
|
||||
--- modules_k/pcem/pcem_logic.c (revisión: 0)
|
||||
+++ modules_k/pcem/pcem_logic.c (revisión: 9441)
|
||||
@@ -0,0 +1,130 @@
|
||||
+/*
|
||||
+ * $Id$
|
||||
+ *
|
||||
+ * PacketCable Event Messages module
|
||||
+ *
|
||||
+ * Copyright (C) 2012 Sipwise GmbH
|
||||
+ *
|
||||
+ * This file is part of Kamailio, a free SIP server.
|
||||
+ *
|
||||
+ * Kamailio is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation; either version 2 of the License, or
|
||||
+ * (at your option) any later version
|
||||
+ *
|
||||
+ * Kamailio is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <string.h>
|
||||
+
|
||||
+#include "../../dprint.h"
|
||||
+#include "../../parser/parse_from.h"
|
||||
+#include "../../parser/parse_content.h"
|
||||
+#include "../../modules/tm/tm_load.h"
|
||||
+#include "../rr/api.h"
|
||||
+#include "../../flags.h"
|
||||
+#include "pcem_mod.h"
|
||||
+#include "pcem_logic.h"
|
||||
+
|
||||
+extern struct tm_binds tmb;
|
||||
+extern struct rr_binds rrb;
|
||||
+
|
||||
+#define is_pcem_flag_set(_rq,_flag) (((_flag) != -1) && (isflagset((_rq), (_flag)) == 1))
|
||||
+#define reset_pcem_flag(_rq,_flag) (resetflag((_rq), (_flag)))
|
||||
+
|
||||
+#define is_all_on(_rq) is_pcem_flag_set(_rq,pcem_all_flag)
|
||||
+#define is_qos_on(_rq) is_pcem_flag_set(_rq,pcem_qos_flag)
|
||||
+
|
||||
+static void tmcb_func( struct cell* t, int type, struct tmcb_params *ps );
|
||||
+
|
||||
+static inline int pcem_preparse_req(struct sip_msg *req)
|
||||
+{
|
||||
+/*
|
||||
+ if((parse_headers(req,HDR_CALLID_F|HDR_CSEQ_F|HDR_FROM_F|HDR_TO_F,0)<0)
|
||||
+ || (parse_from_header(req)<0 ) ) {
|
||||
+ LM_ERR("failed to preparse request\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+*/
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void pcem_onreq( struct cell* t, int type, struct tmcb_params *ps )
|
||||
+{
|
||||
+ int tmcb_types;
|
||||
+ int is_invite;
|
||||
+
|
||||
+ LM_ERR("pcem_onreq called for t(%p) event type %d\n", t, type);
|
||||
+
|
||||
+ if(ps->req && (is_all_on(ps->req) || is_qos_on(ps->req))) {
|
||||
+ LM_ERR("it's a request, is_all_on=%d, is_qos_on=%d, processing request\n",
|
||||
+ is_all_on(ps->req), is_qos_on(ps->req));
|
||||
+
|
||||
+ if (pcem_preparse_req(ps->req)<0)
|
||||
+ return;
|
||||
+
|
||||
+ is_invite = (ps->req->REQ_METHOD==METHOD_INVITE)?1:0;
|
||||
+
|
||||
+ tmcb_types =
|
||||
+ /* get completed transactions */
|
||||
+ TMCB_RESPONSE_OUT |
|
||||
+ /* get incoming replies ready for processing */
|
||||
+ TMCB_RESPONSE_IN |
|
||||
+ /* get failed transactions */
|
||||
+ (is_invite?TMCB_ON_FAILURE:0);
|
||||
+
|
||||
+ if (tmb.register_tmcb( 0, t, tmcb_types, tmcb_func, 0, 0 ) <= 0) {
|
||||
+ LM_ERR("cannot register additional callbacks\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ if(!rrb.is_direction(ps->req,RR_FLOW_UPSTREAM) ) {
|
||||
+ LM_DBG("detected an UPSTREAM req -> flaging it\n");
|
||||
+ ps->req->msg_flags |= FL_REQ_UPSTREAM;
|
||||
+ }
|
||||
+ */
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static inline void pcem_onreply_in(struct cell *t, struct sip_msg *req,
|
||||
+ struct sip_msg *reply, int code)
|
||||
+{
|
||||
+ LM_ERR("got a reply_in, code=%d\n", code);
|
||||
+}
|
||||
+
|
||||
+static inline void pcem_onreply(struct cell *t, struct sip_msg *req,
|
||||
+ struct sip_msg *reply, int code)
|
||||
+{
|
||||
+ LM_ERR("got a reply, code=%d\n", code);
|
||||
+}
|
||||
+
|
||||
+static inline void pcem_onfailure(struct cell *t, struct sip_msg *req,
|
||||
+ struct sip_msg *reply, int code)
|
||||
+{
|
||||
+ LM_ERR("got a failure\n");
|
||||
+}
|
||||
+
|
||||
+static void tmcb_func( struct cell* t, int type, struct tmcb_params *ps )
|
||||
+{
|
||||
+ LM_ERR("pcem callback called for t(%p) event type %d, reply code %d\n",
|
||||
+ t, type, ps->code);
|
||||
+ if (type&TMCB_RESPONSE_OUT) {
|
||||
+ pcem_onreply( t, ps->req, ps->rpl, ps->code);
|
||||
+ } else if (type&TMCB_ON_FAILURE) {
|
||||
+ pcem_onfailure( t, ps->req, ps->rpl, ps->code);
|
||||
+ } else if (type&TMCB_RESPONSE_IN) {
|
||||
+ pcem_onreply_in( t, ps->req, ps->rpl, ps->code);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
Index: modules_k/pcem/pcem_mod.c
|
||||
===================================================================
|
||||
--- modules_k/pcem/pcem_mod.c (revisión: 0)
|
||||
+++ modules_k/pcem/pcem_mod.c (revisión: 9441)
|
||||
@@ -0,0 +1,153 @@
|
||||
+/*
|
||||
+ * $Id$
|
||||
+ *
|
||||
+ * PacketCable Event Messages module
|
||||
+ *
|
||||
+ * Copyright (C) 2012 Sipwise GmbH
|
||||
+ *
|
||||
+ * This file is part of Kamailio, a free SIP server.
|
||||
+ *
|
||||
+ * Kamailio is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation; either version 2 of the License, or
|
||||
+ * (at your option) any later version
|
||||
+ *
|
||||
+ * Kamailio is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <string.h>
|
||||
+
|
||||
+#include "../../sr_module.h"
|
||||
+#include "../../dprint.h"
|
||||
+#include "../../mem/mem.h"
|
||||
+#include "../../modules/tm/tm_load.h"
|
||||
+#include "../../str.h"
|
||||
+#include "../rr/api.h"
|
||||
+#include "pcem_mod.h"
|
||||
+#include "pcem_logic.h"
|
||||
+
|
||||
+MODULE_VERSION
|
||||
+
|
||||
+struct tm_binds tmb;
|
||||
+struct rr_binds rrb;
|
||||
+
|
||||
+static int mod_init(void);
|
||||
+static void destroy(void);
|
||||
+static int child_init(int rank);
|
||||
+
|
||||
+int pcem_qos_flag = -1; /* don't send qos messages by default */
|
||||
+int pcem_all_flag = -1; /* don't send any messages by default */
|
||||
+
|
||||
+/*
|
||||
+static int bind_acc(acc_api_t* api);
|
||||
+static int acc_register_engine(acc_engine_t *eng);
|
||||
+static int acc_init_engines(void);
|
||||
+static acc_engine_t *_acc_engines=NULL;
|
||||
+*/
|
||||
+static int _pcem_module_initialized = 0;
|
||||
+
|
||||
+/*
|
||||
+static int acc_fixup(void** param, int param_no);
|
||||
+static int free_acc_fixup(void** param, int param_no);
|
||||
+*/
|
||||
+
|
||||
+
|
||||
+static cmd_export_t cmds[] = {
|
||||
+/*
|
||||
+ {"pcem_test", (cmd_function)w_pkg_em_test, 1,
|
||||
+ acc_fixup, free_acc_fixup,
|
||||
+ ANY_ROUTE},
|
||||
+*/
|
||||
+ {0, 0, 0, 0, 0, 0}
|
||||
+};
|
||||
+
|
||||
+
|
||||
+
|
||||
+static param_export_t params[] = {
|
||||
+ /*{"test_str", INT_PARAM, &test_str.s },*/
|
||||
+ {"qos_flag", INT_PARAM, &pcem_qos_flag },
|
||||
+ {"all_flag", INT_PARAM, &pcem_all_flag },
|
||||
+ {0,0,0}
|
||||
+};
|
||||
+
|
||||
+
|
||||
+struct module_exports exports= {
|
||||
+ "pcem",
|
||||
+ DEFAULT_DLFLAGS, /* dlopen flags */
|
||||
+ cmds, /* exported functions */
|
||||
+ params, /* exported params */
|
||||
+ 0, /* exported statistics */
|
||||
+ 0, /* exported MI functions */
|
||||
+ 0, /* exported pseudo-variables */
|
||||
+ 0, /* extra processes */
|
||||
+ mod_init, /* initialization module */
|
||||
+ 0, /* response function */
|
||||
+ destroy, /* destroy function */
|
||||
+ child_init /* per-child init function */
|
||||
+};
|
||||
+
|
||||
+
|
||||
+static int mod_init( void )
|
||||
+{
|
||||
+ if ((pcem_qos_flag != -1) &&
|
||||
+ !flag_in_range(pcem_qos_flag)) {
|
||||
+ LM_ERR("pcem_qos_flag set to invalid value\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if ((pcem_all_flag != -1) &&
|
||||
+ !flag_in_range(pcem_all_flag)) {
|
||||
+ LM_ERR("pcem_all_flag set to invalid value\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ /* load the TM API */
|
||||
+ if (load_tm_api(&tmb)!=0) {
|
||||
+ LM_ERR("can't load TM API\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ /* load the RR API */
|
||||
+ if (load_rr_api(&rrb)!=0) {
|
||||
+ LM_ERR("can't load RR API\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ /* we need the append_fromtag on in RR */
|
||||
+ if (!rrb.append_fromtag) {
|
||||
+ LM_ERR("'append_fromtag' RR param is not enabled\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ /* listen for all incoming requests */
|
||||
+ if ( tmb.register_tmcb( 0, 0, TMCB_REQUEST_IN, pcem_onreq, 0, 0 ) <=0 ) {
|
||||
+ LM_ERR("cannot register TMCB_REQUEST_IN callback\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ _pcem_module_initialized = 1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int child_init(int rank)
|
||||
+{
|
||||
+ if (rank==PROC_INIT || rank==PROC_MAIN || rank==PROC_TCP_MAIN)
|
||||
+ return 0; /* do nothing for the main process */
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void destroy(void)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
Index: modules_k/pcem/pcem_logic.h
|
||||
===================================================================
|
||||
--- modules_k/pcem/pcem_logic.h (revisión: 0)
|
||||
+++ modules_k/pcem/pcem_logic.h (revisión: 9441)
|
||||
@@ -0,0 +1,34 @@
|
||||
+/*
|
||||
+ * $Id$
|
||||
+ *
|
||||
+ * PacketCable Event Messages module
|
||||
+ *
|
||||
+ * Copyright (C) 2012 Sipwise GmbH
|
||||
+ *
|
||||
+ * This file is part of Kamailio, a free SIP server.
|
||||
+ *
|
||||
+ * Kamailio is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation; either version 2 of the License, or
|
||||
+ * (at your option) any later version
|
||||
+ *
|
||||
+ * Kamailio is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef _PCEM_LOGIC_H
|
||||
+#define _PCEM_LOGIC_H
|
||||
+
|
||||
+#include "../../str.h"
|
||||
+#include "../../modules/tm/t_hooks.h"
|
||||
+
|
||||
+void pcem_onreq( struct cell* t, int type, struct tmcb_params *ps );
|
||||
+
|
||||
+#endif
|
||||
Index: modules_k/pcem/pcem_mod.h
|
||||
===================================================================
|
||||
--- modules_k/pcem/pcem_mod.h (revisión: 0)
|
||||
+++ modules_k/pcem/pcem_mod.h (revisión: 9441)
|
||||
@@ -0,0 +1,33 @@
|
||||
+/*
|
||||
+ * $Id$
|
||||
+ *
|
||||
+ * PacketCable Event Messages module
|
||||
+ *
|
||||
+ * Copyright (C) 2012 Sipwise GmbH
|
||||
+ *
|
||||
+ * This file is part of Kamailio, a free SIP server.
|
||||
+ *
|
||||
+ * Kamailio is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation; either version 2 of the License, or
|
||||
+ * (at your option) any later version
|
||||
+ *
|
||||
+ * Kamailio is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef _PCEM_MOD_H
|
||||
+#define _PCEM_MOD_H
|
||||
+
|
||||
+/* module parameter declaration */
|
||||
+extern int pcem_qos_flag;
|
||||
+extern int pcem_all_flag;
|
||||
+
|
||||
+#endif
|
||||
Index: modules_k/pcem/Makefile
|
||||
===================================================================
|
||||
--- modules_k/pcem/Makefile (revisión: 0)
|
||||
+++ modules_k/pcem/Makefile (revisión: 9441)
|
||||
@@ -0,0 +1,18 @@
|
||||
+# $Id$
|
||||
+#
|
||||
+# pcem module makefile
|
||||
+#
|
||||
+#
|
||||
+# WARNING: do not run this directly, it should be run by the master Makefile
|
||||
+
|
||||
+include ../../Makefile.defs
|
||||
+auto_gen=
|
||||
+NAME=pcem.so
|
||||
+LIBS=
|
||||
+
|
||||
+DEFS+=-DOPENSER_MOD_INTERFACE
|
||||
+
|
||||
+SERLIBPATH=../../lib
|
||||
+SER_LIBS+=$(SERLIBPATH)/srdb1/srdb1 $(SERLIBPATH)/kcore/kcore
|
||||
+
|
||||
+include ../../Makefile.modules
|
||||
Index: Makefile
|
||||
===================================================================
|
||||
--- Makefile (revisión: 9440)
|
||||
+++ Makefile (revisión: 9441)
|
||||
@@ -170,7 +170,7 @@
|
||||
|
||||
# For radius
|
||||
module_group_radius=acc_radius auth_radius misc_radius avp_radius uri_radius \
|
||||
- peering
|
||||
+ peering pcem
|
||||
|
||||
# For presence
|
||||
# kamailio modules
|
||||
@@ -226,7 +226,7 @@
|
||||
module_group_kcpl=cpl-c
|
||||
|
||||
# K radius modules
|
||||
-module_group_kradius=acc_radius auth_radius misc_radius peering
|
||||
+module_group_kradius=acc_radius auth_radius misc_radius peering pcem
|
||||
|
||||
# K unixodbc module
|
||||
module_group_kunixodbc=db_unixodbc
|
||||
@@ -309,7 +309,7 @@
|
||||
db_sqlite db_unixodbc db_cassandra memcached mi_xmlrpc \
|
||||
perl perlvdb purple \
|
||||
snmpstats xmpp \
|
||||
- carrierroute peering \
|
||||
+ carrierroute peering pcem \
|
||||
dialplan lcr utils presence presence_mwi \
|
||||
presence_dialoginfo presence_xml pua pua_bla \
|
||||
pua_dialoginfo pua_usrloc pua_xmpp \
|
@ -0,0 +1,26 @@
|
||||
Index: Makefile
|
||||
===================================================================
|
||||
--- Makefile (revisión: 9534)
|
||||
+++ Makefile (revisión: 9535)
|
||||
@@ -884,7 +884,7 @@
|
||||
|
||||
.PHONY: install
|
||||
install: mk_params="compile_for_install=yes"
|
||||
-install: install-bin install-every-module install-cfg \
|
||||
+install: install-bin install-every-module \
|
||||
install-doc install-man install-utils install-share
|
||||
|
||||
.PHONY: dbinstall
|
||||
Index: utils/kamctl/Makefile
|
||||
===================================================================
|
||||
--- utils/kamctl/Makefile (revisión: 9534)
|
||||
+++ utils/kamctl/Makefile (revisión: 9535)
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
install-if-newer: install
|
||||
|
||||
-install: install-cfg install-bin install-man install-modules
|
||||
+install: install-bin install-man install-modules
|
||||
|
||||
install-cfg: $(cfg_prefix)/$(cfg_dir)
|
||||
# kamctl config
|
Loading…
Reference in new issue