Module: kamailio
Branch: master
Commit: 1984d4a063a175803b2852c14dcadd8839b4ad83
URL: 
https://github.com/kamailio/kamailio/commit/1984d4a063a175803b2852c14dcadd8839b4ad83

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2017-06-27T15:53:49+02:00

core: parser - helper function to return URI format for local rcv socket

---

Modified: src/core/parser/msg_parser.c
Modified: src/core/parser/msg_parser.h

---

Diff:  
https://github.com/kamailio/kamailio/commit/1984d4a063a175803b2852c14dcadd8839b4ad83.diff
Patch: 
https://github.com/kamailio/kamailio/commit/1984d4a063a175803b2852c14dcadd8839b4ad83.patch

---

diff --git a/src/core/parser/msg_parser.c b/src/core/parser/msg_parser.c
index 2a4f2bb593..84a7ba6ff5 100644
--- a/src/core/parser/msg_parser.c
+++ b/src/core/parser/msg_parser.c
@@ -1102,6 +1102,91 @@ int get_src_uri(sip_msg_t *m, int tmode, str *uri)
        return 0;
 }
 
+/**
+ * get received-on-socket ip, port and protocol in SIP URI format
+ * - tmode - 0: short format (transport=udp is not added, being default)
+ */
+int get_rcv_socket_uri(sip_msg_t *m, int tmode, str *uri)
+{
+       static char buf[MAX_URI_SIZE];
+       char* p;
+       str ip, port;
+       int len;
+       str proto;
+
+       if (!uri || !m || !m->rcv.bind_address) {
+               ERR("invalid parameter value\n");
+               return -1;
+       }
+
+       if(tmode==0) {
+               switch(m->rcv.proto) {
+                       case PROTO_NONE:
+                       case PROTO_UDP:
+                               proto.s = 0; /* Do not add transport parameter, 
UDP is default */
+                               proto.len = 0;
+                       break;
+                       default:
+                               if(get_valid_proto_string(m->rcv.proto, 1, 0, 
&proto)<0) {
+                                       ERR("unknown transport protocol\n");
+                                       return -1;
+                               }
+               }
+       } else {
+               if(get_valid_proto_string(m->rcv.proto, 1, 0, &proto)<0) {
+                       ERR("unknown transport protocol\n");
+                       return -1;
+               }
+       }
+
+       ip.s = m->rcv.bind_address->address_str.s;
+       ip.len = m->rcv.bind_address->address_str.len;
+
+       port.s = m->rcv.bind_address->port_no_str.s;
+       port.len = m->rcv.bind_address->port_no_str.len;
+
+       len = 4 + ip.len + 2*(m->rcv.src_ip.af==AF_INET6)+ 1 + port.len;
+       if (proto.s) {
+               len += TRANSPORT_PARAM_LEN;
+               len += proto.len;
+       }
+
+       if (len > MAX_URI_SIZE) {
+               ERR("buffer too small\n");
+               return -1;
+       }
+
+       p = buf;
+       memcpy(p, "sip:", 4);
+       p += 4;
+
+       if (m->rcv.src_ip.af==AF_INET6)
+               *p++ = '[';
+       memcpy(p, ip.s, ip.len);
+       p += ip.len;
+       if (m->rcv.src_ip.af==AF_INET6)
+               *p++ = ']';
+
+       *p++ = ':';
+
+       memcpy(p, port.s, port.len);
+       p += port.len;
+
+       if (proto.s) {
+               memcpy(p, TRANSPORT_PARAM, TRANSPORT_PARAM_LEN);
+               p += TRANSPORT_PARAM_LEN;
+
+               memcpy(p, proto.s, proto.len);
+               p += proto.len;
+       }
+
+       uri->s = buf;
+       uri->len = len;
+
+       return 0;
+}
+
+
 /*! \brief returns a pointer to the begining of the msg's body
  */
 char* get_body(sip_msg_t* const msg)
diff --git a/src/core/parser/msg_parser.h b/src/core/parser/msg_parser.h
index 13a30d1570..dd5f498a12 100644
--- a/src/core/parser/msg_parser.h
+++ b/src/core/parser/msg_parser.h
@@ -498,4 +498,9 @@ void msg_ldata_reset(sip_msg_t*);
  */
 int get_src_uri(sip_msg_t *m, int tmode, str *uri);
 
+/**
+ * get received-on-socket ip, port and protocol in SIP URI format
+ */
+int get_rcv_socket_uri(sip_msg_t *m, int tmode, str *uri);
+
 #endif


_______________________________________________
Kamailio (SER) - Development Mailing List
[email protected]
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to