- resp = create_mncc(MNCC_RETRIEVE_CNF, p_m_g_callref);
- send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp);
-
- /* enable audio */
- if (!p_m_g_tch_connected) { /* it should be true */
- gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
- end_trace();
- frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
- send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame);
- p_m_g_tch_connected = 1;
- }
-}
-
-/*
- * BSC sends message to port
- */
-static int message_bsc(struct gsm_network *net, int msg_type, void *arg)
-{
- struct gsm_mncc *mncc = (struct gsm_mncc *)arg;
- unsigned int callref = mncc->callref;
- class Port *port;
- class Pgsm *pgsm = NULL;
- char name[64];
- struct mISDNport *mISDNport;
-
- /* Special messages */
- switch(msg_type) {
- }
-
- /* find callref */
- callref = mncc->callref;
- port = port_first;
- while(port) {
- if ((port->p_type & PORT_CLASS_mISDN_MASK) == PORT_CLASS_mISDN_GSM) {
- pgsm = (class Pgsm *)port;
- if (pgsm->p_m_g_callref == callref) {
- break;
- }
- }
- port = port->next;
- }
-
- if (msg_type == GSM_TRAU_FRAME) {
- if (port)
- pgsm->trau_receive((struct gsm_trau_frame *)arg);
- return 0;
- }
-
- if (!port) {
- if (msg_type != MNCC_SETUP_IND)
- return(0);
- /* find gsm port */
- mISDNport = mISDNport_first;
- while(mISDNport) {
- if (mISDNport->gsm)
- break;
- mISDNport = mISDNport->next;
- }
- if (!mISDNport) {
- struct gsm_mncc *rej;
-
- rej = create_mncc(MNCC_REJ_REQ, callref);
- rej->fields |= MNCC_F_CAUSE;
- rej->cause.coding = 3;
- rej->cause.location = 1;
- rej->cause.value = 27;
- gsm_trace_header(NULL, NULL, MNCC_REJ_REQ, DIRECTION_OUT);
- add_trace("cause", "coding", "%d", rej->cause.coding);
- add_trace("cause", "location", "%d", rej->cause.location);
- add_trace("cause", "value", "%d", rej->cause.value);
- end_trace();
- send_and_free_mncc((struct gsm_network *)gsm->network, rej->msg_type, rej);
- return 0;
- }
- /* creating port object, transparent until setup with hdlc */
- SPRINT(name, "%s-%d-in", mISDNport->ifport->interface->name, mISDNport->portnum);
- if (!(pgsm = new Pgsm(PORT_TYPE_GSM_IN, mISDNport, name, NULL, 0, 0, B_MODE_TRANSPARENT)))
-
- FATAL("Cannot create Port instance.\n");
- }
-
- switch(msg_type) {
- case MNCC_SETUP_IND:
- pgsm->setup_ind(msg_type, callref, mncc);
- break;
-
- case MNCC_START_DTMF_IND:
- pgsm->start_dtmf_ind(msg_type, callref, mncc);
- break;
-
- case MNCC_STOP_DTMF_IND:
- pgsm->stop_dtmf_ind(msg_type, callref, mncc);
- break;
-
- case MNCC_CALL_CONF_IND:
- pgsm->call_conf_ind(msg_type, callref, mncc);
- break;
-
- case MNCC_ALERT_IND:
- pgsm->alert_ind(msg_type, callref, mncc);
- break;
-
- case MNCC_SETUP_CNF:
- pgsm->setup_cnf(msg_type, callref, mncc);
- break;
-
- case MNCC_SETUP_COMPL_IND:
- pgsm->setup_compl_ind(msg_type, callref, mncc);
- break;
-
- case MNCC_DISC_IND:
- pgsm->disc_ind(msg_type, callref, mncc);
- break;
-
- case MNCC_REL_IND:
- case MNCC_REL_CNF:
- case MNCC_REJ_IND:
- pgsm->rel_ind(msg_type, callref, mncc);
- break;
-
- case MNCC_NOTIFY_IND:
- pgsm->notify_ind(msg_type, callref, mncc);
- break;
-
- case MNCC_HOLD_IND:
- pgsm->hold_ind(msg_type, callref, mncc);
- break;
-
- case MNCC_RETRIEVE_IND:
- pgsm->retr_ind(msg_type, callref, mncc);
- break;
-
- default:
- PDEBUG(DEBUG_GSM, "Pgsm(%s) gsm port with (caller id %s) received unhandled nessage: 0x%x\n", pgsm->p_name, pgsm->p_callerinfo.id, msg_type);
- }
- return(0);
-}
-
-/* MESSAGE_SETUP */
-void Pgsm::message_setup(unsigned int epoint_id, int message_id, union parameter *param)
-{
- struct lcr_msg *message;
- int ret;
- struct epoint_list *epointlist;
- struct gsm_mncc *mncc;
- int channel;
-
- /* copy setup infos to port */
- memcpy(&p_callerinfo, ¶m->setup.callerinfo, sizeof(p_callerinfo));
- memcpy(&p_dialinginfo, ¶m->setup.dialinginfo, sizeof(p_dialinginfo));
- memcpy(&p_capainfo, ¶m->setup.capainfo, sizeof(p_capainfo));
- memcpy(&p_redirinfo, ¶m->setup.redirinfo, sizeof(p_redirinfo));
-
- /* no number */
- if (!p_dialinginfo.id[0]) {
- gsm_trace_header(p_m_mISDNport, this, MNCC_SETUP_REQ, DIRECTION_OUT);
- add_trace("failure", NULL, "No dialed subscriber given.");
- end_trace();
- message = message_create(p_serial, epoint_id, PORT_TO_EPOINT, MESSAGE_RELEASE);
- message->param.disconnectinfo.cause = 28;
- message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
- message_put(message);
- new_state(PORT_STATE_RELEASE);
- p_m_delete = 1;
- return;
- }
-
- /* release if port is blocked */
- if (p_m_mISDNport->ifport->block) {
- gsm_trace_header(p_m_mISDNport, this, MNCC_SETUP_REQ, DIRECTION_OUT);
- add_trace("failure", NULL, "Port blocked.");