Asterisk,Snom und unbeantwortete Anrufe

guidoquiram

Neuer User
Mitglied seit
25 Jun 2004
Beiträge
50
Punkte für Reaktionen
0
Punkte
0
Hi, danke für Deine schnelle Antwort. Ich habe Olle Johansson angeschrieben, und dieser geantwortet, dass dieses feature in der Version 1.6 implementiert werden soll. Viele Grüsse, Guido
 

speedy1980

Mitglied
Mitglied seit
13 Okt 2004
Beiträge
592
Punkte für Reaktionen
0
Punkte
0
Es war doch eine Lösung für Asterisk 1.4 gefragt? Asterisk 1.6 ist frühestens in einem halben Jahr halbwegs stabil für den produktiven Einsatz nutzbar ...
 

pwalker

Mitglied
Mitglied seit
27 Jun 2007
Beiträge
421
Punkte für Reaktionen
0
Punkte
0
Weiss jemand, ob so ein Patch in bristuff für Asterisk 1.2 drin ist? (Ich habe kurz gesucht aber nichts gefunden.) Wäre doch eigentlich noch was für in die "snom-Patch-Sammlung" von Bristuff.
 

pnxs

Neuer User
Mitglied seit
12 Apr 2008
Beiträge
3
Punkte für Reaktionen
0
Punkte
0
Hallo,

Ich hab mir mal ein paar Minuten Zeit genommen und habe die einzelnen Diffs mal in einem Patch zusammengefasst:

Code:
Index: asterisk-1.4.17~dfsg/include/asterisk/channel.h
===================================================================
--- asterisk-1.4.17~dfsg.orig/include/asterisk/channel.h	2008-04-11 19:26:31.000000000 +0200
+++ asterisk-1.4.17~dfsg/include/asterisk/channel.h	2008-04-11 19:28:13.000000000 +0200
@@ -493,6 +493,9 @@
 	/*! This flag indicates that on a masquerade, an active stream should not
 	 *  be carried over */
 	AST_FLAG_MASQ_NOSTREAM = (1 << 15),
+	/*! Flag to show channels that this call is hangup due to the fact that the call
+	 *  was indeed answerd, but in another channel */
+	AST_FLAG_ANSWERED_ELSEWHERE = (1<< 16),
 };
 
 /*! \brief ast_bridge_config flags */
Index: asterisk-1.4.17~dfsg/apps/app_dial.c
===================================================================
--- asterisk-1.4.17~dfsg.orig/apps/app_dial.c	2008-04-11 19:28:47.000000000 +0200
+++ asterisk-1.4.17~dfsg/apps/app_dial.c	2008-04-11 19:39:10.000000000 +0200
@@ -101,6 +101,8 @@
 "  Options:\n"
 "    A(x) - Play an announcement to the called party, using 'x' as the file.\n"
 "    C    - Reset the CDR for this call.\n"
+"    c    - If DIAL cancels this call, always set the flag to tell the channel\n"
+"           driver that the call is answered elsewhere.\n"
 "    d    - Allow the calling user to dial a 1 digit extension while waiting for\n"
 "           a call to be answered. Exit to that extension if it exists in the\n"
 "           current context, or the context defined in the EXITCONTEXT variable,\n"
@@ -243,6 +245,7 @@
 	OPT_CALLEE_PARK =	(1 << 25),
 	OPT_CALLER_PARK =	(1 << 26),
 	OPT_IGNORE_FORWARDING = (1 << 27),
+	OPT_CANCEL_ELSEWHERE =  (1 << 28),
 } dial_exec_option_flags;
 
 #define DIAL_STILLGOING			(1 << 30)
