- Moving two session (PVT) flags to peer PAGE2 (DYNAMIC and SELFDESTRUCT) to make...
authorOlle Johansson <oej@edvina.net>
Tue, 31 Jan 2006 16:02:35 +0000 (16:02 +0000)
committerOlle Johansson <oej@edvina.net>
Tue, 31 Jan 2006 16:02:35 +0000 (16:02 +0000)
  This is needed for integrating patches in the bug tracker
- Adding doxygen comments

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

channels/chan_sip.c

index 132b551..d0a8ed2 100644 (file)
@@ -34,6 +34,7 @@
  * \todo Better support of forking
  *
  * \ingroup channel_drivers
  * \todo Better support of forking
  *
  * \ingroup channel_drivers
+ *
  */
 
 
  */
 
 
@@ -487,11 +488,13 @@ struct sip_invite_param {
        enum sip_auth_type auth_type;   /*!< Authentication type */
 };
 
        enum sip_auth_type auth_type;   /*!< Authentication type */
 };
 
+/*! \brief Structure to save routing information for a SIP session */
 struct sip_route {
        struct sip_route *next;
        char hop[0];
 };
 
 struct sip_route {
        struct sip_route *next;
        char hop[0];
 };
 
+/*! \brief Modes for SIP domain handling in the PBX */
 enum domain_mode {
        SIP_DOMAIN_AUTO,        /*!< This domain is auto-configured */
        SIP_DOMAIN_CONFIG,      /*!< This domain is from configuration */
 enum domain_mode {
        SIP_DOMAIN_AUTO,        /*!< This domain is auto-configured */
        SIP_DOMAIN_CONFIG,      /*!< This domain is from configuration */
@@ -524,7 +527,9 @@ struct sip_auth {
        struct sip_auth *next;          /*!< Next auth structure in list */
 };
 
        struct sip_auth *next;          /*!< Next auth structure in list */
 };
 
-/*--- Various flags for the flags field in the pvt structure */
+/*--- Various flags for the flags field in the pvt structure 
+ Peer only flags should be set in PAGE2 below
+*/
 #define SIP_ALREADYGONE                (1 << 0)        /*!< Whether or not we've already been destroyed by our peer */
 #define SIP_NEEDDESTROY                (1 << 1)        /*!< if we need to be destroyed */
 #define SIP_NOVIDEO            (1 << 2)        /*!< Didn't get video in invite, don't offer */
 #define SIP_ALREADYGONE                (1 << 0)        /*!< Whether or not we've already been destroyed by our peer */
 #define SIP_NEEDDESTROY                (1 << 1)        /*!< if we need to be destroyed */
 #define SIP_NOVIDEO            (1 << 2)        /*!< Didn't get video in invite, don't offer */
@@ -539,14 +544,13 @@ struct sip_auth {
 #define SIP_REALTIME           (1 << 11)       /*!< Flag for realtime users */
 #define SIP_USECLIENTCODE      (1 << 12)       /*!< Trust X-ClientCode info message */
 #define SIP_OUTGOING           (1 << 13)       /*!< Is this an outgoing call? */
 #define SIP_REALTIME           (1 << 11)       /*!< Flag for realtime users */
 #define SIP_USECLIENTCODE      (1 << 12)       /*!< Trust X-ClientCode info message */
 #define SIP_OUTGOING           (1 << 13)       /*!< Is this an outgoing call? */
-#define SIP_SELFDESTRUCT       (1 << 14)       
-#define SIP_DYNAMIC            (1 << 15)       /*!< Is this a dynamic peer? */
-/* --- Choices for DTMF support in SIP channel */
-#define SIP_DTMF               (3 << 16)       /*!< three settings, uses two bits */
-#define SIP_DTMF_RFC2833       (0 << 16)       /*!< RTP DTMF */
-#define SIP_DTMF_INBAND                (1 << 16)       /*!< Inband audio, only for ULAW/ALAW */
-#define SIP_DTMF_INFO          (2 << 16)       /*!< SIP Info messages */
-#define SIP_DTMF_AUTO          (3 << 16)       /*!< AUTO switch between rfc2833 and in-band DTMF */
+#define SIP_FREEBIT            (1 << 14)       /*!< Free for session-related use */
+#define SIP_FREEBIT3           (1 << 15)       /*!< Free for session-related use */
+#define SIP_DTMF               (3 << 16)       /*!< DTMF Support: four settings, uses two bits */
+#define SIP_DTMF_RFC2833       (0 << 16)       /*!< DTMF Support: RTP DTMF - "rfc2833" */
+#define SIP_DTMF_INBAND                (1 << 16)       /*!< DTMF Support: Inband audio, only for ULAW/ALAW - "inband" */
+#define SIP_DTMF_INFO          (2 << 16)       /*!< DTMF Support: SIP Info messages - "info" */
+#define SIP_DTMF_AUTO          (3 << 16)       /*!< DTMF Support: AUTO switch between rfc2833 and in-band DTMF */
 /* NAT settings */
 #define SIP_NAT                        (3 << 18)       /*!< four settings, uses two bits */
 #define SIP_NAT_NEVER          (0 << 18)       /*!< No nat support */
 /* NAT settings */
 #define SIP_NAT                        (3 << 18)       /*!< four settings, uses two bits */
 #define SIP_NAT_NEVER          (0 << 18)       /*!< No nat support */
@@ -584,7 +588,7 @@ struct sip_auth {
         SIP_PROG_INBAND | SIP_OSPAUTH | SIP_USECLIENTCODE | SIP_NAT | \
         SIP_INSECURE_PORT | SIP_INSECURE_INVITE)
 
         SIP_PROG_INBAND | SIP_OSPAUTH | SIP_USECLIENTCODE | SIP_NAT | \
         SIP_INSECURE_PORT | SIP_INSECURE_INVITE)
 
-/* a new page of flags for peer */
+/* a new page of flags for peers */
 #define SIP_PAGE2_RTCACHEFRIENDS       (1 << 0)
 #define SIP_PAGE2_RTUPDATE             (1 << 1)
 #define SIP_PAGE2_RTAUTOCLEAR          (1 << 2)
 #define SIP_PAGE2_RTCACHEFRIENDS       (1 << 0)
 #define SIP_PAGE2_RTUPDATE             (1 << 1)
 #define SIP_PAGE2_RTAUTOCLEAR          (1 << 2)
@@ -593,6 +597,8 @@ struct sip_auth {
 #define SIP_PAGE2_DEBUG                        (3 << 5)
 #define SIP_PAGE2_DEBUG_CONFIG                 (1 << 5)
 #define SIP_PAGE2_DEBUG_CONSOLE        (1 << 6)
 #define SIP_PAGE2_DEBUG                        (3 << 5)
 #define SIP_PAGE2_DEBUG_CONFIG                 (1 << 5)
 #define SIP_PAGE2_DEBUG_CONSOLE        (1 << 6)
+#define SIP_PAGE2_DYNAMIC              (1 << 7)        /*!< Dynamic Peers register with Asterisk */
+#define SIP_PAGE2_SELFDESTRUCT         (1 << 8)        /*!< Automatic peers need to destruct themselves */
 
 /* SIP packet flags */
 #define SIP_PKT_DEBUG          (1 << 0)        /*!< Debug this packet */
 
 /* SIP packet flags */
 #define SIP_PKT_DEBUG          (1 << 0)        /*!< Debug this packet */
@@ -1313,7 +1319,9 @@ static int retrans_pkt(void *data)
        return 0;
 }
 
        return 0;
 }
 
