]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_caller_id: Add ANI2/OLI parsing
authorNaveen Albert <asterisk@phreaknet.org>
Tue, 8 Jun 2021 20:44:23 +0000 (16:44 -0400)
committerN A <mail@interlinked.x10host.com>
Tue, 14 Sep 2021 20:16:00 +0000 (15:16 -0500)
Adds parsing of ANI II digits (Originating
Line Information) to PJSIP, on par with
what currently exists in chan_sip.

ASTERISK-29472

Change-Id: Ifc938a7a7d45ce33999ebf3656a542226f6d3847

channels/chan_pjsip.c
include/asterisk/res_pjsip_session.h
res/res_pjsip_caller_id.c

index aa78e18bc5160b35733852c05ef335120fd3cfd0..4206974a6f85e756bc765f5852c00b2d42cc0a5f 100644 (file)
@@ -625,6 +625,7 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s
 
        ast_party_id_copy(&ast_channel_caller(chan)->id, &session->id);
        ast_party_id_copy(&ast_channel_caller(chan)->ani, &session->id);
+       ast_channel_caller(chan)->ani2 = session->ani2;
 
        if (!ast_strlen_zero(exten)) {
                /* Set provided DNID on the new channel. */
index 9c90a593ce129d6c330f80ad4c75f8e81c055386..9669b458faa5f2b6bab7b61f8e5a9a9937eb1c25 100644 (file)
@@ -227,6 +227,8 @@ struct ast_sip_session {
        AST_VECTOR(, struct ast_rtp_instance_stats *) media_stats;
        /*! Number of challenges received during outgoing requests to determine if we are in a loop */
        unsigned int authentication_challenge_count:4;
+       /*! Originating Line Info (ANI II digits) */
+       int ani2;
 };
 
 typedef int (*ast_sip_session_request_creation_cb)(struct ast_sip_session *session, pjsip_tx_data *tdata);
index bea635f0584887708118882e706d4f0e58a1ff88..40435c1d81355acf28107ad6fc594e75a95833c6 100644 (file)
@@ -33,6 +33,7 @@
 #include "asterisk/channel.h"
 #include "asterisk/module.h"
 #include "asterisk/callerid.h"
+#include "asterisk/conversions.h"
 
 /*!
  * \internal
@@ -119,6 +120,58 @@ static pjsip_fromto_hdr *get_id_header(pjsip_rx_data *rdata, const pj_str_t *hea
        return parsed_hdr;
 }
 
+/*!
+ * \internal
+ * \brief Set an ANI2 integer based on OLI data in a From header
+ *
+ * This uses the contents of a From header in order to set Originating Line information.
+ *
+ * \param rdata The incoming message
+ * \param ani2 The ANI2 field to set
+ * \retval 0 Successfully parsed OLI
+ * \retval non-zero Could not parse OLI
+ */
+static int set_id_from_oli(pjsip_rx_data *rdata, int *ani2)
+{
+       char fromhdr[AST_CHANNEL_NAME];
+       const char *s = NULL;
+       pjsip_sip_uri *uri;
+       pjsip_name_addr *id_name_addr;
+
+       pjsip_fromto_hdr *from = pjsip_msg_find_hdr(rdata->msg_info.msg,
+                       PJSIP_H_FROM, rdata->msg_info.msg->hdr.next);
+       id_name_addr = (pjsip_name_addr *) from->uri;
+
+       if (!from) {
+               /* This had better not happen */
+               return -1;
+       }
+
+       uri = pjsip_uri_get_uri(id_name_addr);
+       ast_copy_pj_str(fromhdr, &uri->user, sizeof(fromhdr));
+
+       /* Look for the possible OLI tags. */
+       if ((s = strcasestr(fromhdr, ";isup-oli="))) {
+               s += 10;
+       } else if ((s = strcasestr(fromhdr, ";ss7-oli="))) {
+               s += 9;
+       } else if ((s = strcasestr(fromhdr, ";oli="))) {
+               s += 5;
+       }
+
+       if (ast_strlen_zero(s)) {
+               /* OLI tag is missing, or present with nothing following the '=' sign */
+               return -1;
+       }
+
+       /* just in case OLI is quoted */
+       if (*s == '\"') {
+               s++;
+       }
+
+       return ast_str_to_int(s, ani2);
+}
+
 /*!
  * \internal
  * \brief Set an ast_party_id structure based on data in a P-Asserted-Identity header
@@ -371,6 +424,7 @@ static void update_incoming_connected_line(struct ast_sip_session *session, pjsi
 static int caller_id_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
 {
        if (!session->channel) {
+               int ani2;
                /*
                 * Since we have no channel this must be the initial inbound
                 * INVITE.  Set the session ID directly because the channel
@@ -387,6 +441,11 @@ static int caller_id_incoming_request(struct ast_sip_session *session, pjsip_rx_
                if (!session->endpoint->id.self.number.valid) {
                        set_id_from_from(rdata, &session->id);
                }
+               if (!set_id_from_oli(rdata, &ani2)) {
+                       session->ani2 = ani2;
+               } else {
+                       session->ani2 = 0;
+               }
        } else {
                /*
                 * ReINVITE or UPDATE.  Check for changes to the ID and queue