@@ -265,6 +268,7 @@
 AST_APP_OPTIONS(dial_exec_options, {
 	AST_APP_OPTION_ARG('A', OPT_ANNOUNCE, OPT_ARG_ANNOUNCE),
 	AST_APP_OPTION('C', OPT_RESETCDR),
+	AST_APP_OPTION('c', OPT_CANCEL_ELSEWHERE),
 	AST_APP_OPTION('d', OPT_DTMF_EXIT),
 	AST_APP_OPTION_ARG('D', OPT_SENDDTMF, OPT_ARG_SENDDTMF),
 	AST_APP_OPTION('f', OPT_FORCECLID),
@@ -308,14 +312,19 @@
 };
 
 
-static void hanguptree(struct dial_localuser *outgoing, struct ast_channel *exception)
+static void hanguptree(struct dial_localuser *outgoing, struct ast_channel *exception,
+                       int answered_elsewhere)
 {
 	/* Hang up a tree of stuff */
 	struct dial_localuser *oo;
 	while (outgoing) {
 		/* Hangup any existing lines we have open */
-		if (outgoing->chan && (outgoing->chan != exception))
+		if (outgoing->chan && (outgoing->chan != exception)) {
+			if (answered_elsewhere) {
+				ast_set_flag(outgoing->chan, AST_FLAG_ANSWERED_ELSEWHERE);
+			}
 			ast_hangup(outgoing->chan);
+		}
 		oo = outgoing;
 		outgoing=outgoing->next;
 		free(oo);
@@ -1114,6 +1123,7 @@
 			goto out;
 		if (opts.flags) {
 			ast_copy_flags(tmp, &opts,
+			               OPT_CANCEL_ELSEWHERE |
 				       OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER |
 				       OPT_CALLEE_HANGUP | OPT_CALLER_HANGUP |
 				       OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR |
@@ -1347,7 +1357,7 @@
 		/* Ah ha!  Someone answered within the desired timeframe.  Of course after this
 		   we will always return with -1 so that it is hung up properly after the 
 		   conversation.  */
-		hanguptree(outgoing, peer);
+		hanguptree(outgoing, peer, 1);
 		outgoing = NULL;
 		/* If appropriate, log that we have a destination channel */
 		if (chan->cdr)
@@ -1550,7 +1560,7 @@
 			ast_copy_string(peer->exten, chan->exten, sizeof(peer->exten));
 			peer->priority = chan->priority + 2;
 			ast_pbx_start(peer);
-			hanguptree(outgoing, NULL);
+			hanguptree(outgoing, NULL, ast_test_flag(&opts, OPT_CANCEL_ELSEWHERE)?1:0);
 			if (continue_exec)
 				*continue_exec = 1;
 			res = 0;
@@ -1730,7 +1740,7 @@
 		ast_indicate(chan, -1);
 	}
 	ast_rtp_early_bridge(chan, NULL);
-	hanguptree(outgoing, NULL);
+	hanguptree(outgoing, NULL, 0); /* In this case, there's no answer anywhere */
 	pbx_builtin_setvar_helper(chan, "DIALSTATUS", status);
 	if (option_debug)
 		ast_log(LOG_DEBUG, "Exiting with DIALSTATUS=%s.\n", status);
Index: asterisk-1.4.17~dfsg/channels/chan_sip.c
===================================================================
--- asterisk-1.4.17~dfsg.orig/channels/chan_sip.c	2008-04-11 19:39:26.000000000 +0200
+++ asterisk-1.4.17~dfsg/channels/chan_sip.c	2008-04-11 19:46:50.000000000 +0200
@@ -709,6 +709,13 @@
 	struct sip_auth *next;          /*!< Next auth structure in list */
 };
 
+/* New set flags for DIALOG ONLY, not for peers/users etc
+   \todo - move dialog only flags here to release bits for peer/user to dialog copying
+   This gues into flags[2] in the dialog - page 3
+*/
+
+#define SIP_DIALOG_ANSWEREDELSEWHERE (1<<0)
+
 /*--- Various flags for the flags field in the pvt structure */
 #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 by the monitor thread */
@@ -948,7 +955,7 @@
 	ast_group_t pickupgroup;		/*!< Pickup group */
 	int lastinvite;				/*!< Last Cseq of invite */
 	int lastnoninvite;                      /*!< Last Cseq of non-invite */
-	struct ast_flags flags[2];		/*!< SIP_ flags */
+	struct ast_flags flags[3];		/*!< SIP_ flags */
 	int timer_t1;				/*!< SIP timer T1, ms rtt */
 	unsigned int sipoptions;		/*!< Supported SIP options on the other end */
 	struct ast_codec_pref prefs;		/*!< codec prefs */
@@ -3460,6 +3467,13 @@
 		return 0;
 	}
 
+	if (ast_test_flag(ast, AST_FLAG_ANSWERED_ELSEWHERE)) {
+		if (option_debug)
+			ast_log(LOG_DEBUG, "This call was answered elsewhere");
+		append_history(p, "Cancel", "Call answered elsewhere");
+		ast_set_flag(&p->flags[2], SIP_DIALOG_ANSWEREDELSEWHERE);
+	}
+
 	if (ast_test_flag(&p->flags[0], SIP_DEFER_BYE_ON_TRANSFER)) {
 		if (ast_test_flag(&p->flags[0], SIP_INC_COUNT) || ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD)) {
 			if (option_debug && sipdebug)
@@ -7763,6 +7777,8 @@
 		p->invitestate = INV_CONFIRMED;
 
 	reqprep(&resp, p, sipmethod, seqno, newbranch);
+	if (sipmethod == SIP_CANCEL && ast_test_flag(&p->flags[0], SIP_DIALOG_ANSWEREDELSEWHERE))
+		add_header(&resp, "Reason:", "SIP;cause=200;text=\"Call completed elsewhere\"");
 	add_header_contentLength(&resp, 0);
 	return send_request(p, &resp, reliable, seqno ? seqno : p->ocseq);
 }
Der Patch ist auf 1.4.18.1~dfsg aus Debian anwendbar und kompiliert. Die Funktion habe ich noch nicht getestet.

Bye
pnxs
 

ekirchne

Neuer User
Mitglied seit
10 Sep 2007
Beiträge
27
Punkte für Reaktionen
0
Punkte
0
Anruflisten und Gruppenrufe

Mit den Aastra 5xi lösen das Thema derzeit so:
Auf Admin Ebene die lokale Anrufliste ausschalten.
Die Anrufliste hilfsweise im Kommunkationsserver führen.
Mit einem XML Menü auf die Server basierte Anrufliste zugreifen und daraus wählen. Der Kommunkatiosserver kann wissen, dass es sich um einen verpassten Gruppenruf handelte und entsprechend die Einträge für alle parallel geschalteten Teilnehmer löschen.
Gruß EK
 

stefvoip

Neuer User
Mitglied seit
9 Mai 2007
Beiträge
16
Punkte für Reaktionen
0
Punkte
0
cisco und unbeantwortete anrufe

weiss einer von euch ob das mit cisco phones auch irgendwie geht? mit den snom-phones haben wir's hingekriegt, mit cisco 7965 und 7975 geht's nicht. hat das schon mal jemand gemacht?

gruss
stef
 

bstocker

Neuer User
Mitglied seit
27 Aug 2007
Beiträge
16
Punkte für Reaktionen
0
Punkte
0
Und hier noch ein Patch, damit es auch mit dem Queue Kommando geht:

Code:
--- app_queue.backup    2008-07-22 10:18:14.000000000 +0200
+++ app_queue.c 2008-07-22 09:56:07.000000000 +0200
@@ -1391,14 +1391,19 @@
 }

 /* Hang up a list of outgoing calls */
-static void hangupcalls(struct localuser *outgoing, struct ast_channel *exception)
+static void hangupcalls(struct localuser *outgoing, struct ast_channel *exception, int answered_elsewhere)
 {
        struct localuser *oo;

+       ast_log(LOG_DEBUG, "stocky's hanguptree\n");
        while(outgoing) {
                /* Hangup any existing lines we have open */
-               if (outgoing->chan && (outgoing->chan != exception))
+
+               if (outgoing->chan && (outgoing->chan != exception)) {  
+                       if (answered_elsewhere)
+                               ast_set_flag(outgoing->chan, AST_FLAG_ANSWERED_ELSEWHERE);
                        ast_hangup(outgoing->chan);
+               }
                oo = outgoing;
                outgoing=outgoing->next;
                free(oo);
@@ -2314,7 +2319,7 @@
                callcompletedinsl = ((now - qe->start) <= qe->parent->servicelevel);
                ast_mutex_unlock(&qe->parent->lock);
                member = lpeer->member;
-               hangupcalls(outgoing, peer);
+               hangupcalls(outgoing, peer, 1);
                outgoing = NULL;
                if (announce || qe->parent->reportholdtime || qe->parent->memberdelay) {
                        int res2;
@@ -2461,7 +2466,7 @@
                res = bridge ? bridge : 1;
        }
 out:
-       hangupcalls(outgoing, NULL);
+       hangupcalls(outgoing, NULL, 0);
        return res;
 }
Hintergrund: dasselbe Problem, das beim Dial() Kommando zu beobachten ist, tritt auch mit dem Queue() Befehl auf: nimmt ein Teilnehmer das Gespräch entgegen, wird auf allen anderen Apparaten ein "nnn missed call(s)" angezeigt. Der Patch modifiziert app_queue.c analog zu den Änderungen in app_dial.c. Er funktioniert hier mit Asterisk 1.2.24 zufriedenstellend.
 

schogge

Mitglied
Mitglied seit
11 Aug 2005
Beiträge
211
Punkte für Reaktionen
0
Punkte
0
Hat das nun jemand mit Asterisk 1.4 zum Laufen bekommen?

Hab den Patch von pnxs (Post #24) mit folgende Asteriskversionen versucht:
1.4.21.2
1.4.18.1
1.4.17

leider funktioniert es mit keiner einzigen.

Lediglich mit Asterisk 1.2.18, die ich testweise aufgesetzt habe, und dem Patch von speedy1980 (Post #4) funktioniert es.
 

bstocker

Neuer User
Mitglied seit
27 Aug 2007
Beiträge
16
Punkte für Reaktionen
0
Punkte
0
Teste die Version 1.6.0-beta9 - dort ist der Patch übernommen.
 

schogge

Mitglied
Mitglied seit
11 Aug 2005
Beiträge
211
Punkte für Reaktionen
0
Punkte
0
Ich muss sagen das "beta" schreckt mich ab. Der Asterisk-Server läuft hier als Produktivsystem und einen Umstieg auf Version 1.6 möchte ich nicht so schnell machen (auch nicht sofort wenn die Finale Version vorliegt.)

Im Grunde fehlt mir nur dieses eine Feature und wenn ich das über einen Patch der Version 1.4 nachrüsten kann, bin ich auch schon glücklich :)
 

bstocker

Neuer User
Mitglied seit
27 Aug 2007
Beiträge
16
Punkte für Reaktionen
0
Punkte
0
Der patch funktioniert nicht mit Asterisk 1.4.x. Hier sind drei patches (channel.h, app_dial.c, chan_sip.c) für Asterisk 1.4.21.2

Code:
--- include/asterisk/channel.orig       2008-07-23 16:02:08.000000000 +0200
+++ include/asterisk/channel.h  2008-07-23 15:46:45.000000000 +0200
@@ -87,6 +87,8 @@
 #ifndef _ASTERISK_CHANNEL_H
 #define _ASTERISK_CHANNEL_H

+#define AST_FLAG_ANSWERED_ELSEWHERE (1 << 15)
+
 #include "asterisk/abstract_jb.h"

 #include <unistd.h>
Code:
--- apps/app_dial.orig  2008-07-23 16:06:54.000000000 +0200
+++ apps/app_dial.c     2008-07-23 15:50:26.000000000 +0200
@@ -313,14 +313,17 @@
 };
 
 
-static void hanguptree(struct dial_localuser *outgoing, struct ast_channel *exception)
+static void hanguptree(struct dial_localuser *outgoing, struct ast_channel *exception, int answered_elsewhere)
 {
        /* Hang up a tree of stuff */
        struct dial_localuser *oo;
        while (outgoing) {
                /* Hangup any existing lines we have open */
-               if (outgoing->chan && (outgoing->chan != exception))  
+               if (outgoing->chan && (outgoing->chan != exception)) {
+                       if (answered_elsewhere)
+                               ast_set_flag(outgoing->chan, AST_FLAG_ANSWERED_ELSEWHERE);
                        ast_hangup(outgoing->chan);
+               }
                oo = outgoing;
                outgoing=outgoing->next;
                free(oo);
@@ -1345,7 +1348,7 @@
                /* Ah ha!  Someone answered within the desired timeframe.  Of course after this
                   we will always return with -1 so that it is hung up properly after the
                   conversation.  */
-               hanguptree(outgoing, peer);   
+               hanguptree(outgoing, peer, 1);
                outgoing = NULL;
                /* If appropriate, log that we have a destination channel */
                if (chan->cdr)
@@ -1548,7 +1551,7 @@
                        ast_copy_string(peer->exten, chan->exten, sizeof(peer->exten));
                        peer->priority = chan->priority + 2;
                        ast_pbx_start(peer);
-                       hanguptree(outgoing, NULL);   
+                       hanguptree(outgoing, NULL, 0);
                        if (continue_exec)
                                *continue_exec = 1;
                        res = 0;
@@ -1728,7 +1731,7 @@
                ast_indicate(chan, -1);
        }
        ast_rtp_early_bridge(chan, NULL);
-       hanguptree(outgoing, NULL);   
+       hanguptree(outgoing, NULL, 0);
        pbx_builtin_setvar_helper(chan, "DIALSTATUS", status);
        if (option_debug)
                ast_log(LOG_DEBUG, "Exiting with DIALSTATUS=%s.\n", status);
Code:
--- channels/chan_sip.orig      2008-07-23 16:09:38.000000000 +0200
+++ channels/chan_sip.c 2008-07-23 15:56:17.000000000 +0200
@@ -788,6 +788,7 @@
 #define SIP_PAGE2_T38SUPPORT_UDPTL     (1 << 20)       /*!< 20: T38 Fax Passthrough Support */
 #define SIP_PAGE2_T38SUPPORT_RTP       (2 << 20)       /*!< 21: T38 Fax Passthrough Support (not implemented) */
 #define SIP_PAGE2_T38SUPPORT_TCP       (4 << 20)       /*!< 22: T38 Fax Passthrough Support (not implemented) */
+#define SIP_ANSWEREDELSEWHERE  (1 << 27)
 #define SIP_PAGE2_CALL_ONHOLD          (3 << 23)       /*!< Call states */
 #define SIP_PAGE2_CALL_ONHOLD_ACTIVE    (1 << 23)       /*!< 23: Active hold */
 #define SIP_PAGE2_CALL_ONHOLD_ONEDIR   (2 << 23)       /*!< 23: One directional hold */
@@ -3497,6 +3498,13 @@
                return 0;
        }
 
+       if (ast_test_flag(ast, AST_FLAG_ANSWERED_ELSEWHERE)) {
+               if(option_debug)
+                       ast_log(LOG_DEBUG, "This call was answered elsewhere\n");
+               append_history(p, "Cancel", "Call answered elsewhere");
+               ast_set_flag(p, SIP_ANSWEREDELSEWHERE);
+       }
+
        if (ast_test_flag(&p->flags[0], SIP_DEFER_BYE_ON_TRANSFER)) {
                if (ast_test_flag(&p->flags[0], SIP_INC_COUNT) || ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD)) {
                        if (option_debug && sipdebug)
@@ -7858,6 +7866,10 @@
                p->invitestate = INV_CONFIRMED;
 
        reqprep(&resp, p, sipmethod, seqno, newbranch);
+
+       if (sipmethod == SIP_CANCEL && ast_test_flag(p, SIP_ANSWEREDELSEWHERE))
+       add_header(&resp, "Reason", "SIP;cause=200;text=\"Call completed elsewhere\"");
+
        add_header_contentLength(&resp, 0);
        return send_request(p, &resp, reliable, seqno ? seqno : p->ocseq);
 }
Ich hoffe, dass es damit funzt. Viel Spass und Mahlzeit :)
 

schogge

Mitglied
Mitglied seit
11 Aug 2005
Beiträge
211
Punkte für Reaktionen
0
Punkte
0
Erstmal danke für die Mühe.

Patch 2 und 3 verursachen bei mir folgenden Fehler währende des Patchens:
Code:
patch -p0 < /root/patch3.patch 
patching file channels/chan_sip.c
Hunk #1 FAILED at 788.
Hunk #2 FAILED at 3498.
Hunk #3 FAILED at 7866.
3 out of 3 hunks FAILED -- saving rejects to file channels/chan_sip.c.rej
Wenn ich dann in den Dateien die entsprechenden Änderungen per Hand vornehmen, bricht das Kompilieren mit folgender Meldung ab:
Code:
   [CC] chan_oss.c -> chan_oss.o
   [LD] chan_oss.o -> chan_oss.so
   [CC] chan_phone.c -> chan_phone.o
   [LD] chan_phone.o -> chan_phone.so
   [CC] chan_sip.c -> chan_sip.o
chan_sip.c: In function `sip_hangup':
chan_sip.c:3505: Fehler: Feld mit nicht konstantem Feldausdruck initialisiert
chan_sip.c:3505: Warnung: in Vergleich verschiedener Zeigertypen fehlt Typkonvertierung
chan_sip.c:3505: Fehler: ungültige Operanden für binäres |
chan_sip.c: In function `transmit_request':
chan_sip.c:7870: Fehler: Feld mit nicht konstantem Feldausdruck initialisiert
chan_sip.c:7870: Warnung: in Vergleich verschiedener Zeigertypen fehlt Typkonvertierung
chan_sip.c:7870: Fehler: ungültige Operanden für binäres &
make[1]: *** [chan_sip.o] Fehler 1
make: *** [channels] Fehler 2
Scheint mit dieser Zeile aus dem Patch zu tun zu haben:
Code:
#define SIP_ANSWEREDELSEWHERE  (1 << 27)
Leider bin ich kein Programmierer und kann damit nicht viel anfangen. Aber wird hier vielleicht ein Array falsch angelegt? Für den Fall das ich mich etwas dumm anstelle, bitte ich das zu entschuldigen ;-)
 

