|
@@ -35,6 +35,7 @@
|
|
|
#include "../../core/tcp_conn.h"
|
|
|
#include "../../core/pvar.h"
|
|
|
#include "../../core/timer_proc.h" /* register_sync_timer */
|
|
|
+#include "../../core/kemi.h"
|
|
|
|
|
|
#include "msrp_parser.h"
|
|
|
#include "msrp_netio.h"
|
|
@@ -211,15 +212,33 @@ static void mod_destroy(void)
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
-int mod_register(char *path, int *dlflags, void *p1, void *p2)
|
|
|
+static int ki_msrp_relay(sip_msg_t* msg)
|
|
|
{
|
|
|
- return register_trans_mod(path, mod_trans);
|
|
|
+ msrp_frame_t *mf;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ mf = msrp_get_current_frame();
|
|
|
+ if(mf==NULL)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ ret = msrp_relay(mf);
|
|
|
+ if(ret==0) ret = 1;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
static int w_msrp_relay(sip_msg_t* msg, char* str1, char* str2)
|
|
|
+{
|
|
|
+ return ki_msrp_relay(msg);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int ki_msrp_reply(sip_msg_t* msg, str* rcode, str* rtext,
|
|
|
+ str *rhdrs)
|
|
|
{
|
|
|
msrp_frame_t *mf;
|
|
|
int ret;
|
|
@@ -228,49 +247,36 @@ static int w_msrp_relay(sip_msg_t* msg, char* str1, char* str2)
|
|
|
if(mf==NULL)
|
|
|
return -1;
|
|
|
|
|
|
- ret = msrp_relay(mf);
|
|
|
+ ret = msrp_reply(mf, rcode, rtext,
|
|
|
+ (rhdrs!=NULL && rhdrs->len>0)?rhdrs:NULL);
|
|
|
if(ret==0) ret = 1;
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
-static int w_msrp_reply(struct sip_msg* msg, char* code, char* text,
|
|
|
- char *hdrs)
|
|
|
+static int w_msrp_reply(sip_msg_t *msg, char *code, char *text, char *hdrs)
|
|
|
{
|
|
|
- str rcode;
|
|
|
- str rtext;
|
|
|
- str rhdrs;
|
|
|
- msrp_frame_t *mf;
|
|
|
- int ret;
|
|
|
+ str rcode = STR_NULL;
|
|
|
+ str rtext = STR_NULL;
|
|
|
+ str rhdrs = STR_NULL;
|
|
|
|
|
|
- if(fixup_get_svalue(msg, (gparam_t*)code, &rcode)!=0)
|
|
|
- {
|
|
|
+ if(fixup_get_svalue(msg, (gparam_t *)code, &rcode) != 0) {
|
|
|
LM_ERR("no reply status code\n");
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- if(fixup_get_svalue(msg, (gparam_t*)text, &rtext)!=0)
|
|
|
- {
|
|
|
+ if(fixup_get_svalue(msg, (gparam_t *)text, &rtext) != 0) {
|
|
|
LM_ERR("no reply status phrase\n");
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- if(hdrs!=NULL && fixup_get_svalue(msg, (gparam_t*)hdrs, &rhdrs)!=0)
|
|
|
- {
|
|
|
+ if(hdrs != NULL && fixup_get_svalue(msg, (gparam_t *)hdrs, &rhdrs) != 0) {
|
|
|
LM_ERR("invalid extra headers\n");
|
|
|
return -1;
|
|
|
}
|
|
|
-
|
|
|
- mf = msrp_get_current_frame();
|
|
|
- if(mf==NULL)
|
|
|
- return -1;
|
|
|
-
|
|
|
- ret = msrp_reply(mf, &rcode, &rtext, (hdrs!=NULL)?&rhdrs:NULL);
|
|
|
- if(ret==0) ret = 1;
|
|
|
- return ret;
|
|
|
+ return ki_msrp_reply(msg, &rcode, &rtext, (hdrs!=NULL)?&rhdrs:NULL);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -293,9 +299,10 @@ static int w_msrp_reply3(sip_msg_t* msg, char* code, char* text,
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
-static int w_msrp_is_request(sip_msg_t* msg, char* str1, char* str2)
|
|
|
+static int ki_msrp_is_request(sip_msg_t* msg)
|
|
|
{
|
|
|
msrp_frame_t *mf;
|
|
|
+
|
|
|
mf = msrp_get_current_frame();
|
|
|
if(mf==NULL)
|
|
|
return -1;
|
|
@@ -307,9 +314,18 @@ static int w_msrp_is_request(sip_msg_t* msg, char* str1, char* str2)
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
-static int w_msrp_is_reply(sip_msg_t* msg, char* str1, char* str2)
|
|
|
+static int w_msrp_is_request(sip_msg_t* msg, char* str1, char* str2)
|
|
|
+{
|
|
|
+ return ki_msrp_is_request(msg);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int ki_msrp_is_reply(sip_msg_t* msg)
|
|
|
{
|
|
|
msrp_frame_t *mf;
|
|
|
+
|
|
|
mf = msrp_get_current_frame();
|
|
|
if(mf==NULL)
|
|
|
return -1;
|
|
@@ -318,6 +334,31 @@ static int w_msrp_is_reply(sip_msg_t* msg, char* str1, char* str2)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int w_msrp_is_reply(sip_msg_t* msg, char* str1, char* str2)
|
|
|
+{
|
|
|
+ return ki_msrp_is_reply(msg);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int ki_msrp_set_dst(sip_msg_t* msg, str* rtaddr, str* rfsock)
|
|
|
+{
|
|
|
+ msrp_frame_t *mf;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ mf = msrp_get_current_frame();
|
|
|
+ if(mf==NULL)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ ret = msrp_env_set_dstinfo(mf, rtaddr, rfsock, 0);
|
|
|
+ if(ret==0) ret = 1;
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
@@ -325,8 +366,6 @@ static int w_msrp_set_dst(sip_msg_t* msg, char* taddr, char* fsock)
|
|
|
{
|
|
|
str rtaddr = {0};
|
|
|
str rfsock = {0};
|
|
|
- msrp_frame_t *mf;
|
|
|
- int ret;
|
|
|
|
|
|
if(fixup_get_svalue(msg, (gparam_t*)taddr, &rtaddr)!=0)
|
|
|
{
|
|
@@ -339,13 +378,22 @@ static int w_msrp_set_dst(sip_msg_t* msg, char* taddr, char* fsock)
|
|
|
LM_ERR("invalid local socket parameter\n");
|
|
|
return -1;
|
|
|
}
|
|
|
+ return ki_msrp_set_dst(msg, &rtaddr, &rfsock);
|
|
|
+}
|
|
|
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int ki_msrp_relay_flags(sip_msg_t* msg, int rtflags)
|
|
|
+{
|
|
|
+ msrp_frame_t *mf;
|
|
|
+ int ret;
|
|
|
|
|
|
mf = msrp_get_current_frame();
|
|
|
if(mf==NULL)
|
|
|
return -1;
|
|
|
|
|
|
- ret = msrp_env_set_dstinfo(mf, &rtaddr, &rfsock, 0);
|
|
|
+ ret = msrp_env_set_sndflags(mf, rtflags);
|
|
|
if(ret==0) ret = 1;
|
|
|
return ret;
|
|
|
}
|
|
@@ -356,36 +404,22 @@ static int w_msrp_set_dst(sip_msg_t* msg, char* taddr, char* fsock)
|
|
|
static int w_msrp_relay_flags(sip_msg_t* msg, char *tflags, char* str2)
|
|
|
{
|
|
|
int rtflags = 0;
|
|
|
- msrp_frame_t *mf;
|
|
|
- int ret;
|
|
|
- if(fixup_get_ivalue(msg, (gparam_t*)tflags, &rtflags)!=0)
|
|
|
- {
|
|
|
+
|
|
|
+ if(fixup_get_ivalue(msg, (gparam_t *)tflags, &rtflags) != 0) {
|
|
|
LM_ERR("invalid send flags parameter\n");
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- mf = msrp_get_current_frame();
|
|
|
- if(mf==NULL)
|
|
|
- return -1;
|
|
|
-
|
|
|
- ret = msrp_env_set_sndflags(mf, rtflags);
|
|
|
- if(ret==0) ret = 1;
|
|
|
- return ret;
|
|
|
+ return ki_msrp_relay_flags(msg, rtflags);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
-static int w_msrp_reply_flags(sip_msg_t* msg, char *tflags, char* str2)
|
|
|
+static int ki_msrp_reply_flags(sip_msg_t *msg, int rtflags)
|
|
|
{
|
|
|
- int rtflags = 0;
|
|
|
msrp_frame_t *mf;
|
|
|
int ret;
|
|
|
- if(fixup_get_ivalue(msg, (gparam_t*)tflags, &rtflags)!=0)
|
|
|
- {
|
|
|
- LM_ERR("invalid send flags parameter\n");
|
|
|
- return -1;
|
|
|
- }
|
|
|
|
|
|
mf = msrp_get_current_frame();
|
|
|
if(mf==NULL)
|
|
@@ -396,11 +430,24 @@ static int w_msrp_reply_flags(sip_msg_t* msg, char *tflags, char* str2)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int w_msrp_reply_flags(sip_msg_t *msg, char *tflags, char *str2)
|
|
|
+{
|
|
|
+ int rtflags = 0;
|
|
|
+
|
|
|
+ if(fixup_get_ivalue(msg, (gparam_t *)tflags, &rtflags) != 0) {
|
|
|
+ LM_ERR("invalid send flags parameter\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ki_msrp_reply_flags(msg, rtflags);
|
|
|
+}
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
-static int w_msrp_cmap_save(sip_msg_t* msg, char* str1, char* str2)
|
|
|
+static int ki_msrp_cmap_save(sip_msg_t* msg)
|
|
|
{
|
|
|
msrp_frame_t *mf;
|
|
|
int ret;
|
|
@@ -414,11 +461,18 @@ static int w_msrp_cmap_save(sip_msg_t* msg, char* str1, char* str2)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int w_msrp_cmap_save(sip_msg_t* msg, char* str1, char* str2)
|
|
|
+{
|
|
|
+ return ki_msrp_cmap_save(msg);
|
|
|
+}
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
-static int w_msrp_cmap_lookup(sip_msg_t* msg, char* str1, char* str2)
|
|
|
+static int ki_msrp_cmap_lookup(sip_msg_t* msg)
|
|
|
{
|
|
|
msrp_frame_t *mf;
|
|
|
int ret;
|
|
@@ -432,6 +486,14 @@ static int w_msrp_cmap_lookup(sip_msg_t* msg, char* str1, char* str2)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int w_msrp_cmap_lookup(sip_msg_t* msg, char* str1, char* str2)
|
|
|
+{
|
|
|
+ return ki_msrp_cmap_lookup(msg);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
@@ -443,7 +505,6 @@ static int msrp_frame_received(sr_event_param_t *evp)
|
|
|
struct run_act_ctx ctx;
|
|
|
int rtb, rt;
|
|
|
|
|
|
-
|
|
|
tev = (tcp_event_info_t*)evp->data;
|
|
|
|
|
|
if(tev==NULL || tev->buf==NULL || tev->len<=0)
|
|
@@ -493,3 +554,67 @@ static void msrp_local_timer(unsigned int ticks, void* param)
|
|
|
{
|
|
|
msrp_cmap_clean();
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+/* clang-format off */
|
|
|
+static sr_kemi_t sr_kemi_msrp_exports[] = {
|
|
|
+ { str_init("msrp"), str_init("relay"),
|
|
|
+ SR_KEMIP_INT, ki_msrp_relay,
|
|
|
+ { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
|
|
|
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
|
|
|
+ },
|
|
|
+ { str_init("msrp"), str_init("reply"),
|
|
|
+ SR_KEMIP_INT, ki_msrp_reply,
|
|
|
+ { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR,
|
|
|
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
|
|
|
+ },
|
|
|
+ { str_init("msrp"), str_init("is_request"),
|
|
|
+ SR_KEMIP_INT, ki_msrp_is_request,
|
|
|
+ { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
|
|
|
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
|
|
|
+ },
|
|
|
+ { str_init("msrp"), str_init("is_reply"),
|
|
|
+ SR_KEMIP_INT, ki_msrp_is_reply,
|
|
|
+ { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
|
|
|
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
|
|
|
+ },
|
|
|
+ { str_init("msrp"), str_init("set_dst"),
|
|
|
+ SR_KEMIP_INT, ki_msrp_set_dst,
|
|
|
+ { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
|
|
|
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
|
|
|
+ },
|
|
|
+ { str_init("msrp"), str_init("relay_flags"),
|
|
|
+ SR_KEMIP_INT, ki_msrp_relay_flags,
|
|
|
+ { SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE,
|
|
|
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
|
|
|
+ },
|
|
|
+ { str_init("msrp"), str_init("reply_flags"),
|
|
|
+ SR_KEMIP_INT, ki_msrp_reply_flags,
|
|
|
+ { SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE,
|
|
|
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
|
|
|
+ },
|
|
|
+ { str_init("msrp"), str_init("cmap_save"),
|
|
|
+ SR_KEMIP_INT, ki_msrp_cmap_save,
|
|
|
+ { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
|
|
|
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
|
|
|
+ },
|
|
|
+ { str_init("msrp"), str_init("cmap_lookup"),
|
|
|
+ SR_KEMIP_INT, ki_msrp_cmap_lookup,
|
|
|
+ { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
|
|
|
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
|
|
|
+ },
|
|
|
+
|
|
|
+ { {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } }
|
|
|
+};
|
|
|
+/* clang-format on */
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+int mod_register(char *path, int *dlflags, void *p1, void *p2)
|
|
|
+{
|
|
|
+ sr_kemi_modules_add(sr_kemi_msrp_exports);
|
|
|
+ return register_trans_mod(path, mod_trans);
|
|
|
+}
|