]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_iax2: Add ANI2/OLI information element
authorNaveen Albert <asterisk@phreaknet.org>
Wed, 18 Aug 2021 19:44:17 +0000 (19:44 +0000)
committerGeorge Joseph <gjoseph@digium.com>
Thu, 2 Sep 2021 19:17:04 +0000 (14:17 -0500)
Adds an information element for ANI2 so that
Originating Line Information can be transmitted
over IAX2 channels.

ASTERISK-29605 #close

Change-Id: Iaeacdf6ccde18eaff7f776a0f49fee87dcb549d2

channels/chan_iax2.c
channels/iax2/include/iax2.h
channels/iax2/include/parser.h
channels/iax2/parser.c
doc/CHANGES-staging/chan_iax2_ani2.txt [new file with mode: 0644]

index c57434bf202b3e72a3a4d135b340e3251dec2c70..e16577eecd2b40040f8cbff90a075de5498e91d4 100644 (file)
@@ -865,6 +865,7 @@ struct chan_iax2_pvt {
        int calling_ton;
        int calling_tns;
        int calling_pres;
+       int calling_ani2;
        int amaflags;
        AST_LIST_HEAD_NOLOCK(, iax2_dpcache) dpentries;
        /*! variables inherited from the user definition */
@@ -5181,6 +5182,7 @@ static int iax2_call(struct ast_channel *c, const char *dest, int timeout)
 
        iax_ie_append_byte(&ied, IAX_IE_CALLINGTON, ast_channel_connected(c)->id.number.plan);
        iax_ie_append_short(&ied, IAX_IE_CALLINGTNS, ast_channel_dialed(c)->transit_network_select);
+       iax_ie_append_int(&ied, IAX_IE_CALLINGANI2, ast_channel_connected(c)->ani2);
 
        if (n)
                iax_ie_append_str(&ied, IAX_IE_CALLING_NAME, n);
@@ -5941,6 +5943,7 @@ static struct ast_channel *ast_iax2_new(int callno, int state, iax2_format capab
                ast_channel_redirecting(tmp)->from.number.valid = 1;
                ast_channel_redirecting(tmp)->from.number.str = ast_strdup(i->rdnis);
        }
+       ast_channel_caller(tmp)->ani2 = i->calling_ani2;
        ast_channel_caller(tmp)->id.name.presentation = i->calling_pres;
        ast_channel_caller(tmp)->id.number.presentation = i->calling_pres;
        ast_channel_caller(tmp)->id.number.plan = i->calling_ton;
@@ -7831,6 +7834,8 @@ static int check_access(int callno, struct ast_sockaddr *addr, struct iax_ies *i
                iaxs[callno]->calling_tns = ies->calling_tns;
        if (ies->calling_pres > -1)
                iaxs[callno]->calling_pres = ies->calling_pres;
+       if (ies->calling_ani2 > -1)
+               iaxs[callno]->calling_ani2 = ies->calling_ani2;
        if (ies->format)
                iaxs[callno]->peerformat = ies->format;
        if (ies->adsicpe)
index 3deb5dbcd8dee3bc12575e7ee1872ed9639c20c9..a661858d2e24a83442e92c4ccccea32c73894f1e 100644 (file)
@@ -187,6 +187,8 @@ enum iax_frame_subclass {
 #define IAX_IE_CAPABILITY2          55      /*!< Actual codec capability - u8 version + integer array */
 #define IAX_IE_FORMAT2              56      /*!< Desired codec format - u8 version + integer array */
 
+#define IAX_IE_CALLINGANI2          57      /*!< Calling Originating Line Information (ANI2) digits */
+
 #define IAX_MAX_OSPBLOCK_SIZE          254             /*!< Max OSP token block size, 255 bytes - 1 byte OSP token block index */
 #define IAX_MAX_OSPBLOCK_NUM           4
 #define IAX_MAX_OSPTOKEN_SIZE          (IAX_MAX_OSPBLOCK_SIZE * IAX_MAX_OSPBLOCK_NUM)
index d8edc4b2aa3b4148c9bdf2362a6aa0ff789113d5..cd64f35e2e328ac840bd67498d829f39c248b082 100644 (file)
@@ -32,6 +32,7 @@ struct iax_ies {
        int calling_ton;
        int calling_tns;
        int calling_pres;
+       int calling_ani2;
        char *called_context;
        char *username;
        char *password;
index 86839388b139294b65b448295fb0e577f1866ca1..8a36f172183e828c1bc8e79ab8e97fbff7ebcd17 100644 (file)
@@ -313,6 +313,7 @@ static struct iax2_ie infoelts[] = {
        { IAX_IE_CALLINGPRES, "CALLING PRESNTN", dump_byte },
        { IAX_IE_CALLINGTON, "CALLING TYPEOFNUM", dump_byte },
        { IAX_IE_CALLINGTNS, "CALLING TRANSITNET", dump_short },
+       { IAX_IE_CALLINGANI2, "CALLING ANI2", dump_int },
        { IAX_IE_SAMPLINGRATE, "SAMPLINGRATE", dump_samprate },
        { IAX_IE_CAUSECODE, "CAUSE CODE", dump_byte },
        { IAX_IE_ENCRYPTION, "ENCRYPTION", dump_short },
@@ -805,6 +806,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
        ies->calling_ton = -1;
        ies->calling_tns = -1;
        ies->calling_pres = -1;
+       ies->calling_ani2 = -1;
        ies->samprate = IAX_RATE_8KHZ;
        while(datalen >= 2) {
                ie = data[0];
@@ -1057,6 +1059,14 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
                                errorf(tmp);
                        }
                        break;
+               case IAX_IE_CALLINGANI2:
+                       if (len == (int)sizeof(unsigned int)) {
+                               ies->calling_ani2 = ntohl(get_unaligned_uint32(data + 2));
+                       } else {
+                               snprintf(tmp, (int)sizeof(tmp), "callingani2 was %d long: %s\n", len, data + 2);
+                               errorf(tmp);
+                       }
+                       break;
                case IAX_IE_CALLINGTNS:
                        if (len != (int)sizeof(unsigned short)) {
                                snprintf(tmp, (int)sizeof(tmp), "Expecting callingtns to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
diff --git a/doc/CHANGES-staging/chan_iax2_ani2.txt b/doc/CHANGES-staging/chan_iax2_ani2.txt
new file mode 100644 (file)
index 0000000..37c6fa6
--- /dev/null
@@ -0,0 +1,4 @@
+Subject: chan_iax2
+
+ANI2 (OLI) is now transmitted over IAX2 calls
+as an information element.