From 2fb2b854efea35f1917df8f81ecf4bbf6d56ba02 Mon Sep 17 00:00:00 2001 From: Karsten Keil Date: Fri, 24 Jun 2005 15:28:54 +0000 Subject: [PATCH] Fix bug #0000007 Capidivert doesnt work with mISDN an Fritz! PCI - DUMMY CR messages from up was not handled in l3_udss1 - some better debug and cleanup - FACILITY RESPONSE is a currently a no op, handle it early without queueing to abvoid possible races with ReleaseApplication --- drivers/isdn/hardware/mISDN/contr.c | 12 +++++++++--- drivers/isdn/hardware/mISDN/l3_udss1.c | 19 +++++++++++++++++-- drivers/isdn/hardware/mISDN/supp_serv.c | 1 - 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/drivers/isdn/hardware/mISDN/contr.c b/drivers/isdn/hardware/mISDN/contr.c index 214de71..a51d37c 100644 --- a/drivers/isdn/hardware/mISDN/contr.c +++ b/drivers/isdn/hardware/mISDN/contr.c @@ -249,8 +249,9 @@ SendMessage(struct capi_ctr *ctrl, struct sk_buff *skb) hh->prim = CAPI_MESSAGE_REQUEST; hh->dinfo = ApplId; cmd = CAPICMD(CAPIMSG_COMMAND(skb->data), CAPIMSG_SUBCOMMAND(skb->data)); - contrDebug(contr, CAPI_DBG_CONTR_MSG, "SendMessage: %s", - capi_cmd2str(CAPIMSG_COMMAND(skb->data), CAPIMSG_SUBCOMMAND(skb->data))); + contrDebug(contr, CAPI_DBG_CONTR_MSG, "SendMessage: %s caddr(%x)", + capi_cmd2str(CAPIMSG_COMMAND(skb->data), CAPIMSG_SUBCOMMAND(skb->data)), + CAPIMSG_CONTROL(skb->data)); switch (cmd) { // for NCCI state machine case CAPI_DATA_B3_REQ: @@ -295,7 +296,6 @@ SendMessage(struct capi_ctr *ctrl, struct sk_buff *skb) case CAPI_LISTEN_REQ: // other case CAPI_FACILITY_REQ: - case CAPI_FACILITY_RESP: case CAPI_MANUFACTURER_REQ: case CAPI_INFO_RESP: err = mISDN_queue_message(&contr->inst, 0, skb); @@ -304,6 +304,12 @@ SendMessage(struct capi_ctr *ctrl, struct sk_buff *skb) err = CAPI_MSGBUSY; } break; + /* need not further action currently, so it can be released here too avoid + * overlap with a release application + */ + case CAPI_FACILITY_RESP: + dev_kfree_skb(skb); + break; default: contrDebug(contr, CAPI_DBG_WARN, "SendMessage: %#x %#x not handled!", CAPIMSG_COMMAND(skb->data), CAPIMSG_SUBCOMMAND(skb->data)); diff --git a/drivers/isdn/hardware/mISDN/l3_udss1.c b/drivers/isdn/hardware/mISDN/l3_udss1.c index 77857e1..7baa8c3 100644 --- a/drivers/isdn/hardware/mISDN/l3_udss1.c +++ b/drivers/isdn/hardware/mISDN/l3_udss1.c @@ -783,6 +783,14 @@ l3dss1_progress_req(l3_process_t *pc, u_char pr, void *arg) } } +static void +l3dss1_facility_req(l3_process_t *pc, u_char pr, void *arg) +{ + if (arg) { + SendMsg(pc, arg, -1); + } +} + static void l3dss1_release_cmpl(l3_process_t *pc, u_char pr, void *arg) { @@ -2136,9 +2144,16 @@ dss1_fromup(layer3_t *l3, struct sk_buff *skb, mISDN_head_t *hh) } return(ret); } + if (!proc && hh->dinfo == MISDN_ID_DUMMY) { + if (hh->prim == (CC_FACILITY | REQUEST)) { + l3dss1_facility_req(l3->dummy, hh->prim, skb->len ? skb : NULL); + ret = 0; + } + return(ret); + } if (!proc) { - printk(KERN_ERR "mISDN dss1 fromup without proc pr=%04x\n", - hh->prim); + printk(KERN_ERR "mISDN dss1 fromup without proc pr=%04x dinfo(%x)\n", + hh->prim, hh->dinfo); return(-EINVAL); } for (i = 0; i < DOWNSLLEN; i++) diff --git a/drivers/isdn/hardware/mISDN/supp_serv.c b/drivers/isdn/hardware/mISDN/supp_serv.c index 367337e..db1d0a4 100644 --- a/drivers/isdn/hardware/mISDN/supp_serv.c +++ b/drivers/isdn/hardware/mISDN/supp_serv.c @@ -36,7 +36,6 @@ static int SSProcess_L4L3(SSProcess_t *spc, __u32 prim, struct sk_buff *skb) { int err; -// FIXME err = ControllerL4L3(contr, prim, contr->addr | DUMMY_CR_FLAG, skb); err = ControllerL4L3(spc->contr, prim, MISDN_ID_DUMMY, skb); if (err) dev_kfree_skb(skb);