]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Ensure Min-SE is included in outbound INVITEs
authorKinsey Moore <kmoore@digium.com>
Thu, 13 Dec 2012 13:48:32 +0000 (13:48 +0000)
committerKinsey Moore <kmoore@digium.com>
Thu, 13 Dec 2012 13:48:32 +0000 (13:48 +0000)
Asterisk now includes Min-SE in outbound INVITEs when the value is not
90 (the default) and session timers are not disabled. This has the
effect of Asterisk following RFC4028 more closely with regard to 422
responses and preventing situations in which Asterisk would be forced
to temporarily accept a call to tear it down based on a Session-Expires
below the locally configured Min-SE.

(issue SWP-5051)
Review: https://reviewboard.asterisk.org/r/2222/
Reported-by: Kinsey Moore
Patch-by: Kinsey Moore
........

Merged revisions 377946 from http://svn.asterisk.org/svn/asterisk/branches/1.8

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@377947 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index e57485946e0cb2cfcc94e32ac8fe2b7bad2d1099..658fe55a9af4d6683193718029df330ebc176b7c 100644 (file)
@@ -13057,7 +13057,9 @@ static int transmit_invite(struct sip_pvt *p, int sipmethod, int sdp, int init,
        }
 
        /* Add Session-Timers related headers */
-       if (st_get_mode(p, 0) == SESSION_TIMER_MODE_ORIGINATE) {
+       if (st_get_mode(p, 0) == SESSION_TIMER_MODE_ORIGINATE
+               || (st_get_mode(p, 0) == SESSION_TIMER_MODE_ACCEPT
+                       && st_get_se(p, FALSE) != DEFAULT_MIN_SE)) {
                char i2astr[10];
 
                if (!p->stimer->st_interval) {
@@ -13065,9 +13067,11 @@ static int transmit_invite(struct sip_pvt *p, int sipmethod, int sdp, int init,
                }
 
                p->stimer->st_active = TRUE;
-               
-               snprintf(i2astr, sizeof(i2astr), "%d", p->stimer->st_interval);
-               add_header(&req, "Session-Expires", i2astr);
+               if (st_get_mode(p, 0) == SESSION_TIMER_MODE_ORIGINATE) {        
+                       snprintf(i2astr, sizeof(i2astr), "%d", p->stimer->st_interval);
+                       add_header(&req, "Session-Expires", i2astr);
+               }
+
                snprintf(i2astr, sizeof(i2astr), "%d", st_get_se(p, FALSE));
                add_header(&req, "Min-SE", i2astr);
        }
@@ -27621,7 +27625,10 @@ static void proc_422_rsp(struct sip_pvt *p, struct sip_request *rsp)
                ast_log(LOG_WARNING, "Parsing of Min-SE header failed %s\n", p_hdrval);
                return;
        }
-       p->stimer->st_interval = minse;
+       p->stimer->st_cached_min_se = minse;
+       if (p->stimer->st_interval < minse) {
+               p->stimer->st_interval = minse;
+       }
        transmit_invite(p, SIP_INVITE, 1, 2, NULL);
 }
 
@@ -29122,8 +29129,8 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
                                        ast_log(LOG_WARNING, "Invalid session-minse '%s' at line %d of %s\n", v->value, v->lineno, config);
                                        peer->stimer.st_min_se = global_min_se;
                                }
-                               if (peer->stimer.st_min_se < 90) {
-                                       ast_log(LOG_WARNING, "session-minse '%s' at line %d of %s is not allowed to be < 90 secs\n", v->value, v->lineno, config);
+                               if (peer->stimer.st_min_se < DEFAULT_MIN_SE) {
+                                       ast_log(LOG_WARNING, "session-minse '%s' at line %d of %s is not allowed to be < %d secs\n", v->value, v->lineno, config, DEFAULT_MIN_SE);
                                        peer->stimer.st_min_se = global_min_se;
                                }
                        } else if (!strcasecmp(v->name, "session-refresher")) {
@@ -30131,8 +30138,8 @@ static int reload_config(enum channelreloadreason reason)
                                ast_log(LOG_WARNING, "Invalid session-minse '%s' at line %d of %s\n", v->value, v->lineno, config);
                                global_min_se = DEFAULT_MIN_SE;
                        }
-                       if (global_min_se < 90) {
-                               ast_log(LOG_WARNING, "session-minse '%s' at line %d of %s is not allowed to be < 90 secs\n", v->value, v->lineno, config);
+                       if (global_min_se < DEFAULT_MIN_SE) {
+                               ast_log(LOG_WARNING, "session-minse '%s' at line %d of %s is not allowed to be < %d secs\n", v->value, v->lineno, config, DEFAULT_MIN_SE);
                                global_min_se = DEFAULT_MIN_SE;
                        }
                } else if (!strcasecmp(v->name, "session-refresher")) {