/* $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__ */
