1/* $Id: isdn_divert.h,v 1.5.6.1 2001/09/23 22:24:36 kai Exp $ 2 * 3 * Header for the diversion supplementary ioctl interface. 4 * 5 * Copyright 1998 by Werner Cornelius (werner@ikt.de) 6 * 7 * This software may be used and distributed according to the terms 8 * of the GNU General Public License, incorporated herein by reference. 9 * 10 */ 11 12#include <linux/ioctl.h> 13#include <linux/types.h> 14 15/******************************************/ 16/* IOCTL codes for interface to user prog */ 17/******************************************/ 18#define DIVERT_IIOC_VERSION 0x01 /* actual version */ 19#define IIOCGETVER _IO('I', 1) /* get version of interface */ 20#define IIOCGETDRV _IO('I', 2) /* get driver number */ 21#define IIOCGETNAM _IO('I', 3) /* get driver name */ 22#define IIOCGETRULE _IO('I', 4) /* read one rule */ 23#define IIOCMODRULE _IO('I', 5) /* modify/replace a rule */ 24#define IIOCINSRULE _IO('I', 6) /* insert/append one rule */ 25#define IIOCDELRULE _IO('I', 7) /* delete a rule */ 26#define IIOCDODFACT _IO('I', 8) /* hangup/reject/alert/immediately deflect a call */ 27#define IIOCDOCFACT _IO('I', 9) /* activate control forwarding in PBX */ 28#define IIOCDOCFDIS _IO('I', 10) /* deactivate control forwarding in PBX */ 29#define IIOCDOCFINT _IO('I', 11) /* interrogate control forwarding in PBX */ 30 31/*************************************/ 32/* states reported through interface */ 33/*************************************/ 34#define DEFLECT_IGNORE 0 /* ignore incoming call */ 35#define DEFLECT_REPORT 1 /* only report */ 36#define DEFLECT_PROCEED 2 /* deflect when externally triggered */ 37#define DEFLECT_ALERT 3 /* alert and deflect after delay */ 38#define DEFLECT_REJECT 4 /* reject immediately */ 39#define DIVERT_ACTIVATE 5 /* diversion activate */ 40#define DIVERT_DEACTIVATE 6 /* diversion deactivate */ 41#define DIVERT_REPORT 7 /* interrogation result */ 42#define DEFLECT_AUTODEL 255 /* only for internal use */ 43 44#define DEFLECT_ALL_IDS 0xFFFFFFFF /* all drivers selected */ 45 46typedef struct { 47 ulong drvid; /* driver ids, bit mapped */ 48 char my_msn[35]; /* desired msn, subaddr allowed */ 49 char caller[35]; /* caller id, partial string with * + subaddr allowed */ 50 char to_nr[35]; /* deflected to number incl. subaddress */ 51 u_char si1, si2; /* service indicators, si1=bitmask, si1+2 0 = all */ 52 u_char screen; /* screening: 0 = no info, 1 = info, 2 = nfo with nr */ 53 u_char callopt; /* option for call handling: 54 0 = all calls 55 1 = only non waiting calls 56 2 = only waiting calls */ 57 u_char action; /* desired action: 58 0 = don't report call -> ignore 59 1 = report call, do not allow/proceed for deflection 60 2 = report call, send proceed, wait max waittime secs 61 3 = report call, alert and deflect after waittime 62 4 = report call, reject immediately 63 actions 1-2 only take place if interface is opened 64 */ 65 u_char waittime; /* maximum wait time for proceeding */ 66} divert_rule; 67 68typedef union { 69 int drv_version; /* return of driver version */ 70 struct { 71 int drvid; /* id of driver */ 72 char drvnam[30]; /* name of driver */ 73 } getid; 74 struct { 75 int ruleidx; /* index of rule */ 76 divert_rule rule; /* rule parms */ 77 } getsetrule; 78 struct { 79 u_char subcmd; /* 0 = hangup/reject, 80 1 = alert, 81 2 = deflect */ 82 ulong callid; /* id of call delivered by ascii output */ 83 char to_nr[35]; /* destination when deflect, 84 else uus1 string (maxlen 31), 85 data from rule used if empty */ 86 } fwd_ctrl; 87 struct { 88 int drvid; /* id of driver */ 89 u_char cfproc; /* cfu = 0, cfb = 1, cfnr = 2 */ 90 ulong procid; /* process id returned when no error */ 91 u_char service; /* basically coded service, 0 = all */ 92 char msn[25]; /* desired msn, empty = all */ 93 char fwd_nr[35];/* forwarded to number + subaddress */ 94 } cf_ctrl; 95} divert_ioctl; 96 97#ifdef __KERNEL__ 98 99#include <linux/isdnif.h> 100#include <linux/isdn_divertif.h> 101 102#define AUTODEL_TIME 30 /* timeout in s to delete internal entries */ 103 104/**************************************************/ 105/* structure keeping ascii info for device output */ 106/**************************************************/ 107struct divert_info { 108 struct divert_info *next; 109 ulong usage_cnt; /* number of files still to work */ 110 char info_start[2]; /* info string start */ 111}; 112 113 114/**************/ 115/* Prototypes */ 116/**************/ 117extern spinlock_t divert_lock; 118 119extern ulong if_used; /* number of interface users */ 120extern int divert_dev_deinit(void); 121extern int divert_dev_init(void); 122extern void put_info_buffer(char *); 123extern int ll_callback(isdn_ctrl *); 124extern isdn_divert_if divert_if; 125extern divert_rule *getruleptr(int); 126extern int insertrule(int, divert_rule *); 127extern int deleterule(int); 128extern void deleteprocs(void); 129extern int deflect_extern_action(u_char, ulong, char *); 130extern int cf_command(int, int, u_char, char *, u_char, char *, ulong *); 131 132#endif /* __KERNEL__ */ 133