msrp_mod.c

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}, /* string class */
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, /* dlopen flags */
00107         cmds,
00108         params,
00109         0,
00110         0,              /* exported MI functions */
00111         mod_pvs,        /* exported pseudo-variables */
00112         0,              /* extra processes */
00113         mod_init,       /* module initialization function */
00114         0,              /* response function */
00115         mod_destroy,    /* destroy function */
00116         child_init      /* per child init function */
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 }