diff --git a/UPGRADE.txt b/UPGRADE.txt index 71eb5d8337e1c6dbf9ff14266fec4935162515b1..10b832171c34a432023fc955efa9aa0b50b54599 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -101,6 +101,10 @@ SIP should be vastly improved. The HANGUPCAUSE hash should now be used instead of SIP_CAUSE. Because of this, the storesipcause option in sip.conf is also deprecated. + - The sip paramater for Originating Line Information (oli, isup-oli, and + ss7-oli) is now parsed out of the From header and copied into the channel's + ANI2 information field. This is readable from the CALLERID(ani2) dialplan + function. chan_unistim - Due to massive update in chan_unistim phone keys functions and on-screen diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 934f8a611a7d9a1e06d76748af7b628373803aec..5fd1bc11a3ccce4f3af5174ea94dab4f1e2deb32 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1515,6 +1515,7 @@ static int parse_request(struct sip_request *req); static const char *referstatus2str(enum referstatus rstatus) attribute_pure; static int method_match(enum sipmethod id, const char *name); static void parse_copy(struct sip_request *dst, const struct sip_request *src); +static void parse_oli(struct sip_request *req, struct ast_channel *chan); static const char *find_alias(const char *name, const char *_default); static const char *__get_header(const struct sip_request *req, const char *name, int *start); static void lws2sws(struct ast_str *msgbuf); @@ -23894,6 +23895,9 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int ast_party_redirecting_free(&redirecting); } + /* Check if OLI/ANI-II is present in From: */ + parse_oli(req, p->owner); + /* Session-Timers */ if ((p->sipoptions & SIP_OPT_TIMER) && !ast_strlen_zero(sip_get_header(req, "Session-Expires"))) { /* The UAC has requested session-timers for this session. Negotiate @@ -24214,6 +24218,51 @@ request_invite_cleanup: return res; } +/*! \brief Check for the presence of OLI tag(s) in the From header and set on the channel + */ +static void parse_oli(struct sip_request *req, struct ast_channel *chan) +{ + const char *from = NULL; + const char *s = NULL; + int ani2 = 0; + + if (!chan || !req) { + /* null pointers are not helpful */ + return; + } + + from = sip_get_header(req, "From"); + if (ast_strlen_zero(from)) { + /* no From header */ + return; + } + + /* Look for the possible OLI tags. */ + if ((s = strcasestr(from, ";isup-oli="))) { + s += 10; + } else if ((s = strcasestr(from, ";ss7-oli="))) { + s += 9; + } else if ((s = strcasestr(from, ";oli="))) { + s += 5; + } + + if (ast_strlen_zero(s)) { + /* OLI tag is missing, or present with nothing following the '=' sign */ + return; + } + + /* just in case OLI is quoted */ + if (*s == '\"') { + s++; + } + + if (sscanf(s, "%d", &ani2)) { + ast_channel_caller(chan)->ani2 = ani2; + } + + return; +} + /*! \brief Find all call legs and bridge transferee with target * called from handle_request_refer *