easy12377

Neuer User
Mitglied seit
1 Jul 2008
Beiträge
11
Punkte für Reaktionen
0
Punkte
1
Hallo,

ich habe gestern auch mal versucht den Patch bei mir einzuspielen (Asterisk 1.4) leider kommt beim Kompilieren der gleich Fehler wie bei schogge.
Ich habe da ein wenig im Digium svn gesucht, und festgestellt das die Übergabeparameter für die Funktion ast_set_flag immer nach dem system "&p->flags[0]" aussehen.
Für mich sieht das aus wie wenn p ein "struct" wäre und in ihm es ein Feld mit Flags geben würde. Leider kann ich nirgends finden wo dieser struct definiert wir, bzw für was welches Flag ist. Habt ihr da ne quelle wo ich nachschaun kann?

Ich bekomme das das Ding zwar jetzt durch den Compiller mit meiner Ändereung, aber leider wird bei jeden nicht angenommenen Anruf jetzt angezeigt, dass er wo anderes angenommen würde(auch wenn das nicht so war).

Daher vermute ich das entweder das falsche Flag gesetzt wird, oder es nicht mehr zurück gesetzt wird.
Hat da irgendwer ne Idee?

mfg easy
 

bstocker

Neuer User
Mitglied seit
27 Aug 2007
Beiträge
16
Punkte für Reaktionen
0
Punkte
0
Hallo und erstmals sorry, dass es nicht geklappt hat :-(

Hallo,

ich habe gestern auch mal versucht den Patch bei mir einzuspielen (Asterisk 1.4) leider kommt beim Kompilieren der gleich Fehler wie bei schogge.
Ich habe da ein wenig im Digium svn gesucht, und festgestellt das die Übergabeparameter für die Funktion ast_set_flag immer nach dem system "&p->flags[0]" aussehen.
Für mich sieht das aus wie wenn p ein "struct" wäre und in ihm es ein Feld mit Flags geben würde. Leider kann ich nirgends finden wo dieser struct definiert wir, bzw für was welches Flag ist. Habt ihr da ne quelle wo ich nachschaun kann?
Steht in chan_sip.c: p ist ein pointer auf eine sip_pvt Struktur. Darin gibt's ein Array "flags" das wiederum aus ast_flags Strukturen besteht.

Ich bekomme das das Ding zwar jetzt durch den Compiller mit meiner Ändereung, aber leider wird bei jeden nicht angenommenen Anruf jetzt angezeigt, dass er wo anderes angenommen würde(auch wenn das nicht so war).
Hast Du in Zeile 3500 (chan_sip.c) folgendes:

Code:
ast_set_flag(&p->flags[0], SIP_ANSWEREDELSEWHERE);
und in Zeile 7869 folgendes:

Code:
if (sipmethod == SIP_CANCEL && ast_test_flag(&p->flags[0], SIP_ANSWEREDELSEWHERE))
    add_header(&resp, "Reason", "SIP;cause=200;text=\"Call completed elsewhere\"");
Daher vermute ich das entweder das falsche Flag gesetzt wird, oder es nicht mehr zurück gesetzt wird.
Hat da irgendwer ne Idee?
Schau mal, was zwischen den Telefonen und Asterisk an SIP Mesages hin und hergeht. Alle Telefone ausser dem, das abnimmt, müssen ein CANCEL mit dem 200 Code "answered elsewhere " erhalten. Resp. wenn ich Dir die files sende, könntest Du nochmals testen?
 

easy12377

Neuer User
Mitglied seit
1 Jul 2008
Beiträge
11
Punkte für Reaktionen
0
Punkte
1
Hallo,

Hast Du in Zeile 3500 (chan_sip.c) folgendes:

ast_set_flag(&p->flags[0], SIP_ANSWEREDELSEWHERE);

und in Zeile 7869 folgendes:

if (sipmethod == SIP_CANCEL && ast_test_flag(&p->flags[0], SIP_ANSWEREDELSEWHERE))
add_header(&resp, "Reason", "SIP;cause=200;text=\"Call completed elsewhere\"");
Genau so ist es.

Schau mal, was zwischen den Telefonen und Asterisk an SIP Mesages hin und hergeht. Alle Telefone ausser dem, das abnimmt, müssen ein CANCEL mit dem 200 Code "answered elsewhere " erhalten.
Das CANCEL mit dem 200 Code "answered elsewhere" wird korrekt übertragen.

Das Problem ist, dass das jetzt immer übertragen wird. Auch dann, wenn ich intern von einer auf eine andere Nebenstelle anrufe und wieder auflege. Es wird also nie ein Anruf in Abwesenheit angezeigt.

Resp. wenn ich Dir die files sende, könntest Du nochmals testen?
Du kannst mir gerne mal deine Files schicken und ich probier Sie dann aus. Meine Mailadresse sende ich dir aber lieber per PN nicht das ich dann ganz viel Post bekomme. ;-)

