Module: kamailio
Branch: 5.2
Commit: 4db7db8486ecab55e649a4037a1d86cda7633faf
URL:
https://github.com/kamailio/kamailio/commit/4db7db8486ecab55e649a4037a1d86c…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2019-08-20T10:23:19+02:00
core: function to get a new faked message in a specific structure
- refactored the code to be able to fill a sip msg structure with
content from the faked request
(cherry picked from commit 4a904b5fe90253d0d5517cf1a5cdca3695e59ec3)
---
Modified: src/core/fmsg.c
---
Diff:
https://github.com/kamailio/kamailio/commit/4db7db8486ecab55e649a4037a1d86c…
Patch:
https://github.com/kamailio/kamailio/commit/4db7db8486ecab55e649a4037a1d86c…
---
diff --git a/src/core/fmsg.c b/src/core/fmsg.c
index 28d24cd116..1450509f8c 100644
--- a/src/core/fmsg.c
+++ b/src/core/fmsg.c
@@ -30,48 +30,69 @@
#define FAKED_SIP_MSG "OPTIONS sip:you@kamailio.org SIP/2.0\r\nVia: SIP/2.0/UDP
127.0.0.1\r\nFrom: <sip:you@kamailio.org>;tag=123\r\nTo:
<sip:you@kamailio.org>\r\nCall-ID: 123\r\nCSeq: 1 OPTIONS\r\nContent-Length:
0\r\n\r\n"
#define FAKED_SIP_MSG_LEN (sizeof(FAKED_SIP_MSG)-1)
-static char _faked_sip_buf[FAKED_SIP_MSG_LEN+1];
-static struct sip_msg _faked_msg;
+static char _faked_sip_buf[BUF_SIZE];
+static int _faked_sip_buf_init = 0;
+static sip_msg_t _faked_msg;
static unsigned int _faked_msg_no = 0;
-int faked_msg_init(void)
+static unsigned int faked_msg_get_next_id(void)
{
- if(_faked_msg_no>0)
- return 0;
- /* init faked sip msg */
+ _faked_msg_no += ((_faked_msg_no+1)==0)?2:1;
+ return _faked_msg_no;
+}
+
+static void faked_msg_buf_init(void)
+{
+ if(_faked_sip_buf_init!=0) {
+ return;
+ }
memcpy(_faked_sip_buf, FAKED_SIP_MSG, FAKED_SIP_MSG_LEN);
_faked_sip_buf[FAKED_SIP_MSG_LEN] = '\0';
+ _faked_sip_buf_init = 1;
+}
+
+static int faked_msg_init_new(sip_msg_t *fmsg)
+{
+ faked_msg_buf_init();
- memset(&_faked_msg, 0, sizeof(struct sip_msg));
+ /* init faked sip msg */
+ memset(fmsg, 0, sizeof(sip_msg_t));
- _faked_msg.buf=_faked_sip_buf;
- _faked_msg.len=FAKED_SIP_MSG_LEN;
+ fmsg->buf=_faked_sip_buf;
+ fmsg->len=FAKED_SIP_MSG_LEN;
- _faked_msg.set_global_address=default_global_address;
- _faked_msg.set_global_port=default_global_port;
+ fmsg->set_global_address=default_global_address;
+ fmsg->set_global_port=default_global_port;
- if (parse_msg(_faked_msg.buf, _faked_msg.len, &_faked_msg)!=0)
- {
- LM_ERR("parse_msg failed\n");
+ if (parse_msg(fmsg->buf, fmsg->len, fmsg)!=0) {
+ LM_ERR("parse faked msg failed\n");
return -1;
}
- _faked_msg.rcv.proto = PROTO_UDP;
- _faked_msg.rcv.src_port = 5060;
- _faked_msg.rcv.src_ip.u.addr32[0] = 0x7f000001;
- _faked_msg.rcv.src_ip.af = AF_INET;
- _faked_msg.rcv.src_ip.len = 4;
- _faked_msg.rcv.dst_port = 5060;
- _faked_msg.rcv.dst_ip.u.addr32[0] = 0x7f000001;
- _faked_msg.rcv.dst_ip.af = AF_INET;
- _faked_msg.rcv.dst_ip.len = 4;
+ fmsg->rcv.proto = PROTO_UDP;
+ fmsg->rcv.src_port = 5060;
+ fmsg->rcv.src_ip.u.addr32[0] = 0x7f000001;
+ fmsg->rcv.src_ip.af = AF_INET;
+ fmsg->rcv.src_ip.len = 4;
+ fmsg->rcv.dst_port = 5060;
+ fmsg->rcv.dst_ip.u.addr32[0] = 0x7f000001;
+ fmsg->rcv.dst_ip.af = AF_INET;
+ fmsg->rcv.dst_ip.len = 4;
return 0;
}
-static inline sip_msg_t* faked_msg_next_id(int mode)
+int faked_msg_init(void)
+{
+ if(_faked_msg_no>0) {
+ return 0;
+ }
+ return faked_msg_init_new(&_faked_msg);
+}
+
+static inline sip_msg_t* faked_msg_build_next(int mode)
{
- _faked_msg.id = 1 + _faked_msg_no++;
+ _faked_msg.id = faked_msg_get_next_id();
_faked_msg.pid = my_pid();
memset(&_faked_msg.tval, 0, sizeof(struct timeval));
if(mode) clear_branches();
@@ -80,12 +101,12 @@ static inline sip_msg_t* faked_msg_next_id(int mode)
sip_msg_t* faked_msg_next(void)
{
- return faked_msg_next_id(0);
+ return faked_msg_build_next(0);
}
sip_msg_t* faked_msg_next_clear(void)
{
- return faked_msg_next_id(1);
+ return faked_msg_build_next(1);
}
sip_msg_t* faked_msg_get_next(void)
@@ -104,6 +125,18 @@ sip_msg_t* faked_msg_get_next_clear(void)
return faked_msg_next_clear();
}
+int faked_msg_get_new(sip_msg_t *fmsg)
+{
+ if(faked_msg_init_new(fmsg)<0) {
+ return -1;
+ }
+ fmsg->id = faked_msg_get_next_id();
+ fmsg->pid = my_pid();
+ memset(&fmsg->tval, 0, sizeof(struct timeval));
+
+ return 0;
+}
+
int faked_msg_match(sip_msg_t *tmsg)
{
return ( tmsg == &_faked_msg ) ? 1 : 0;