Enable reinvite via "UPDATE" if selected
authorMark Spencer <markster@digium.com>
Fri, 28 Mar 2003 06:59:34 +0000 (06:59 +0000)
committerMark Spencer <markster@digium.com>
Fri, 28 Mar 2003 06:59:34 +0000 (06:59 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@712 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 403fdc1..d525083 100755 (executable)
@@ -300,6 +300,9 @@ struct sip_registry {
        struct sip_registry *next;
 };
 
+#define REINVITE_INVITE                1
+#define REINVITE_UPDATE                2
+
 static int sip_do_register(struct sip_registry *r);
 struct sip_registry *registrations;
 
@@ -1235,8 +1238,8 @@ static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useg
                build_callid(p->callid, sizeof(p->callid), p->ourip);
        else
                strncpy(p->callid, callid, sizeof(p->callid) - 1);
-       /* Assume reinvite OK */
-       p->canreinvite = 1;
+       /* Assume reinvite OK and via INVITE */
+       p->canreinvite = REINVITE_INVITE;
        p->dtmfmode = globaldtmfmode;
        if (p->dtmfmode & SIP_DTMF_RFC2833)
                p->noncodeccapability |= AST_RTP_DTMF;
@@ -2006,7 +2009,10 @@ static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_r
 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp)
 {
        struct sip_request resp;
-       reqprep(&resp, p, "INVITE", 1);
+       if (p->canreinvite == REINVITE_UPDATE)
+               reqprep(&resp, p, "UPDATE", 1);
+       else
+               reqprep(&resp, p, "INVITE", 1);
        add_sdp(&resp, p, rtp);
        return send_request(p, &resp, 1, p->ocseq);
 }
@@ -4034,7 +4040,7 @@ static struct sip_user *build_user(char *name, struct ast_variable *v)
        if (user) {
                memset(user, 0, sizeof(struct sip_user));
                strncpy(user->name, name, sizeof(user->name)-1);
-               user->canreinvite = 1;
+               user->canreinvite = REINVITE_INVITE;
                /* JK02: set default context */
                strcpy(user->context, context);
                while(v) {
@@ -4059,7 +4065,10 @@ static struct sip_user *build_user(char *name, struct ast_variable *v)
                                        user->dtmfmode = SIP_DTMF_RFC2833;
                                }
                        } else if (!strcasecmp(v->name, "canreinvite")) {
-                               user->canreinvite = ast_true(v->value);
+                               if (!strcasecmp(v->value, "update"))
+                                       user->canreinvite = REINVITE_UPDATE;
+                               else
+                                       user->canreinvite = ast_true(v->value);
                        } else if (!strcasecmp(v->name, "nat")) {
                                user->nat = ast_true(v->value);
                        } else if (!strcasecmp(v->name, "callerid")) {
@@ -4131,16 +4140,19 @@ static struct sip_peer *build_peer(char *name, struct ast_variable *v)
                }
                peer->capability = capability;
                /* Assume can reinvite */
-               peer->canreinvite = 1;
+               peer->canreinvite = REINVITE_INVITE;
                peer->dtmfmode = 0;
                while(v) {
                        if (!strcasecmp(v->name, "secret")) 
                                strncpy(peer->secret, v->value, sizeof(peer->secret)-1);
                        else if (!strcasecmp(v->name, "auth")) 
                                strncpy(peer->methods, v->value, sizeof(peer->methods)-1);
-                       else if (!strcasecmp(v->name, "canreinvite")) 
-                               peer->canreinvite = ast_true(v->value);
-                       else if (!strcasecmp(v->name, "nat")) 
+                       else if (!strcasecmp(v->name, "canreinvite")) {
+                               if (!strcasecmp(v->value, "update"))
+                                       peer->canreinvite = REINVITE_UPDATE;
+                               else
+                                       peer->canreinvite = ast_true(v->value);
+                       } else if (!strcasecmp(v->name, "nat")) 
                                peer->nat = ast_true(v->value);
                        else if (!strcasecmp(v->name, "context"))
                                strncpy(peer->context, v->value, sizeof(peer->context)-1);