Lines Matching +full:cs +full:- +full:2

61   struct call_struc *cs = (struct call_struc *) arg;  in deflect_timer_expire()  local
64 del_timer(&cs->timer); /* delete active timer */ in deflect_timer_expire()
67 switch(cs->akt_state) in deflect_timer_expire()
69 cs->ics.command = ISDN_CMD_HANGUP; /* cancel action */ in deflect_timer_expire()
70 divert_if.ll_cmd(&cs->ics); in deflect_timer_expire()
72 cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ in deflect_timer_expire()
73 cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); in deflect_timer_expire()
74 add_timer(&cs->timer); in deflect_timer_expire()
79 cs->ics.command = ISDN_CMD_REDIR; /* protocol */ in deflect_timer_expire()
80 strlcpy(cs->ics.parm.setup.phone, cs->deflect_dest, sizeof(cs->ics.parm.setup.phone)); in deflect_timer_expire()
81 strcpy(cs->ics.parm.setup.eazmsn,"Testtext delayed"); in deflect_timer_expire()
82 divert_if.ll_cmd(&cs->ics); in deflect_timer_expire()
84 cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ in deflect_timer_expire()
85 cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); in deflect_timer_expire()
86 add_timer(&cs->timer); in deflect_timer_expire()
93 if (cs->prev) in deflect_timer_expire()
94 cs->prev->next = cs->next; /* forward link */ in deflect_timer_expire()
96 divert_head = cs->next; in deflect_timer_expire()
97 if (cs->next) in deflect_timer_expire()
98 cs->next->prev = cs->prev; /* back link */ in deflect_timer_expire()
100 kfree(cs); in deflect_timer_expire()
109 /* 0 = deact, 1 = act, 2 = interrogate */
118 struct call_struc *cs; in cf_command() local
120 if (strchr(msn,'.')) return(-EINVAL); /* subaddress not allowed in msn */ in cf_command()
121 if ((proc & 0x7F) > 2) return(-EINVAL); in cf_command()
134 { if (!*fwd_nr) return(-EINVAL); /* destination missing */ in cf_command()
135 if (strchr(fwd_nr,'.')) return(-EINVAL); /* subaddress not allowed */ in cf_command()
138 *p++ = fwd_len + 2; /* complete forward to len */ in cf_command()
154 *ielenp = p - ielenp - 1; /* set total IE length */ in cf_command()
157 if (!(cs = kmalloc(sizeof(struct call_struc), GFP_ATOMIC))) in cf_command()
158 return(-ENOMEM); /* no memory */ in cf_command()
159 init_timer(&cs->timer); in cf_command()
160 cs->info[0] = '\0'; in cf_command()
161 cs->timer.function = deflect_timer_expire; in cf_command()
162 cs->timer.data = (ulong) cs; /* pointer to own structure */ in cf_command()
163 cs->ics.driver = drvid; in cf_command()
164 cs->ics.command = ISDN_CMD_PROT_IO; /* protocol specific io */ in cf_command()
165 cs->ics.arg = DSS1_CMD_INVOKE; /* invoke supplementary service */ in cf_command()
166 cs->ics.parm.dss1_io.proc = (mode == 1) ? 7: (mode == 2) ? 11:8; /* operation */ in cf_command()
167 cs->ics.parm.dss1_io.timeout = 4000; /* from ETS 300 207-1 */ in cf_command()
168 cs->ics.parm.dss1_io.datalen = p - tmp; /* total len */ in cf_command()
169 cs->ics.parm.dss1_io.data = tmp; /* start of buffer */ in cf_command()
172 cs->ics.parm.dss1_io.ll_id = next_id++; /* id for callback */ in cf_command()
174 *procid = cs->ics.parm.dss1_io.ll_id; in cf_command()
176 sprintf(cs->info,"%d 0x%lx %s%s 0 %s %02x %d%s%s\n", in cf_command()
178 cs->ics.parm.dss1_io.ll_id, in cf_command()
179 (mode != 2) ? "" : "0 ", in cf_command()
180 divert_if.drv_to_name(cs->ics.driver), in cf_command()
187 retval = divert_if.ll_cmd(&cs->ics); /* execute command */ in cf_command()
190 { cs->prev = NULL; in cf_command()
192 cs->next = divert_head; in cf_command()
193 divert_head = cs; in cf_command()
197 kfree(cs); in cf_command()
206 { struct call_struc *cs; in deflect_extern_action() local
211 if ((cmd & 0x7F) > 2) return(-EINVAL); /* invalid command */ in deflect_extern_action()
212 cs = divert_head; /* start of parameter list */ in deflect_extern_action()
213 while (cs) in deflect_extern_action()
214 { if (cs->divert_id == callid) break; /* found */ in deflect_extern_action()
215 cs = cs->next; in deflect_extern_action()
217 if (!cs) return(-EINVAL); /* invalid callid */ in deflect_extern_action()
219 ic.driver = cs->ics.driver; in deflect_extern_action()
220 ic.arg = cs->ics.arg; in deflect_extern_action()
221 i = -EINVAL; in deflect_extern_action()
222 if (cs->akt_state == DEFLECT_AUTODEL) return(i); /* no valid call */ in deflect_extern_action()
225 del_timer(&cs->timer); in deflect_extern_action()
229 cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ in deflect_extern_action()
230 cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); in deflect_extern_action()
231 add_timer(&cs->timer); in deflect_extern_action()
236 if (cs->akt_state == DEFLECT_ALERT) return(0); in deflect_extern_action()
238 del_timer(&cs->timer); in deflect_extern_action()
243 cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ in deflect_extern_action()
244 cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); in deflect_extern_action()
245 add_timer(&cs->timer); in deflect_extern_action()
249 cs->akt_state = DEFLECT_ALERT; in deflect_extern_action()
252 case 2: /* redir */ in deflect_extern_action()
253 del_timer(&cs->timer); in deflect_extern_action()
254 strlcpy(cs->ics.parm.setup.phone, to_nr, sizeof(cs->ics.parm.setup.phone)); in deflect_extern_action()
255 strcpy(cs->ics.parm.setup.eazmsn, "Testtext manual"); in deflect_extern_action()
260 cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ in deflect_extern_action()
261 cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); in deflect_extern_action()
262 add_timer(&cs->timer); in deflect_extern_action()
266 cs->akt_state = DEFLECT_ALERT; in deflect_extern_action()
282 return(-ENOMEM); /* no memory */ in insertrule()
284 ds->rule = *newrule; /* set rule */ in insertrule()
291 { idx--; in insertrule()
292 ds1 = ds1->next; in insertrule()
294 if (!ds1) idx = -1; in insertrule()
298 { ds->prev = table_tail; /* previous entry */ in insertrule()
299 ds->next = NULL; /* end of chain */ in insertrule()
300 if (ds->prev) in insertrule()
301 ds->prev->next = ds; /* last forward */ in insertrule()
307 { ds->next = ds1; /* next entry */ in insertrule()
308 ds->prev = ds1->prev; /* prev entry */ in insertrule()
309 ds1->prev = ds; /* backward chain old element */ in insertrule()
310 if (!ds->prev) in insertrule()
333 ds = ds->next; in deleterule()
343 { idx--; in deleterule()
344 ds = ds->next; in deleterule()
350 return(-EINVAL); in deleterule()
353 if (ds->next) in deleterule()
354 ds->next->prev = ds->prev; /* backward chain */ in deleterule()
356 table_tail = ds->prev; /* end of chain */ in deleterule()
358 if (ds->prev) in deleterule()
359 ds->prev->next = ds->next; /* forward chain */ in deleterule()
361 table_head = ds->next; /* start of chain */ in deleterule()
376 { if (!(idx--)) in getruleptr()
377 { return(&ds->rule); in getruleptr()
380 ds = ds->next; in getruleptr()
391 struct call_struc *cs = NULL; in isdn_divert_icall() local
397 for (dv = table_head; dv ; dv = dv->next ) in isdn_divert_icall()
399 if (((dv->rule.callopt == 1) && (ic->command == ISDN_STAT_ICALLW)) || in isdn_divert_icall()
400 ((dv->rule.callopt == 2) && (ic->command == ISDN_STAT_ICALL))) in isdn_divert_icall()
402 if (!(dv->rule.drvid & (1L << ic->driver))) in isdn_divert_icall()
404 if ((dv->rule.si1) && (dv->rule.si1 != ic->parm.setup.si1)) in isdn_divert_icall()
406 if ((dv->rule.si2) && (dv->rule.si2 != ic->parm.setup.si2)) in isdn_divert_icall()
409 p = dv->rule.my_msn; in isdn_divert_icall()
410 p1 = ic->parm.setup.eazmsn; in isdn_divert_icall()
414 if (*p == '-') in isdn_divert_icall()
425 if ((strcmp(dv->rule.caller,"0")) || (ic->parm.setup.phone[0])) in isdn_divert_icall()
426 { p = dv->rule.caller; in isdn_divert_icall()
427 p1 = ic->parm.setup.phone; in isdn_divert_icall()
431 if (*p == '-') in isdn_divert_icall()
443 switch (dv->rule.action) in isdn_divert_icall()
452 if (dv->rule.action == DEFLECT_PROCEED) in isdn_divert_icall()
453 if ((!if_used) || ((!extern_wait_max) && (!dv->rule.waittime))) in isdn_divert_icall()
455 if (!(cs = kmalloc(sizeof(struct call_struc), GFP_ATOMIC))) in isdn_divert_icall()
457 init_timer(&cs->timer); in isdn_divert_icall()
458 cs->info[0] = '\0'; in isdn_divert_icall()
459 cs->timer.function = deflect_timer_expire; in isdn_divert_icall()
460 cs->timer.data = (ulong) cs; /* pointer to own structure */ in isdn_divert_icall()
462 cs->ics = *ic; /* copy incoming data */ in isdn_divert_icall()
463 if (!cs->ics.parm.setup.phone[0]) strcpy(cs->ics.parm.setup.phone,"0"); in isdn_divert_icall()
464 if (!cs->ics.parm.setup.eazmsn[0]) strcpy(cs->ics.parm.setup.eazmsn,"0"); in isdn_divert_icall()
465 cs->ics.parm.setup.screen = dv->rule.screen; in isdn_divert_icall()
466 if (dv->rule.waittime) in isdn_divert_icall()
467 cs->timer.expires = jiffies + (HZ * dv->rule.waittime); in isdn_divert_icall()
469 if (dv->rule.action == DEFLECT_PROCEED) in isdn_divert_icall()
470 cs->timer.expires = jiffies + (HZ * extern_wait_max); in isdn_divert_icall()
472 cs->timer.expires = 0; in isdn_divert_icall()
473 cs->akt_state = dv->rule.action; in isdn_divert_icall()
475 cs->divert_id = next_id++; /* new sequence number */ in isdn_divert_icall()
477 cs->prev = NULL; in isdn_divert_icall()
478 if (cs->akt_state == DEFLECT_ALERT) in isdn_divert_icall()
479 { strcpy(cs->deflect_dest,dv->rule.to_nr); in isdn_divert_icall()
480 if (!cs->timer.expires) in isdn_divert_icall()
481 { strcpy(ic->parm.setup.eazmsn,"Testtext direct"); in isdn_divert_icall()
482 ic->parm.setup.screen = dv->rule.screen; in isdn_divert_icall()
483 strlcpy(ic->parm.setup.phone, dv->rule.to_nr, sizeof(ic->parm.setup.phone)); in isdn_divert_icall()
484 cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ in isdn_divert_icall()
485 cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); in isdn_divert_icall()
492 { cs->deflect_dest[0] = '\0'; in isdn_divert_icall()
495 sprintf(cs->info,"%d 0x%lx %s %s %s %s 0x%x 0x%x %d %d %s\n", in isdn_divert_icall()
496 cs->akt_state, in isdn_divert_icall()
497 cs->divert_id, in isdn_divert_icall()
498 divert_if.drv_to_name(cs->ics.driver), in isdn_divert_icall()
499 (ic->command == ISDN_STAT_ICALLW) ? "1":"0", in isdn_divert_icall()
500 cs->ics.parm.setup.phone, in isdn_divert_icall()
501 cs->ics.parm.setup.eazmsn, in isdn_divert_icall()
502 cs->ics.parm.setup.si1, in isdn_divert_icall()
503 cs->ics.parm.setup.si2, in isdn_divert_icall()
504 cs->ics.parm.setup.screen, in isdn_divert_icall()
505 dv->rule.waittime, in isdn_divert_icall()
506 cs->deflect_dest); in isdn_divert_icall()
507 if ((dv->rule.action == DEFLECT_REPORT) || in isdn_divert_icall()
508 (dv->rule.action == DEFLECT_REJECT)) in isdn_divert_icall()
509 { put_info_buffer(cs->info); in isdn_divert_icall()
510 kfree(cs); /* remove */ in isdn_divert_icall()
511 return((dv->rule.action == DEFLECT_REPORT) ? 0:2); /* nothing to do */ in isdn_divert_icall()
522 if (cs) in isdn_divert_icall()
523 { cs->prev = NULL; in isdn_divert_icall()
525 cs->next = divert_head; in isdn_divert_icall()
526 divert_head = cs; in isdn_divert_icall()
527 if (cs->timer.expires) add_timer(&cs->timer); in isdn_divert_icall()
530 put_info_buffer(cs->info); in isdn_divert_icall()
539 { struct call_struc *cs, *cs1; in deleteprocs() local
543 cs = divert_head; in deleteprocs()
545 while (cs) in deleteprocs()
546 { del_timer(&cs->timer); in deleteprocs()
547 cs1 = cs; in deleteprocs()
548 cs = cs->next; in deleteprocs()
561 if (len < 2) return(retval); in put_address()
563 { retval = *(++p) + 2; /* total length */ in put_address()
565 len = retval - 2; /* remaining length */ in put_address()
569 len -= 3; in put_address()
571 if (len < 2) return(0); in put_address()
578 { retval = *(++p) + 2; /* total length */ in put_address()
580 len = retval - 2; in put_address()
589 *st++ = '-'; in put_address()
591 while (len--) in put_address()
600 static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs) in interrogate_success() argument
601 { char *src = ic->parm.dss1_io.data; in interrogate_success()
602 int restlen = ic->parm.dss1_io.datalen; in interrogate_success()
607 if (restlen < 2) return(-100); /* frame too short */ in interrogate_success()
608 if (*src++ != 0x30) return(-101); in interrogate_success()
609 if ((n = *src++) > 0x81) return(-102); /* invalid length field */ in interrogate_success()
610 restlen -= 2; /* remaining bytes */ in interrogate_success()
612 { if (restlen < 2) return(-103); in interrogate_success()
613 if ((*(src+restlen-1)) || (*(src+restlen-2))) return(-104); in interrogate_success()
614 restlen -= 2; in interrogate_success()
619 restlen--; in interrogate_success()
620 if (n > restlen) return(-105); in interrogate_success()
624 if (n > restlen) return(-106); in interrogate_success()
627 if (restlen < 3) return(-107); /* no procedure */ in interrogate_success()
628 if ((*src++ != 2) || (*src++ != 1) || (*src++ != 0x0B)) return(-108); in interrogate_success()
629 restlen -= 3; in interrogate_success()
630 if (restlen < 2) return(-109); /* list missing */ in interrogate_success()
633 if ((n = *src++) > 0x81) return(-110); /* invalid length field */ in interrogate_success()
634 restlen -= 2; /* remaining bytes */ in interrogate_success()
636 { if (restlen < 2) return(-111); in interrogate_success()
637 if ((*(src+restlen-1)) || (*(src+restlen-2))) return(-112); in interrogate_success()
638 restlen -= 2; in interrogate_success()
643 restlen--; in interrogate_success()
644 if (n > restlen) return(-113); in interrogate_success()
648 if (n > restlen) return(-114); in interrogate_success()
653 while (restlen >= 2) in interrogate_success()
655 sprintf(stp,"%d 0x%lx %d %s ",DIVERT_REPORT, ic->parm.dss1_io.ll_id, in interrogate_success()
656 cnt++,divert_if.drv_to_name(ic->driver)); in interrogate_success()
658 if (*src++ != 0x30) return(-115); /* invalid enum */ in interrogate_success()
660 restlen -= 2; in interrogate_success()
661 if (n > restlen) return(-116); /* enum length wrong */ in interrogate_success()
662 restlen -= n; in interrogate_success()
668 n -= n1; in interrogate_success()
676 n -= 6; in interrogate_success()
677 if (n > 2) in interrogate_success()
679 if (*p > (n-2)) continue; in interrogate_success()
687 if (restlen) return(-117); in interrogate_success()
695 { struct call_struc *cs, *cs1; in prot_stat_callback() local
699 cs = divert_head; /* start of list */ in prot_stat_callback()
701 while (cs) in prot_stat_callback()
702 { if (ic->driver == cs->ics.driver) in prot_stat_callback()
703 { switch (cs->ics.arg) in prot_stat_callback()
705 if ((cs->ics.parm.dss1_io.ll_id == ic->parm.dss1_io.ll_id) && in prot_stat_callback()
706 (cs->ics.parm.dss1_io.hl_id == ic->parm.dss1_io.hl_id)) in prot_stat_callback()
707 { switch (ic->arg) in prot_stat_callback()
709 sprintf(cs->info,"128 0x%lx 0x%x\n", in prot_stat_callback()
710 ic->parm.dss1_io.ll_id, in prot_stat_callback()
711 ic->parm.dss1_io.timeout); in prot_stat_callback()
712 put_info_buffer(cs->info); in prot_stat_callback()
716 switch (cs->ics.parm.dss1_io.proc) in prot_stat_callback()
719 put_info_buffer(cs->info); in prot_stat_callback()
723 i = interrogate_success(ic,cs); in prot_stat_callback()
725 sprintf(cs->info,"%d 0x%lx %d\n",DIVERT_REPORT, in prot_stat_callback()
726 ic->parm.dss1_io.ll_id,i); in prot_stat_callback()
727 put_info_buffer(cs->info); in prot_stat_callback()
731 … printk(KERN_WARNING "dss1_divert: unknown proc %d\n",cs->ics.parm.dss1_io.proc); in prot_stat_callback()
739 printk(KERN_WARNING "dss1_divert unknown invoke answer %lx\n",ic->arg); in prot_stat_callback()
742 cs1 = cs; /* remember structure */ in prot_stat_callback()
743 cs = NULL; in prot_stat_callback()
753 printk(KERN_WARNING "dss1_divert unknown cmd 0x%lx\n",cs->ics.arg); in prot_stat_callback()
756 cs = cs->next; in prot_stat_callback()
765 if (cs1->ics.driver == -1) in prot_stat_callback()
768 del_timer(&cs1->timer); in prot_stat_callback()
769 if (cs1->prev) in prot_stat_callback()
770 cs1->prev->next = cs1->next; /* forward link */ in prot_stat_callback()
772 divert_head = cs1->next; in prot_stat_callback()
773 if (cs1->next) in prot_stat_callback()
774 cs1->next->prev = cs1->prev; /* back link */ in prot_stat_callback()
787 { struct call_struc *cs, *cs1; in isdn_divert_stat_callback() local
791 retval = -1; in isdn_divert_stat_callback()
792 cs = divert_head; /* start of list */ in isdn_divert_stat_callback()
793 while (cs) in isdn_divert_stat_callback()
794 { if ((ic->driver == cs->ics.driver) && (ic->arg == cs->ics.arg)) in isdn_divert_stat_callback()
795 { switch (ic->command) in isdn_divert_stat_callback()
797 sprintf(cs->info,"129 0x%lx\n",cs->divert_id); in isdn_divert_stat_callback()
798 del_timer(&cs->timer); in isdn_divert_stat_callback()
799 cs->ics.driver = -1; in isdn_divert_stat_callback()
803 sprintf(cs->info,"130 0x%lx %s\n",cs->divert_id,ic->parm.num); in isdn_divert_stat_callback()
807 sprintf(cs->info,"131 0x%lx\n",cs->divert_id); in isdn_divert_stat_callback()
808 del_timer(&cs->timer); in isdn_divert_stat_callback()
809 cs->ics.driver = -1; in isdn_divert_stat_callback()
813 sprintf(cs->info,"999 0x%lx 0x%x\n",cs->divert_id,(int)(ic->command)); in isdn_divert_stat_callback()
816 put_info_buffer(cs->info); in isdn_divert_stat_callback()
819 cs1 = cs; in isdn_divert_stat_callback()
820 cs = cs->next; in isdn_divert_stat_callback()
821 if (cs1->ics.driver == -1) in isdn_divert_stat_callback()
824 if (cs1->prev) in isdn_divert_stat_callback()
825 cs1->prev->next = cs1->next; /* forward link */ in isdn_divert_stat_callback()
827 divert_head = cs1->next; in isdn_divert_stat_callback()
828 if (cs1->next) in isdn_divert_stat_callback()
829 cs1->next->prev = cs1->prev; /* back link */ in isdn_divert_stat_callback()
843 switch (ic->command) in ll_callback()
850 if ((ic->arg & 0xFF) == ISDN_PTYPE_EURO) in ll_callback()
851 { if (ic->arg != DSS1_STAT_INVOKE_BRD) in ll_callback()
857 return(-1); /* protocol not euro */ in ll_callback()