1 /* 2 * Copyright (c) 2009, Konrad Hammel <konrad@sangoma.com> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of the original author; nor the names of any contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 25 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 * 33 * 34 * Contributors: 35 * 36 * James Zhang <jzhang@sangoma.com> 37 * 38 */ 39 /******************************************************************************/ 40 #ifndef __FTMOD_SNG_SS7_H__ 41 #define __FTMOD_SNG_SS7_H__ 42 /******************************************************************************/ 43 44 /* INCLUDE ********************************************************************/ 45 #include <stdio.h> 46 #include <string.h> 47 #include <stdarg.h> 48 #include <stdint.h> 49 #include <unistd.h> 50 #include <ctype.h> 51 52 #include "private/ftdm_core.h" 53 54 #include "sng_ss7/sng_ss7.h" 55 #include "ftmod_sangoma_ss7_m2ua.h" 56 57 /******************************************************************************/ 58 59 /* DEFINES ********************************************************************/ 60 #define MAX_NAME_LEN 25 61 62 #define MAX_CIC_LENGTH 5 63 #define MAX_CIC_MAP_LENGTH 1000 64 #define MAX_SCTP_LINK 100 65 66 #define SNGSS7_EVENT_QUEUE_SIZE 100 67 #define SNGSS7_PEER_CHANS_QUEUE_SIZE 100 68 #define SNGSS7_CHAN_EVENT_QUEUE_SIZE 100 69 70 #define MAX_SIZEOF_SUBADDR_IE 24 /* as per Q931 4.5.9 */ 71 72 #define SNGSS7_SWITCHTYPE_ANSI(switchtype) (switchtype == LSI_SW_ANS88) || \ 73 (switchtype == LSI_SW_ANS92) || \ 74 (switchtype == LSI_SW_ANS95) 75 76 #define sngss7_flush_queue(queue) \ 77 do { \ 78 void *__queue_data = NULL; \ 79 while ((__queue_data = ftdm_queue_dequeue(queue))) { \ 80 ftdm_safe_free(__queue_data); \ 81 } \ 82 } while (0) 83 84 typedef struct ftdm2trillium { 85 uint8_t ftdm_val; 86 uint8_t trillium_val; 87 } ftdm2trillium_t; 88 89 typedef enum { 90 SNGSS7_CON_IND_EVENT = 0, 91 SNGSS7_CON_CFM_EVENT, 92 SNGSS7_CON_STA_EVENT, 93 SNGSS7_REL_IND_EVENT, 94 SNGSS7_REL_CFM_EVENT, 95 SNGSS7_DAT_IND_EVENT, 96 SNGSS7_FAC_IND_EVENT, 97 SNGSS7_FAC_CFM_EVENT, 98 SNGSS7_UMSG_IND_EVENT, 99 SNGSS7_STA_IND_EVENT, 100 SNGSS7_SUSP_IND_EVENT, 101 SNGSS7_RESM_IND_EVENT, 102 SNGSS7_SSP_STA_CFM_EVENT, 103 SNGSS7_INVALID_EVENT, 104 } sng_event_type_t; 105 #define SNG_EVENT_TYPE_STRINGS "CON_IND", "CON_CFM", "CON_STA", "REL_IND", "REL_CFM", "DAT_IND", "FAC_IND", \ 106 "FAC_CFM", "UMSG_IND", "STA_IND", "SUSP_IND", "RESM_IND", "SSP_STA_CFM", "INVALID" 107 FTDM_STR2ENUM_P(ftdm_str2sngss7_event, ftdm_sngss7_event2str, sng_event_type_t) 108 109 typedef enum { 110 SNG_BIT_A = (1 << 0), 111 SNG_BIT_B = (1 << 1), 112 SNG_BIT_C = (1 << 2), 113 SNG_BIT_D = (1 << 3), 114 SNG_BIT_E = (1 << 4), 115 SNG_BIT_F = (1 << 5), 116 SNG_BIT_G = (1 << 6), 117 SNG_BIT_H = (1 << 7) 118 } sng_bit_enums_t; 119 120 typedef enum { 121 SNG_CKT_VOICE = 0, 122 SNG_CKT_SIG, 123 SNG_CKT_HOLE 124 } sng_ckt_type_t; 125 126 typedef enum { 127 SNG_RTE_UP = 0, 128 SNG_RTE_DN 129 } sng_route_direction_t; 130 131 typedef enum { 132 SNGSS7_LPA_FOR_COT = (1 << 0), /* send LPA when COT arrives */ 133 SNGSS7_ACM_OBCI_BITA = (1 << 10) /* in-band indication */ 134 } sng_intf_options_t; 135 136 typedef enum { 137 SNG_CALLED = 1, 138 SNG_CALLING = 2 139 } sng_addr_type_t; 140 141 typedef enum { 142 SNG_GEN_CFG_STATUS_INIT = 0, 143 SNG_GEN_CFG_STATUS_PENDING = 1, 144 SNG_GEN_CFG_STATUS_DONE = 2 145 } nsg_gen_cfg_type_t; 146 147 typedef struct sng_mtp2_error_type { 148 int init; 149 char sng_type[MAX_NAME_LEN]; 150 uint32_t tril_type; 151 } sng_mtp2_error_type_t; 152 153 typedef struct sng_link_type { 154 int init; 155 char sng_type[MAX_NAME_LEN]; 156 uint32_t tril_mtp2_type; 157 uint32_t tril_mtp3_type; 158 } sng_link_type_t; 159 160 typedef struct sng_switch_type { 161 int init; 162 char sng_type[MAX_NAME_LEN]; 163 uint32_t tril_mtp3_type; 164 uint32_t tril_isup_type; 165 } sng_switch_type_t; 166 167 typedef struct sng_ssf_type { 168 int init; 169 char sng_type[MAX_NAME_LEN]; 170 uint32_t tril_type; 171 } sng_ssf_type_t; 172 173 typedef struct sng_cic_cntrl_type { 174 int init; 175 char sng_type[MAX_NAME_LEN]; 176 uint32_t tril_type; 177 } sng_cic_cntrl_type_t; 178 179 typedef struct sng_mtp1_link { 180 char name[MAX_NAME_LEN]; 181 uint32_t flags; 182 uint32_t id; 183 uint32_t span; 184 uint32_t chan; 185 } sng_mtp1_link_t; 186 187 typedef struct sng_mtp2_link { 188 char name[MAX_NAME_LEN]; 189 uint32_t flags; 190 uint32_t id; 191 uint32_t lssuLength; 192 uint32_t errorType; 193 uint32_t linkType; 194 uint32_t mtp1Id; 195 uint32_t mtp1ProcId; 196 uint32_t t1; 197 uint32_t t2; 198 uint32_t t3; 199 uint32_t t4n; 200 uint32_t t4e; 201 uint32_t t5; 202 uint32_t t6; 203 uint32_t t7; 204 } sng_mtp2_link_t; 205 206 /* defining glare handling methods: 207 SNGSS7_GLARE_PC: 208 higher PointCode controls even number CIC 209 lower PointCode controls odd number CIC 210 SNGSS7_GLARE_DOWN: 211 always give control to the other side 212 SNGSS7_GLARE_CONTROL: 213 always trying to control 214 */ 215 typedef enum { 216 SNGSS7_GLARE_PC = 0, 217 SNGSS7_GLARE_DOWN, 218 SNGSS7_GLARE_CONTROL 219 } sng_glare_resolution; 220 221 typedef struct sng_mtp3_link { 222 char name[MAX_NAME_LEN]; 223 uint32_t flags; 224 uint32_t id; 225 uint32_t priority; 226 uint32_t linkType; 227 uint32_t switchType; 228 uint32_t apc; 229 uint32_t spc; 230 uint32_t ssf; 231 uint32_t slc; 232 uint32_t linkSetId; 233 uint32_t mtp2Id; 234 uint32_t mtp2ProcId; 235 uint32_t t1; 236 uint32_t t2; 237 uint32_t t3; 238 uint32_t t4; 239 uint32_t t5; 240 uint32_t t6; 241 uint32_t t7; 242 uint32_t t8; 243 uint32_t t9; 244 uint32_t t10; 245 uint32_t t11; 246 uint32_t t12; 247 uint32_t t13; 248 uint32_t t14; 249 uint32_t t15; 250 uint32_t t16; 251 uint32_t t17; 252 uint32_t t18; 253 uint32_t t19; 254 uint32_t t20; 255 uint32_t t21; 256 uint32_t t22; 257 uint32_t t23; 258 uint32_t t24; 259 uint32_t t25; 260 uint32_t t27; 261 uint32_t t28; 262 uint32_t t29; 263 uint32_t t30; 264 uint32_t t31; 265 uint32_t t32; 266 uint32_t t33; 267 uint32_t t34; 268 uint32_t t35; 269 uint32_t t36; 270 uint32_t t37; 271 uint32_t tcraft; 272 uint32_t tflc; 273 uint32_t tbnd; 274 } sng_mtp3_link_t; 275 276 typedef struct sng_link_set { 277 char name[MAX_NAME_LEN]; 278 uint32_t flags; 279 uint32_t id; 280 uint32_t apc; 281 uint32_t linkType; 282 uint32_t switchType; 283 uint32_t ssf; 284 uint32_t minActive; 285 uint32_t numLinks; 286 uint32_t links[16]; 287 } sng_link_set_t; 288 289 typedef struct sng_link_set_list { 290 uint32_t lsId; 291 struct sng_link_set_list *next; 292 } sng_link_set_list_t; 293 294 typedef struct sng_route { 295 char name[MAX_NAME_LEN]; 296 uint32_t flags; 297 uint32_t id; 298 uint32_t dpc; 299 uint32_t cmbLinkSetId; 300 struct sng_link_set_list lnkSets; 301 uint32_t linkType; 302 uint32_t switchType; 303 uint32_t ssf; 304 uint32_t nwId; 305 uint32_t isSTP; 306 uint32_t dir; 307 uint32_t t6; 308 uint32_t t8; 309 uint32_t t10; 310 uint32_t t11; 311 uint32_t t15; 312 uint32_t t16; 313 uint32_t t18; 314 uint32_t t19; 315 uint32_t t21; 316 uint32_t t25; 317 uint32_t t26; 318 } sng_route_t; 319 320 typedef struct sng_isup_intf { 321 char name[MAX_NAME_LEN]; 322 uint32_t options; 323 uint32_t flags; 324 uint32_t id; 325 uint32_t spc; 326 uint32_t dpc; 327 uint32_t switchType; 328 uint32_t nwId; 329 uint32_t mtpRouteId; 330 uint32_t ssf; 331 uint32_t isap; 332 uint16_t t4; 333 uint32_t t11; 334 uint32_t t18; 335 uint32_t t19; 336 uint32_t t20; 337 uint32_t t21; 338 uint32_t t22; 339 uint32_t t23; 340 uint32_t t24; 341 uint32_t t25; 342 uint32_t t26; 343 uint32_t t28; 344 uint32_t t29; 345 uint32_t t30; 346 uint32_t t32; 347 uint32_t t37; 348 uint32_t t38; 349 uint32_t t39; 350 uint32_t tfgr; 351 uint32_t tpause; 352 uint32_t tstaenq; 353 } sng_isup_inf_t; 354 355 typedef struct sng_isup_ckt { 356 uint32_t options; 357 uint32_t flags; 358 uint32_t procId; 359 uint32_t id; 360 uint32_t ccSpanId; 361 uint32_t span; 362 uint32_t chan; 363 uint32_t type; /* VOICE/SIG/HOLE */ 364 uint32_t cic; 365 uint32_t infId; 366 uint32_t typeCntrl; 367 uint32_t ssf; 368 uint32_t switchType; 369 370 uint32_t clg_nadi; 371 uint32_t cld_nadi; 372 uint8_t rdnis_nadi; 373 uint32_t loc_nadi; 374 375 /* Generic Number defaults */ 376 uint8_t gn_nmbqual; /* Number Qualifier */ 377 uint8_t gn_nadi; /* Nature of Address indicator */ 378 uint8_t gn_screen_ind; /* Screening Indicator */ 379 uint8_t gn_pres_ind; /* Presentation Indicator */ 380 uint8_t gn_npi; /* Numbering Plan Indicator */ 381 uint8_t gn_num_inc_ind; /* Number Incomplete Indicator */ 382 /* END - Generic Number defaults */ 383 384 uint32_t min_digits; 385 uint32_t transparent_iam_max_size; 386 uint8_t transparent_iam; 387 uint8_t cpg_on_progress_media; 388 uint8_t cpg_on_progress; 389 uint8_t itx_auto_reply; 390 void *obj; 391 uint16_t t3; 392 uint32_t t10; 393 uint16_t t12; 394 uint16_t t13; 395 uint16_t t14; 396 uint16_t t15; 397 uint16_t t16; 398 uint16_t t17; 399 uint32_t t35; 400 uint32_t t39; 401 uint16_t tval; 402 } sng_isup_ckt_t; 403 404 typedef struct sng_nsap { 405 uint32_t flags; 406 uint32_t id; 407 uint32_t suId; 408 uint32_t spId; 409 uint32_t nwId; 410 uint32_t linkType; 411 uint32_t switchType; 412 uint32_t ssf; 413 } sng_nsap_t; 414 415 typedef struct sng_isap { 416 uint32_t id; 417 uint32_t suId; 418 uint32_t spId; 419 uint32_t switchType; 420 uint32_t ssf; 421 uint32_t flags; 422 uint32_t t1; 423 uint32_t t2; 424 uint32_t t5; 425 uint32_t t6; 426 uint32_t t7; 427 uint32_t t8; 428 uint32_t t9; 429 uint32_t t27; 430 uint32_t t31; 431 uint32_t t33; 432 uint32_t t34; 433 uint32_t t36; 434 uint32_t tccr; 435 uint32_t tccrt; 436 uint32_t tex; 437 uint32_t tcrm; 438 uint32_t tcra; 439 uint32_t tect; 440 uint32_t trelrsp; 441 uint32_t tfnlrelrsp; 442 } sng_isap_t; 443 444 typedef struct sng_relay { 445 uint32_t id; 446 char name[MAX_NAME_LEN]; 447 uint32_t flags; 448 uint32_t type; 449 uint32_t port; 450 char hostname[RY_REMHOSTNAME_SIZE]; 451 uint32_t procId; 452 } sng_relay_t; 453 454 /********************************************** 455 sctp structures and data definitions 456 **********************************************/ 457 458 typedef struct sng_sctp_gen_cfg { 459 } sng_sctp_gen_cfg_t; 460 461 typedef struct sng_sctp_link { 462 char name[MAX_NAME_LEN]; 463 uint32_t flags; 464 uint32_t id; 465 uint32_t port; 466 uint32_t numSrcAddr; 467 uint32_t srcAddrList[SCT_MAX_NET_ADDRS+1]; 468 } sng_sctp_link_t; 469 470 typedef struct sng_sctp_cfg { 471 sng_sctp_gen_cfg_t genCfg; 472 sng_sctp_link_t linkCfg[MAX_SCTP_LINK+1]; 473 } sng_sctp_cfg_t; 474 475 476 477 typedef struct sng_ss7_cfg { 478 uint32_t spc; 479 uint32_t procId; 480 char license[MAX_SNGSS7_PATH]; 481 char signature[MAX_SNGSS7_PATH]; 482 uint32_t transparent_iam_max_size; 483 uint32_t flags; 484 sng_relay_t relay[MAX_RELAY_CHANNELS+1]; 485 sng_mtp1_link_t mtp1Link[MAX_MTP_LINKS+1]; 486 sng_mtp2_link_t mtp2Link[MAX_MTP_LINKS+1]; 487 sng_mtp3_link_t mtp3Link[MAX_MTP_LINKS+1]; 488 sng_link_set_t mtpLinkSet[MAX_MTP_LINKSETS+1]; 489 sng_route_t mtpRoute[MAX_MTP_ROUTES+1]; 490 sng_isup_inf_t isupIntf[MAX_ISUP_INFS+1]; 491 sng_isup_ckt_t isupCkt[10000]; /* KONRAD - only need 2000 ( and 0-1000 aren't used) since other servers are registerd else where */ 492 sng_nsap_t nsap[MAX_NSAPS+1]; 493 sng_isap_t isap[MAX_ISAPS+1]; 494 sng_glare_resolution glareResolution; 495 uint32_t force_inr; 496 sng_m2ua_gbl_cfg_t g_m2ua_cfg; 497 sng_sctp_cfg_t sctpCfg; 498 } sng_ss7_cfg_t; 499 500 typedef struct ftdm_sngss7_data { 501 sng_ss7_cfg_t cfg; 502 int gen_config; 503 int function_trace; 504 int function_trace_level; 505 int message_trace; 506 int message_trace_level; 507 fio_signal_cb_t sig_cb; 508 } ftdm_sngss7_data_t; 509 510 typedef enum{ 511 SNG_SS7_OPR_MODE_NONE, 512 SNG_SS7_OPR_MODE_M2UA_SG, 513 SNG_SS7_OPR_MODE_ISUP, 514 }ftdm_sngss7_operating_modes_e; 515 516 typedef ftdm_sngss7_operating_modes_e ftdm_sngss7_opr_mode; 517 518 typedef struct sngss7_timer_data { 519 ftdm_timer_id_t hb_timer_id; 520 int beat; 521 int counter; 522 ftdm_sched_callback_t callback; 523 ftdm_sched_t *sched; 524 void *sngss7_info; 525 } sngss7_timer_data_t; 526 527 typedef struct sngss7_glare_data { 528 uint32_t spInstId; 529 uint32_t circuit; 530 SiConEvnt iam; 531 } sngss7_glare_data_t; 532 533 typedef struct sngss7_group_data { 534 uint32_t circuit; 535 uint32_t range; 536 uint8_t status[255]; 537 uint8_t type; 538 uint8_t cause; 539 } sngss7_group_data_t; 540 541 typedef struct sngss7_chan_data { 542 ftdm_channel_t *ftdmchan; 543 sng_isup_ckt_t *circuit; 544 uint32_t base_chan; 545 uint32_t suInstId; 546 uint32_t spInstId; 547 uint32_t spId; 548 uint8_t globalFlg; 549 uint32_t ckt_flags; 550 uint32_t blk_flags; 551 ftdm_hash_t* variables; /* send on next sigevent */ 552 ftdm_size_t raw_data_len; 553 void *raw_data; /* send on next sigevent */ 554 sngss7_glare_data_t glare; 555 sngss7_timer_data_t t35; 556 sngss7_timer_data_t t10; 557 sngss7_timer_data_t t39; 558 sngss7_group_data_t rx_grs; 559 sngss7_group_data_t rx_gra; 560 sngss7_group_data_t tx_grs; 561 sngss7_group_data_t ucic; 562 ftdm_queue_t *event_queue; 563 struct sngss7_chan_data *peer_data; 564 uint8_t peer_event_transfer_cnt; 565 } sngss7_chan_data_t; 566 567 #define SNGSS7_RX_GRS_PENDING (1 << 0) 568 #define SNGSS7_UCIC_PENDING (1 << 1) 569 #define SNGSS7_RX_GRA_PENDING (1 << 2) 570 typedef struct sngss7_span_data { 571 ftdm_sched_t *sched; 572 uint32_t flags; 573 sngss7_group_data_t rx_cgb; 574 sngss7_group_data_t tx_cgb; 575 sngss7_group_data_t rx_cgu; 576 sngss7_group_data_t tx_cgu; 577 ftdm_queue_t *event_queue; 578 } sngss7_span_data_t; 579 580 typedef struct sngss7_event_data 581 { 582 uint32_t event_id; 583 uint32_t spId; 584 uint32_t suId; 585 uint32_t spInstId; 586 uint32_t suInstId; 587 uint32_t circuit; 588 uint8_t globalFlg; 589 uint8_t evntType; 590 union 591 { 592 SiConEvnt siConEvnt; 593 SiCnStEvnt siCnStEvnt; 594 SiRelEvnt siRelEvnt; 595 SiInfoEvnt siInfoEvnt; 596 SiFacEvnt siFacEvnt; 597 SiStaEvnt siStaEvnt; 598 SiSuspEvnt siSuspEvnt; 599 SiResmEvnt siResmEvnt; 600 } event; 601 } sngss7_event_data_t; 602 603 604 typedef enum { 605 FLAG_RESET_RX = (1 << 0), 606 FLAG_RESET_TX = (1 << 1), 607 FLAG_RESET_SENT = (1 << 2), 608 FLAG_RESET_TX_RSP = (1 << 3), 609 FLAG_GRP_RESET_RX = (1 << 4), 610 FLAG_GRP_RESET_RX_DN = (1 << 5), 611 FLAG_GRP_RESET_RX_CMPLT = (1 << 6), 612 FLAG_GRP_RESET_BASE = (1 << 7), 613 FLAG_GRP_RESET_TX = (1 << 8), 614 FLAG_GRP_RESET_SENT = (1 << 9), 615 FLAG_GRP_RESET_TX_RSP = (1 << 10), 616 FLAG_REMOTE_REL = (1 << 11), 617 FLAG_LOCAL_REL = (1 << 12), 618 FLAG_GLARE = (1 << 13), 619 FLAG_INFID_RESUME = (1 << 14), 620 FLAG_INFID_PAUSED = (1 << 15), 621 FLAG_SENT_ACM = (1 << 16), 622 FLAG_SENT_CPG = (1 << 17), 623 FLAG_SUS_RECVD = (1 << 18), 624 FLAG_T6_CANCELED = (1 << 19), 625 FLAG_INR_TX = (1 << 20), 626 FLAG_INR_SENT = (1 << 21), 627 FLAG_INR_RX = (1 << 22), 628 FLAG_INR_RX_DN = (1 << 23), 629 FLAG_INF_TX = (1 << 24), 630 FLAG_INF_SENT = (1 << 25), 631 FLAG_INF_RX = (1 << 26), 632 FLAG_INF_RX_DN = (1 << 27), 633 FLAG_FULL_NUMBER = (1 << 28), 634 FLAG_RELAY_DOWN = (1 << 30), 635 FLAG_CKT_RECONFIG = (1 << 31) 636 } sng_ckt_flag_t; 637 638 #define CKT_FLAGS_STRING \ 639 "RX_RSC", \ 640 "TX_RSC", \ 641 "TX_RSC_REQ_SENT", \ 642 "TX_RSC_RSP_RECEIVED", \ 643 "RX_GRS", \ 644 "RX_GRS_DONE", \ 645 "RX_GRS_CMPLT", \ 646 "GRS_BASE", \ 647 "TX_GRS", \ 648 "TX_GRS_REQ_SENT", \ 649 "TX_GRS_RSP_RECEIVED", \ 650 "REMOTE_REL", \ 651 "LOCAL_REL", \ 652 "GLARE", \ 653 "INF_RESUME", \ 654 "INF_PAUSED", \ 655 "TX_ACM_SENT" \ 656 "TX_INR" \ 657 "INR_SENT" \ 658 "RX_INR" \ 659 "RX_INR_DN" \ 660 "TX_INF" \ 661 "INF SENT" \ 662 "RX_INF" \ 663 "RX_INF_DN" \ 664 "RELAY_DOWN", \ 665 "CKT_RECONFIG" 666 FTDM_STR2ENUM_P(ftmod_ss7_ckt_state2flag, ftmod_ss7_ckt_flag2str, sng_ckt_flag_t) 667 668 /* ckt blocking flags */ 669 typedef enum { 670 FLAG_CKT_UCIC_BLOCK = (1 << 0), 671 FLAG_CKT_UCIC_BLOCK_DN = (1 << 1), 672 FLAG_CKT_UCIC_UNBLK = (1 << 2), 673 FLAG_CKT_UCIC_UNBLK_DN = (1 << 3), 674 FLAG_CKT_LC_BLOCK_RX = (1 << 4), 675 FLAG_CKT_LC_BLOCK_RX_DN = (1 << 5), 676 FLAG_CKT_LC_UNBLK_RX = (1 << 6), 677 FLAG_CKT_LC_UNBLK_RX_DN = (1 << 7), 678 FLAG_CKT_MN_BLOCK_RX = (1 << 8), 679 FLAG_CKT_MN_BLOCK_RX_DN = (1 << 9), 680 FLAG_CKT_MN_UNBLK_RX = (1 << 10), 681 FLAG_CKT_MN_UNBLK_RX_DN = (1 << 11), 682 FLAG_CKT_MN_BLOCK_TX = (1 << 12), 683 FLAG_CKT_MN_BLOCK_TX_DN = (1 << 13), 684 FLAG_CKT_MN_UNBLK_TX = (1 << 14), 685 FLAG_CKT_MN_UNBLK_TX_DN = (1 << 15), 686 FLAG_GRP_HW_BLOCK_RX = (1 << 16), 687 FLAG_GRP_HW_BLOCK_RX_DN = (1 << 17), 688 FLAG_GRP_HW_BLOCK_TX = (1 << 18), 689 FLAG_GRP_HW_BLOCK_TX_DN = (1 << 19), 690 FLAG_GRP_MN_BLOCK_RX = (1 << 20), 691 FLAG_GRP_MN_BLOCK_RX_DN = (1 << 21), 692 FLAG_GRP_MN_BLOCK_TX = (1 << 22), 693 FLAG_GRP_MN_BLOCK_TX_DN = (1 << 23), 694 FLAG_GRP_HW_UNBLK_TX = (1 << 24), 695 FLAG_GRP_HW_UNBLK_TX_DN = (1 << 25), 696 FLAG_GRP_MN_UNBLK_TX = (1 << 26), 697 FLAG_GRP_MN_UNBLK_TX_DN = (1 << 27), 698 } sng_ckt_block_flag_t; 699 700 #define BLK_FLAGS_STRING \ 701 "UCIC BLK", \ 702 "UCIC BLK DN", \ 703 "UCIC UNBLK", \ 704 "UCIC UNBLK DN", \ 705 "RX LC BLK", \ 706 "RX LC BLK DN", \ 707 "RX LC UNBLK", \ 708 "RX LC UNBLK DN", \ 709 "RX CKT BLK", \ 710 "RX CKT BLK DN", \ 711 "RX CKT UNBLK", \ 712 "RX CKT UNBLK DN", \ 713 "TX CKT BLK", \ 714 "TX CKT BLK DN", \ 715 "TX CKT UNBLK", \ 716 "TX CKT UNBLK DN", \ 717 "RX GRP HW BLK", \ 718 "RX GRP HW BLK DN", \ 719 "TX GRP HW BLK", \ 720 "TX GRP HW BLK DN", \ 721 "RX GRP MN BLK", \ 722 "RX GRP MN BLK DN", \ 723 "TX GRP MN BLK", \ 724 "TX GRP MN BLK DN", \ 725 "TX GRP HW UNBLK", \ 726 "TX GRP HW UNBLK DN", \ 727 "TX GRP MN UNBLK", \ 728 "TX GRP MN UNBLK DN", \ 729 "RX GRP HW UNBLK", \ 730 "RX GRP HW UNBLK DN" 731 FTDM_STR2ENUM_P(ftmod_ss7_blk_state2flag, ftmod_ss7_blk_flag2str, sng_ckt_block_flag_t) 732 733 /* valid for every cfg array except circuits */ 734 typedef enum { 735 SNGSS7_CONFIGURED = (1 << 0), 736 SNGSS7_ACTIVE = (1 << 1), 737 SNGSS7_RELAY_INIT = (1 << 3), 738 SNGSS7_PAUSED = (1 << 7) /* for isup interfaces */ 739 } sng_cfg_flag_t; 740 741 typedef enum { 742 SNGSS7_SM_STARTED = (1 << 0), 743 744 SNGSS7_RY_PRESENT = (1 << 2), 745 SNGSS7_RY_STARTED = (1 << 3), 746 747 SNGSS7_MTP1_PRESENT = (1 << 4), 748 SNGSS7_MTP1_STARTED = (1 << 5), 749 750 SNGSS7_MTP2_PRESENT = (1 << 6), 751 SNGSS7_MTP2_STARTED = (1 << 7), 752 753 SNGSS7_MTP3_PRESENT = (1 << 8), 754 SNGSS7_MTP3_STARTED = (1 << 9), 755 756 SNGSS7_ISUP_PRESENT = (1 << 10), 757 SNGSS7_ISUP_STARTED = (1 << 11), 758 759 SNGSS7_CC_PRESENT = (1 << 12), 760 SNGSS7_CC_STARTED = (1 << 13), 761 762 SNGSS7_TUCL_PRESENT = (1 << 14), 763 SNGSS7_TUCL_STARTED = (1 << 15), 764 765 SNGSS7_SCTP_PRESENT = (1 << 16), 766 SNGSS7_SCTP_STARTED = (1 << 17), 767 768 SNGSS7_M2UA_PRESENT = (1 << 18), 769 SNGSS7_M2UA_STARTED = (1 << 19), 770 SNGSS7_M2UA_EP_OPENED = (1 << 20), 771 SNGSS7_M2UA_INIT_ASSOC_DONE = (1 << 21), 772 773 SNGSS7_NIF_PRESENT = (1 << 22), 774 SNGSS7_NIF_STARTED = (1 << 23), 775 776 } sng_task_flag_t; 777 /******************************************************************************/ 778 779 /* GLOBALS ********************************************************************/ 780 extern ftdm_sngss7_data_t g_ftdm_sngss7_data; 781 extern ftdm_sngss7_opr_mode g_ftdm_operating_mode; 782 extern sng_ssf_type_t sng_ssf_type_map[]; 783 extern sng_switch_type_t sng_switch_type_map[]; 784 extern sng_link_type_t sng_link_type_map[]; 785 extern sng_mtp2_error_type_t sng_mtp2_error_type_map[]; 786 extern sng_cic_cntrl_type_t sng_cic_cntrl_type_map[]; 787 extern uint32_t sngss7_id; 788 extern ftdm_sched_t *sngss7_sched; 789 extern int cmbLinkSetId; 790 /******************************************************************************/ 791 792 /* PROTOTYPES *****************************************************************/ 793 /* in ftmod_sangoma_ss7_main.c */ 794 ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan); 795 796 /* in ftmod_sangoma_ss7_logger.c */ 797 void handle_sng_log(uint8_t level, char *fmt,...); 798 void handle_sng_mtp1_alarm(Pst *pst, L1Mngmt *sta); 799 void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta); 800 void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta); 801 void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta); 802 void handle_sng_cc_alarm(Pst *pst, CcMngmt *sta); 803 void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta); 804 void handle_sng_m2ua_alarm(Pst *pst, MwMgmt *sta); 805 void handle_sng_nif_alarm(Pst *pst, NwMgmt *sta); 806 void handle_sng_tucl_alarm(Pst *pst, HiMngmt *sta); 807 void handle_sng_sctp_alarm(Pst *pst, SbMgmt *sta); 808 809 /* in ftmod_sangoma_ss7_relay.c */ 810 ftdm_status_t handle_relay_connect(RyMngmt *sta); 811 ftdm_status_t handle_relay_disconnect_on_down(RyMngmt *sta); 812 ftdm_status_t handle_relay_disconnect_on_error(RyMngmt *sta); 813 814 /* in ftmod_sangoma_ss7_cfg.c */ 815 int ft_to_sngss7_cfg_all(void); 816 int ftmod_ss7_mtp1_gen_config(void); 817 int ftmod_ss7_mtp2_gen_config(void); 818 int ftmod_ss7_mtp3_gen_config(void); 819 int ftmod_ss7_isup_gen_config(void); 820 int ftmod_ss7_cc_gen_config(void); 821 int ftmod_ss7_mtp1_psap_config(int id); 822 int ftmod_ss7_mtp2_dlsap_config(int id); 823 int ftmod_ss7_mtp3_dlsap_config(int id); 824 int ftmod_ss7_mtp3_nsap_config(int id); 825 int ftmod_ss7_mtp3_linkset_config(int id); 826 int ftmod_ss7_mtp3_route_config(int id); 827 int ftmod_ss7_isup_nsap_config(int id); 828 int ftmod_ss7_isup_intf_config(int id); 829 int ftmod_ss7_isup_ckt_config(int id); 830 int ftmod_ss7_isup_isap_config(int id); 831 int ftmod_ss7_cc_isap_config(int id); 832 833 /* in ftmod_sangoma_ss7_cntrl.c */ 834 int ft_to_sngss7_activate_all(void); 835 836 int ftmod_ss7_inhibit_mtp3link(uint32_t id); 837 int ftmod_ss7_uninhibit_mtp3link(uint32_t id); 838 int ftmod_ss7_bind_mtp3link(uint32_t id); 839 int ftmod_ss7_unbind_mtp3link(uint32_t id); 840 int ftmod_ss7_activate_mtp3link(uint32_t id); 841 int ftmod_ss7_deactivate_mtp3link(uint32_t id); 842 int ftmod_ss7_deactivate2_mtp3link(uint32_t id); 843 int ftmod_ss7_activate_mtplinkSet(uint32_t id); 844 int ftmod_ss7_deactivate_mtplinkSet(uint32_t id); 845 int ftmod_ss7_deactivate2_mtplinkSet(uint32_t id); 846 int ftmod_ss7_lpo_mtp3link(uint32_t id); 847 int ftmod_ss7_lpr_mtp3link(uint32_t id); 848 849 int ftmod_ss7_shutdown_isup(void); 850 int ftmod_ss7_shutdown_mtp3(void); 851 int ftmod_ss7_shutdown_mtp2(void); 852 int ftmod_ss7_shutdown_relay(void); 853 int ftmod_ss7_disable_relay_channel(uint32_t chanId); 854 855 int ftmod_ss7_disable_grp_mtp3Link(uint32_t procId); 856 int ftmod_ss7_enable_grp_mtp3Link(uint32_t procId); 857 858 int ftmod_ss7_disable_grp_mtp2Link(uint32_t procId); 859 860 #define ftmod_ss7_block_isup_ckt(x) __ftmod_ss7_block_isup_ckt(x,FTDM_TRUE) 861 #define ftmod_ss7_block_isup_ckt_nowait(x) __ftmod_ss7_block_isup_ckt(x,FTDM_FALSE) 862 int __ftmod_ss7_block_isup_ckt(uint32_t cktId, ftdm_bool_t wait); 863 int ftmod_ss7_unblock_isup_ckt(uint32_t cktId); 864 865 866 /* in ftmod_sangoma_ss7_sta.c */ 867 int ftmod_ss7_mtp1link_sta(uint32_t id, L1Mngmt *cfm); 868 int ftmod_ss7_mtp2link_sta(uint32_t id, SdMngmt *cfm); 869 int ftmod_ss7_mtp3link_sta(uint32_t id, SnMngmt *cfm); 870 int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm); 871 int ftmod_ss7_isup_intf_sta(uint32_t id, uint8_t *status); 872 int ftmod_ss7_relay_status(uint32_t id, RyMngmt *cfm); 873 int ftmod_ss7_isup_ckt_sta(uint32_t id, unsigned char *state); 874 875 876 /* in ftmod_sangoma_ss7_out.c */ 877 void ft_to_sngss7_iam(ftdm_channel_t *ftdmchan); 878 void ft_to_sngss7_acm(ftdm_channel_t *ftdmchan); 879 void ft_to_sngss7_cpg (ftdm_channel_t *ftdmchan); 880 void ft_to_sngss7_anm(ftdm_channel_t *ftdmchan); 881 void ft_to_sngss7_rel(ftdm_channel_t *ftdmchan); 882 void ft_to_sngss7_rlc(ftdm_channel_t *ftdmchan); 883 void ft_to_sngss7_rsc(ftdm_channel_t *ftdmchan); 884 void ft_to_sngss7_rsca(ftdm_channel_t *ftdmchan); 885 void ft_to_sngss7_blo(ftdm_channel_t *ftdmchan); 886 void ft_to_sngss7_bla(ftdm_channel_t *ftdmchan); 887 void ft_to_sngss7_ubl(ftdm_channel_t *ftdmchan); 888 void ft_to_sngss7_uba(ftdm_channel_t *ftdmchan); 889 void ft_to_sngss7_lpa(ftdm_channel_t *ftdmchan); 890 void ft_to_sngss7_gra(ftdm_channel_t *ftdmchan); 891 void ft_to_sngss7_grs(ftdm_channel_t *ftdmchan); 892 void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan); 893 void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan); 894 void ft_to_sngss7_cgb(ftdm_channel_t * ftdmchan); 895 void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan); 896 void ft_to_sngss7_itx (ftdm_channel_t * ftdmchan); 897 void ft_to_sngss7_txa (ftdm_channel_t * ftdmchan); 898 void ft_to_sngss7_inr(ftdm_channel_t * ftdmchan); 899 void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan, SiCnStEvnt *inr); 900 901 902 903 /* in ftmod_sangoma_ss7_in.c */ 904 void sngss7_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 905 void sngss7_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt); 906 void sngss7_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt); 907 void sngss7_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCnStEvnt *siCnStEvnt, uint8_t evntType); 908 void sngss7_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiRelEvnt *siRelEvnt); 909 void sngss7_rel_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiRelEvnt *siRelEvnt); 910 void sngss7_dat_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiInfoEvnt *siInfoEvnt); 911 void sngss7_fac_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t evntType, SiFacEvnt *siFacEvnt); 912 void sngss7_fac_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t evntType, SiFacEvnt *siFacEvnt); 913 void sngss7_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 914 void sngss7_umsg_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit); 915 void sngss7_resm_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiResmEvnt *siResmEvnt); 916 void sngss7_susp_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiSuspEvnt *siSuspEvnt); 917 void sngss7_ssp_sta_cfm(uint32_t infId); 918 919 ftdm_status_t sngss7_bufferzero_iam(SiConEvnt *siConEvnt); 920 ftdm_status_t sngss7_retrieve_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt); 921 ftdm_status_t sngss7_save_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt); 922 923 /* in ftmod_sangoma_ss7_handle.c */ 924 ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt); 925 ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCnStEvnt *siCnStEvnt, uint8_t evntType); 926 ftdm_status_t handle_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt); 927 ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiRelEvnt *siRelEvnt); 928 ftdm_status_t handle_rel_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiRelEvnt *siRelEvnt); 929 ftdm_status_t handle_dat_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiInfoEvnt *siInfoEvnt); 930 ftdm_status_t handle_fac_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t evntType, SiFacEvnt *siFacEvnt); 931 ftdm_status_t handle_fac_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t evntType, SiFacEvnt *siFacEvnt); 932 ftdm_status_t handle_umsg_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit); 933 ftdm_status_t handle_susp_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiSuspEvnt *siSuspEvnt); 934 ftdm_status_t handle_resm_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiResmEvnt *siResmEvnt); 935 ftdm_status_t handle_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 936 937 ftdm_status_t handle_reattempt(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 938 ftdm_status_t handle_pause(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 939 ftdm_status_t handle_resume(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 940 ftdm_status_t handle_cot_start(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 941 ftdm_status_t handle_cot_stop(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 942 ftdm_status_t handle_cot(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 943 ftdm_status_t handle_rsc_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 944 ftdm_status_t handle_local_rsc_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 945 ftdm_status_t handle_rsc_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 946 ftdm_status_t handle_grs_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 947 ftdm_status_t handle_grs_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 948 ftdm_status_t handle_blo_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 949 ftdm_status_t handle_blo_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 950 ftdm_status_t handle_ubl_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 951 ftdm_status_t handle_ubl_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 952 ftdm_status_t handle_local_blk(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 953 ftdm_status_t handle_local_ubl(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 954 ftdm_status_t handle_ucic(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt); 955 956 /* in ftmod_sangoma_ss7_xml.c */ 957 int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span); 958 959 /* in ftmod_sangoma_ss7_cli.c */ 960 ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const char *data); 961 962 /* in ftmod_sangoma_ss7_support.c */ 963 ftdm_status_t copy_cgPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum); 964 ftdm_status_t copy_cgPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum); 965 ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum); 966 ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum); 967 ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum); 968 ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum); 969 ftdm_status_t copy_redirgInfo_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo); 970 ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo); 971 ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); 972 ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); 973 974 ftdm_status_t copy_access_transport_from_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt); 975 ftdm_status_t copy_access_transport_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt); 976 ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); 977 ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); 978 ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb); 979 ftdm_status_t copy_genNmb_from_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb); 980 ftdm_status_t copy_cgPtyCat_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat); 981 ftdm_status_t copy_cgPtyCat_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat); 982 ftdm_status_t copy_accTrnspt_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt); 983 ftdm_status_t copy_natConInd_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd); 984 ftdm_status_t copy_fwdCallInd_hex_from_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd); 985 ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd); 986 ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMedReq); 987 ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA); 988 ftdm_status_t copy_NatureOfConnection_from_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd ); 989 ftdm_status_t copy_NatureOfConnection_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd); 990 991 ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven); 992 ftdm_status_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven); 993 ftdm_status_t copy_tknStr_to_sngss7(char* str, TknStr *tknStr, TknU8 *oddEven); 994 995 int check_for_state_change(ftdm_channel_t *ftdmchan); 996 int check_for_reset(sngss7_chan_data_t *sngss7_info); 997 ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_info, ftdm_channel_t **ftdmchan); 998 unsigned long get_unique_id(void); 999 1000 ftdm_status_t check_if_rx_grs_started(ftdm_span_t *ftdmspan); 1001 ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan); 1002 ftdm_status_t check_if_rx_gra_started(ftdm_span_t *ftdmspan); 1003 ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan); 1004 1005 ftdm_status_t process_span_ucic(ftdm_span_t *ftdmspan); 1006 1007 ftdm_status_t clear_rx_grs_flags(sngss7_chan_data_t *sngss7_info); 1008 ftdm_status_t clear_tx_grs_flags(sngss7_chan_data_t *sngss7_info); 1009 ftdm_status_t clear_rx_rsc_flags(sngss7_chan_data_t *sngss7_info); 1010 ftdm_status_t clear_tx_rsc_flags(sngss7_chan_data_t *sngss7_info); 1011 ftdm_status_t clear_rx_grs_data(sngss7_chan_data_t *sngss7_info); 1012 ftdm_status_t clear_rx_gra_data(sngss7_chan_data_t *sngss7_info); 1013 ftdm_status_t clear_tx_grs_data(sngss7_chan_data_t *sngss7_info); 1014 1015 ftdm_status_t encode_subAddrIE_nsap(const char *subAddr, char *subAddrIE, int type); 1016 ftdm_status_t encode_subAddrIE_nat(const char *subAddr, char *subAddrIE, int type); 1017 1018 int find_mtp2_error_type_in_map(const char *err_type); 1019 int find_link_type_in_map(const char *linkType); 1020 int find_switch_type_in_map(const char *switchType); 1021 int find_ssf_type_in_map(const char *ssfType); 1022 int find_cic_cntrl_in_map(const char *cntrlType); 1023 1024 ftdm_status_t check_status_of_all_isup_intf(void); 1025 ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan); 1026 1027 void sngss7_send_signal(sngss7_chan_data_t *sngss7_info, ftdm_signal_event_t event_id); 1028 void sngss7_set_sig_status(sngss7_chan_data_t *sngss7_info, ftdm_signaling_status_t status); 1029 ftdm_status_t sngss7_add_var(sngss7_chan_data_t *ss7_info, const char* var, const char* val); 1030 ftdm_status_t sngss7_add_raw_data(sngss7_chan_data_t *sngss7_info, uint8_t* data, ftdm_size_t data_len); 1031 1032 /* in ftmod_sangoma_ss7_timers.c */ 1033 void handle_isup_t35(void *userdata); 1034 void handle_isup_t10(void *userdata); 1035 void handle_isup_t39(void *userdata); 1036 1037 1038 /******************************************************************************/ 1039 1040 /* MACROS *********************************************************************/ 1041 #define SS7_STATE_CHANGE(ftdmchan, new_state) \ 1042 if (ftdmchan->state == new_state) { \ 1043 ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_IDLE); \ 1044 } else { \ 1045 ftdm_set_state(ftdmchan, new_state); \ 1046 } 1047 1048 #define SS7_DEBUG(a,...) ftdm_log(FTDM_LOG_DEBUG,a , ##__VA_ARGS__ ); 1049 #define SS7_INFO(a,...) ftdm_log(FTDM_LOG_INFO,a , ##__VA_ARGS__ ); 1050 #define SS7_WARN(a,...) ftdm_log(FTDM_LOG_WARNING,a , ##__VA_ARGS__ ); 1051 #define SS7_ERROR(a,...) ftdm_log(FTDM_LOG_ERROR,a , ##__VA_ARGS__ ); 1052 #define SS7_CRITICAL(a,...) ftdm_log(FTDM_LOG_CRIT,a , ##__VA_ARGS__ ); 1053 1054 #define SS7_DEBUG_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_DEBUG, msg , ##args) 1055 #define SS7_INFO_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_INFO, msg , ##args) 1056 #define SS7_WARN_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_WARNING, msg , ##args) 1057 #define SS7_ERROR_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_ERROR, msg , ##args) 1058 #define SS7_CRIT_CHAN(fchan, msg, args...) ftdm_log_chan(fchan, FTDM_LOG_CRIT, msg , ##args) 1059 1060 #ifdef SS7_CODE_DEVEL 1061 #define SS7_DEVEL_DEBUG(a,...) ftdm_log(FTDM_LOG_DEBUG,a,##__VA_ARGS__ ); 1062 #else 1063 #define SS7_DEVEL_DEBUG(a,...) 1064 #endif 1065 1066 #define SS7_FUNC_TRACE_ENTER(a) if (g_ftdm_sngss7_data.function_trace) { \ 1067 switch (g_ftdm_sngss7_data.function_trace_level) { \ 1068 case 0: \ 1069 ftdm_log(FTDM_LOG_EMERG,"Entering %s\n", a); \ 1070 break; \ 1071 case 1: \ 1072 ftdm_log(FTDM_LOG_ALERT,"Entering %s\n", a); \ 1073 break; \ 1074 case 2: \ 1075 ftdm_log(FTDM_LOG_CRIT,"Entering %s\n", a); \ 1076 break; \ 1077 case 3: \ 1078 ftdm_log(FTDM_LOG_ERROR,"Entering %s\n", a); \ 1079 break; \ 1080 case 4: \ 1081 ftdm_log(FTDM_LOG_WARNING,"Entering %s\n", a); \ 1082 break; \ 1083 case 5: \ 1084 ftdm_log(FTDM_LOG_NOTICE,"Entering %s\n", a); \ 1085 break; \ 1086 case 6: \ 1087 ftdm_log(FTDM_LOG_INFO,"Entering %s\n", a); \ 1088 break; \ 1089 case 7: \ 1090 ftdm_log(FTDM_LOG_DEBUG,"Entering %s\n", a); \ 1091 break; \ 1092 default: \ 1093 ftdm_log(FTDM_LOG_INFO,"Entering %s\n", a); \ 1094 break; \ 1095 } /* switch (g_ftdm_sngss7_data.function_trace_level) */ \ 1096 } /* if(g_ftdm_sngss7_data.function_trace) */ 1097 1098 #define SS7_FUNC_TRACE_EXIT(a) if (g_ftdm_sngss7_data.function_trace) { \ 1099 switch (g_ftdm_sngss7_data.function_trace_level) { \ 1100 case 0: \ 1101 ftdm_log(FTDM_LOG_EMERG,"Exiting %s\n", a); \ 1102 break; \ 1103 case 1: \ 1104 ftdm_log(FTDM_LOG_ALERT,"Exiting %s\n", a); \ 1105 break; \ 1106 case 2: \ 1107 ftdm_log(FTDM_LOG_CRIT,"Exiting %s\n", a); \ 1108 break; \ 1109 case 3: \ 1110 ftdm_log(FTDM_LOG_ERROR,"Exiting %s\n", a); \ 1111 break; \ 1112 case 4: \ 1113 ftdm_log(FTDM_LOG_WARNING,"Exiting %s\n", a); \ 1114 break; \ 1115 case 5: \ 1116 ftdm_log(FTDM_LOG_NOTICE,"Exiting %s\n", a); \ 1117 break; \ 1118 case 6: \ 1119 ftdm_log(FTDM_LOG_INFO,"Exiting %s\n", a); \ 1120 break; \ 1121 case 7: \ 1122 ftdm_log(FTDM_LOG_DEBUG,"Exiting %s\n", a); \ 1123 break; \ 1124 default: \ 1125 ftdm_log(FTDM_LOG_INFO,"Exiting %s\n", a); \ 1126 break; \ 1127 } /* switch (g_ftdm_sngss7_data.function_trace_level) */ \ 1128 } /* if(g_ftdm_sngss7_data.function_trace) */ 1129 1130 #define SS7_MSG_TRACE(fchan, sngss7info ,msg) if (g_ftdm_sngss7_data.message_trace) { \ 1131 switch (g_ftdm_sngss7_data.message_trace_level) { \ 1132 case 0: \ 1133 ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \ 1134 sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \ 1135 break; \ 1136 case 1: \ 1137 ftdm_log_chan(fchan, FTDM_LOG_ALERT, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \ 1138 sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \ 1139 break; \ 1140 case 2: \ 1141 ftdm_log_chan(fchan, FTDM_LOG_CRIT, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \ 1142 sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \ 1143 break; \ 1144 case 3: \ 1145 ftdm_log_chan(fchan, FTDM_LOG_ERROR, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \ 1146 sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \ 1147 break; \ 1148 case 4: \ 1149 ftdm_log_chan(fchan, FTDM_LOG_WARNING, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \ 1150 sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \ 1151 break; \ 1152 case 5: \ 1153 ftdm_log_chan(fchan, FTDM_LOG_NOTICE, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \ 1154 sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \ 1155 break; \ 1156 case 6: \ 1157 ftdm_log_chan(fchan, FTDM_LOG_INFO, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \ 1158 sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \ 1159 break; \ 1160 case 7: \ 1161 ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \ 1162 sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \ 1163 break; \ 1164 default: \ 1165 ftdm_log_chan(fchan, FTDM_LOG_INFO, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \ 1166 sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \ 1167 break; \ 1168 } /* switch (g_ftdm_sngss7_data.message_trace_level) */ \ 1169 } /* if(g_ftdm_sngss7_data.message_trace) */ 1170 1171 #define sngss7_test_flag(obj, flag) ((obj)->flags & flag) 1172 #define sngss7_clear_flag(obj, flag) ((obj)->flags &= ~(flag)) 1173 #define sngss7_set_flag(obj, flag) ((obj)->flags |= (flag)) 1174 1175 #define sngss7_test_ckt_flag(obj, flag) ((obj)->ckt_flags & flag) 1176 #define sngss7_clear_ckt_flag(obj, flag) ((obj)->ckt_flags &= ~(flag)) 1177 #define sngss7_set_ckt_flag(obj, flag) ((obj)->ckt_flags |= (flag)) 1178 1179 #define sngss7_test_ckt_blk_flag(obj, flag) ((obj)->blk_flags & flag) 1180 #define sngss7_clear_ckt_blk_flag(obj, flag) ((obj)->blk_flags &= ~(flag)) 1181 #define sngss7_set_ckt_blk_flag(obj, flag) ((obj)->blk_flags |= (flag)) 1182 1183 #define sngss7_test_options(obj, option) ((obj)->options & option) 1184 #define sngss7_clear_options(obj, option) ((obj)->options &= ~(option)) 1185 #define sngss7_set_options(obj, option) ((obj)->options |= (option)) 1186 1187 #define sngss7_tx_block_status_clear(obj) (!sngss7_test_ckt_blk_flag(obj, (FLAG_CKT_MN_BLOCK_TX | \ 1188 FLAG_CKT_MN_BLOCK_TX_DN | \ 1189 FLAG_GRP_MN_BLOCK_TX | \ 1190 FLAG_GRP_MN_BLOCK_TX_DN | \ 1191 FLAG_GRP_HW_BLOCK_TX | \ 1192 FLAG_GRP_HW_BLOCK_TX_DN | \ 1193 FLAG_GRP_HW_UNBLK_TX | \ 1194 FLAG_CKT_MN_UNBLK_TX ))) 1195 1196 #define sngss7_block_status_clear(obj) (obj->blk_flags == 0) 1197 1198 #define sngss7_reset_status_clear(obj) (!sngss7_test_ckt_flag(obj, (FLAG_RESET_TX | \ 1199 FLAG_RESET_RX | \ 1200 FLAG_GRP_RESET_TX | \ 1201 FLAG_GRP_RESET_RX ))) 1202 1203 #define sngss7_tx_reset_sent(obj) ((sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) && \ 1204 sngss7_test_ckt_flag(obj, (FLAG_RESET_SENT))) || \ 1205 (sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX)) && \ 1206 sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_SENT)))) 1207 1208 #define sngss7_tx_reset_status_pending(obj) (sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) || sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX))) 1209 1210 #define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && \ 1211 (sngss7_reset_status_clear(obj)) && \ 1212 (!sngss7_test_ckt_flag((obj),FLAG_INFID_PAUSED))) 1213 1214 #define sngss7_tx_reset_restart(obj) do { clear_tx_grs_flags((obj)); \ 1215 clear_tx_grs_data((obj)); \ 1216 clear_tx_rsc_flags((obj)); \ 1217 sngss7_set_ckt_flag((obj), (FLAG_RESET_TX)); \ 1218 } while (0); 1219 1220 1221 1222 #ifdef SMG_RELAY_DBG 1223 #define SS7_RELAY_DBG(a,...) printf(a"\n", ##__VA_ARGS__) 1224 #define SS7_RELAY_DBG_FUN(a) printf(#a"\n") 1225 #else 1226 #define SS7_RELAY_DBG(a, ...) 1227 #define SS7_RELAY_DBG_FUN(a) 1228 #endif 1229 /******************************************************************************/ 1230 1231 /******************************************************************************/ 1232 #endif /* __FTMOD_SNG_SS7_H__ */ 1233 /******************************************************************************/ 1234 1235 /******************************************************************************/ 1236 /* For Emacs: 1237 * Local Variables: 1238 * mode:c 1239 * indent-tabs-mode:t 1240 * tab-width:4 1241 * c-basic-offset:4 1242 * End: 1243 * For VIM: 1244 * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet: 1245 */ 1246 /******************************************************************************/ 1247