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
This commit is contained in:
Karsten Keil 2005-06-24 15:28:54 +00:00
parent 822b8d28ee
commit 2fb2b854ef
3 changed files with 26 additions and 6 deletions

View File

@ -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));

View File

@ -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++)

View File

@ -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);