1 /**
2 * Copyright (C) 2012 Daniel-Constantin Mierla (asipto.com)
3 *
4 * This file is part of Kamailio, a free SIP server.
5 *
6 * This file is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version
10 *
11 *
12 * This file is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 *
21 */
22
23 #include <stdio.h>
24 #include <unistd.h>
25 #include <stdlib.h>
26 #include <string.h>
27
28 #include "../../core/dprint.h"
29 #include "../../core/globals.h"
30 #include "../../core/ut.h"
31 #include "../../core/dset.h"
32
33 #include "msrp_parser.h"
34 #include "msrp_netio.h"
35 #include "msrp_env.h"
36
37 extern int msrp_param_sipmsg;
38
39 static msrp_env_t _msrp_env = {0};
40
41 /**
42 *
43 */
msrp_get_env(void)44 msrp_env_t *msrp_get_env(void)
45 {
46 return &_msrp_env;
47 }
48
49 /**
50 *
51 */
msrp_reset_env(void)52 void msrp_reset_env(void)
53 {
54 memset(&_msrp_env, 0, sizeof(struct msrp_env));
55 }
56
57 /**
58 *
59 */
msrp_get_current_frame(void)60 msrp_frame_t *msrp_get_current_frame(void)
61 {
62 return _msrp_env.msrp;
63 }
64
65 /**
66 *
67 */
msrp_set_current_frame(msrp_frame_t * mf)68 int msrp_set_current_frame(msrp_frame_t *mf)
69 {
70 _msrp_env.msrp = mf;
71 init_dst_from_rcv(&_msrp_env.srcinfo, mf->tcpinfo->rcv);
72 _msrp_env.envflags |= MSRP_ENV_SRCINFO;
73 return 0;
74 }
75
76
77 /**
78 *
79 */
msrp_env_set_dstinfo(msrp_frame_t * mf,str * addr,str * fsock,int flags)80 int msrp_env_set_dstinfo(msrp_frame_t *mf, str *addr, str *fsock, int flags)
81 {
82 struct socket_info *si = NULL;
83 snd_flags_t sflags = {0};
84
85 if(fsock!=NULL && fsock->len>0)
86 {
87 si = msrp_get_local_socket(fsock);
88 if(si==NULL)
89 {
90 LM_DBG("local socket not found [%.*s] - trying to continue\n",
91 fsock->len, fsock->s);
92 }
93 }
94 sflags.f = flags;
95 if(si==NULL)
96 {
97 sflags.f &= ~SND_F_FORCE_SOCKET;
98 } else {
99 sflags.f |= SND_F_FORCE_SOCKET;
100 }
101
102 sflags.f |= _msrp_env.sndflags;
103 memset(&_msrp_env.dstinfo, 0, sizeof(struct dest_info));
104 if(msrp_uri_to_dstinfo(NULL, &_msrp_env.dstinfo, si, sflags, addr)==NULL)
105 {
106 LM_ERR("failed to set destination address [%.*s]\n",
107 addr->len, addr->s);
108 return -1;
109 }
110 _msrp_env.envflags |= MSRP_ENV_DSTINFO;
111 return 0;
112 }
113
114 /**
115 *
116 */
msrp_env_set_sndflags(msrp_frame_t * mf,int flags)117 int msrp_env_set_sndflags(msrp_frame_t *mf, int flags)
118 {
119 _msrp_env.sndflags |= (flags & (~SND_F_FORCE_SOCKET));
120 if(_msrp_env.envflags & MSRP_ENV_DSTINFO)
121 {
122 _msrp_env.dstinfo.send_flags.f |= _msrp_env.sndflags;
123 }
124 return 0;
125 }
126
127 /**
128 *
129 */
msrp_env_set_rplflags(msrp_frame_t * mf,int flags)130 int msrp_env_set_rplflags(msrp_frame_t *mf, int flags)
131 {
132 _msrp_env.rplflags |= (flags & (~SND_F_FORCE_SOCKET));
133 if(_msrp_env.envflags & MSRP_ENV_SRCINFO)
134 {
135 _msrp_env.srcinfo.send_flags.f |= _msrp_env.rplflags;
136 }
137 return 0;
138 }
139
140
141 /**
142 *
143 */
144 #define MSRP_FAKED_SIPMSG_START "MSRP sip:a@127.0.0.1 SIP/2.0\r\nVia: SIP/2.0/UDP 127.0.0.1:9;branch=z9hG4bKa\r\nFrom: <b@127.0.0.1>;tag=a\r\nTo: <a@127.0.0.1>\r\nCall-ID: a\r\nCSeq: 1 MSRP\r\nContent-Length: 0\r\nMSRP-First-Line: "
145 #define MSRP_FAKED_SIPMSG_EXTRA 11240
146 #define MSRP_FAKED_SIPMSG_SIZE (sizeof(MSRP_FAKED_SIPMSG_START)+MSRP_FAKED_SIPMSG_EXTRA)
147 static char _msrp_faked_sipmsg_buf[MSRP_FAKED_SIPMSG_SIZE];
148 static sip_msg_t _msrp_faked_sipmsg;
149 static unsigned int _msrp_faked_sipmsg_no = 0;
150
msrp_fake_sipmsg(msrp_frame_t * mf)151 sip_msg_t *msrp_fake_sipmsg(msrp_frame_t *mf)
152 {
153 int len;
154 if(msrp_param_sipmsg==0)
155 return NULL;
156 if(mf->buf.len >= MSRP_FAKED_SIPMSG_EXTRA-1)
157 return NULL;
158
159 len = sizeof(MSRP_FAKED_SIPMSG_START)-1;
160 memcpy(_msrp_faked_sipmsg_buf, MSRP_FAKED_SIPMSG_START, len);
161 memcpy(_msrp_faked_sipmsg_buf + len, mf->buf.s,
162 mf->fline.buf.len + mf->hbody.len);
163 len += mf->fline.buf.len + mf->hbody.len;
164 memcpy(_msrp_faked_sipmsg_buf + len, "\r\n", 2);
165 len += 2;
166 _msrp_faked_sipmsg_buf[len] = '\0';
167
168 memset(&_msrp_faked_sipmsg, 0, sizeof(sip_msg_t));
169
170 _msrp_faked_sipmsg.buf=_msrp_faked_sipmsg_buf;
171 _msrp_faked_sipmsg.len=len;
172
173 _msrp_faked_sipmsg.set_global_address=default_global_address;
174 _msrp_faked_sipmsg.set_global_port=default_global_port;
175
176 if (parse_msg(_msrp_faked_sipmsg.buf, _msrp_faked_sipmsg.len,
177 &_msrp_faked_sipmsg)!=0)
178 {
179 LM_ERR("parse_msg failed\n");
180 return NULL;
181 }
182
183 _msrp_faked_sipmsg.id = 1 + _msrp_faked_sipmsg_no++;
184 _msrp_faked_sipmsg.pid = my_pid();
185 clear_branches();
186 return &_msrp_faked_sipmsg;
187 }
188