First, a spec reference: https://tools.ietf.org/html/rfc3261#section-10.2.4

> A UA SHOULD use the same Call-ID for all registrations during a single boot 
> cycle.

On the surface is is then reasonable for Kamailio to default to contact lookup 
by contact and Call-ID. It does, however, [default to contact only 
lookup](http://kamailio.org/docs/modules/4.2.x/modules/usrloc.html#usrloc.p.matching_mode).

In a repeat registration scenario like this:

~15:32:28
```
REGISTER sip:ben-test.callix.com.br SIP/2.0
Call-ID: [email protected]
CSeq: 2 REGISTER
From: 
<sip:[email protected]>;tag=61616278_117e27da_7c77d0dd_13a609f6-c985-463b-b43f-ac43090d221e
To: <sip:[email protected]>
Max-Forwards: 70
Contact: <sip:[email protected]:5080>
User-Agent: Callix/Click2Call
Expires: 180
Via: SIP/2.0/UDP 
chandler.localdomain:5080;branch=z9hG4bK13a609f6-c985-463b-b43f-ac43090d221e_7c77d0dd_e6dd0acb-255f-4c1c-afe6-67a360a7f581
Authorization: Digest 
username="destination_007",realm="ben-test.callix.com.br",nonce="VcItt1XCLIsaLIdqq1Uo9wYmRIbpfQhP",uri="sip:ben-test.callix.com.br",response="0a014dd4613deb4b89fc9457d43d5cee"
Route: <sip:registrar.oneclick.callix.com.br;lr>
Content-Length: 0

SIP/2.0 200 OK
Call-ID: [email protected]
CSeq: 2 REGISTER
From: 
<sip:[email protected]>;tag=61616278_117e27da_7c77d0dd_13a609f6-c985-463b-b43f-ac43090d221e
To: 
<sip:[email protected]>;tag=b27e1a1d33761e85846fc98f5f3a7e58.73ee
Via: SIP/2.0/UDP 
chandler.localdomain:5080;branch=z9hG4bK13a609f6-c985-463b-b43f-ac43090d221e_7c77d0dd_e6dd0acb-255f-4c1c-afe6-67a360a7f581;received=172.31.31.221
Contact: <sip:[email protected]:5080>;expires=180
Supported: outbound
Server: kamailio (4.1.6 (x86_64/linux))
Content-Length: 0
```

~15:34:28

```
REGISTER sip:ben-test.callix.com.br SIP/2.0
Call-ID: [email protected]
CSeq: 2 REGISTER
From: 
<sip:[email protected]>;tag=10060555_117e27da_7c77d0dd_13a609f6-c985-463b-b43f-ac43090d221e
To: <sip:[email protected]>
Max-Forwards: 70
Contact: <sip:[email protected]:5080>
User-Agent: Callix/Click2Call
Expires: 180
Via: SIP/2.0/UDP 
chandler.localdomain:5080;branch=z9hG4bK13a609f6-c985-463b-b43f-ac43090d221e_7c77d0dd_4c667124-f13e-4bae-b637-4f19472bd417
Authorization: Digest 
username="destination_007",realm="ben-test.callix.com.br",nonce="VcIuMFXCLQQbB0Z4Q92WkVEu4iM2wjU3",uri="sip:ben-test.callix.com.br",response="8161b70052e50a5e3f51a843080c1eac"
Route: <sip:registrar.oneclick.callix.com.br;lr>
Content-Length: 0

SIP/2.0 200 OK
Call-ID: [email protected]
CSeq: 2 REGISTER
From: 
<sip:[email protected]>;tag=10060555_117e27da_7c77d0dd_13a609f6-c985-463b-b43f-ac43090d221e
To: 
<sip:[email protected]>;tag=b27e1a1d33761e85846fc98f5f3a7e58.6229
Via: SIP/2.0/UDP 
chandler.localdomain:5080;branch=z9hG4bK13a609f6-c985-463b-b43f-ac43090d221e_7c77d0dd_4c667124-f13e-4bae-b637-4f19472bd417;received=172.31.31.221
Contact: <sip:[email protected]:5080>;expires=180
Supported: outbound
Server: kamailio (4.1.6 (x86_64/linux))
Content-Length: 0
```

I see the following queries in the Kamailio logs:

```
Aug  5 15:32:28 lexington /usr/sbin/kamailio[12366]: DEBUG: db_postgres 
[km_dbase.c:230]: db_postgres_submit_query(): sending query ok: 0x7fc5155669a0 
(1) - [insert into location 
(username,contact,expires,q,callid,cseq,flags,cflags,user_agent,received,path,socket,methods,last_modified,ruid,instance,reg_id,domain
 ) values 
('destination_007','sip:[email protected]:5080','2015-08-05 
15:35:28',-1.00     
,'[email protected]',2,0,0,'Callix/Click2Call',NULL,NULL,'udp:172.31.26.82:5060',NULL,'2015-08-05
 15:32:28','uloc-55c220c7-304e-96',NULL,0,'ben-test.callix.com.br')]

Aug  5 15:34:28 lexington /usr/sbin/kamailio[12364]: DEBUG: db_postgres 
[km_dbase.c:230]: db_postgres_submit_query(): sending query ok: 0x7fc5155669a0 
(2) - [select 
contact,expires,q,callid,cseq,flags,cflags,user_agent,received,path,socket,methods,last_modified,ruid,instance,reg_id
 from location where username='destination_007' AND 
domain='ben-test.callix.com.br' order by q]

Aug  5 15:34:28 lexington /usr/sbin/kamailio[12364]: DEBUG: db_postgres 
[km_dbase.c:230]: db_postgres_submit_query(): sending query ok: 0x7fc5155669a0 
(1) - [update location set expires='2015-08-05 15:37:28',q=-1.00     
,cseq=2,flags=0,cflags=0,user_agent='Callix/Click2Call',received=NULL,path=NULL,socket='udp:172.31.26.82:5060',methods=NULL,last_modified='2015-08-05
 
15:34:28',ruid='uloc-55c220c7-304e-96',instance=NULL,reg_id=0,contact='sip:[email protected]:5080'
 where username='destination_007' AND 
contact='sip:[email protected]:5080' AND 
callid='[email protected]' AND 
domain='ben-test.callix.com.br']
```

Evidently the contact-only nature of usrloc lookup is not being respected when 
a follow-up registration is attempted. This means that every pre-expiry 
registration for a static contact from a UA which does not comply with 
RFC3621's normative `SHOULD` will silently fail. This is not a big deal; most 
do comply and I could fix mine to comply.

What is a bigger deal is that if the UA is restarted, it is not to be 
reasonably expected to maintain the same CallID. It will use a new CallID 
(precisely the same way as my "faulty" UA does) on its first registration. If 
this occurs while there is an active registration for the same Contact, this 
new registration will effectively be ignored.

I *think*, though I'm likely to be corrected, that we should only be including 
the CallID in the UPDATE's WHERE clause if we used it in the SELECT and got a 
result. In my "faulty" UA case, this would at least leave me with duplicate 
registrations rather than 0 registrations. I could then follow the normative 
`SHOULD` and eliminate the duplication.

Caveat that I have only tested with usrloc's `dbmode` parameter as `3`. I am 
using Postgres.

---
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/issues/280
_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to