Module: sip-router Branch: master Commit: ed23dbde621a4b60d35639d3c61284b658fb6ad1 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ed23dbde...
Author: Carsten Bock carsten@ng-voice.com Committer: Carsten Bock carsten@ng-voice.com Date: Thu Sep 26 20:21:11 2013 +0200
Move assert_identity to ims_usrloc_pcscf as we may have more than one IMPI per Port/IP/Proto
---
modules/ims_registrar_pcscf/service_routes.c | 42 ++++----------------- modules/ims_usrloc_pcscf/udomain.c | 50 +++++++++++++++++++++++--- modules/ims_usrloc_pcscf/udomain.h | 1 + modules/ims_usrloc_pcscf/usrloc.c | 1 + modules/ims_usrloc_pcscf/usrloc.h | 3 ++ 5 files changed, 58 insertions(+), 39 deletions(-)
diff --git a/modules/ims_registrar_pcscf/service_routes.c b/modules/ims_registrar_pcscf/service_routes.c index e53cdd0..42590b5 100644 --- a/modules/ims_registrar_pcscf/service_routes.c +++ b/modules/ims_registrar_pcscf/service_routes.c @@ -390,40 +390,14 @@ str * get_asserted_identity(struct sip_msg* _m) { * Add proper asserted identies based on registration */ int assert_identity(struct sip_msg* _m, udomain_t* _d, str identity) { - // Get the contact: - pcontact_t * c = getContactP(_m, _d); - // Public identities of this contact - ppublic_t * p; - - // Contact not found => Identity not asserted. - if (c == NULL) return -2; - - /* Lock this record while working with the data: */ - ul.lock_udomain(_d, &c->aor); - - LM_DBG("Checking identity: %.*s\n", identity.len, identity.s); - - LM_DBG("AOR of contact: %.*s\n", c->aor.len, c->aor.s); - - for (p = c->head; p; p = p->next) { - LM_DBG("Public identity: %.*s\n", p->public_identity.len, p->public_identity.s); - /* Check length: */ - if (identity.len == p->public_identity.len) { - /* Check contents: */ - if (strncasecmp(identity.s, p->public_identity.s, identity.len) == 0) { - LM_DBG("Match!\n"); - goto success; - } - } else LM_DBG("Length does not match.\n"); - } + str received_host = {0, 0}; + char srcip[50];
- // We should only get here, if we failed: - /* Unlock domain */ - ul.unlock_udomain(_d, &c->aor); - return -1; -success: - /* Unlock domain */ - ul.unlock_udomain(_d, &c->aor); - return 1; + received_host.len = ip_addr2sbuf(&_m->rcv.src_ip, srcip, sizeof(srcip)); + received_host.s = srcip; + if (ul.assert_identity(_d, &received_host, _m->rcv.src_port, _m->rcv.proto, &identity) == 0) + return -1; + else + return 1; }
diff --git a/modules/ims_usrloc_pcscf/udomain.c b/modules/ims_usrloc_pcscf/udomain.c index 8c0d370..3d2d46c 100644 --- a/modules/ims_usrloc_pcscf/udomain.c +++ b/modules/ims_usrloc_pcscf/udomain.c @@ -433,12 +433,43 @@ int get_pcontact_by_src(udomain_t* _d, str * _host, unsigned short _port, unsign int i; struct pcontact* c;
- if (_d->table) { - for(i = 0; i < _d->size; i++) { + for(i=0; i<_d->size; i++) + { + c = _d->table[i].first; + while(c) { + LM_DBG("Port %d (search %d), Proto %d (search %d), reg_state %s (search %s)\n", + c->received_port, _port, c->received_proto, _proto, + reg_state_to_string(c->reg_state), reg_state_to_string(PCONTACT_REGISTERED) + ); + // First check, if Proto and Port matches: + if ((c->reg_state == PCONTACT_REGISTERED) && (c->received_port == _port) && (c->received_proto == _proto)) { + LM_DBG("Received host len %d (search %d)\n", c->received_host.len, _host->len); + // Then check the length: + if (c->received_host.len == _host->len) { + LM_DBG("Received host %.*s (search %.*s)\n", + c->received_host.len, c->received_host.s, + _host->len, _host->s); + + // Finally really compare the "received_host" + if (!memcmp(c->received_host.s, _host->s, _host->len)) { + *_c = c; + return 0; + } + } + } + c = c->next; } } + return 1; /* Nothing found */ +}
+int assert_identity(udomain_t* _d, str * _host, unsigned short _port, unsigned short _proto, str * _identity) { + int i; + struct pcontact* c; + // Public identities of this contact + struct ppublic * p; + for(i=0; i<_d->size; i++) { c = _d->table[i].first; @@ -458,15 +489,24 @@ int get_pcontact_by_src(udomain_t* _d, str * _host, unsigned short _port, unsign
// Finally really compare the "received_host" if (!memcmp(c->received_host.s, _host->s, _host->len)) { - *_c = c; - return 0; + for (p = c->head; p; p = p->next) { + LM_DBG("Public identity: %.*s\n", p->public_identity.len, p->public_identity.s); + /* Check length: */ + if (_identity->len == p->public_identity.len) { + /* Check contents: */ + if (strncasecmp(_identity->s, p->public_identity.s, _identity->len) == 0) { + LM_DBG("Match!\n"); + return 1; + } + } else LM_DBG("Length does not match.\n"); + } } } } c = c->next; } } - return 1; /* Nothing found */ + return 0; /* Nothing found */ }
int delete_pcontact(udomain_t* _d, str* _aor, struct pcontact* _c) diff --git a/modules/ims_usrloc_pcscf/udomain.h b/modules/ims_usrloc_pcscf/udomain.h index f2c74c6..23e4d58 100644 --- a/modules/ims_usrloc_pcscf/udomain.h +++ b/modules/ims_usrloc_pcscf/udomain.h @@ -78,6 +78,7 @@ int update_pcontact(struct udomain* _d, struct pcontact_info* _ci, struct pconta int insert_pcontact(struct udomain* _d, str* _contact, struct pcontact_info* _ci, struct pcontact** _r); int get_pcontact(udomain_t* _d, str* _aor, struct pcontact** _r); int get_pcontact_by_src(udomain_t* _d, str * _host, unsigned short _port, unsigned short _proto, struct pcontact** _c); +int assert_identity(udomain_t* _d, str * _host, unsigned short _port, unsigned short _proto, str * _identity); int delete_pcontact(udomain_t* _d, str* _aor, struct pcontact* _r);
#endif diff --git a/modules/ims_usrloc_pcscf/usrloc.c b/modules/ims_usrloc_pcscf/usrloc.c index 3a444b4..5d483b5 100644 --- a/modules/ims_usrloc_pcscf/usrloc.c +++ b/modules/ims_usrloc_pcscf/usrloc.c @@ -72,6 +72,7 @@ int bind_usrloc(usrloc_api_t* api) { api->delete_pcontact = delete_pcontact; api->get_pcontact = get_pcontact; api->get_pcontact_by_src = get_pcontact_by_src; + api->assert_identity = assert_identity;
api->update_pcontact = update_pcontact; api->update_rx_regsession = update_rx_regsession; diff --git a/modules/ims_usrloc_pcscf/usrloc.h b/modules/ims_usrloc_pcscf/usrloc.h index 38d4a2e..28724af 100644 --- a/modules/ims_usrloc_pcscf/usrloc.h +++ b/modules/ims_usrloc_pcscf/usrloc.h @@ -195,6 +195,8 @@ typedef int (*get_pcontact_t)(struct udomain* _d, str* _contact, struct pcontact
typedef int (*get_pcontact_by_src_t)(struct udomain* _d, str * _host, unsigned short _port, unsigned short _proto, struct pcontact** _c);
+typedef int (*assert_identity_t)(struct udomain* _d, str * _host, unsigned short _port, unsigned short _proto, str * _identity); + typedef int (*insert_pcontact_t)(struct udomain* _d, str* _aor, struct pcontact_info* ci, struct pcontact** _c); typedef int (*delete_pcontact_t)(struct udomain* _d, str* _aor, struct pcontact* _c); typedef int (*update_pcontact_t)(struct udomain* _d, struct pcontact_info* ci, struct pcontact* _c); @@ -220,6 +222,7 @@ typedef struct usrloc_api { delete_pcontact_t delete_pcontact; get_pcontact_t get_pcontact; get_pcontact_by_src_t get_pcontact_by_src; + assert_identity_t assert_identity;
update_pcontact_t update_pcontact; update_rx_regsession_t update_rx_regsession;