-/*! \brief Transmit packet with retransmits */
+/*! \brief Transmit packet with retransmits 
+       \return 0 on success, -1 on failure to allocate packet 
+*/
 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len, int fatal, int sipmethod)
 {
        struct sip_pkt *pkt;
 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len, int fatal, int sipmethod)
 {
        struct sip_pkt *pkt;
@@ -1680,7 +1688,7 @@ static void sip_destroy_peer(struct sip_peer *peer)
                ast_sched_del(sched, peer->pokeexpire);
        register_peer_exten(peer, 0);
        ast_free_ha(peer->ha);
                ast_sched_del(sched, peer->pokeexpire);
        register_peer_exten(peer, 0);
        ast_free_ha(peer->ha);
-       if (ast_test_flag(peer, SIP_SELFDESTRUCT))
+       if (ast_test_flag((&peer->flags_page2), SIP_PAGE2_SELFDESTRUCT))
                apeerobjs--;
        else if (ast_test_flag(peer, SIP_REALTIME))
                rpeerobjs--;
                apeerobjs--;
        else if (ast_test_flag(peer, SIP_REALTIME))
                rpeerobjs--;
@@ -5758,7 +5766,7 @@ static int expire_register(void *data)
        register_peer_exten(peer, 0);
        peer->expire = -1;
        ast_device_state_changed("SIP/%s", peer->name);
        register_peer_exten(peer, 0);
        peer->expire = -1;
        ast_device_state_changed("SIP/%s", peer->name);
-       if (ast_test_flag(peer, SIP_SELFDESTRUCT) || ast_test_flag((&peer->flags_page2), SIP_PAGE2_RTAUTOCLEAR)) {
+       if (ast_test_flag((&peer->flags_page2), SIP_PAGE2_SELFDESTRUCT) || ast_test_flag((&peer->flags_page2), SIP_PAGE2_RTAUTOCLEAR)) {
                peer = ASTOBJ_CONTAINER_UNLINK(&peerl, peer);
                ASTOBJ_UNREF(peer, sip_destroy_peer);
        }
                peer = ASTOBJ_CONTAINER_UNLINK(&peerl, peer);
                ASTOBJ_UNREF(peer, sip_destroy_peer);
        }
@@ -6490,7 +6498,7 @@ static int register_verify(struct sip_pvt *p, struct sockaddr_in *sin, struct si
                        ASTOBJ_UNREF(peer, sip_destroy_peer);
        }
        if (peer) {
                        ASTOBJ_UNREF(peer, sip_destroy_peer);
        }
        if (peer) {
-               if (!ast_test_flag(peer, SIP_DYNAMIC)) {
+               if (!ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC)) {
                        ast_log(LOG_ERROR, "Peer '%s' is trying to register, but not configured as host=dynamic\n", peer->name);
                } else {
                        ast_copy_flags(p, peer, SIP_NAT);
                        ast_log(LOG_ERROR, "Peer '%s' is trying to register, but not configured as host=dynamic\n", peer->name);
                } else {
                        ast_copy_flags(p, peer, SIP_NAT);
@@ -7650,7 +7658,7 @@ static int _sip_show_peers(int fd, int *total, struct mansession *s, struct mess
                
                snprintf(srch, sizeof(srch), FORMAT, name,
                        iterator->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), iterator->addr.sin_addr) : "(Unspecified)",
                
                snprintf(srch, sizeof(srch), FORMAT, name,
                        iterator->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), iterator->addr.sin_addr) : "(Unspecified)",
-                       ast_test_flag(iterator, SIP_DYNAMIC) ? " D " : "   ",   /* Dynamic or not? */
+                       ast_test_flag((&iterator->flags_page2), SIP_PAGE2_DYNAMIC) ? " D " : "   ",     /* Dynamic or not? */
                        (ast_test_flag(iterator, SIP_NAT) & SIP_NAT_ROUTE) ? " N " : "   ",     /* NAT=yes? */
                        iterator->ha ? " A " : "   ",   /* permit/deny */
                        ntohs(iterator->addr.sin_port), status);
                        (ast_test_flag(iterator, SIP_NAT) & SIP_NAT_ROUTE) ? " N " : "   ",     /* NAT=yes? */
                        iterator->ha ? " A " : "   ",   /* permit/deny */
                        ntohs(iterator->addr.sin_port), status);