mfg easy
 
Zuletzt bearbeitet:

easy12377

Neuer User
Mitglied seit
1 Jul 2008
Beiträge
11
Punkte für Reaktionen
0
Punkte
1
Hallo,

so ich bin jetzt ein kleines Stückchen weiter gekommen.
Ich hab mir nochmal die Aufteilung der Flags im Asterisk angesehen und festgestellt das das verwendete Flag 27 bereits verwendet wird.

Code:
#define SIP_PAGE2_OUTGOING_CALL         (1 << 27)
Somit ist das Flag ja schon besetzt.
Daher kann es in der Zeile ~3500 auch nicht gesetzt werden bzw. ist schon gesetzt durch eine andere Funktion.
Die Auswertung des Flags in der Zeile ~7800 lieferte bei mir immer true zurück da es anscheinend immer gesetzt war.
Somit bekamen immer alle Telefonen ein "answeredelsewhere" zurück.

Ich habe jetzt einfach mal das Flag 31 also das 32igste bit genommen.

Code:
#define SIP_ANSWEREDELSEWHERE           (1 << 31)
Jetzt funktioniert alles so wie es soll, d.h. wenn jemand anderes abgehoben hat kommt die Meldung "answeredelsewhere".
Wenn niemand abgehoben hat kommt die Meldung nicht und es wird ein verpasster Anruf angezeigt.

