struct dentry *capifs_new_ncci(unsigned int number, dev_t device) { struct dentry *dentry; if (simple_pin_fs(&capifs_fs_type, &capifs_mnt, &capifs_mnt_count) < 0) return NULL; dentry = new_ncci(number, device); if (!dentry) simple_release_fs(&capifs_mnt, &capifs_mnt_count); return dentry; }
static void handle_ncci(capiconn_context *ctx, _cmsg * cmsg) { capi_contr *card = findcontrbynumber(ctx, cmsg->adr.adrController&0x7f); capiconn_callbacks *cb = ctx->cb; capi_connection *plcip; capi_ncci *nccip; unsigned char *data; if (!card) { (*cb->errmsg)("capidrv: %s from unknown controller 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrController & 0x7f); return; } switch (CAPICMD(cmsg->Command, cmsg->Subcommand)) { case CAPI_CONNECT_B3_ACTIVE_IND: /* ncci */ if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) goto notfound; capi_cmsg_answer(cmsg); send_message(card, cmsg); ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_ACTIVE_IND); (*cb->debugmsg)("ncci 0x%x up", nccip->ncci); (*cb->connected)(nccip->plcip, cmsg->NCPI); break; case CAPI_CONNECT_B3_ACTIVE_CONF: /* ncci */ goto ignored; case CAPI_CONNECT_B3_IND: /* ncci */ plcip = find_plci_by_ncci(card, cmsg->adr.adrNCCI); if (plcip) { nccip = new_ncci(card, plcip, cmsg->adr.adrNCCI); if (nccip) { ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_IND); capi_fill_CONNECT_B3_RESP(cmsg, ctx->appid, card->msgid++, nccip->ncci, /* adr */ 0, /* Reject */ 0 /* NCPI */ ); send_message(card, cmsg); ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_RESP); break; } (*cb->errmsg)("capidrv-%d: no mem for ncci, sorry", card->contrnr); } else { (*cb->errmsg)("capidrv-%d: %s: plci for ncci 0x%x not found", card->contrnr, capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrNCCI); } capi_fill_CONNECT_B3_RESP(cmsg, ctx->appid, card->msgid++, cmsg->adr.adrNCCI, 2, /* Reject */ plcip->conninfo.ncpi); send_message(card, cmsg); break; case CAPI_CONNECT_B3_CONF: /* ncci */ if (!(nccip = find_ncci_by_msgid(card, cmsg->adr.adrNCCI, cmsg->Messagenumber))) goto notfound; nccip->ncci = cmsg->adr.adrNCCI; nccip->plcip->ncci = cmsg->adr.adrNCCI; if (cmsg->Info) { (*cb->infomsg)("%s info 0x%x (%s) for ncci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Info, capi_info2str(cmsg->Info), cmsg->adr.adrNCCI); } if (cmsg->Info) ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_CONF_ERROR); else ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_CONF_OK); break; case CAPI_CONNECT_B3_T90_ACTIVE_IND: /* ncci */ capi_cmsg_answer(cmsg); send_message(card, cmsg); break; case CAPI_DATA_B3_IND: /* ncci */ /* handled in handle_data() */ goto ignored; case CAPI_DATA_B3_CONF: /* ncci */ if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) goto notfound; data = capi_del_ack(nccip, cmsg->DataHandle); if (data == 0) break; if (cb->datasent) (*cb->datasent)(nccip->plcip, data); break; case CAPI_DISCONNECT_B3_IND: /* ncci */ if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) goto notfound; nccip->plcip->disconnectreason_b3 = cmsg->Reason_B3; nccip->plcip->disconnecting = 1; ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_IND); capi_cmsg_answer(cmsg); send_message(card, cmsg); ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_RESP); break; case CAPI_DISCONNECT_B3_CONF: /* ncci */ if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) goto notfound; if (cmsg->Info) { (*cb->infomsg)("%s info 0x%x (%s) for ncci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Info, capi_info2str(cmsg->Info), cmsg->adr.adrNCCI); ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_CONF_ERROR); } break; case CAPI_RESET_B3_IND: /* ncci */ if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) goto notfound; ncci_change_state(card, nccip, EV_NCCI_RESET_B3_IND); capi_cmsg_answer(cmsg); send_message(card, cmsg); break; case CAPI_RESET_B3_CONF: /* ncci */ goto ignored; /* $$$$ */ case CAPI_FACILITY_IND: /* Controller/plci/ncci */ goto ignored; case CAPI_FACILITY_CONF: /* Controller/plci/ncci */ goto ignored; default: (*cb->errmsg)("capidrv-%d: got %s for ncci 0x%x ???", card->contrnr, capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrNCCI); } return; ignored: (*cb->infomsg)("%s for ncci 0x%x ignored", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrNCCI); return; notfound: (*cb->errmsg)("%s: ncci 0x%x not found", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrNCCI); }
static void handle_plci(capiconn_context *ctx, _cmsg * cmsg) { capi_contr *card = findcontrbynumber(ctx, cmsg->adr.adrController&0x7f); capiconn_callbacks *cb = ctx->cb; capi_connection *plcip; if (!card) { (*cb->errmsg)("capiconn: %s from unknown controller 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrController & 0x7f); return; } switch (CAPICMD(cmsg->Command, cmsg->Subcommand)) { case CAPI_DISCONNECT_IND: /* plci */ if (cmsg->Reason) { (*cb->debugmsg)("%s reason 0x%x (%s) for plci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Reason, capi_info2str(cmsg->Reason), cmsg->adr.adrPLCI); } if (!(plcip = find_plci_by_plci(card, cmsg->adr.adrPLCI))) { capi_cmsg_answer(cmsg); send_message(card, cmsg); goto notfound; } plcip->disconnectreason = cmsg->Reason; plcip->disconnecting = 1; plci_change_state(card, plcip, EV_PLCI_DISCONNECT_IND); capi_cmsg_answer(cmsg); send_message(card, cmsg); plci_change_state(card, plcip, EV_PLCI_DISCONNECT_RESP); break; case CAPI_DISCONNECT_CONF: /* plci */ if (cmsg->Info) { (*cb->infomsg)("%s info 0x%x (%s) for plci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Info, capi_info2str(cmsg->Info), cmsg->adr.adrPLCI); } if (!(plcip = find_plci_by_plci(card, cmsg->adr.adrPLCI))) goto notfound; plcip->disconnecting = 1; break; case CAPI_ALERT_CONF: /* plci */ if (cmsg->Info) { (*cb->infomsg)("%s info 0x%x (%s) for plci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Info, capi_info2str(cmsg->Info), cmsg->adr.adrPLCI); } break; case CAPI_CONNECT_IND: /* plci */ handle_incoming_call(card, cmsg); break; case CAPI_CONNECT_CONF: /* plci */ if (cmsg->Info) { (*cb->infomsg)("%s info 0x%x (%s) for plci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Info, capi_info2str(cmsg->Info), cmsg->adr.adrPLCI); } if (!(plcip = find_plci_by_msgid(card, cmsg->Messagenumber))) goto notfound; plcip->plci = cmsg->adr.adrPLCI; if (cmsg->Info) { plci_change_state(card, plcip, EV_PLCI_CONNECT_CONF_ERROR); } else { plci_change_state(card, plcip, EV_PLCI_CONNECT_CONF_OK); } break; case CAPI_CONNECT_ACTIVE_IND: /* plci */ if (!(plcip = find_plci_by_plci(card, cmsg->adr.adrPLCI))) goto notfound; if (plcip->incoming) { capi_cmsg_answer(cmsg); send_message(card, cmsg); plci_change_state(card, plcip, EV_PLCI_CONNECT_ACTIVE_IND); } else { capi_ncci *nccip; capi_cmsg_answer(cmsg); send_message(card, cmsg); nccip = new_ncci(card, plcip, cmsg->adr.adrPLCI); if (!nccip) { (*cb->errmsg)("no mem for ncci on contr %d, sorry", card->contrnr); break; /* $$$$ */ } capi_fill_CONNECT_B3_REQ(cmsg, ctx->appid, card->msgid++, plcip->plci, /* adr */ plcip->conninfo.ncpi); nccip->msgid = cmsg->Messagenumber; send_message(card, cmsg); plci_change_state(card, plcip, EV_PLCI_CONNECT_ACTIVE_IND); ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_REQ); } break; case CAPI_INFO_IND: /* Controller/plci */ if (!(plcip = find_plci_by_plci(card, cmsg->adr.adrPLCI))) goto notfound; if (handle_charge_info(plcip, cmsg)) { capi_cmsg_answer(cmsg); send_message(card, cmsg); } else if (handle_callednumber_info(plcip, cmsg)) { capi_cmsg_answer(cmsg); send_message(card, cmsg); } else { capi_cmsg_answer(cmsg); send_message(card, cmsg); } break; case CAPI_CONNECT_ACTIVE_CONF: /* plci */ goto ignored; case CAPI_SELECT_B_PROTOCOL_CONF: /* plci */ goto ignored; case CAPI_FACILITY_IND: /* Controller/plci/ncci */ goto ignored; case CAPI_FACILITY_CONF: /* Controller/plci/ncci */ goto ignored; case CAPI_INFO_CONF: /* Controller/plci */ goto ignored; default: (*cb->errmsg)("got %s for plci 0x%x ???", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrPLCI); } return; ignored: (*cb->infomsg)("%s for plci 0x%x ignored", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrPLCI); return; notfound: (*cb->errmsg)("%s: plci 0x%x not found", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrPLCI); return; }