[reSIProcate] Incomplete processing of subscription expires values by DUM

Kevin Pickard kpickard at upstreamworks.com
Mon Mar 27 16:45:46 CST 2006


	Hello all.

	I have encountered a problem with the way DUM is dealing with subscription 
expiry values.

	The problem occurs when a device does not include the ";expires=..." 
parameter on the Subscription-State: header in the NOTIFY messages. In this 
situation DUM is not refreshing the subscription before it expires as it is 
using a default expiry value of 3600 seconds (verified by turning on full 
debug).

	Now looking at the code it looks like it should be using the value from 
the last request (ClientSubscription::processNextNotify) if the parameter 
is not present (although this behaviour is not really correct--see below). 
But for some reason it is not seeing the Expires: header in the last 
request (and yes it is present in the SUBSCRIBE message that goes out--see 
debug trace (and also verified by Ethernet trace)). So it is defaulting to 
a value of 3600.

	Looking at the debug trace (included below) you can see the Expires: 
header in the last request but right below it the header does not appear in 
the new request it is building for some reason. So when it gets to the test 
it does not see the header and defaults to 3600.

	Now even if it did take the value from the last request, technically this 
would not be correct. As per RFC 3265, the notifier can modify the 
requested expiry value by making it lower. This would be indicated in the 
Expires: header in the 200 OK sent back. But DUM ignores the 200 OK of a 
SUBSCRIBE and waits for the first NOTIFY which is sort of correct as the 
subscription is to be considered in the neutral state unit it is received. 
But it needs to look at the Expires: header value in the 200 OK. What if a 
SUBSCRIBE is sent without an Expires: header at all (which is valid). The 
notifier would then report the value being used (default of the event 
package) in the 200 OK. And if it does not use the ";expires=..." parameter 
on the Subscription-State: header of the NOTIFY (which is valid as it is a 
SHOULD not a MUST in RFC 3265) then DUM would have no idea what is actually 
being used by ignoring the value in the 200 OK.

	So is there someone who is familiar with this section of code? Tomorrow I 
will be digging into the first problem of the expiry value not being found 
in the last request as a temporary fix (although any pointers would be 
welcome :-) I am guessing that the bigger problem of correctly using the 
value from the 200 OK is going to take far greater investigation.

	Thanks.

[RESIP:DUM] Dialog::dispatch: SipReq:  NOTIFY sipif at 192.168.1.150:5060 
tid=-541ba0c40bb2e6bb6f8426f87b7c6051 cseq=NOTIFY 
contact=snom320 at 192.168.1.146:2051 / 1 from(wire)
[RESIP:DUM] Making subscription (from creator) request: SUBSCRIBE 
sip:snom320 at sipxkev.upstreamworks.bogus SIP/2.0
 >Via: SIP/2.0/ ;branch=z9hG4bK-d87543-d165ab066803f961-1--d87543-;rport
 >Max-Forwards: 70
 >Contact: <sip:sipif>
 >To: <sip:snom320 at sipxkev.upstreamworks.bogus>
 >From: <sip:sipif at upstreamworks.com>;tag=3827ae13
 >Call-ID: db1a5c02396f0752Y2IzMzFhMTkzYThjOWE3M2NkYjE4NDAyOWM4YTg4YzU.
 >CSeq: 1 SUBSCRIBE
 >Expires: 200
 >Allow: NOTIFY
 >User-Agent: SIPIF/0.1
 >Event: dialog
 >Content-Length: 0
[RESIP:DUM] ClientSubscription::ClientSubscription from SipReq:  SUBSCRIBE 
snom320 at sipxkev.upstreamworks.bogus tid=d165ab066803f961 cseq=SUBSCRIBE 
contact=sipif / 1 from(tu)
[RESIP:DUM] Dialog::makeRequest: SUBSCRIBE 
sip:snom320 at 192.168.1.146:2051;line=n3b3x9av SIP/2.0
 >Via: SIP/2.0/ ;branch=z9hG4bK-d87543-f1145b757938512d-1--d87543-;rport
 >Max-Forwards: 70
 >Route: 
<sip:192.168.1.96:5080;lr;a;t=3827ae13;s=3af5bb44dabbb05888df09155ce9a1ae>
 >Contact: <sip:sipif>
 >To: <sip:snom320 at sipxkev.upstreamworks.bogus>;tag=wikel513dl
 >From: <sip:sipif at upstreamworks.com>;tag=3827ae13
 >Call-ID: db1a5c02396f0752Y2IzMzFhMTkzYThjOWE3M2NkYjE4NDAyOWM4YTg4YzU.
 >CSeq: 2 SUBSCRIBE
 >Event: dialog
 >Content-Length: 0
[RESIP:DUM] [ClientSubscription] 
<sip:snom320 at sipxkev.upstreamworks.bogus>;tag=wikel513dl
Subscriptions::onNewSubscription
Subscriptions::convertHandleToSubscription Client Subscription Handle : 
(6:01895CD8)
... AppDialogSet Handle : (4:0188A9B0)
... typeid *AppDialogSet().get() 'class sipapi::Subscription'
... Subscription : 'sip:snom320 at sipxkev.upstreamworks.bogus'
Subscription::setActive 'sip:snom320 at sipxkev.upstreamworks.bogus'
Subscription Status callback. Id:2 'Subscribed' (0)
[RESIP:DUM] no queued notify
[RESIP:DUM] No expires header in last request, set to 3600






More information about the resiprocate-devel mailing list