@@ -7658,7 +7666,7 @@ static int _sip_show_peers(int fd, int *total, struct mansession *s, struct mess
                if (!s)  {/* Normal CLI list */
                        ast_cli(fd, FORMAT, name, 
                        iterator->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), iterator->addr.sin_addr) : "(Unspecified)",
                if (!s)  {/* Normal CLI list */
                        ast_cli(fd, FORMAT, name, 
                        iterator->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), iterator->addr.sin_addr) : "(Unspecified)",
-                       ast_test_flag(iterator, SIP_DYNAMIC) ? " D " : "   ",  /* Dynamic or not? */
+                       ast_test_flag((&iterator->flags_page2), SIP_PAGE2_DYNAMIC) ? " D " : "   ",     /* Dynamic or not? */
                        (ast_test_flag(iterator, SIP_NAT) & SIP_NAT_ROUTE) ? " N " : "   ",     /* NAT=yes? */
                        iterator->ha ? " A " : "   ",       /* permit/deny */
                        
                        (ast_test_flag(iterator, SIP_NAT) & SIP_NAT_ROUTE) ? " N " : "   ",     /* NAT=yes? */
                        iterator->ha ? " A " : "   ",       /* permit/deny */
                        
@@ -7680,7 +7688,7 @@ static int _sip_show_peers(int fd, int *total, struct mansession *s, struct mess
                        iterator->name, 
                        iterator->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), iterator->addr.sin_addr) : "-none-",
                        ntohs(iterator->addr.sin_port), 
                        iterator->name, 
                        iterator->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), iterator->addr.sin_addr) : "-none-",
                        ntohs(iterator->addr.sin_port), 
