/*
 *
 Copyright (c) Eicon Networks, 2002.
 *
 This source file is supplied for the use with
 Eicon Networks range of DIVA Server Adapters.
 *
 Eicon File Revision :    1.9
 *
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.
 *
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 *
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */
/* Definitions for use with the Management Information Element      */

/*------------------------------------------------------------------*/
/* Management information element                                   */
/* ----------------------------------------------------------       */
/* Byte     Coding            Comment                               */
/* ----------------------------------------------------------       */
/*    0 | 0 1 1 1 1 1 1 1 | ESC                                     */
/*    1 | 0 x x x x x x x | Length of information element (m-1)     */
/*    2 | 1 0 0 0 0 0 0 0 | Management Information Id               */
/*    3 | x x x x x x x x | Type                                    */
/*    4 | x x x x x x x x | Attribute                               */
/*    5 | x x x x x x x x | Status                                  */
/*    6 | x x x x x x x x | Variable Value Length (m-n)             */
/*    7 | x x x x x x x x | Path / Variable Name String Length (n-8)*/
/* 8..n | x x x x x x x x | Path/Node Name String separated by '\'  */
/* n..m | x x x x x x x x | Variable content                        */
/*------------------------------------------------------------------*/

/*------------------------------------------------------------------*/
/* Type Field                                                       */
/*                                                                  */
/* MAN_READ:      not used                                          */
/* MAN_WRITE:     not used                                          */
/* MAN_EVENT_ON:  not used                                          */
/* MAN_EVENT_OFF: not used                                          */
/* MAN_INFO_IND:  type of variable                                  */
/* MAN_EVENT_IND: type of variable                                  */
/* MAN_TRACE_IND  not used                                          */
/*------------------------------------------------------------------*/
#define MI_DIR          0x01  /* Directory string (zero terminated) */
#define MI_EXECUTE      0x02  /* Executable function (has no value) */
#define MI_ASCIIZ       0x03  /* Zero terminated string             */
#define MI_ASCII        0x04  /* String, first byte is length       */
#define MI_NUMBER       0x05  /* Number string, first byte is length*/
#define MI_TRACE        0x06  /* Trace information, format see below*/

#define MI_FIXED_LENGTH 0x80  /* get length from MAN_INFO max_len   */
#define MI_INT          0x81  /* number to display as signed int    */
#define MI_UINT         0x82  /* number to display as unsigned int  */
#define MI_HINT         0x83  /* number to display in hex format    */
#define MI_HSTR         0x84  /* number to display as a hex string  */
#define MI_BOOLEAN      0x85  /* number to display as boolean       */
#define MI_IP_ADDRESS   0x86  /* number to display as IP address    */
#define MI_BITFLD       0x87  /* number to display as bit field     */
#define MI_SPID_STATE   0x88  /* state# of SPID initialisation      */

/*------------------------------------------------------------------*/
/* Attribute Field                                                  */
/*                                                                  */
/* MAN_READ:      not used                                          */
/* MAN_WRITE:     not used                                          */
/* MAN_EVENT_ON:  not used                                          */
/* MAN_EVENT_OFF: not used                                          */
/* MAN_INFO_IND:  set according to capabilities of that variable    */
/* MAN_EVENT_IND: not used                                          */
/* MAN_TRACE_IND  not used                                          */
/*------------------------------------------------------------------*/
#define MI_WRITE        0x01  /* Variable is writeable              */
#define MI_EVENT        0x02  /* Variable can indicate changes      */

/*------------------------------------------------------------------*/
/* Status Field                                                     */
/*                                                                  */
/* MAN_READ:      not used                                          */
/* MAN_WRITE:     not used                                          */
/* MAN_EVENT_ON:  not used                                          */
/* MAN_EVENT_OFF: not used                                          */
/* MAN_INFO_IND:  set according to the actual status                */
/* MAN_EVENT_IND: set according to the actual statu                 */
/* MAN_TRACE_IND  not used                                          */
/*------------------------------------------------------------------*/
#define MI_LOCKED       0x01  /* write protected by another instance*/
#define MI_EVENT_ON     0x02  /* Event logging switched on          */
#define MI_PROTECTED    0x04  /* write protected by this instance   */

/*------------------------------------------------------------------*/
/* Data Format used for MAN_TRACE_IND (no MI-element used)          */
/*------------------------------------------------------------------*/
typedef struct mi_xlog_hdr_s MI_XLOG_HDR;
struct mi_xlog_hdr_s
{
	unsigned long  time;   /* Timestamp in msec units                 */
	unsigned short size;   /* Size of data that follows               */
	unsigned short code;   /* code of trace event                     */
};                       /* unspecified data follows this header    */

/*------------------------------------------------------------------*/
/* Trace mask definitions for trace events except B channel and     */
/* debug trace events                                               */
/*------------------------------------------------------------------*/
#define TM_D_CHAN   0x0001  /* D-Channel        (D-.) Code 3,4      */
#define TM_L_LAYER  0x0002  /* Low Layer        (LL)  Code 6,7      */
#define TM_N_LAYER  0x0004  /* Network Layer    (N)   Code 14,15    */
#define TM_DL_ERR   0x0008  /* Data Link Error  (MDL) Code 9        */
#define TM_LAYER1   0x0010  /* Layer 1                Code 20       */
#define TM_C_COMM   0x0020  /* Call Comment     (SIG) Code 5,21,22  */
#define TM_M_DATA   0x0040  /* Modulation Data  (EYE) Code 23       */
#define TM_STRING   0x0080  /* Sting data             Code 24       */
#define TM_N_USED2  0x0100  /* not used                             */
#define TM_N_USED3  0x0200  /* not used                             */
#define TM_N_USED4  0x0400  /* not used                             */
#define TM_N_USED5  0x0800  /* not used                             */
#define TM_N_USED6  0x1000  /* not used                             */
#define TM_N_USED7  0x2000  /* not used                             */
#define TM_N_USED8  0x4000  /* not used                             */
#define TM_REST     0x8000  /* Codes 10,11,12,13,16,18,19,128,129   */

/*------ End of file -----------------------------------------------*/
