summaryrefslogtreecommitdiff
path: root/drivers/isdn/divert/isdn_divert.h
blob: 55033dd872c0258b4902e3056e3563d273770793 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* $Id: isdn_divert.h,v 1.5.6.1 2001/09/23 22:24:36 kai Exp $
 *
 * Header for the diversion supplementary ioctl interface.
 *
 * Copyright 1998       by Werner Cornelius (werner@ikt.de)
 *
 * This software may be used and distributed according to the terms
 * of the GNU General Public License, incorporated herein by reference.
 *
 */

#include <linux/ioctl.h>
#include <linux/types.h>

/******************************************/
/* IOCTL codes for interface to user prog */
/******************************************/
#define DIVERT_IIOC_VERSION 0x01 /* actual version */
#define IIOCGETVER   _IO('I', 1)  /* get version of interface */
#define IIOCGETDRV   _IO('I', 2)  /* get driver number */
#define IIOCGETNAM   _IO('I', 3)  /* get driver name */
#define IIOCGETRULE  _IO('I', 4)  /* read one rule */
#define IIOCMODRULE  _IO('I', 5)  /* modify/replace a rule */
#define IIOCINSRULE  _IO('I', 6)  /* insert/append one rule */
#define IIOCDELRULE  _IO('I', 7)  /* delete a rule */
#define IIOCDODFACT  _IO('I', 8)  /* hangup/reject/alert/immediately deflect a call */
#define IIOCDOCFACT  _IO('I', 9)  /* activate control forwarding in PBX */
#define IIOCDOCFDIS  _IO('I', 10)  /* deactivate control forwarding in PBX */
#define IIOCDOCFINT  _IO('I', 11)  /* interrogate control forwarding in PBX */

/*************************************/
/* states reported through interface */
/*************************************/
#define DEFLECT_IGNORE    0  /* ignore incoming call */
#define DEFLECT_REPORT    1  /* only report */
#define DEFLECT_PROCEED   2  /* deflect when externally triggered */
#define DEFLECT_ALERT     3  /* alert and deflect after delay */
#define DEFLECT_REJECT    4  /* reject immediately */
#define DIVERT_ACTIVATE   5  /* diversion activate */
#define DIVERT_DEACTIVATE 6  /* diversion deactivate */
#define DIVERT_REPORT     7  /* interrogation result */
#define DEFLECT_AUTODEL 255  /* only for internal use */

#define DEFLECT_ALL_IDS   0xFFFFFFFF /* all drivers selected */

typedef struct {
	ulong drvid;     /* driver ids, bit mapped */
	char my_msn[35]; /* desired msn, subaddr allowed */
	char caller[35]; /* caller id, partial string with * + subaddr allowed */
	char to_nr[35];  /* deflected to number incl. subaddress */
	u_char si1, si2;  /* service indicators, si1=bitmask, si1+2 0 = all */
	u_char screen;   /* screening: 0 = no info, 1 = info, 2 = nfo with nr */
	u_char callopt;  /* option for call handling:
			    0 = all calls
			    1 = only non waiting calls
			    2 = only waiting calls */
	u_char action;   /* desired action:
			    0 = don't report call -> ignore
			    1 = report call, do not allow/proceed for deflection
			    2 = report call, send proceed, wait max waittime secs
			    3 = report call, alert and deflect after waittime
			    4 = report call, reject immediately
			    actions 1-2 only take place if interface is opened
			 */
	u_char waittime; /* maximum wait time for proceeding */
} divert_rule;

typedef union {
	int drv_version; /* return of driver version */
	struct {
		int drvid;		/* id of driver */
		char drvnam[30];	/* name of driver */
	} getid;
	struct {
		int ruleidx;	/* index of rule */
		divert_rule rule;	/* rule parms */
	} getsetrule;
	struct {
		u_char subcmd;  /* 0 = hangup/reject,
			     1 = alert,
			     2 = deflect */
		ulong callid;   /* id of call delivered by ascii output */
		char to_nr[35]; /* destination when deflect,
				   else uus1 string (maxlen 31),
				   data from rule used if empty */
	} fwd_ctrl;
	struct {
		int drvid;      /* id of driver */
		u_char cfproc;  /* cfu = 0, cfb = 1, cfnr = 2 */
		ulong procid;   /* process id returned when no error */
		u_char service; /* basically coded service, 0 = all */
		char msn[25];   /* desired msn, empty = all */
		char fwd_nr[35];/* forwarded to number + subaddress */
	} cf_ctrl;
} divert_ioctl;

#ifdef __KERNEL__

#include <linux/isdnif.h>
#include <linux/isdn_divertif.h>

#define AUTODEL_TIME 30 /* timeout in s to delete internal entries */

/**************************************************/
/* structure keeping ascii info for device output */
/**************************************************/
struct divert_info {
	struct divert_info *next;
	ulong usage_cnt; /* number of files still to work */
	char info_start[2]; /* info string start */
};


/**************/
/* Prototypes */
/**************/
extern spinlock_t divert_lock;

extern ulong if_used; /* number of interface users */
extern int divert_dev_deinit(void);
extern int divert_dev_init(void);
extern void put_info_buffer(char *);
extern int ll_callback(isdn_ctrl *);
extern isdn_divert_if divert_if;
extern divert_rule *getruleptr(int);
extern int insertrule(int, divert_rule *);
extern int deleterule(int);
extern void deleteprocs(void);
extern int deflect_extern_action(u_char, ulong, char *);
extern int cf_command(int, int, u_char, char *, u_char, char *, ulong *);

#endif /* __KERNEL__ */