00001
00025 #include <stdio.h>
00026 #include <unistd.h>
00027 #include <stdlib.h>
00028 #include <string.h>
00029
00030 #include "../../sr_module.h"
00031 #include "../../dprint.h"
00032 #include "../../ut.h"
00033 #include "../../dset.h"
00034 #include "../../action.h"
00035 #include "../../mod_fix.h"
00036 #include "../../events.h"
00037 #include "../../tcp_conn.h"
00038 #include "../../pvar.h"
00039
00040 #include "msrp_parser.h"
00041 #include "msrp_netio.h"
00042 #include "msrp_vars.h"
00043 #include "msrp_env.h"
00044
00045 MODULE_VERSION
00046
00047 static int mod_init(void);
00048 static int child_init(int);
00049 static void mod_destroy(void);
00050
00051 static int w_msrp_relay(sip_msg_t* msg, char* str1, char* str2);
00052 static int w_msrp_reply2(sip_msg_t* msg, char* code, char* text);
00053 static int w_msrp_reply3(sip_msg_t* msg, char* code, char* text, char* hdrs);
00054 static int w_msrp_is_request(sip_msg_t* msg, char* str1, char* str2);
00055 static int w_msrp_is_reply(sip_msg_t* msg, char* str1, char* str2);
00056 static int w_msrp_set_dst(sip_msg_t* msg, char* taddr, char* fsock);
00057 static int w_msrp_relay_flags(sip_msg_t* msg, char *tflags, char* str2);
00058 static int w_msrp_reply_flags(sip_msg_t* msg, char *tflags, char* str2);
00059
00060 int msrp_param_sipmsg = 1;
00061
00062 static int msrp_frame_received(void *data);
00063 sip_msg_t *msrp_fake_sipmsg(msrp_frame_t *mf);
00064
00065 static tr_export_t mod_trans[] = {
00066 { {"msrpuri", sizeof("msrpuri")-1},
00067 tr_parse_msrpuri },
00068
00069 { { 0, 0 }, 0 }
00070 };
00071
00072 static pv_export_t mod_pvs[] = {
00073 { {"msrp", (sizeof("msrp")-1)}, PVT_OTHER, pv_get_msrp,
00074 pv_set_msrp, pv_parse_msrp_name, 0, 0, 0},
00075
00076 { {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
00077 };
00078
00079 static cmd_export_t cmds[]={
00080 {"msrp_relay", (cmd_function)w_msrp_relay, 0, 0,
00081 0, ANY_ROUTE},
00082 {"msrp_reply", (cmd_function)w_msrp_reply2, 2, fixup_spve_spve,
00083 0, ANY_ROUTE},
00084 {"msrp_reply", (cmd_function)w_msrp_reply3, 3, fixup_spve_all,
00085 0, ANY_ROUTE},
00086 {"msrp_is_request", (cmd_function)w_msrp_is_request, 0, 0,
00087 0, ANY_ROUTE},
00088 {"msrp_is_reply", (cmd_function)w_msrp_is_reply, 0, 0,
00089 0, ANY_ROUTE},
00090 {"msrp_set_dst", (cmd_function)w_msrp_set_dst, 2, fixup_spve_all,
00091 0, ANY_ROUTE},
00092 {"msrp_relay_flags", (cmd_function)w_msrp_relay_flags, 1, fixup_igp_null,
00093 0, ANY_ROUTE},
00094 {"msrp_reply_flags", (cmd_function)w_msrp_reply_flags, 1, fixup_igp_null,
00095 0, ANY_ROUTE},
00096 {0, 0, 0, 0, 0, 0}
00097 };
00098
00099 static param_export_t params[]={
00100 {"sipmsg", INT_PARAM, &msrp_param_sipmsg},
00101 {0, 0, 0}
00102 };
00103
00104 struct module_exports exports = {
00105 "msrp",
00106 DEFAULT_DLFLAGS,
00107 cmds,
00108 params,
00109 0,
00110 0,
00111 mod_pvs,
00112 0,
00113 mod_init,
00114 0,
00115 mod_destroy,
00116 child_init
00117 };
00118
00119
00120
00124 static int mod_init(void)
00125 {
00126 sr_event_register_cb(SREV_TCP_MSRP_FRAME, msrp_frame_received);
00127 return 0;
00128 }
00129
00133 static int child_init(int rank)
00134 {
00135 if (rank!=PROC_MAIN)
00136 return 0;
00137
00138 return 0;
00139 }
00143 static void mod_destroy(void)
00144 {
00145 return;
00146 }
00147
00151 int mod_register(char *path, int *dlflags, void *p1, void *p2)
00152 {
00153 return register_trans_mod(path, mod_trans);
00154 }
00155
00159 static int w_msrp_relay(sip_msg_t* msg, char* str1, char* str2)
00160 {
00161 msrp_frame_t *mf;
00162 int ret;
00163
00164 mf = msrp_get_current_frame();
00165 if(mf==NULL)
00166 return -1;
00167
00168 ret = msrp_relay(mf);
00169 if(ret==0) ret = 1;
00170 return ret;
00171 }
00172
00173
00177 static int w_msrp_reply(struct sip_msg* msg, char* code, char* text,
00178 char *hdrs)
00179 {
00180 str rcode;
00181 str rtext;
00182 str rhdrs;
00183 msrp_frame_t *mf;
00184 int ret;
00185
00186 if(fixup_get_svalue(msg, (gparam_t*)code, &rcode)!=0)
00187 {
00188 LM_ERR("no reply status code\n");
00189 return -1;
00190 }
00191
00192 if(fixup_get_svalue(msg, (gparam_t*)text, &rtext)!=0)
00193 {
00194 LM_ERR("no reply status phrase\n");
00195 return -1;
00196 }
00197
00198 if(hdrs!=NULL && fixup_get_svalue(msg, (gparam_t*)hdrs, &rhdrs)!=0)
00199 {
00200 LM_ERR("invalid extra headers\n");
00201 return -1;
00202 }
00203
00204 mf = msrp_get_current_frame();
00205 if(mf==NULL)
00206 return -1;
00207
00208 ret = msrp_reply(mf, &rcode, &rtext, (hdrs!=NULL)?&rhdrs:NULL);
00209 if(ret==0) ret = 1;
00210 return ret;
00211 }
00212
00216 static int w_msrp_reply2(sip_msg_t* msg, char* code, char* text)
00217 {
00218 return w_msrp_reply(msg, code, text, NULL);
00219 }
00220
00224 static int w_msrp_reply3(sip_msg_t* msg, char* code, char* text,
00225 char *hdrs)
00226 {
00227 return w_msrp_reply(msg, code, text, hdrs);
00228 }
00229
00233 static int w_msrp_is_request(sip_msg_t* msg, char* str1, char* str2)
00234 {
00235 msrp_frame_t *mf;
00236 mf = msrp_get_current_frame();
00237 if(mf==NULL)
00238 return -1;
00239 if(mf->fline.msgtypeid==MSRP_REQUEST)
00240 return 1;
00241 return -1;
00242 }
00243
00247 static int w_msrp_is_reply(sip_msg_t* msg, char* str1, char* str2)
00248 {
00249 msrp_frame_t *mf;
00250 mf = msrp_get_current_frame();
00251 if(mf==NULL)
00252 return -1;
00253 if(mf->fline.msgtypeid==MSRP_REPLY)
00254 return 1;
00255 return -1;
00256 }
00257
00261 static int w_msrp_set_dst(sip_msg_t* msg, char* taddr, char* fsock)
00262 {
00263 str rtaddr = {0};
00264 str rfsock = {0};
00265 msrp_frame_t *mf;
00266 int ret;
00267
00268 if(fixup_get_svalue(msg, (gparam_t*)taddr, &rtaddr)!=0)
00269 {
00270 LM_ERR("invalid target address parameter\n");
00271 return -1;
00272 }
00273
00274 if(fixup_get_svalue(msg, (gparam_t*)fsock, &rfsock)!=0)
00275 {
00276 LM_ERR("invalid local socket parameter\n");
00277 return -1;
00278 }
00279
00280
00281 mf = msrp_get_current_frame();
00282 if(mf==NULL)
00283 return -1;
00284
00285 ret = msrp_env_set_dstinfo(mf, &rtaddr, &rfsock, 0);
00286 if(ret==0) ret = 1;
00287 return ret;
00288 }
00289
00293 static int w_msrp_relay_flags(sip_msg_t* msg, char *tflags, char* str2)
00294 {
00295 int rtflags = 0;
00296 msrp_frame_t *mf;
00297 int ret;
00298 if(fixup_get_ivalue(msg, (gparam_t*)tflags, &rtflags)!=0)
00299 {
00300 LM_ERR("invalid send flags parameter\n");
00301 return -1;
00302 }
00303
00304 mf = msrp_get_current_frame();
00305 if(mf==NULL)
00306 return -1;
00307
00308 ret = msrp_env_set_sndflags(mf, rtflags);
00309 if(ret==0) ret = 1;
00310 return ret;
00311 }
00312
00316 static int w_msrp_reply_flags(sip_msg_t* msg, char *tflags, char* str2)
00317 {
00318 int rtflags = 0;
00319 msrp_frame_t *mf;
00320 int ret;
00321 if(fixup_get_ivalue(msg, (gparam_t*)tflags, &rtflags)!=0)
00322 {
00323 LM_ERR("invalid send flags parameter\n");
00324 return -1;
00325 }
00326
00327 mf = msrp_get_current_frame();
00328 if(mf==NULL)
00329 return -1;
00330
00331 ret = msrp_env_set_rplflags(mf, rtflags);
00332 if(ret==0) ret = 1;
00333 return ret;
00334 }
00335
00339 static int msrp_frame_received(void *data)
00340 {
00341 tcp_event_info_t *tev;
00342 static msrp_frame_t mf;
00343 msrp_uri_t uri;
00344 sip_msg_t *fmsg;
00345 struct run_act_ctx ctx;
00346 int rtb, rt;
00347
00348
00349 tev = (tcp_event_info_t*)data;
00350
00351 if(tev==NULL || tev->buf==NULL || tev->len<=0)
00352 {
00353 LM_DBG("invalid parameters\n");
00354 return -1;
00355 }
00356
00357 memset(&mf, 0, sizeof(msrp_frame_t));
00358 mf.buf.s = tev->buf;
00359 mf.buf.len = tev->len;
00360 mf.tcpinfo = tev;
00361 if(msrp_parse_frame(&mf)<0)
00362 {
00363 LM_ERR("error parsing msrp frame\n");
00364 return -1;
00365 }
00366 msrp_reset_env();
00367 msrp_set_current_frame(&mf);
00368 rt = route_get(&event_rt, "msrp:frame-in");
00369 if(rt>=0 && event_rt.rlist[rt]!=NULL) {
00370 LM_DBG("executing event_route[msrp:frame-in] (%d)\n", rt);
00371 fmsg = msrp_fake_sipmsg(&mf);
00372 if(fmsg!=NULL)
00373 fmsg->rcv = *tev->rcv;
00374 rtb = get_route_type();
00375 set_route_type(REQUEST_ROUTE);
00376 init_run_actions_ctx(&ctx);
00377 run_top_route(event_rt.rlist[rt], fmsg, &ctx);
00378 if(ctx.run_flags&DROP_R_F)
00379 {
00380 LM_DBG("exit due to 'drop' in event route\n");
00381 }
00382 set_route_type(rtb);
00383 if(fmsg!=NULL)
00384 free_sip_msg(fmsg);
00385 }
00386 msrp_reset_env();
00387 msrp_destroy_frame(&mf);
00388 msrp_parse_uri("msrps://alice.example.com:9892/98cjs;tcp",
00389 sizeof("msrps://alice.example.com:9892/98cjs;tcp")-1, &uri);
00390 msrp_parse_uri("msrps://me@alice.example.com:9892/98cjs;tcp;a=123",
00391 sizeof("msrps://m3@alice.example.com:9892/98cjs;tcp;a=123")-1, &uri);
00392
00393 return 0;
00394 }