diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 38dd57bf8b2b11029c35f84a746272389ae5b941..f1bbd50b3a2af82ef8df2570eff5483202d4c0de 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -778,10 +778,12 @@ struct sip_auth { #define SIP_PAGE2_CALL_ONHOLD (3 << 23) /*!< Call states */ #define SIP_PAGE2_CALL_ONHOLD_ONEDIR (1 << 23) /*!< 23: One directional hold */ #define SIP_PAGE2_CALL_ONHOLD_INACTIVE (1 << 24) /*!< 24: Inactive */ -#define SIP_PAGE2_RFC2833_COMPENSATE (1 << 25) +#define SIP_PAGE2_RFC2833_COMPENSATE (1 << 25) /*!< 25: ???? */ +#define SIP_PAGE2_BUGGY_CISCO_MWI (1 << 26) /*!< 26: Buggy CISCO MWI fix */ #define SIP_PAGE2_FLAGS_TO_COPY \ - (SIP_PAGE2_ALLOWSUBSCRIBE | SIP_PAGE2_ALLOWOVERLAP | SIP_PAGE2_VIDEOSUPPORT | SIP_PAGE2_T38SUPPORT | SIP_PAGE2_RFC2833_COMPENSATE) + (SIP_PAGE2_ALLOWSUBSCRIBE | SIP_PAGE2_ALLOWOVERLAP | SIP_PAGE2_VIDEOSUPPORT | \ + SIP_PAGE2_T38SUPPORT | SIP_PAGE2_RFC2833_COMPENSATE | SIP_PAGE2_BUGGY_CISCO_MWI) /* SIP packet flags */ #define SIP_PKT_DEBUG (1 << 0) /*!< Debug this packet */ @@ -7065,7 +7067,11 @@ static int transmit_notify_with_mwi(struct sip_pvt *p, int newmsgs, int oldmsgs, ast_build_string(&t, &maxbytes, "Messages-Waiting: %s\r\n", newmsgs ? "yes" : "no"); ast_build_string(&t, &maxbytes, "Message-Account: sip:%s@%s\r\n", S_OR(vmexten, default_vmexten), S_OR(p->fromdomain, ast_inet_ntoa(p->ourip))); - ast_build_string(&t, &maxbytes, "Voice-Message: %d/%d (0/0)\r\n", newmsgs, oldmsgs); + /* Cisco has a bug in the SIP stack where it can't accept the + (0/0) notification. This can temporarily be disabled in + sip.conf with the "buggyciscomwi" option */ + ast_build_string(&t, &maxbytes, "Voice-Message: %d/%d%s\r\n", newmsgs, oldmsgs, (ast_test_flag(&p->flags[1], SIP_PAGE2_BUGGY_CISCO_MWI) ? "" : " (0/0)")); + if (p->subscribed) { if (p->expiry) add_header(&req, "Subscription-State", "active"); @@ -15541,6 +15547,10 @@ static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask ast_set_flag(&mask[1], SIP_PAGE2_RFC2833_COMPENSATE); ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_RFC2833_COMPENSATE); res = 1; + } else if (!strcasecmp(v->name, "buggyciscomwi")) { + ast_set_flag(&mask[1], SIP_PAGE2_BUGGY_CISCO_MWI); + ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_BUGGY_CISCO_MWI); + res = 1; } return res; diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample index 05f050a5d7020d7e89c00682838893d0e602615c..8264644b1d8695ae2a99f016af18b9b85a29338a 100644 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -70,6 +70,9 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls ; Defaults to 100 ms ;notifymimetype=text/plain ; Allow overriding of mime type in MWI NOTIFY ;checkmwi=10 ; Default time between mailbox checks for peers +;buggyciscomwi=no ; Cisco SIP firmware doesn't support the MWI RFC + ; fully. Enable this option to not get error messages + ; when sending MWI to phones with this bug. ;vmexten=voicemail ; dialplan extension to reach mailbox sets the ; Message-Account in the MWI notify message ; defaults to "asterisk"