From f0578a801182fb78f41cae27cd52bacd941fdda3 Mon Sep 17 00:00:00 2001 From: David Yat Sin <dyatsin@sangoma.com> Date: Tue, 12 Jul 2011 17:26:44 -0400 Subject: [PATCH] chlog: freetdm: ISDN - Fix for Caller ID name on DMS-100 --- .../ftmod_sangoma_isdn/ftmod_sangoma_isdn.h | 3 +- .../ftmod_sangoma_isdn_stack_hndl.c | 5 +- .../ftmod_sangoma_isdn_support.c | 49 ++++++++++++++++++- .../ftmod_sangoma_isdn_trace.c | 20 ++++++-- .../ftmod_sangoma_isdn_trace.h | 14 +++++- 5 files changed, 79 insertions(+), 12 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h index 08adc6ef6b..5cb8fbe0c0 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h @@ -452,8 +452,7 @@ ftdm_status_t get_calling_num(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb); ftdm_status_t get_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb); ftdm_status_t get_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb); ftdm_status_t get_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb); -ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *display); -ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr); +ftdm_status_t get_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt); ftdm_status_t get_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad); ftdm_status_t get_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd); ftdm_status_t get_facility_ie(ftdm_channel_t *ftdmchan, FacilityStr *facilityStr); diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c index 44538bba61..4caad20ee1 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c @@ -135,11 +135,8 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event) get_calling_subaddr(ftdmchan, &conEvnt->cgPtySad); get_prog_ind_ie(ftdmchan, &conEvnt->progInd); get_facility_ie(ftdmchan, &conEvnt->facilityStr); + get_calling_name(ftdmchan, conEvnt); - if (get_calling_name_from_display(ftdmchan, &conEvnt->display) != FTDM_SUCCESS) { - get_calling_name_from_usr_usr(ftdmchan, &conEvnt->usrUsr); - } - ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_INFO, "Incoming call: Called No:[%s] Calling No:[%s]\n", ftdmchan->caller_data.dnis.digits, ftdmchan->caller_data.cid_num.digits); if (conEvnt->bearCap[0].eh.pres) { diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c index b0c3efe271..a2bca1f8fa 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c @@ -45,6 +45,9 @@ SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_loc, ftdm_sngisdn_progind_loc2str static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val); static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val); +ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr); +ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *display); +ftdm_status_t get_calling_name_from_ntDisplay(ftdm_channel_t *ftdmchan, NtDisplay *display); extern ftdm_sngisdn_data_t g_sngisdn_data; @@ -355,6 +358,20 @@ ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *d return FTDM_SUCCESS; } +ftdm_status_t get_calling_name_from_ntDisplay(ftdm_channel_t *ftdmchan, NtDisplay *display) +{ + ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; + if (display->eh.pres != PRSNT_NODEF) { + return FTDM_FAIL; + } + if (display->dispInfo.pres != PRSNT_NODEF) { + return FTDM_FAIL; + } + + ftdm_copy_string(caller_data->cid_name, (const char*)display->dispInfo.val, display->dispInfo.len+1); + return FTDM_SUCCESS; +} + ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr) { ftdm_caller_data_t *caller_data = &ftdmchan->caller_data; @@ -374,6 +391,24 @@ ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *us return FTDM_SUCCESS; } +ftdm_status_t get_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt) +{ + ftdm_status_t status = FTDM_FAIL; + sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data; + + if (signal_data->switchtype == SNGISDN_SWITCH_DMS100) { + status = get_calling_name_from_ntDisplay(ftdmchan, &conEvnt->ntDisplay[0]); + } else { + status = get_calling_name_from_display(ftdmchan, &conEvnt->display); + + } + if (status != FTDM_SUCCESS) { + status = get_calling_name_from_usr_usr(ftdmchan, &conEvnt->usrUsr); + } + return status; +} + + ftdm_status_t get_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad) { char subaddress[100]; @@ -694,12 +729,22 @@ ftdm_status_t set_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt) /* follow through */ case SNGISDN_SWITCH_5ESS: case SNGISDN_SWITCH_4ESS: - case SNGISDN_SWITCH_DMS100: - conEvnt->display.eh.pres = PRSNT_NODEF; conEvnt->display.dispInfo.pres = PRSNT_NODEF; conEvnt->display.dispInfo.len = len; memcpy(conEvnt->display.dispInfo.val, caller_data->cid_name, len); break; + case SNGISDN_SWITCH_DMS100: + conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF; + conEvnt->ntDisplay[0].dispTypeNt.pres = PRSNT_NODEF; + conEvnt->ntDisplay[0].dispTypeNt.val = 0x01; /* Calling Party Name */ + conEvnt->ntDisplay[0].assocInfo.pres = PRSNT_NODEF; + conEvnt->ntDisplay[0].assocInfo.val = 0x03; /* Included */ + conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF; + conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF; + conEvnt->ntDisplay[0].dispInfo.pres = PRSNT_NODEF; + conEvnt->ntDisplay[0].dispInfo.len = len; + memcpy(conEvnt->ntDisplay[0].dispInfo.val, caller_data->cid_name, len); + break; case SNGISDN_SWITCH_QSIG: /* It seems like QSIG does not support Caller ID Name */ break; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c index f44f1032a3..e127e7fc1e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c @@ -584,11 +584,18 @@ uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset break; case PROT_Q931_IE_DISPLAY: { - uint8_t displayStrOct=2, j; + uint8_t j, displayType, assocInfo; char displayStr[82]; + uint8_t displayNtEnabled = 0; + uint8_t displayStrOct = 2; + memset(displayStr, 0, sizeof(displayStr)); if(get_bits(OCTET(3),8,8)) { + displayType = get_bits(OCTET(3),1,4); + assocInfo = get_bits(OCTET(3),5,7); + + displayNtEnabled = 1; displayStrOct++; } j = 0; @@ -599,8 +606,15 @@ uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset displayStr[j++]=ia5[get_bits(OCTET(displayStrOct),1,4)][get_bits(OCTET(displayStrOct),5,8)]; } displayStr[j]='\0'; - *str_len+= sprintf(&str[*str_len], "%s(l:%d)\n", - displayStr, len); + if (displayNtEnabled) { + *str_len+= sprintf(&str[*str_len], "%s(l:%d) type:%s(%d) info:%s(%d)\n", + displayStr, len, + get_code_2_str(displayType, dcodQ931DisplayTypeTable), displayType, + get_code_2_str(assocInfo, dcodQ931AssocInfoTable), assocInfo); + } else { + *str_len+= sprintf(&str[*str_len], "%s(l:%d)\n", + displayStr, len); + } } break; case PROT_Q931_IE_RESTART_IND: diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.h index ca6683d4e3..37b799d007 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.h @@ -578,5 +578,17 @@ struct code2str dcodQ931TypeOfSubaddressTable[] = { { -1, "Invalid"}, }; -#endif /* __FTMOD_SANGOMA_ISDN_TRACE_H__ */ +struct code2str dcodQ931DisplayTypeTable[] = { + { 0x00, "Calling Party Name"}, + { 0x01, "Connected Party Name"}, + { 0x05, "Original Called Party Name"}, + { -1, "Invalid"}, +}; +struct code2str dcodQ931AssocInfoTable[] = { + { 0x00, "Requested"}, + { 0x03, "Included"}, + { -1, "Invalid"}, +}; + +#endif /* __FTMOD_SANGOMA_ISDN_TRACE_H__ */