Nur weiß ich jetzt leider nicht was ich alles damit "kaputt" mache da ich dieses Flag einfach verwende.
Könnte vielleicht jemand der sich besser mit Asterisk auskennt mal nachschauen ob diese Flag 31 nicht noch wo anders verwendet wir.
Vielen Dank schon mal.

mfg easy

@bstocker
Vielen dank für die Mail ich hab mir die Files angesehen und die Änderungen in meine Dateien abgetippt.
Ich muss mal sehn wenn ich morgen Zeit habe erstelle ich vielleicht noch nen Patch(oder ein Anderer erbarmt sich ;-) )
 

xbdbx

Neuer User
Mitglied seit
4 Jun 2008
Beiträge
4
Punkte für Reaktionen
0
Punkte
0
Hallo,

wäre toll wenn du, oder wer anders ;), den Patch hier in neuer Version bereitstellen könntest. :)

ich habes in der app_dial.c gefunden.
app_dial.c:#define DIAL_NOFORWARDHTML (1 << 31)

mfg
 
Zuletzt bearbeitet:

easy12377

Neuer User
Mitglied seit
1 Jul 2008
Beiträge
11
Punkte für Reaktionen
0
Punkte
1
Hallo,

ja ich hab mir am die Stelle in der app_dial.c angesehen. Leider werde ich nicht richtig schlau draus ob sich dieses Flag mit dem von mir verwendeten Flag in der chan_sip.c überschneidet, oder es sogar die gleichen sind.

Notfalls müsste man sich eine eigene extra Variable erstellen, und könnte so sicher sein das man nichts damit verändert.

Bevor ich den Patch erstelle, sollte man das vielleicht mal noch klären.

mfg easy
 

bstocker

Neuer User
Mitglied seit
27 Aug 2007
Beiträge
16
Punkte für Reaktionen
0
Punkte
0
...es sollte keine Probleme geben! Das Flag wird ja nur in einem vorgegebenen Bitset verwendet. Ich habe es ausprobiert und es scheint gut zu funktionieren. Ich werde allerdings auf 1.6 umstellen, sobald eine Final-Release verfügbar ist. Dort ist nebst vielen anderen Verbesserungen auch dieser Patch fix im Code.
 

pwalker

Mitglied
Mitglied seit
27 Jun 2007
Beiträge
421
Punkte für Reaktionen
0
Punkte
0
Wenn ich das richtig sehe, ist das Flag in 1.6 so definiert:
Code:
AST_FLAG_ANSWERED_ELSEWHERE = (1 << 15),
in include/asterisk/channel.h