Module: sip-router
Branch: master
Commit: a2cf37e0edc89f5bef9ae193122053de4652249f
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=a2cf37e…
Author: Carsten Bock <carsten(a)ng-voice.com>
Committer: Carsten Bock <carsten(a)ng-voice.com>
Date: Wed Sep 10 17:32:40 2014 +0200
ims_*_pcscf: Several bugfixes
---
modules/ims_registrar_pcscf/service_routes.c | 46 ++++++++++++++++----------
modules/ims_usrloc_pcscf/udomain.c | 8 +++--
2 files changed, 33 insertions(+), 21 deletions(-)
diff --git a/modules/ims_registrar_pcscf/service_routes.c
b/modules/ims_registrar_pcscf/service_routes.c
index 1b2371b..4380ce8 100644
--- a/modules/ims_registrar_pcscf/service_routes.c
+++ b/modules/ims_registrar_pcscf/service_routes.c
@@ -112,6 +112,11 @@ int checkcontact(struct sip_msg* _m, pcontact_t * c) {
str received_host = {0, 0};
char srcip[50];
+ LM_DBG("Port %d (search %d), Proto %d (search %d), reg_state %s (search
%s)\n",
+ c->received_port, _m->rcv.src_port, c->received_proto, _m->rcv.proto,
+ reg_state_to_string(c->reg_state), reg_state_to_string(PCONTACT_REGISTERED)
+ );
+
if (c->security) {
switch (c->security->type) {
case SECURITY_IPSEC:
@@ -164,7 +169,6 @@ pcontact_t * getContactP(struct sip_msg* _m, udomain_t* _d) {
str received_host = {0, 0};
char srcip[50];
-
if (_m->id != current_msg_id) {
current_msg_id = _m->id;
c = NULL;
@@ -172,10 +176,17 @@ pcontact_t * getContactP(struct sip_msg* _m, udomain_t* _d) {
if (is_registered_fallback2ip == 2) {
received_host.len = ip_addr2sbuf(&_m->rcv.src_ip, srcip, sizeof(srcip));
received_host.s = srcip;
- if (ul.get_pcontact_by_src(_d, &received_host, _m->rcv.src_port,
_m->rcv.proto, &c) == 1)
+
+ LM_DBG("Searching in usrloc for %.*s:%i (Proto %i)\n",
+ received_host.len, received_host.s,
+ _m->rcv.src_port, _m->rcv.proto);
+
+ if (ul.get_pcontact_by_src(_d, &received_host, _m->rcv.src_port,
_m->rcv.proto, &c) == 1) {
LM_DBG("No entry in usrloc for %.*s:%i (Proto %i) found!\n",
received_host.len, received_host.s, _m->rcv.src_port, _m->rcv.proto);
- if (checkcontact(_m, c) != 0) {
- c = NULL;
+ } else {
+ if (checkcontact(_m, c) != 0) {
+ c = NULL;
+ }
}
}
@@ -185,10 +196,10 @@ pcontact_t * getContactP(struct sip_msg* _m, udomain_t* _d) {
if (b && b->contacts) {
for (ct = b->contacts; ct; ct = ct->next) {
if (ul.get_pcontact(_d, &ct->uri, &c) == 0) {
- if (checkcontact(_m, c) == 0) {
- break;
- } else {
+ if (checkcontact(_m, c) != 0) {
c = NULL;
+ } else {
+ break;
}
}
}
@@ -201,10 +212,12 @@ pcontact_t * getContactP(struct sip_msg* _m, udomain_t* _d) {
LM_INFO("Contact not found based on Contact-header, trying
IP/Port/Proto\n");
received_host.len = ip_addr2sbuf(&_m->rcv.src_ip, srcip, sizeof(srcip));
received_host.s = srcip;
- if (ul.get_pcontact_by_src(_d, &received_host, _m->rcv.src_port,
_m->rcv.proto, &c) == 1)
+ if (ul.get_pcontact_by_src(_d, &received_host, _m->rcv.src_port,
_m->rcv.proto, &c) == 1) {
LM_DBG("No entry in usrloc for %.*s:%i (Proto %i) found!\n",
received_host.len, received_host.s, _m->rcv.src_port, _m->rcv.proto);
- if (checkcontact(_m, c) != 0) {
- c = NULL;
+ } else {
+ if (checkcontact(_m, c) != 0) {
+ c = NULL;
+ }
}
}
}
@@ -308,7 +321,7 @@ int check_service_routes(struct sip_msg* _m, udomain_t* _d) {
/* No more Route-Headers? Not following service-routes */
if (!r) {
- LM_ERR("No more route headers in message.\n");
+ LM_DBG("No more route headers in message.\n");
goto error;
}
@@ -330,7 +343,7 @@ int check_service_routes(struct sip_msg* _m, udomain_t* _d) {
/* Check, if it was the last route-header in the message: */
if (r) {
- LM_ERR("Too many route headers in message.\n");
+ LM_DBG("Too many route headers in message.\n");
goto error;
}
} else {
@@ -338,7 +351,7 @@ int check_service_routes(struct sip_msg* _m, udomain_t* _d) {
if (c->num_service_routes > 0) goto error;
}
} else {
- LM_ERR("No route header in Message.\n");
+ LM_DBG("No route header in Message.\n");
/* No route-header? Check, if service-routes are indicated.
If yes, request is not following service-routes */
if (c->num_service_routes > 0) goto error;
@@ -352,12 +365,10 @@ error:
return -1;
}
-static str route_start={": <",8};
+static str route_start={"Route: <",8};
static str route_sep={">, <",4};
static str route_end={">\r\n",3};
-extern str route_header;
-
/**
* Force Service routes (upon request)
*/
@@ -408,7 +419,7 @@ int force_service_routes(struct sip_msg* _m, udomain_t* _d) {
goto error;
}
/* Calculate the length: */
- new_route_header.len = route_header.len + route_start.len +
+ new_route_header.len = route_start.len +
route_end.len + (c->num_service_routes-1) * route_sep.len;
for(i=0; i< c->num_service_routes; i++)
@@ -422,7 +433,6 @@ int force_service_routes(struct sip_msg* _m, udomain_t* _d) {
/* Construct new header */
new_route_header.len = 0;
- STR_APPEND(new_route_header, route_header);
STR_APPEND(new_route_header, route_start);
for(i=0; i < c->num_service_routes; i++) {
if (i) STR_APPEND(new_route_header, route_sep);
diff --git a/modules/ims_usrloc_pcscf/udomain.c b/modules/ims_usrloc_pcscf/udomain.c
index 3e7aa63..23e1213 100644
--- a/modules/ims_usrloc_pcscf/udomain.c
+++ b/modules/ims_usrloc_pcscf/udomain.c
@@ -481,15 +481,15 @@ int get_pcontact(udomain_t* _d, str* _contact, struct pcontact** _c)
{
LM_DBG("Searching for [%.*s] and comparing to [%.*s]\n", _contact->len,
_contact->s, c->aor.len, c->aor.s);
/* hosts HAVE to match */
- if (lookup_check_received && ((needle_uri.host.len != c->received_host.len)
|| (memcmp(needle_uri.host.s, c->contact_host.s, needle_uri.host.len)!=0))) {
+ if (lookup_check_received && ((needle_uri.host.len != c->received_host.len)
|| (memcmp(needle_uri.host.s, c->received_host.s, needle_uri.host.len)!=0))) {
//can't possibly match
+ LM_DBG("Lookup failed for [%.*s <=> %.*s]\n", needle_uri.host.len,
needle_uri.host.s, c->received_host.len, c->received_host.s);
c = c->next;
continue;
}
/* one of the ports must match, either the initial registered port, the received port,
or one if the security ports (server) */
- if ((needle_uri.port_no != c->contact_port)
- && (needle_uri.port_no != c->received_proto)) {
+ if ((needle_uri.port_no != c->contact_port) && (needle_uri.port_no !=
c->received_port)) {
//check security ports
if (c->security) {
switch (c->security->type) {
@@ -536,6 +536,8 @@ int get_pcontact(udomain_t* _d, str* _contact, struct pcontact** _c)
{
}
if (!port_match){
+ LM_DBG("Port don't match: %d (contact) %d (received) != %d!\n",
+ c->contact_port, c->received_port, needle_uri.port_no);
c = c->next;
continue;
}