FreeCalypso > hg > themwi-system-sw
comparison mncc/call_setup.c @ 243:59a166c50d0e
themwi-mncc: convert to libnumdb2
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Mon, 14 Aug 2023 19:13:26 -0800 |
| parents | 2ebad02adbe5 |
| children |
comparison
equal
deleted
inserted
replaced
| 242:f86ec96cea6f | 243:59a166c50d0e |
|---|---|
| 11 #include <string.h> | 11 #include <string.h> |
| 12 #include <strings.h> | 12 #include <strings.h> |
| 13 #include <syslog.h> | 13 #include <syslog.h> |
| 14 #include "../include/mncc.h" | 14 #include "../include/mncc.h" |
| 15 #include "../include/gsm48_const.h" | 15 #include "../include/gsm48_const.h" |
| 16 #include "../include/number_db_v2.h" | |
| 17 #include "../libnumdb2/lookup_func.h" | |
| 16 #include "struct.h" | 18 #include "struct.h" |
| 17 #include "gsm_call.h" | 19 #include "gsm_call.h" |
| 18 | 20 |
| 19 preen_msc_provided_number(nums) | 21 preen_msc_provided_number(nums) |
| 20 struct gsm_mncc_number *nums; | 22 struct gsm_mncc_number *nums; |
| 56 void | 58 void |
| 57 process_mo_call_setup(msg) | 59 process_mo_call_setup(msg) |
| 58 struct gsm_mncc *msg; | 60 struct gsm_mncc *msg; |
| 59 { | 61 { |
| 60 struct gsm_call *call; | 62 struct gsm_call *call; |
| 61 char nanp[11]; | 63 struct owned_number_rec *own; |
| 62 int res, is_nanp, is_itn, is_local; | 64 struct short_number_rec *snum; |
| 65 int is_nanp, is_itn, is_local; | |
| 63 | 66 |
| 64 if (preen_msc_provided_number(&msg->calling)) | 67 if (preen_msc_provided_number(&msg->calling)) |
| 65 msg->fields |= MNCC_F_CALLING; | 68 msg->fields |= MNCC_F_CALLING; |
| 66 else | 69 else |
| 67 msg->fields &= ~MNCC_F_CALLING; | 70 msg->fields &= ~MNCC_F_CALLING; |
| 91 break; | 94 break; |
| 92 if (msg->called.plan != GSM48_NPI_UNKNOWN && | 95 if (msg->called.plan != GSM48_NPI_UNKNOWN && |
| 93 msg->called.plan != GSM48_NPI_ISDN_E164 && | 96 msg->called.plan != GSM48_NPI_ISDN_E164 && |
| 94 msg->called.plan != GSM48_NPI_PRIVATE) | 97 msg->called.plan != GSM48_NPI_PRIVATE) |
| 95 break; | 98 break; |
| 96 res = lookup_short_dial_number(msg->called.number, nanp); | 99 snum = numdb_lookup_short(msg->called.number); |
| 97 if (!res) { | 100 if (!snum) { |
| 98 syslog(LOG_ERR, | 101 syslog(LOG_ERR, |
| 99 "rejecting MO call 0x%x: invalid short number", | 102 "rejecting MO call 0x%x: unassigned short number", |
| 100 msg->callref); | 103 msg->callref); |
| 101 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, | 104 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, |
| 102 GSM48_CC_CAUSE_UNASSIGNED_NR); | 105 GSM48_CC_CAUSE_UNASSIGNED_NR); |
| 103 call->gc_flag = 1; | 106 call->gc_flag = 1; |
| 104 return; | 107 return; |
| 105 } | 108 } |
| 106 if (nanp[0]) { | 109 switch (snum->short_num_type) { |
| 110 case SHORT_NUM_TYPE_ABBREV: | |
| 107 is_nanp = 1; | 111 is_nanp = 1; |
| 108 msg->called.type = GSM48_TON_INTERNATIONAL; | 112 msg->called.type = GSM48_TON_INTERNATIONAL; |
| 109 msg->called.plan = GSM48_NPI_ISDN_E164; | 113 msg->called.plan = GSM48_NPI_ISDN_E164; |
| 110 msg->called.number[0] = '1'; | 114 sprintf(msg->called.number, "1%03u%03u%04u", |
| 111 strcpy(msg->called.number+1, nanp); | 115 snum->fullnum_prefix[0], |
| 112 } else { | 116 snum->fullnum_prefix[1], snum->short_num); |
| 117 break; | |
| 118 case SHORT_NUM_TYPE_ITN: | |
| 113 is_itn = 1; | 119 is_itn = 1; |
| 114 msg->called.type = GSM48_TON_NET_SPEC; | 120 msg->called.type = GSM48_TON_NET_SPEC; |
| 115 msg->called.plan = GSM48_NPI_PRIVATE; | 121 msg->called.plan = GSM48_NPI_PRIVATE; |
| 122 break; | |
| 123 case SHORT_NUM_TYPE_TEST_SINK: | |
| 124 syslog(LOG_ERR, | |
| 125 "rejecting MO call 0x%x: test sink not implemented", | |
| 126 msg->callref); | |
| 127 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, | |
| 128 GSM48_CC_CAUSE_DEST_OOO); | |
| 129 call->gc_flag = 1; | |
| 130 return; | |
| 131 default: | |
| 132 syslog(LOG_ERR, | |
| 133 "rejecting MO call 0x%x: unknown short number type 0x%02X", | |
| 134 msg->callref, snum->short_num_type); | |
| 135 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, | |
| 136 GSM48_CC_CAUSE_DEST_OOO); | |
| 137 call->gc_flag = 1; | |
| 138 return; | |
| 116 } | 139 } |
| 117 break; | 140 break; |
| 118 case 10: | 141 case 10: |
| 119 if (msg->called.type != GSM48_TON_UNKNOWN && | 142 if (msg->called.type != GSM48_TON_UNKNOWN && |
| 120 msg->called.type != GSM48_TON_NATIONAL) | 143 msg->called.type != GSM48_TON_NATIONAL) |
| 162 msg->called.type = GSM48_TON_INTERNATIONAL; | 185 msg->called.type = GSM48_TON_INTERNATIONAL; |
| 163 msg->called.plan = GSM48_NPI_ISDN_E164; | 186 msg->called.plan = GSM48_NPI_ISDN_E164; |
| 164 break; | 187 break; |
| 165 } | 188 } |
| 166 is_local = is_itn; | 189 is_local = is_itn; |
| 167 if (is_nanp && is_nanp_locally_owned(msg->called.number+1)) | 190 if (is_nanp && (own = numdb_lookup_nanp(msg->called.number+1))) { |
| 168 is_local = 1; | 191 is_local = 1; |
| 192 switch (own->usage & NUMBER_USAGE_MASK) { | |
| 193 case NUMBER_USAGE_TYPE_GSM_SUB: | |
| 194 break; | |
| 195 case NUMBER_USAGE_TYPE_ALIAS: | |
| 196 sprintf(msg->called.number, "1%03u%03u%04u", | |
| 197 own->remap[0], own->remap[1], own->remap[2]); | |
| 198 break; | |
| 199 default: | |
| 200 syslog(LOG_ERR, | |
| 201 "rejecting MO call 0x%x: unassigned owned NANP", | |
| 202 msg->callref); | |
| 203 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, | |
| 204 GSM48_CC_CAUSE_UNASSIGNED_NR); | |
| 205 call->gc_flag = 1; | |
| 206 return; | |
| 207 } | |
| 208 } | |
| 169 /* weed out attempts to call yourself */ | 209 /* weed out attempts to call yourself */ |
| 170 if (is_local && !strcmp(msg->calling.number, msg->called.number)) { | 210 if (is_local && !strcmp(msg->calling.number, msg->called.number)) { |
| 171 syslog(LOG_ERR, "rejecting MO call 0x%x: call to self", | 211 syslog(LOG_ERR, "rejecting MO call 0x%x: call to self", |
| 172 msg->callref); | 212 msg->callref); |
| 173 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, | 213 reject_mo_call(msg->callref, GSM48_CAUSE_LOC_PRN_S_LU, |
