Lines Matching +full:cs +full:- +full:2
61 struct call_struc *cs = from_timer(cs, t, timer); 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 */
119 struct call_struc *cs; in cf_command() local
121 if (strchr(msn, '.')) return (-EINVAL); /* subaddress not allowed in msn */ in cf_command()
122 if ((proc & 0x7F) > 2) return (-EINVAL); in cf_command()
135 if (!*fwd_nr) return (-EINVAL); /* destination missing */ in cf_command()
136 if (strchr(fwd_nr, '.')) return (-EINVAL); /* subaddress not allowed */ in cf_command()
139 *p++ = fwd_len + 2; /* complete forward to len */ in cf_command()
155 *ielenp = p - ielenp - 1; /* set total IE length */ in cf_command()
158 if (!(cs = kmalloc(sizeof(struct call_struc), GFP_ATOMIC))) in cf_command()
159 return (-ENOMEM); /* no memory */ in cf_command()
160 timer_setup(&cs->timer, deflect_timer_expire, 0); in cf_command()
161 cs->info[0] = '\0'; in cf_command()
162 cs->ics.driver = drvid; in cf_command()
163 cs->ics.command = ISDN_CMD_PROT_IO; /* protocol specific io */ in cf_command()
164 cs->ics.arg = DSS1_CMD_INVOKE; /* invoke supplementary service */ in cf_command()
165 cs->ics.parm.dss1_io.proc = (mode == 1) ? 7 : (mode == 2) ? 11 : 8; /* operation */ in cf_command()
166 cs->ics.parm.dss1_io.timeout = 4000; /* from ETS 300 207-1 */ in cf_command()
167 cs->ics.parm.dss1_io.datalen = p - tmp; /* total len */ in cf_command()
168 cs->ics.parm.dss1_io.data = tmp; /* start of buffer */ in cf_command()
171 cs->ics.parm.dss1_io.ll_id = next_id++; /* id for callback */ in cf_command()
173 *procid = cs->ics.parm.dss1_io.ll_id; in cf_command()
175 sprintf(cs->info, "%d 0x%lx %s%s 0 %s %02x %d%s%s\n", in cf_command()
177 cs->ics.parm.dss1_io.ll_id, in cf_command()
178 (mode != 2) ? "" : "0 ", in cf_command()
179 divert_if.drv_to_name(cs->ics.driver), in cf_command()
186 retval = divert_if.ll_cmd(&cs->ics); /* execute command */ in cf_command()
189 cs->prev = NULL; in cf_command()
191 cs->next = divert_head; in cf_command()
192 divert_head = cs; in cf_command()
195 kfree(cs); in cf_command()
205 struct call_struc *cs; in deflect_extern_action() local
210 if ((cmd & 0x7F) > 2) return (-EINVAL); /* invalid command */ in deflect_extern_action()
211 cs = divert_head; /* start of parameter list */ in deflect_extern_action()
212 while (cs) { in deflect_extern_action()
213 if (cs->divert_id == callid) break; /* found */ in deflect_extern_action()
214 cs = cs->next; in deflect_extern_action()
216 if (!cs) return (-EINVAL); /* invalid callid */ in deflect_extern_action()
218 ic.driver = cs->ics.driver; in deflect_extern_action()
219 ic.arg = cs->ics.arg; in deflect_extern_action()
220 i = -EINVAL; in deflect_extern_action()
221 if (cs->akt_state == DEFLECT_AUTODEL) return (i); /* no valid call */ in deflect_extern_action()
224 del_timer(&cs->timer); in deflect_extern_action()
228 cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ in deflect_extern_action()
229 cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); in deflect_extern_action()
230 add_timer(&cs->timer); in deflect_extern_action()
235 if (cs->akt_state == DEFLECT_ALERT) return (0); in deflect_extern_action()
237 del_timer(&cs->timer); in deflect_extern_action()
241 cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ in deflect_extern_action()
242 cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); in deflect_extern_action()
243 add_timer(&cs->timer); in deflect_extern_action()
246 cs->akt_state = DEFLECT_ALERT; in deflect_extern_action()
249 case 2: /* redir */ in deflect_extern_action()
250 del_timer(&cs->timer); in deflect_extern_action()
251 strlcpy(cs->ics.parm.setup.phone, to_nr, sizeof(cs->ics.parm.setup.phone)); in deflect_extern_action()
252 strcpy(cs->ics.parm.setup.eazmsn, "Testtext manual"); in deflect_extern_action()
256 cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ in deflect_extern_action()
257 cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); in deflect_extern_action()
258 add_timer(&cs->timer); in deflect_extern_action()
261 cs->akt_state = DEFLECT_ALERT; in deflect_extern_action()
277 return (-ENOMEM); /* no memory */ in insertrule()
279 ds->rule = *newrule; /* set rule */ in insertrule()
286 { idx--; in insertrule()
287 ds1 = ds1->next; in insertrule()
289 if (!ds1) idx = -1; in insertrule()
293 ds->prev = table_tail; /* previous entry */ in insertrule()
294 ds->next = NULL; /* end of chain */ in insertrule()
295 if (ds->prev) in insertrule()
296 ds->prev->next = ds; /* last forward */ in insertrule()
301 ds->next = ds1; /* next entry */ in insertrule()
302 ds->prev = ds1->prev; /* prev entry */ in insertrule()
303 ds1->prev = ds; /* backward chain old element */ in insertrule()
304 if (!ds->prev) in insertrule()
328 ds = ds->next; in deleterule()
338 idx--; in deleterule()
339 ds = ds->next; in deleterule()
344 return (-EINVAL); in deleterule()
347 if (ds->next) in deleterule()
348 ds->next->prev = ds->prev; /* backward chain */ in deleterule()
350 table_tail = ds->prev; /* end of chain */ in deleterule()
352 if (ds->prev) in deleterule()
353 ds->prev->next = ds->next; /* forward chain */ in deleterule()
355 table_head = ds->next; /* start of chain */ in deleterule()
371 if (!(idx--)) { in getruleptr()
372 return (&ds->rule); in getruleptr()
375 ds = ds->next; in getruleptr()
387 struct call_struc *cs = NULL; in isdn_divert_icall() local
393 for (dv = table_head; dv; dv = dv->next) { in isdn_divert_icall()
395 if (((dv->rule.callopt == 1) && (ic->command == ISDN_STAT_ICALLW)) || in isdn_divert_icall()
396 ((dv->rule.callopt == 2) && (ic->command == ISDN_STAT_ICALL))) in isdn_divert_icall()
398 if (!(dv->rule.drvid & (1L << ic->driver))) in isdn_divert_icall()
400 if ((dv->rule.si1) && (dv->rule.si1 != ic->parm.setup.si1)) in isdn_divert_icall()
402 if ((dv->rule.si2) && (dv->rule.si2 != ic->parm.setup.si2)) in isdn_divert_icall()
405 p = dv->rule.my_msn; in isdn_divert_icall()
406 p1 = ic->parm.setup.eazmsn; in isdn_divert_icall()
410 if (*p == '-') { in isdn_divert_icall()
421 if ((strcmp(dv->rule.caller, "0")) || in isdn_divert_icall()
422 (ic->parm.setup.phone[0])) { in isdn_divert_icall()
423 p = dv->rule.caller; in isdn_divert_icall()
424 p1 = ic->parm.setup.phone; in isdn_divert_icall()
428 if (*p == '-') { in isdn_divert_icall()
440 switch (dv->rule.action) { in isdn_divert_icall()
448 if (dv->rule.action == DEFLECT_PROCEED) in isdn_divert_icall()
449 if ((!if_used) || ((!extern_wait_max) && (!dv->rule.waittime))) in isdn_divert_icall()
451 if (!(cs = kmalloc(sizeof(struct call_struc), GFP_ATOMIC))) in isdn_divert_icall()
453 timer_setup(&cs->timer, deflect_timer_expire, 0); in isdn_divert_icall()
454 cs->info[0] = '\0'; in isdn_divert_icall()
456 cs->ics = *ic; /* copy incoming data */ in isdn_divert_icall()
457 if (!cs->ics.parm.setup.phone[0]) strcpy(cs->ics.parm.setup.phone, "0"); in isdn_divert_icall()
458 if (!cs->ics.parm.setup.eazmsn[0]) strcpy(cs->ics.parm.setup.eazmsn, "0"); in isdn_divert_icall()
459 cs->ics.parm.setup.screen = dv->rule.screen; in isdn_divert_icall()
460 if (dv->rule.waittime) in isdn_divert_icall()
461 cs->timer.expires = jiffies + (HZ * dv->rule.waittime); in isdn_divert_icall()
462 else if (dv->rule.action == DEFLECT_PROCEED) in isdn_divert_icall()
463 cs->timer.expires = jiffies + (HZ * extern_wait_max); in isdn_divert_icall()
465 cs->timer.expires = 0; in isdn_divert_icall()
466 cs->akt_state = dv->rule.action; in isdn_divert_icall()
468 cs->divert_id = next_id++; /* new sequence number */ in isdn_divert_icall()
470 cs->prev = NULL; in isdn_divert_icall()
471 if (cs->akt_state == DEFLECT_ALERT) { in isdn_divert_icall()
472 strcpy(cs->deflect_dest, dv->rule.to_nr); in isdn_divert_icall()
473 if (!cs->timer.expires) { in isdn_divert_icall()
474 strcpy(ic->parm.setup.eazmsn, in isdn_divert_icall()
476 ic->parm.setup.screen = dv->rule.screen; in isdn_divert_icall()
477 strlcpy(ic->parm.setup.phone, dv->rule.to_nr, sizeof(ic->parm.setup.phone)); in isdn_divert_icall()
478 cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */ in isdn_divert_icall()
479 cs->timer.expires = jiffies + (HZ * AUTODEL_TIME); in isdn_divert_icall()
484 cs->deflect_dest[0] = '\0'; in isdn_divert_icall()
487 snprintf(cs->info, sizeof(cs->info), in isdn_divert_icall()
489 cs->akt_state, in isdn_divert_icall()
490 cs->divert_id, in isdn_divert_icall()
491 divert_if.drv_to_name(cs->ics.driver), in isdn_divert_icall()
492 (ic->command == ISDN_STAT_ICALLW) ? "1" : "0", in isdn_divert_icall()
493 cs->ics.parm.setup.phone, in isdn_divert_icall()
494 cs->ics.parm.setup.eazmsn, in isdn_divert_icall()
495 cs->ics.parm.setup.si1, in isdn_divert_icall()
496 cs->ics.parm.setup.si2, in isdn_divert_icall()
497 cs->ics.parm.setup.screen, in isdn_divert_icall()
498 dv->rule.waittime, in isdn_divert_icall()
499 cs->deflect_dest); in isdn_divert_icall()
500 if ((dv->rule.action == DEFLECT_REPORT) || in isdn_divert_icall()
501 (dv->rule.action == DEFLECT_REJECT)) { in isdn_divert_icall()
502 put_info_buffer(cs->info); in isdn_divert_icall()
503 kfree(cs); /* remove */ in isdn_divert_icall()
504 return ((dv->rule.action == DEFLECT_REPORT) ? 0 : 2); /* nothing to do */ in isdn_divert_icall()
514 if (cs) { in isdn_divert_icall()
515 cs->prev = NULL; in isdn_divert_icall()
517 cs->next = divert_head; in isdn_divert_icall()
518 divert_head = cs; in isdn_divert_icall()
519 if (cs->timer.expires) add_timer(&cs->timer); in isdn_divert_icall()
522 put_info_buffer(cs->info); in isdn_divert_icall()
531 struct call_struc *cs, *cs1; in deleteprocs() local
535 cs = divert_head; in deleteprocs()
537 while (cs) { in deleteprocs()
538 del_timer(&cs->timer); in deleteprocs()
539 cs1 = cs; in deleteprocs()
540 cs = cs->next; in deleteprocs()
554 if (len < 2) return (retval); in put_address()
556 retval = *(++p) + 2; /* total length */ in put_address()
558 len = retval - 2; /* remaining length */ in put_address()
562 len -= 3; in put_address()
564 if (len < 2) return (0); in put_address()
569 retval = *(++p) + 2; /* total length */ in put_address()
571 len = retval - 2; in put_address()
579 *st++ = '-'; in put_address()
581 while (len--) in put_address()
590 static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs) in interrogate_success() argument
592 char *src = ic->parm.dss1_io.data; in interrogate_success()
593 int restlen = ic->parm.dss1_io.datalen; in interrogate_success()
598 if (restlen < 2) return (-100); /* frame too short */ in interrogate_success()
599 if (*src++ != 0x30) return (-101); in interrogate_success()
600 if ((n = *src++) > 0x81) return (-102); /* invalid length field */ in interrogate_success()
601 restlen -= 2; /* remaining bytes */ in interrogate_success()
603 if (restlen < 2) return (-103); in interrogate_success()
604 if ((*(src + restlen - 1)) || (*(src + restlen - 2))) return (-104); in interrogate_success()
605 restlen -= 2; in interrogate_success()
608 restlen--; in interrogate_success()
609 if (n > restlen) return (-105); in interrogate_success()
612 return (-106); in interrogate_success()
615 if (restlen < 3) return (-107); /* no procedure */ in interrogate_success()
616 if ((*src++ != 2) || (*src++ != 1) || (*src++ != 0x0B)) return (-108); in interrogate_success()
617 restlen -= 3; in interrogate_success()
618 if (restlen < 2) return (-109); /* list missing */ in interrogate_success()
621 if ((n = *src++) > 0x81) return (-110); /* invalid length field */ in interrogate_success()
622 restlen -= 2; /* remaining bytes */ in interrogate_success()
624 if (restlen < 2) return (-111); in interrogate_success()
625 if ((*(src + restlen - 1)) || (*(src + restlen - 2))) return (-112); in interrogate_success()
626 restlen -= 2; in interrogate_success()
629 restlen--; in interrogate_success()
630 if (n > restlen) return (-113); in interrogate_success()
633 return (-114); in interrogate_success()
638 while (restlen >= 2) { in interrogate_success()
640 sprintf(stp, "%d 0x%lx %d %s ", DIVERT_REPORT, ic->parm.dss1_io.ll_id, in interrogate_success()
641 cnt++, divert_if.drv_to_name(ic->driver)); in interrogate_success()
643 if (*src++ != 0x30) return (-115); /* invalid enum */ in interrogate_success()
645 restlen -= 2; in interrogate_success()
646 if (n > restlen) return (-116); /* enum length wrong */ in interrogate_success()
647 restlen -= n; in interrogate_success()
653 n -= n1; in interrogate_success()
661 n -= 6; in interrogate_success()
662 if (n > 2) { in interrogate_success()
664 if (*p > (n - 2)) continue; in interrogate_success()
672 if (restlen) return (-117); in interrogate_success()
681 struct call_struc *cs, *cs1; in prot_stat_callback() local
685 cs = divert_head; /* start of list */ in prot_stat_callback()
687 while (cs) { in prot_stat_callback()
688 if (ic->driver == cs->ics.driver) { in prot_stat_callback()
689 switch (cs->ics.arg) { in prot_stat_callback()
691 if ((cs->ics.parm.dss1_io.ll_id == ic->parm.dss1_io.ll_id) && in prot_stat_callback()
692 (cs->ics.parm.dss1_io.hl_id == ic->parm.dss1_io.hl_id)) { in prot_stat_callback()
693 switch (ic->arg) { in prot_stat_callback()
695 sprintf(cs->info, "128 0x%lx 0x%x\n", in prot_stat_callback()
696 ic->parm.dss1_io.ll_id, in prot_stat_callback()
697 ic->parm.dss1_io.timeout); in prot_stat_callback()
698 put_info_buffer(cs->info); in prot_stat_callback()
702 switch (cs->ics.parm.dss1_io.proc) { in prot_stat_callback()
705 put_info_buffer(cs->info); in prot_stat_callback()
709 i = interrogate_success(ic, cs); in prot_stat_callback()
711 sprintf(cs->info, "%d 0x%lx %d\n", DIVERT_REPORT, in prot_stat_callback()
712 ic->parm.dss1_io.ll_id, i); in prot_stat_callback()
713 put_info_buffer(cs->info); in prot_stat_callback()
717 printk(KERN_WARNING "dss1_divert: unknown proc %d\n", cs->ics.parm.dss1_io.proc); in prot_stat_callback()
724 printk(KERN_WARNING "dss1_divert unknown invoke answer %lx\n", ic->arg); in prot_stat_callback()
727 cs1 = cs; /* remember structure */ in prot_stat_callback()
728 cs = NULL; in prot_stat_callback()
738 printk(KERN_WARNING "dss1_divert unknown cmd 0x%lx\n", cs->ics.arg); in prot_stat_callback()
741 cs = cs->next; in prot_stat_callback()
750 if (cs1->ics.driver == -1) { in prot_stat_callback()
752 del_timer(&cs1->timer); in prot_stat_callback()
753 if (cs1->prev) in prot_stat_callback()
754 cs1->prev->next = cs1->next; /* forward link */ in prot_stat_callback()
756 divert_head = cs1->next; in prot_stat_callback()
757 if (cs1->next) in prot_stat_callback()
758 cs1->next->prev = cs1->prev; /* back link */ in prot_stat_callback()
772 struct call_struc *cs, *cs1; in isdn_divert_stat_callback() local
776 retval = -1; in isdn_divert_stat_callback()
777 cs = divert_head; /* start of list */ in isdn_divert_stat_callback()
778 while (cs) { in isdn_divert_stat_callback()
779 if ((ic->driver == cs->ics.driver) && in isdn_divert_stat_callback()
780 (ic->arg == cs->ics.arg)) { in isdn_divert_stat_callback()
781 switch (ic->command) { in isdn_divert_stat_callback()
783 sprintf(cs->info, "129 0x%lx\n", cs->divert_id); in isdn_divert_stat_callback()
784 del_timer(&cs->timer); in isdn_divert_stat_callback()
785 cs->ics.driver = -1; in isdn_divert_stat_callback()
789 sprintf(cs->info, "130 0x%lx %s\n", cs->divert_id, ic->parm.num); in isdn_divert_stat_callback()
793 sprintf(cs->info, "131 0x%lx\n", cs->divert_id); in isdn_divert_stat_callback()
794 del_timer(&cs->timer); in isdn_divert_stat_callback()
795 cs->ics.driver = -1; in isdn_divert_stat_callback()
799 sprintf(cs->info, "999 0x%lx 0x%x\n", cs->divert_id, (int)(ic->command)); in isdn_divert_stat_callback()
802 put_info_buffer(cs->info); in isdn_divert_stat_callback()
805 cs1 = cs; in isdn_divert_stat_callback()
806 cs = cs->next; in isdn_divert_stat_callback()
807 if (cs1->ics.driver == -1) { in isdn_divert_stat_callback()
809 if (cs1->prev) in isdn_divert_stat_callback()
810 cs1->prev->next = cs1->next; /* forward link */ in isdn_divert_stat_callback()
812 divert_head = cs1->next; in isdn_divert_stat_callback()
813 if (cs1->next) in isdn_divert_stat_callback()
814 cs1->next->prev = cs1->prev; /* back link */ in isdn_divert_stat_callback()
828 switch (ic->command) { in ll_callback()
835 if ((ic->arg & 0xFF) == ISDN_PTYPE_EURO) { in ll_callback()
836 if (ic->arg != DSS1_STAT_INVOKE_BRD) in ll_callback()
841 return (-1); /* protocol not euro */ in ll_callback()