Module: sems
Branch: master
Commit: a1fcef99d1efb35646420a57a2d9ac183ee797cd
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=a1fcef99d1efb35646420a57a2d9ac183ee797cd

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Fri Mar  4 17:33:29 2011 +0100

SST fixes: timer option tag; Min-SE==Interval

---

 core/plug-in/session_timer/SessionTimer.cpp |   53 +++++++++++++++------------
 core/plug-in/session_timer/SessionTimer.h   |    2 +
 2 files changed, 31 insertions(+), 24 deletions(-)

diff --git a/core/plug-in/session_timer/SessionTimer.cpp 
b/core/plug-in/session_timer/SessionTimer.cpp
index 19168b1..d866de2 100644
--- a/core/plug-in/session_timer/SessionTimer.cpp
+++ b/core/plug-in/session_timer/SessionTimer.cpp
@@ -152,17 +152,15 @@ bool SessionTimer::onSendRequest(const string& method,
                                         hdrs);
   }
 
-  string m_hdrs = SIP_HDR_COLSP(SIP_HDR_SUPPORTED)  "timer"  CRLF;
+  addOptionTag(hdrs, SIP_HDR_SUPPORTED, TIMER_OPTION_TAG);
   if  ((method != SIP_METH_INVITE) && (method != SIP_METH_UPDATE))
-    goto end;
+    return false; // session-expires / min-se only in INV/UPD
 
   removeHeader(hdrs, SIP_HDR_SESSION_EXPIRES);
   removeHeader(hdrs, SIP_HDR_MIN_SE);
-  m_hdrs += SIP_HDR_COLSP(SIP_HDR_SESSION_EXPIRES) + int2str(session_interval) 
+CRLF
+  hdrs += SIP_HDR_COLSP(SIP_HDR_SESSION_EXPIRES) + int2str(session_interval) + 
CRLF
     + SIP_HDR_COLSP(SIP_HDR_MIN_SE) + int2str(min_se) + CRLF;
 
- end:
-  hdrs += m_hdrs;
   return false;
 }
 
@@ -173,22 +171,26 @@ bool SessionTimer::onSendReply(const AmSipRequest& req,
                               string& hdrs,
                               int flags)
 {
+  // only in 2xx responses to INV/UPD
   if  (((req.method != SIP_METH_INVITE) && (req.method != SIP_METH_UPDATE)) ||
        (code < 200) || (code >= 300))
     return false;
-    
-  string m_hdrs = SIP_HDR_COLSP(SIP_HDR_SUPPORTED)  "timer"  CRLF;
 
-  // only in 2xx responses to INV/UPD
-  m_hdrs  += SIP_HDR_COLSP(SIP_HDR_SESSION_EXPIRES) +
+  addOptionTag(hdrs, SIP_HDR_SUPPORTED, TIMER_OPTION_TAG);
+
+  if (((session_refresher_role==UAC) && (session_refresher==refresh_remote))
+      || ((session_refresher_role==UAS) && remote_timer_aware)) {
+    addOptionTag(hdrs, SIP_HDR_REQUIRE, TIMER_OPTION_TAG);
+  } else {
+    removeOptionTag(hdrs, SIP_HDR_REQUIRE, TIMER_OPTION_TAG);
+  }
+
+  // remove (possibly existing) Session-Expires header
+  removeHeader(hdrs, SIP_HDR_SESSION_EXPIRES);
+
+  hdrs += SIP_HDR_COLSP(SIP_HDR_SESSION_EXPIRES) +
     int2str(session_interval) + ";refresher="+
     (session_refresher_role==UAC ? "uac":"uas")+CRLF;
-    
-  if (((session_refresher_role==UAC) && (session_refresher==refresh_remote)) 
-      || ((session_refresher_role==UAS) && remote_timer_aware))
-    m_hdrs += SIP_HDR_COLSP(SIP_HDR_REQUIRE)  "timer"  CRLF;
-    
-  hdrs += m_hdrs;
 
   return false;
 }
@@ -266,7 +268,7 @@ void SessionTimer::updateTimer(AmSession* s, const 
AmSipRequest& req) {
   if((req.method == SIP_METH_INVITE)||(req.method == SIP_METH_UPDATE)){
     
     remote_timer_aware = 
-      key_in_list(getHeader(req.hdrs, SIP_HDR_SUPPORTED),"timer", true);
+      key_in_list(getHeader(req.hdrs, SIP_HDR_SUPPORTED), TIMER_OPTION_TAG, 
true);
     
     // determine session interval
     string sess_expires_hdr = getHeader(req.hdrs, SIP_HDR_SESSION_EXPIRES,
@@ -295,17 +297,20 @@ void SessionTimer::updateTimer(AmSession* s, const 
AmSipRequest& req) {
       }
     }
 
-    // calculate actual se
-    session_interval = session_timer_conf.getSessionExpires();
-
+    // minimum limit of both
     if (i_minse > min_se)
       min_se = i_minse;
 
-    if (rem_has_sess_expires && (rem_sess_expires < min_se)) {
-      session_interval = min_se;
-    } else {
-      if (rem_has_sess_expires && (rem_sess_expires < session_interval))
-       session_interval = rem_sess_expires;
+    // calculate actual se
+    session_interval = session_timer_conf.getSessionExpires();
+
+    if (rem_has_sess_expires) {
+      if (rem_sess_expires <= min_se) {
+       session_interval = min_se;
+      } else {
+       if (rem_sess_expires < session_interval)
+         session_interval = rem_sess_expires;
+      }
     }
      
     DBG("using actual session interval %u\n", session_interval);
diff --git a/core/plug-in/session_timer/SessionTimer.h 
b/core/plug-in/session_timer/SessionTimer.h
index 9cafbdf..9e43435 100644
--- a/core/plug-in/session_timer/SessionTimer.h
+++ b/core/plug-in/session_timer/SessionTimer.h
@@ -33,6 +33,8 @@
 
 #define MOD_NAME "session_timer"
 
+#define TIMER_OPTION_TAG  "timer"
+
 /* Session Timer: -ssa */
 class AmTimeoutEvent;
 // these are the timer IDs for session timer

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to