1/* $NetBSD: monitor.h,v 1.3 2003/11/12 13:31:07 grant Exp $ */
2
3/*-
4 * Copyright (c) 2002 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Martin Husemann <martin@NetBSD.org>.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef _MONITOR_H_
33#define _MONITOR_H_
34
35#define DEF_MONPORT     451             /* default monitor TCP port     */
36
37#ifdef __hpux
38#define	u_int8_t	ubit8
39#define	u_int32_t	ubit32
40#endif
41#ifdef WIN32
42#define	u_int8_t	BYTE
43#define	u_int32_t	DWORD
44#endif
45
46/*
47 * The monitor client connects to the isdnd daemon process via a tcp/ip
48 * connection from a remote machine or via a local (unix domain) socket.
49 * The daemon accepts multiple connections and verifies access rights.
50 * On connection establishment the daemon sends initial data telling
51 * the client the current configuration: number and type of available
52 * controllers, current connections, channel and interface states
53 * and the clients access privileges. The client sends an event mask
54 * telling the daemon which events it is interested in. If the client
55 * has appropriate rights he may send commands to the daemon.
56 *
57 * All multi-byte values are in network byte order!
58 */
59
60/* All data packets transfered are declared as arrays of u_int8_t */
61
62/* max stringlength used in this protocol */
63#define	I4B_MAX_MON_STRING		256
64
65/* max command size from client to server */
66#define	I4B_MAX_MON_CLIENT_CMD		16
67
68/* Version of the monitor protocol described here */
69#define	MPROT_VERSION			0	/* major version no */
70#define	MPROT_REL			5	/* release no */
71
72/*
73 * Client access rights
74 */
75#define	I4B_CA_COMMAND_FULL		1	/* may send any command */
76#define	I4B_CA_COMMAND_RESTRICTED	2	/* may send 'harmless' commands */
77#define	I4B_CA_EVNT_CHANSTATE		16	/* may watch b-channel states */
78#define	I4B_CA_EVNT_CALLIN		32	/* may watch incoming calls */
79#define	I4B_CA_EVNT_CALLOUT		64	/* may watch outgoing calls */
80#define	I4B_CA_EVNT_I4B			128	/* may watch isdnd actions */
81
82/*
83 * General layout of a command packet. All commands have this common
84 * prefix. It is prepared by the macro I4B_PREP_CMD (s.b.)
85 */
86#define	I4B_MON_CMD			0	/* 2 byte: command code */
87#define	I4B_MON_CMD_LEN			2	/* 2 byte: packet length */
88#define	I4B_MON_CMD_HDR			4	/* size of header */
89
90/*
91 * Currently events look the same as commands. We do not make
92 * any guarantee this will remain the same, so a different set
93 * of macros is used when describing events. Events are prepared
94 * by I4B_PREP_EVNT (s.b.)
95 */
96#define	I4B_MON_EVNT			0	/* 2 byte: event code */
97#define	I4B_MON_EVNT_LEN		2	/* 2 byte: packet length */
98#define	I4B_MON_EVNT_HDR		4	/* size of header */
99
100/* Initial data send by daemon after connection is established */
101#define	I4B_MON_IDATA_SIZE		I4B_MON_EVNT_HDR+12
102#define	I4B_MON_IDATA_CODE		0			/* event code */
103#define	I4B_MON_IDATA_VERSMAJOR		I4B_MON_EVNT_HDR+0	/* 2 byte: isdnd major version */
104#define	I4B_MON_IDATA_VERSMINOR		I4B_MON_EVNT_HDR+2	/* 2 byte: isdnd minor version */
105#define	I4B_MON_IDATA_NUMCTRL		I4B_MON_EVNT_HDR+4	/* 2 byte: number of controllers */
106#define	I4B_MON_IDATA_NUMENTR		I4B_MON_EVNT_HDR+6	/* 2 byte: number of controllers */
107#define	I4B_MON_IDATA_CLACCESS		I4B_MON_EVNT_HDR+8	/* 4 byte: client rights */
108
109/* followed by this for every controller */
110#define	I4B_MON_ICTRL_SIZE		I4B_MON_EVNT_HDR+I4B_MAX_MON_STRING+8
111#define	I4B_MON_ICTRL_CODE		1					/* event code */
112#define	I4B_MON_ICTRL_NAME		I4B_MON_EVNT_HDR+0			/* string: name of controller */
113#define	I4B_MON_ICTRL_BUSID		I4B_MON_EVNT_HDR+I4B_MAX_MON_STRING+0	/* 2 byte: isdn bus id (reservered) */
114#define	I4B_MON_ICTRL_FLAGS		I4B_MON_EVNT_HDR+I4B_MAX_MON_STRING+2	/* 4 byte: controller flags (not yet defined) */
115#define	I4B_MON_ICTRL_NCHAN		I4B_MON_EVNT_HDR+I4B_MAX_MON_STRING+6	/* 2 byte: number of b channels on this controller */
116
117/* followed by this for every entry */
118#define	I4B_MON_IDEV_SIZE		I4B_MON_EVNT_HDR+I4B_MAX_MON_STRING+2
119#define	I4B_MON_IDEV_CODE		2					/* event code */
120#define	I4B_MON_IDEV_NAME		I4B_MON_EVNT_HDR+0			/* string: name of device */
121#define	I4B_MON_IDEV_STATE		I4B_MON_EVNT_HDR+I4B_MAX_MON_STRING+0	/* 2 byte: state of device */
122
123/*
124 * The client sets it's protocol version and event mask (usually once after
125 * connection establishement)
126 */
127#define	I4B_MON_CCMD_SETMASK		0x7e			/* command code */
128#define	I4B_MON_ICLIENT_SIZE		I4B_MON_CMD_HDR+8
129#define	I4B_MON_ICLIENT_VERMAJOR	I4B_MON_CMD_HDR+0	/* 2 byte: protocol major version (always 0 for now) */
130#define	I4B_MON_ICLIENT_VERMINOR	I4B_MON_CMD_HDR+2	/* 2 byte: protocol minor version (always 0 for now) */
131#define	I4B_MON_ICLIENT_EVENTS		I4B_MON_CMD_HDR+4	/* 4 byte: client event mask */
132
133/* The client requests a list of monitor rights */
134#define	I4B_MON_DUMPRIGHTS_CODE		1
135#define	I4B_MON_DUMPRIGHTS_SIZE		I4B_MON_CMD_HDR		/* no parameters */
136
137/*
138 * in response to a I4B_MON_DUMPRIGHTS_CODE command, the daemon sends
139 * this event:
140 */
141#define	I4B_MON_DRINI_CODE		2	/* event code */
142#define	I4B_MON_DRINI_SIZE		I4B_MON_EVNT_HDR+2	/* size of packet */
143#define	I4B_MON_DRINI_COUNT		I4B_MON_EVNT_HDR+0	/* 2 byte: number of records */
144
145/* followed by this for each record anounced above */
146#define	I4B_MON_DR_CODE			3
147#define	I4B_MON_DR_SIZE			I4B_MON_EVNT_HDR+13
148#define	I4B_MON_DR_RIGHTS		I4B_MON_EVNT_HDR+0	/* 4 byte: rights mask */
149#define I4B_MON_DR_NET			I4B_MON_EVNT_HDR+4	/* 4 byte: network address */
150#define	I4B_MON_DR_MASK			I4B_MON_EVNT_HDR+8	/* 4 byte: network mask */
151#define	I4B_MON_DR_LOCAL		I4B_MON_EVNT_HDR+12	/* 1 byte: non-zero if local socket */
152
153/* The client requests a list of monitor connections */
154#define	I4B_MON_DUMPMCONS_CODE		2
155#define	I4B_MON_DUMPMCONS_SIZE		I4B_MON_CMD_HDR		/* no parameters */
156
157/*
158 * in response to a I4B_MON_DUMPMCONS_CODE command, the daemon sends
159 * this event:
160 */
161#define	I4B_MON_DCINI_CODE		4	/* event code */
162#define	I4B_MON_DCINI_SIZE		I4B_MON_EVNT_HDR+2	/* size of packet */
163#define	I4B_MON_DCINI_COUNT		I4B_MON_EVNT_HDR+0	/* 2 byte: number of records */
164
165/* followed by this for each record anounced above */
166#define	I4B_MON_DC_CODE			5
167#define	I4B_MON_DC_SIZE			I4B_MON_EVNT_HDR+8
168#define	I4B_MON_DC_RIGHTS		I4B_MON_EVNT_HDR+0	/* 4 byte: rights mask */
169#define I4B_MON_DC_WHO			I4B_MON_EVNT_HDR+4	/* 4 byte: network address */
170
171/* The client requests a config file rescan */
172#define	I4B_MON_CFGREREAD_CODE		3
173#define	I4B_MON_CFGREREAD_SIZE		I4B_MON_CMD_HDR		/* no parameters */
174
175/* The client requests to hangup a connection */
176#define	I4B_MON_HANGUP_CODE		4
177#define	I4B_MON_HANGUP_SIZE		I4B_MON_CMD_HDR+8
178#define	I4B_MON_HANGUP_CTRL		I4B_MON_CMD_HDR+0	/* controller */
179#define	I4B_MON_HANGUP_CHANNEL		I4B_MON_CMD_HDR+4	/* channel */
180
181/* The daemon sends a logfile event */
182#define I4B_MON_LOGEVNT_CODE		6
183#define	I4B_MON_LOGEVNT_SIZE		I4B_MON_EVNT_HDR+8+2*I4B_MAX_MON_STRING
184#define	I4B_MON_LOGEVNT_TSTAMP		I4B_MON_EVNT_HDR+0	/* 4 byte: timestamp */
185#define	I4B_MON_LOGEVNT_PRIO		I4B_MON_EVNT_HDR+4	/* 4 byte: syslog priority */
186#define	I4B_MON_LOGEVNT_WHAT		I4B_MON_EVNT_HDR+8	/* followed by 2 strings: 'what' and 'message' */
187#define	I4B_MON_LOGEVNT_MSG		I4B_MON_EVNT_HDR+8+I4B_MAX_MON_STRING
188
189/* The daemon sends a charge event */
190#define I4B_MON_CHRG_CODE		7
191#define	I4B_MON_CHRG_SIZE		I4B_MON_EVNT_HDR+20
192#define	I4B_MON_CHRG_TSTAMP		I4B_MON_EVNT_HDR+0	/* 4 byte: timestamp */
193#define	I4B_MON_CHRG_CTRL		I4B_MON_EVNT_HDR+4	/* 4 byte: channel charged */
194#define	I4B_MON_CHRG_CHANNEL		I4B_MON_EVNT_HDR+8	/* 4 byte: channel charged */
195#define	I4B_MON_CHRG_UNITS		I4B_MON_EVNT_HDR+12	/* 4 byte: new charge value */
196#define	I4B_MON_CHRG_ESTIMATED		I4B_MON_EVNT_HDR+16	/* 4 byte: 0 = charge by network, 1 = calculated estimate */
197
198/* The daemon sends a connect event */
199#define	I4B_MON_CONNECT_CODE		8
200#define	I4B_MON_CONNECT_SIZE		I4B_MON_EVNT_HDR+16+4*I4B_MAX_MON_STRING
201#define	I4B_MON_CONNECT_TSTAMP		I4B_MON_EVNT_HDR+0	/* 4 byte: time stamp */
202#define	I4B_MON_CONNECT_DIR		I4B_MON_EVNT_HDR+4	/* 4 byte: direction (0 = incoming, 1 = outgoing) */
203#define	I4B_MON_CONNECT_CTRL		I4B_MON_EVNT_HDR+8	/* 4 byte: channel connected */
204#define	I4B_MON_CONNECT_CHANNEL		I4B_MON_EVNT_HDR+12	/* 4 byte: channel connected */
205#define	I4B_MON_CONNECT_CFGNAME		I4B_MON_EVNT_HDR+16	/* name of config entry */
206#define	I4B_MON_CONNECT_DEVNAME		I4B_MON_EVNT_HDR+16+I4B_MAX_MON_STRING	/* name of device used for connection */
207#define	I4B_MON_CONNECT_REMPHONE	I4B_MON_EVNT_HDR+16+2*I4B_MAX_MON_STRING	/* remote phone no. */
208#define	I4B_MON_CONNECT_LOCPHONE	I4B_MON_EVNT_HDR+16+3*I4B_MAX_MON_STRING	/* local phone no. */
209
210/* The daemon sends a disconnect event */
211#define	I4B_MON_DISCONNECT_CODE		9
212#define	I4B_MON_DISCONNECT_SIZE		I4B_MON_EVNT_HDR+12
213#define	I4B_MON_DISCONNECT_TSTAMP	I4B_MON_EVNT_HDR+0	/* 4 byte: time stamp */
214#define	I4B_MON_DISCONNECT_CTRL		I4B_MON_EVNT_HDR+4	/* 4 byte: channel disconnected */
215#define	I4B_MON_DISCONNECT_CHANNEL	I4B_MON_EVNT_HDR+8	/* 4 byte: channel disconnected */
216
217/* The daemon sends an up/down event */
218#define	I4B_MON_UPDOWN_CODE		10
219#define	I4B_MON_UPDOWN_SIZE		I4B_MON_EVNT_HDR+16
220#define	I4B_MON_UPDOWN_TSTAMP		I4B_MON_EVNT_HDR+0	/* 4 byte: time stamp */
221#define	I4B_MON_UPDOWN_CTRL		I4B_MON_EVNT_HDR+4	/* 4 byte: channel disconnected */
222#define	I4B_MON_UPDOWN_CHANNEL		I4B_MON_EVNT_HDR+8	/* 4 byte: channel disconnected */
223#define	I4B_MON_UPDOWN_ISUP		I4B_MON_EVNT_HDR+12	/* 4 byte: interface is up */
224
225/* The daemon sends a L1/L2 status change event */
226#define	I4B_MON_L12STAT_CODE		11
227#define	I4B_MON_L12STAT_SIZE		I4B_MON_EVNT_HDR+16
228#define	I4B_MON_L12STAT_TSTAMP		I4B_MON_EVNT_HDR+0	/* 4 byte: time stamp */
229#define	I4B_MON_L12STAT_CTRL		I4B_MON_EVNT_HDR+4	/* 4 byte: controller */
230#define	I4B_MON_L12STAT_LAYER		I4B_MON_EVNT_HDR+8	/* 4 byte: layer */
231#define	I4B_MON_L12STAT_STATE		I4B_MON_EVNT_HDR+12	/* 4 byte: state */
232
233/* The daemon sends a TEI change event */
234#define	I4B_MON_TEI_CODE		12
235#define	I4B_MON_TEI_SIZE		I4B_MON_EVNT_HDR+12
236#define	I4B_MON_TEI_TSTAMP		I4B_MON_EVNT_HDR+0	/* 4 byte: time stamp */
237#define	I4B_MON_TEI_CTRL		I4B_MON_EVNT_HDR+4	/* 4 byte: controller */
238#define	I4B_MON_TEI_TEI			I4B_MON_EVNT_HDR+8	/* 4 byte: tei */
239
240/* The daemon sends an accounting message event */
241#define	I4B_MON_ACCT_CODE		13
242#define	I4B_MON_ACCT_SIZE		I4B_MON_EVNT_HDR+28
243#define	I4B_MON_ACCT_TSTAMP		I4B_MON_EVNT_HDR+0	/* 4 byte: time stamp */
244#define	I4B_MON_ACCT_CTRL		I4B_MON_EVNT_HDR+4	/* 4 byte: controller */
245#define	I4B_MON_ACCT_CHAN		I4B_MON_EVNT_HDR+8	/* 4 byte: channel */
246#define	I4B_MON_ACCT_OBYTES		I4B_MON_EVNT_HDR+12	/* 4 byte: outbytes */
247#define	I4B_MON_ACCT_OBPS		I4B_MON_EVNT_HDR+16	/* 4 byte: outbps */
248#define	I4B_MON_ACCT_IBYTES		I4B_MON_EVNT_HDR+20	/* 4 byte: inbytes */
249#define	I4B_MON_ACCT_IBPS		I4B_MON_EVNT_HDR+24	/* 4 byte: inbps */
250
251/* macros for setup/decoding of protocol packets */
252
253/* clear a record */
254#define	I4B_CLEAR(r)	memset(&(r), 0, sizeof(r));
255
256/* prepare a record as event or command */
257#define	I4B_PREP_EVNT(r, e)	{			\
258	I4B_CLEAR(r);					\
259	I4B_PUT_2B(r, I4B_MON_EVNT, e);			\
260	I4B_PUT_2B(r, I4B_MON_EVNT_LEN, sizeof(r));	\
261}
262#define	I4B_PREP_CMD(r, c)	{			\
263	I4B_CLEAR(r);					\
264	I4B_PUT_2B(r, I4B_MON_CMD, c);			\
265	I4B_PUT_2B(r, I4B_MON_CMD_LEN, sizeof(r));	\
266}
267
268/* put 1, 2 or 4 bytes in network byte order into a record at offset off */
269#define	I4B_PUT_1B(r, off, val)	{ ((u_int8_t*)(r))[off] = (val) & 0x00ff; }
270#define	I4B_PUT_2B(r, off, val) { I4B_PUT_1B(r, off, val >> 8); I4B_PUT_1B(r, off+1, val); }
271#define	I4B_PUT_4B(r, off, val) { I4B_PUT_1B(r, off, val >> 24); I4B_PUT_1B(r, off+1, val >> 16); I4B_PUT_1B(r, off+2, val >> 8); I4B_PUT_1B(r, off+3, val); }
272
273/* get 1, 2 or 4 bytes in network byte order from a record at offset off */
274#define	I4B_GET_1B(r, off)	(((u_int8_t*)(r))[off])
275#define	I4B_GET_2B(r, off)	((((u_int8_t*)(r))[off]) << 8) | (((u_int8_t*)(r))[off+1])
276#define	I4B_GET_4B(r, off)	((((u_int8_t*)(r))[off]) << 24) | ((((u_int8_t*)(r))[off+1]) << 16) | ((((u_int8_t*)(r))[off+2]) << 8) | (((u_int8_t*)(r))[off+3])
277
278/*
279 * put a string into record r at offset off, make sure it's not to long
280 * and proper terminate it
281 */
282#define	I4B_PUT_STR(r, off, str)	{		\
283	strncpy((r)+(off), (str), I4B_MAX_MON_STRING);	\
284	(r)[(off)+I4B_MAX_MON_STRING-1] = (u_int8_t)0;     }
285
286#endif /* _MONITOR_H_ */
287
288