isdnio.h revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1991, 1992, 1997, by Sun Microsystems, Inc.
* All rights reserved.
*/
#ifndef _SYS_ISDNIO_H
#define _SYS_ISDNIO_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/audioio.h>
/*
* ISDN related ioctls
*/
#ifdef __cplusplus
extern "C" {
#endif
enum isdn_chan {
ISDN_CHAN_NONE = 0x0, /* no channel given */
ISDN_CHAN_SELF, /* our channel from stream */
ISDN_CHAN_HOST, /* Unix STREAM */
ISDN_CHAN_CTLR_MGT, /* The management stream for a controller */
/* TE channel defines */
ISDN_CHAN_TE_MGT = 0x10,
ISDN_CHAN_TE_D_TRACE,
ISDN_CHAN_TE_D,
ISDN_CHAN_TE_B1,
ISDN_CHAN_TE_B2,
/* NT channel defines */
ISDN_CHAN_NT_MGT = 0x20,
ISDN_CHAN_NT_D_TRACE,
ISDN_CHAN_NT_D,
ISDN_CHAN_NT_B1,
ISDN_CHAN_NT_B2,
/* Primary rate ISDN */
ISDN_CHAN_PRI_MGT = 0x30,
ISDN_CHAN_PRI_D,
ISDN_CHAN_PRI_B0, ISDN_CHAN_PRI_B1, ISDN_CHAN_PRI_B2,
ISDN_CHAN_PRI_B3, ISDN_CHAN_PRI_B4, ISDN_CHAN_PRI_B5,
ISDN_CHAN_PRI_B6, ISDN_CHAN_PRI_B7, ISDN_CHAN_PRI_B8,
ISDN_CHAN_PRI_B9, ISDN_CHAN_PRI_B10, ISDN_CHAN_PRI_B11,
ISDN_CHAN_PRI_B12, ISDN_CHAN_PRI_B13, ISDN_CHAN_PRI_B14,
ISDN_CHAN_PRI_B15, ISDN_CHAN_PRI_B16, ISDN_CHAN_PRI_B17,
ISDN_CHAN_PRI_B18, ISDN_CHAN_PRI_B19, ISDN_CHAN_PRI_B20,
ISDN_CHAN_PRI_B21, ISDN_CHAN_PRI_B22, ISDN_CHAN_PRI_B23,
ISDN_CHAN_PRI_B24, ISDN_CHAN_PRI_B25, ISDN_CHAN_PRI_B26,
ISDN_CHAN_PRI_B27, ISDN_CHAN_PRI_B28, ISDN_CHAN_PRI_B29,
ISDN_CHAN_PRI_B30, ISDN_CHAN_PRI_B31,
/* Auxiliary channel defines */
ISDN_CHAN_AUX0_MGT = 0x100, ISDN_CHAN_AUX0,
ISDN_CHAN_AUX1_MGT, ISDN_CHAN_AUX1,
ISDN_CHAN_AUX2_MGT, ISDN_CHAN_AUX2,
ISDN_CHAN_AUX3_MGT, ISDN_CHAN_AUX3,
ISDN_CHAN_AUX4_MGT, ISDN_CHAN_AUX4,
ISDN_CHAN_AUX5_MGT, ISDN_CHAN_AUX5,
ISDN_CHAN_AUX6_MGT, ISDN_CHAN_AUX6,
ISDN_CHAN_AUX7_MGT, ISDN_CHAN_AUX7
};
typedef enum isdn_chan isdn_chan_t;
/*
* ISDN-specific status requests
*/
#define ISDN_INTERFACE_STATUS _IOWR('A', 8, isdn_interface_info_t)
#define ISDN_CHANNEL_STATUS _IOWR('A', 9, isdn_channel_info_t)
/*
* ISDN_PH_ACTIVATE_REQ - CCITT PH-ACTIVATE.req can only be used with a
* file descriptor that is connected to a D-Channel.
*/
#define ISDN_PH_ACTIVATE_REQ _IO('A', 10) /* Activate TE interface */
/*
* ISDN_MPH_DEACTIVATE_REQ - CCITT PH-ACTIVATE.req can only be used with
* a file descriptor that is connected to a D-Channel. This ioctl is only
* legal on NT D-Channels.
*/
#define ISDN_MPH_DEACTIVATE_REQ _IO('A', 11) /* deactivate ISDN intface */
/*
* ISDN_PARAM_POWER_* - Turn power for an ISDN interface on and off.
* This is equivalent to inserting or removing the ISDN cable from the
* ISDN equipment on an ISDN-line powerted TE.
*
* 1 = power on
* 0 = power off
*
* Interfaces that do not support this ioctl return -1 with errno set to
* EXIO.
*/
#define ISDN_PARAM_POWER_OFF (0)
#define ISDN_PARAM_POWER_ON (1)
/*
* ISDN_PARAM_SET and ISDN_PARAM_GET - Set/get an ISDN device parameter.
*/
#define ISDN_PARAM_SET _IOW('A', 16, isdn_param_t)
#define ISDN_PARAM_GET _IOWR('A', 16, isdn_param_t)
typedef enum {
ISDN_PARAM_NONE = 0,
ISDN_PARAM_NT_T101, /* NT Timer, 5-30 s, in milliseconds */
ISDN_PARAM_NT_T102, /* NT Timer, 25-100 ms, in milliseconds */
ISDN_PARAM_TE_T103, /* TE Timer, 5-30 s, in milliseconds */
ISDN_PARAM_TE_T104, /* TE Timer, 500-1000 ms, in milliseconds */
ISDN_PARAM_end_of_timers = 99, /* highest possible timer parameter */
ISDN_PARAM_MAINT, /* Manage the TE Maintenence Channel */
ISDN_PARAM_ASMB, /* Modify Activation State Machine Behavoir */
ISDN_PARAM_POWER, /* ISDN_PARAM_POWER_* */
ISDN_PARAM_PAUSE, /* Paused if == 1, else not paused == 0 */
ISDN_PARAM_vendor = 1000 /* Vendor specific params start at 1000 */
} isdn_param_tag_t;
#define ISDN_PARAM_VENDOR(x) \
((isdn_param_tag_t)((int)ISDN_PARAM_vendor+(int)(x)))
/*
* Modify activation state machine behavior.
* This parameter takes effect immediately.
*/
enum isdn_param_asmb {
ISDN_PARAM_TE_ASMB_UNKNOWN = -1,
/*
* 1988 CCITT Blue Book
*/
ISDN_PARAM_TE_ASMB_CCITT88,
/*
* Conformance Test Suite 2, used by CNET for France Telecom testing
*/
ISDN_PARAM_TE_ASMB_CTS2
};
/*
* This parameter takes effect the next time the device is opened. XXX?
*/
enum isdn_param_maint {
/*
* ISDN_PARAM_MAINT:
* If bit 8 is 0, F(A) will be zero in all conditions
*/
ISDN_PARAM_MAINT_OFF,
/*
* ISDN_PARAM_MAINT:
* If bit 8 is 1 and there is no source for Q-channel then F(A)
* will echo the received F(A)
*/
ISDN_PARAM_MAINT_ECHO,
/*
* ISDN_PARAM_MAINT:
* If bit 8 is 1 and the TE is transmitting Q-channel data, then
* where a 1 is received in the proper place in the multi-frame,
* the Q-data but will be transmitted in the F(A) bit of the
* current frame.
*/
ISDN_PARAM_MAINT_ON
};
typedef struct isdn_param isdn_param_t;
struct isdn_param {
isdn_param_tag_t tag; /* parameter name */
union {
unsigned int us; /* micro seconds */
unsigned int ms; /* Timer value in ms */
unsigned int flag; /* Boolean */
unsigned int count;
enum isdn_param_asmb asmb;
enum isdn_param_maint maint;
struct {
isdn_chan_t channel; /* Channel to Pause */
int paused; /* TRUE or FALSE */
} pause;
unsigned int reserved[2]; /* reserved future expansion */
} value;
};
/*
* ISDN_ACTIVATION_STATUS - Query the current activation state of an
* interface. "type" must be set to indicate the interface to query.
*
* type == ISDN_TYPE_SELF may be used to get the activation status of the
* interface connected to the file descriptor used in the ioctl.
*/
#define ISDN_ACTIVATION_STATUS _IOWR('A', 13, isdn_activation_status_t)
/*
* ISDN_SET_LOOPBACK - Set the specified interface into remote loopback
* mode.
*
* ISDN_RESET_LOOPBACK - Clear the specified loopbacks on the specified
* interface.
*/
#define ISDN_SET_LOOPBACK _IOW('A', 14, isdn_loopback_request_t)
#define ISDN_RESET_LOOPBACK _IOW('A', 15, isdn_loopback_request_t)
#define ISDN_SET_FORMAT _IOWR('A', 16, isdn_format_req_t)
#define ISDN_GET_FORMAT _IOWR('A', 17, isdn_format_req_t)
#define ISDN_SET_CHANNEL _IOW('A', 18, isdn_conn_req_t)
#define ISDN_GET_CONFIG _IOWR('A', 19, isdn_conn_tab_t)
typedef enum {
ISDN_TYPE_UNKNOWN = -1, /* Not known or applicable */
/*
* For queries, application may put this value into "type" to
* query the state of the file descriptor used in an ioctl.
*/
ISDN_TYPE_SELF = 0,
ISDN_TYPE_OTHER, /* Not an ISDN interface */
ISDN_TYPE_TE,
ISDN_TYPE_NT,
ISDN_TYPE_PRI
} isdn_interface_t;
typedef enum {
ISDN_PATH_NOCHANGE = 0, /* No-operation */
ISDN_PATH_DISCONNECT, /* Disconnect data path */
ISDN_PATH_ONEWAY, /* Uni-directional data path */
ISDN_PATH_TWOWAY /* Bi-directional data path */
} isdn_path_t;
typedef enum {
ISDN_MODE_UNKNOWN = 0, /* mode predefined by def */
ISDN_MODE_HDLC, /* HDLC framing and error checking */
ISDN_MODE_TRANSPARENT /* Transparent mode */
} isdn_mode_t;
typedef struct isdn_format isdn_format_t;
struct isdn_format {
isdn_mode_t mode;
unsigned int sample_rate; /* data frames per second */
unsigned int channels; /* number of interleaved channels */
unsigned int precision; /* bits per sample */
unsigned int encoding; /* AUDIO_ENCODING_* */
unsigned int reserved[3]; /* must be zero */
};
typedef struct isdn_conn_req isdn_conn_req_t;
struct isdn_conn_req {
isdn_chan_t from;
isdn_chan_t to;
isdn_path_t dir; /* uni/bi-directional or disconnect */
isdn_format_t format; /* data format */
int reserved[4];
};
typedef struct isdn_conn_tab isdn_conn_tab_t;
struct isdn_conn_tab {
int maxpaths;
int npaths;
isdn_conn_req_t *paths;
};
typedef struct isdn_format_req isdn_format_req_t;
struct isdn_format_req {
isdn_chan_t channel; /* controller end channel */
isdn_format_t format; /* data format */
int reserved[4]; /* future use - must be 0 */
};
#define ISDN_SET_FORMAT_x(p, m, s, c, pr, e) \
{ \
(p)->mode = (m); \
(p)->sample_rate = (s); \
(p)->channels = (c); \
(p)->precision = (pr); \
(p)->encoding = (e); \
(p)->reserved[0] = 0; \
(p)->reserved[1] = 0; \
(p)->reserved[2] = 0; \
}
#define ISDN_SET_FORMAT_BRI_D(p) \
ISDN_SET_FORMAT_x((p), ISDN_MODE_HDLC, 2000, 1, 8, AUDIO_ENCODING_NONE)
#define ISDN_SET_FORMAT_PRI_D(p) \
ISDN_SET_FORMAT_x((p), ISDN_MODE_HDLC, 8000, 1, 8, AUDIO_ENCODING_NONE)
#define ISDN_SET_FORMAT_HDLC_B56(p) \
ISDN_SET_FORMAT_x((p), ISDN_MODE_HDLC, 7000, 1, 8, AUDIO_ENCODING_NONE)
#define ISDN_SET_FORMAT_HDLC_B64(p) \
ISDN_SET_FORMAT_x((p), ISDN_MODE_HDLC, 8000, 1, 8, AUDIO_ENCODING_NONE)
#define ISDN_SET_FORMAT_BRI_H(p) \
ISDN_SET_FORMAT_x((p), ISDN_MODE_HDLC, 16000, 1, 8, AUDIO_ENCODING_NONE)
#define ISDN_SET_FORMAT_VOICE_ULAW(p) \
ISDN_SET_FORMAT_x((p), ISDN_MODE_TRANSPARENT, 8000, 1, 8, \
AUDIO_ENCODING_ULAW)
#define ISDN_SET_FORMAT_VOICE_ALAW(p) \
ISDN_SET_FORMAT_x((p), ISDN_MODE_TRANSPARENT, 8000, 1, 8, \
AUDIO_ENCODING_ALAW)
enum isdn_activation_state {
ISDN_OFF = 0, /* Interface is powered down */
ISDN_UNPLUGGED, /* Power but no physical-layer connection */
ISDN_DEACTIVATE_REQ, /* Pending deactivation, NT only */
ISDN_DEACTIVATED, /* Activation is permitted */
ISDN_ACTIVATE_REQ, /* Attempting to activate */
ISDN_ACTIVATED /* Interface is activated */
};
typedef enum isdn_activation_state isdn_activation_state_t;
enum isdn_iostate {
ISDN_IO_UNKNOWN = -1, /* I/O state not known or applicable */
ISDN_IO_STOPPED, /* DMA is not enabled */
ISDN_IO_READY /* DMA is enabled */
};
#define ISDN_PROTO_MAGIC (0x6973646e) /* "isdn" */
/*
* TE sends: ISDN_PH_AI, ISDN_PH_DI, ISDN_MPH_AI, ISDN_MPH_DI, ISDN_MPH_EI1,
* ISDN_MPH_EI2, ISDN_MPH_II_C, ISDN_MPH_II_D
* NT sends: ISDN_PH_AI, ISDN_PH_DI, ISDN_MPH_AI, ISDN_MPH_DI, ISDN_MPH_EI1
*/
enum isdn_message_type {
ISDN_VPH_VENDOR = 0, /* Vendor specific messages */
ISDN_PH_AI, /* Physical: Activation Ind */
ISDN_PH_DI, /* Physical: Deactivation Ind */
ISDN_PH_AR, /* Physical: Activation Request */
ISDN_PH_DATA_RQ, /* Physical: Request for transmission */
ISDN_PH_DATA_IN, /* Physical: Received */
ISDN_MPH_AI, /* Management: Activation Ind */
ISDN_MPH_DI, /* Management: Deactivation Ind */
ISDN_MPH_EI1, /* Management: Error 1 Indication */
ISDN_MPH_EI2, /* Management: Error 2 Indication */
ISDN_MPH_II_C, /* Management: Info Ind, connection */
ISDN_MPH_II_D /* Management: Info Ind, disconn. */
};
typedef enum isdn_message_type isdn_message_type_t;
typedef struct isdn_message isdn_message_t;
struct isdn_message {
unsigned int magic; /* ISDN_PROTO_MAGIC */
isdn_interface_t type; /* Interface type */
isdn_message_type_t message; /* CCITT Primitive or Vendor */
unsigned int vendor[5]; /* Vendor specific content */
};
typedef struct isdn_activation_status isdn_activation_status_t;
struct isdn_activation_status {
isdn_interface_t type;
enum isdn_activation_state activation;
};
typedef enum {
ISDN_LOOPBACK_LOCAL,
ISDN_LOOPBACK_REMOTE
} isdn_loopback_type_t;
typedef enum {
ISDN_LOOPBACK_B1 = 0x1,
ISDN_LOOPBACK_B2 = 0x2,
ISDN_LOOPBACK_D = 0x4,
ISDN_LOOPBACK_E_ZERO = 0x8,
ISDN_LOOPBACK_S = 0x10,
ISDN_LOOPBACK_Q = 0x20
} isdn_loopback_chan_t;
typedef struct isdn_loopback_request isdn_loopback_request_t;
struct isdn_loopback_request {
isdn_loopback_type_t type;
int channels;
};
/*
* ISDN_INTERFACE_STATUS ioctl uses this data structure. If the
* interface is specified as ISDN_TYPE_SELF, the driver will replace it
* with the true interface value.
*/
typedef struct isdn_interface_info isdn_interface_info_t;
struct isdn_interface_info {
isdn_interface_t interface; /* to be filled in by user */
/*
* Activation State Machine information
*/
isdn_activation_state_t activation;
/*
* Counters for physical layer ASM primitives
*/
#if defined(_LP64) || defined(_I32LPx)
uint_t ph_ai; /* Physical: Activation Ind */
uint_t ph_di; /* Physical: Deactivation Ind */
uint_t mph_ai; /* Management: Activation Ind */
uint_t mph_di; /* Management: Deactivation Ind */
uint_t mph_ei1; /* Management: Error 1 Indication */
uint_t mph_ei2; /* Management: Error 2 Indication */
uint_t mph_ii_c; /* Management: Info Ind, connection */
uint_t mph_ii_d; /* Management: Info Ind, disconn. */
#else /* !_LP64 && !_I32LPx */
ulong_t ph_ai; /* Physical: Activation Ind */
ulong_t ph_di; /* Physical: Deactivation Ind */
ulong_t mph_ai; /* Management: Activation Ind */
ulong_t mph_di; /* Management: Deactivation Ind */
ulong_t mph_ei1; /* Management: Error 1 Indication */
ulong_t mph_ei2; /* Management: Error 2 Indication */
ulong_t mph_ii_c; /* Management: Info Ind, connection */
ulong_t mph_ii_d; /* Management: Info Ind, disconn. */
#endif /* !_LP64 && !_I32LPx */
}; /* struct isdn_interface_info */
/*
* ISDN_CHANNEL_STATUS ioctl uses this data structure. If the channel is
* specified as ISDN_CHAN_SELF, the driver will replace it with the true
* channel value.
*/
typedef struct isdn_channel_info isdn_channel_info_t;
struct isdn_channel_info {
isdn_chan_t channel; /* to be filled in by user */
/*
* Per-channel I/O statistics for receive and transmit
*/
enum isdn_iostate iostate;
struct isdn_io_stats {
#if defined(_LP64) || defined(_I32LPx)
uint_t packets; /* Number of packets transferred */
uint_t octets; /* Number of octets transferred */
uint_t errors; /* Number of errors encountered */
#else /* !_LP64 && !_I32LPx */
ulong_t packets; /* Number of packets transferred */
ulong_t octets; /* Number of octets transferred */
ulong_t errors; /* Number of errors encountered */
#endif /* !_LP64 && !_I32LPx */
} transmit, receive;
}; /* struct isdn_channel_info */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_ISDNIO_H */