-                       ast_test_flag(iterator, SIP_DYNAMIC) ? "yes" : "no",  /* Dynamic or not? */
+                       ast_test_flag((&iterator->flags_page2), SIP_PAGE2_DYNAMIC) ? "yes" : "no",      /* Dynamic or not? */
                        (ast_test_flag(iterator, SIP_NAT) & SIP_NAT_ROUTE) ? "yes" : "no",      /* NAT=yes? */
                        iterator->ha ? "yes" : "no",       /* permit/deny */
                        status);
                        (ast_test_flag(iterator, SIP_NAT) & SIP_NAT_ROUTE) ? "yes" : "no",      /* NAT=yes? */
                        iterator->ha ? "yes" : "no",       /* permit/deny */
                        status);
@@ -8053,7 +8061,7 @@ static int _sip_show_peer(int type, int fd, struct mansession *s, struct message
                ast_cli(fd, "  VM Extension : %s\n", peer->vmexten);
                ast_cli(fd, "  LastMsgsSent : %d\n", peer->lastmsgssent);
                ast_cli(fd, "  Call limit   : %d\n", peer->call_limit);
                ast_cli(fd, "  VM Extension : %s\n", peer->vmexten);
                ast_cli(fd, "  LastMsgsSent : %d\n", peer->lastmsgssent);
                ast_cli(fd, "  Call limit   : %d\n", peer->call_limit);
-               ast_cli(fd, "  Dynamic      : %s\n", (ast_test_flag(peer, SIP_DYNAMIC)?"Yes":"No"));
+               ast_cli(fd, "  Dynamic      : %s\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC)?"Yes":"No"));
                ast_cli(fd, "  Callerid     : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
                ast_cli(fd, "  Expire       : %d\n", peer->expire);
                ast_cli(fd, "  Insecure     : %s\n", insecure2str(ast_test_flag(peer, SIP_INSECURE_PORT), ast_test_flag(peer, SIP_INSECURE_INVITE)));
                ast_cli(fd, "  Callerid     : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
                ast_cli(fd, "  Expire       : %d\n", peer->expire);
                ast_cli(fd, "  Insecure     : %s\n", insecure2str(ast_test_flag(peer, SIP_INSECURE_PORT), ast_test_flag(peer, SIP_INSECURE_INVITE)));
@@ -8129,7 +8137,7 @@ static int _sip_show_peer(int type, int fd, struct mansession *s, struct message
                ast_cli(fd, "VoiceMailbox: %s\r\n", peer->mailbox);
                ast_cli(fd, "LastMsgsSent: %d\r\n", peer->lastmsgssent);
                ast_cli(fd, "Call limit: %d\r\n", peer->call_limit);
                ast_cli(fd, "VoiceMailbox: %s\r\n", peer->mailbox);
                ast_cli(fd, "LastMsgsSent: %d\r\n", peer->lastmsgssent);
                ast_cli(fd, "Call limit: %d\r\n", peer->call_limit);
-               ast_cli(fd, "Dynamic: %s\r\n", (ast_test_flag(peer, SIP_DYNAMIC)?"Y":"N"));
+               ast_cli(fd, "Dynamic: %s\r\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC)?"Y":"N"));
                ast_cli(fd, "Callerid: %s\r\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, ""));
                ast_cli(fd, "RegExpire: %ld seconds\r\n", ast_sched_when(sched,peer->expire));
                ast_cli(fd, "SIP-AuthInsecure: %s\r\n", insecure2str(ast_test_flag(peer, SIP_INSECURE_PORT), ast_test_flag(peer, SIP_INSECURE_INVITE)));
                ast_cli(fd, "Callerid: %s\r\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, ""));
                ast_cli(fd, "RegExpire: %ld seconds\r\n", ast_sched_when(sched,peer->expire));
                ast_cli(fd, "SIP-AuthInsecure: %s\r\n", insecure2str(ast_test_flag(peer, SIP_INSECURE_PORT), ast_test_flag(peer, SIP_INSECURE_INVITE)));
@@ -9368,7 +9376,7 @@ static char *function_sippeer(struct ast_channel *chan, char *cmd, char *data, c
        } else  if (!strcasecmp(colname, "expire")) {
                snprintf(buf, len, "%d", peer->expire);
        } else  if (!strcasecmp(colname, "dynamic")) {
        } else  if (!strcasecmp(colname, "expire")) {
                snprintf(buf, len, "%d", peer->expire);
        } else  if (!strcasecmp(colname, "dynamic")) {
-               ast_copy_string(buf, (ast_test_flag(peer, SIP_DYNAMIC) ? "yes" : "no"), len);
+               ast_copy_string(buf, (ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC) ? "yes" : "no"), len);
        } else  if (!strcasecmp(colname, "callerid_name")) {
                ast_copy_string(buf, peer->cid_name, len);
        } else  if (!strcasecmp(colname, "callerid_num")) {
        } else  if (!strcasecmp(colname, "callerid_name")) {
                ast_copy_string(buf, peer->cid_name, len);
        } else  if (!strcasecmp(colname, "callerid_num")) {
@@ -12069,8 +12077,8 @@ static struct sip_peer *temp_peer(const char *name)
        peer->rtptimeout = global_rtptimeout;
        peer->rtpholdtimeout = global_rtpholdtimeout;
        peer->rtpkeepalive = global_rtpkeepalive;
        peer->rtptimeout = global_rtptimeout;
        peer->rtpholdtimeout = global_rtpholdtimeout;
        peer->rtpkeepalive = global_rtpkeepalive;
-       ast_set_flag(peer, SIP_SELFDESTRUCT);
-       ast_set_flag(peer, SIP_DYNAMIC);
+       ast_set_flag((&peer->flags_page2), SIP_PAGE2_SELFDESTRUCT);
+       ast_set_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC);
        peer->prefs = default_prefs;
        reg_source_db(peer);
 
        peer->prefs = default_prefs;
        reg_source_db(peer);
 
@@ -12196,7 +12204,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                                        ast_log(LOG_WARNING, "You can't have a dynamic outbound proxy, you big silly head at line %d.\n", v->lineno);
                                } else {
                                        /* They'll register with us */
                                        ast_log(LOG_WARNING, "You can't have a dynamic outbound proxy, you big silly head at line %d.\n", v->lineno);
                                } else {
                                        /* They'll register with us */
-                                       ast_set_flag(peer, SIP_DYNAMIC);
+                                       ast_set_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC);
                                        if (!found) {
                                                /* Initialize stuff iff we're not found, otherwise
                                                   we keep going with what we had */
                                        if (!found) {
                                                /* Initialize stuff iff we're not found, otherwise
                                                   we keep going with what we had */
@@ -12213,7 +12221,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                                if (peer->expire > -1)
                                        ast_sched_del(sched, peer->expire);
                                peer->expire = -1;
                                if (peer->expire > -1)
                                        ast_sched_del(sched, peer->expire);
                                peer->expire = -1;
-                               ast_clear_flag(peer, SIP_DYNAMIC);      
+                               ast_clear_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC);
                                if (!obproxyfound || !strcasecmp(v->name, "outboundproxy")) {
                                        if (ast_get_ip_or_srv(&peer->addr, v->value, "_sip._udp")) {
                                                ASTOBJ_UNREF(peer, sip_destroy_peer);
                                if (!obproxyfound || !strcasecmp(v->name, "outboundproxy")) {
                                        if (ast_get_ip_or_srv(&peer->addr, v->value, "_sip._udp")) {
                                                ASTOBJ_UNREF(peer, sip_destroy_peer);
@@ -12236,7 +12244,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                } else if (!strcasecmp(v->name, "permit") || !strcasecmp(v->name, "deny")) {
                        peer->ha = ast_append_ha(v->name, v->value, peer->ha);
                } else if (!strcasecmp(v->name, "port")) {
                } else if (!strcasecmp(v->name, "permit") || !strcasecmp(v->name, "deny")) {
                        peer->ha = ast_append_ha(v->name, v->value, peer->ha);
                } else if (!strcasecmp(v->name, "port")) {
-                       if (!realtime && ast_test_flag(peer, SIP_DYNAMIC))
+                       if (!realtime && ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC))
                                peer->defaddr.sin_port = htons(atoi(v->value));
                        else
                                peer->addr.sin_port = htons(atoi(v->value));
                                peer->defaddr.sin_port = htons(atoi(v->value));
                        else
                                peer->addr.sin_port = htons(atoi(v->value));
@@ -12318,7 +12326,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                 */
                v=v->next;
        }
                 */
                v=v->next;
        }
-       if (!ast_test_flag((&global_flags_page2), SIP_PAGE2_IGNOREREGEXPIRE) && ast_test_flag(peer, SIP_DYNAMIC) && realtime) {
+       if (!ast_test_flag((&global_flags_page2), SIP_PAGE2_IGNOREREGEXPIRE) && ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC) && realtime) {
                time_t nowtime;
 
                time(&nowtime);
                time_t nowtime;
 
                time(&nowtime);
@@ -12330,7 +12338,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
                }
        }
        ast_copy_flags(peer, &peerflags, mask.flags);
                }
        }
        ast_copy_flags(peer, &peerflags, mask.flags);
-       if (!found && ast_test_flag(peer, SIP_DYNAMIC) && !ast_test_flag(peer, SIP_REALTIME))
+       if (!found && ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC) && !ast_test_flag(peer, SIP_REALTIME))
                reg_source_db(peer);
        ASTOBJ_UNMARK(peer);
        ast_free_ha(oldha);
                reg_source_db(peer);
        ASTOBJ_UNMARK(peer);
        ast_free_ha(oldha);