1122205Sharti/*
2122205Sharti * Copyright (c) 1996-2003
3122205Sharti *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4122205Sharti * 	All rights reserved.
5122205Sharti *
6122205Sharti * Redistribution and use in source and binary forms, with or without
7122205Sharti * modification, are permitted provided that the following conditions
8122205Sharti * are met:
9122205Sharti * 1. Redistributions of source code must retain the above copyright
10122205Sharti *    notice, this list of conditions and the following disclaimer.
11122205Sharti * 2. Redistributions in binary form must reproduce the above copyright
12122205Sharti *    notice, this list of conditions and the following disclaimer in the
13122205Sharti *    documentation and/or other materials provided with the distribution.
14122205Sharti *
15122205Sharti * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16122205Sharti * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17122205Sharti * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18122205Sharti * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19122205Sharti * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20122205Sharti * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21122205Sharti * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22122205Sharti * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23122205Sharti * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24122205Sharti * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25122205Sharti * SUCH DAMAGE.
26122205Sharti *
27122205Sharti * Author: Hartmut Brandt <harti@freebsd.org>
28122205Sharti *
29131826Sharti * $Begemot: libunimsg/netnatm/sig/unipriv.h,v 1.17 2004/07/08 08:22:25 brandt Exp $
30122205Sharti *
31122205Sharti * Private UNI stuff.
32122205Sharti */
33122205Sharti#ifndef unipriv_h
34122205Sharti#define unipriv_h
35122205Sharti
36122205Sharti#ifdef _KERNEL
37122205Sharti#ifdef __FreeBSD__
38122205Sharti#include <netgraph/atm/uni/ng_uni_cust.h>
39122205Sharti#endif
40122205Sharti#else
41122205Sharti#include "unicust.h"
42122205Sharti#endif
43122205Sharti
44122205Shartistruct call;
45122205Shartistruct party;
46122205Sharti
47122205Shartienum cu_stat {
48122205Sharti	CU_STAT0,	/* AAL connection released */
49122205Sharti	CU_STAT1,	/* awaiting establish */
50122205Sharti	CU_STAT2,	/* awaiting release */
51122205Sharti	CU_STAT3,	/* AAL connection established */
52122205Sharti};
53122205Sharti
54122205Sharti/*
55122205Sharti * Internal Signals
56122205Sharti */
57122205Sharti#define DEF_COORD_SIGS						\
58122205Sharti  DEF_PRIV_SIG(O_SAAL_ESTABLISH_indication,	SAAL)		\
59122205Sharti  DEF_PRIV_SIG(O_SAAL_ESTABLISH_confirm,	SAAL)		\
60122205Sharti  DEF_PRIV_SIG(O_SAAL_RELEASE_indication,	SAAL)		\
61122205Sharti  DEF_PRIV_SIG(O_SAAL_RELEASE_confirm,		SAAL)		\
62122205Sharti  DEF_PRIV_SIG(O_SAAL_DATA_indication,		SAAL)		\
63122205Sharti  DEF_PRIV_SIG(O_SAAL_UDATA_indication,		SAAL)		\
64122205Sharti  DEF_PRIV_SIG(O_T309,				Coord)		\
65122205Sharti  DEF_PRIV_SIG(O_DATA,				Coord)		\
66122205Sharti  DEF_PRIV_SIG(O_LINK_ESTABLISH_request,	API)		\
67122205Sharti  DEF_PRIV_SIG(O_LINK_RELEASE_request,		API)		\
68122205Sharti  DEF_PRIV_SIG(O_RESET_request,			API)		\
69122205Sharti  DEF_PRIV_SIG(O_RESET_response,		API)		\
70122205Sharti  DEF_PRIV_SIG(O_RESET_ERROR_response,		API)		\
71122205Sharti  DEF_PRIV_SIG(O_SETUP_request,			API)		\
72122205Sharti  DEF_PRIV_SIG(O_SETUP_response,		API)		\
73122205Sharti  DEF_PRIV_SIG(O_SETUP_COMPLETE_request,	API)		\
74122205Sharti  DEF_PRIV_SIG(O_PROCEEDING_request,		API)		\
75122205Sharti  DEF_PRIV_SIG(O_ALERTING_request,		API)		\
76122205Sharti  DEF_PRIV_SIG(O_RELEASE_request,		API)		\
77122205Sharti  DEF_PRIV_SIG(O_RELEASE_response,		API)		\
78122205Sharti  DEF_PRIV_SIG(O_NOTIFY_request,		API)		\
79122205Sharti  DEF_PRIV_SIG(O_STATUS_ENQUIRY_request,	API)		\
80122205Sharti  DEF_PRIV_SIG(O_ADD_PARTY_request,		API)		\
81122205Sharti  DEF_PRIV_SIG(O_PARTY_ALERTING_request,	API)		\
82122205Sharti  DEF_PRIV_SIG(O_ADD_PARTY_ACK_request,		API)		\
83122205Sharti  DEF_PRIV_SIG(O_ADD_PARTY_REJ_request,		API)		\
84122205Sharti  DEF_PRIV_SIG(O_DROP_PARTY_request,		API)		\
85122205Sharti  DEF_PRIV_SIG(O_DROP_PARTY_ACK_request,	API)		\
86122205Sharti  DEF_PRIV_SIG(O_ABORT_CALL_request,		API)		\
87122205Sharti  DEF_PRIV_SIG(O_CALL_DESTROYED,		CallControl)	\
88122205Sharti  DEF_PRIV_SIG(O_RESET_indication,		ResetRespond)	\
89122205Sharti  DEF_PRIV_SIG(O_END,				Coord)
90122205Sharti
91122205Sharti#define DEF_RESPOND_SIGS					\
92122205Sharti  DEF_PRIV_SIG(R_RESTART,			Coord)		\
93122205Sharti  DEF_PRIV_SIG(R_STATUS,			Coord)		\
94122205Sharti  DEF_PRIV_SIG(R_RESET_response,		Coord)		\
95122205Sharti  DEF_PRIV_SIG(R_RESET_ERROR_response,		Coord)		\
96122205Sharti  DEF_PRIV_SIG(R_T317,				ResetRespond)	\
97122205Sharti  DEF_PRIV_SIG(R_END,				ResetRespond)
98122205Sharti
99122205Sharti#define DEF_START_SIGS						\
100122205Sharti  DEF_PRIV_SIG(S_RESTART_ACK,			Coord)		\
101122205Sharti  DEF_PRIV_SIG(S_STATUS,			Coord)		\
102122205Sharti  DEF_PRIV_SIG(S_RESET_request,			Coord)		\
103122205Sharti  DEF_PRIV_SIG(S_T316,				ResetStart)	\
104122205Sharti  DEF_PRIV_SIG(S_END,				ResetStart)
105122205Sharti
106122205Sharti#define DEF_CALL_SIGS						\
107122205Sharti  DEF_PRIV_SIG(C_LINK_ESTABLISH_confirm,	Coord)		\
108122205Sharti  DEF_PRIV_SIG(C_LINK_ESTABLISH_indication,	Coord)		\
109122205Sharti  DEF_PRIV_SIG(C_LINK_ESTABLISH_ERROR_indication,Coord)		\
110122205Sharti  DEF_PRIV_SIG(C_LINK_RELEASE_indication,	Coord)		\
111122205Sharti  DEF_PRIV_SIG(C_SETUP_request,			Coord)		\
112122205Sharti  DEF_PRIV_SIG(C_SETUP_response,		Coord)		\
113122205Sharti  DEF_PRIV_SIG(C_SETUP_COMPLETE_request,	Coord)		\
114122205Sharti  DEF_PRIV_SIG(C_PROCEEDING_request,		Coord)		\
115122205Sharti  DEF_PRIV_SIG(C_ALERTING_request,		Coord)		\
116122205Sharti  DEF_PRIV_SIG(C_RELEASE_request,		Coord)		\
117122205Sharti  DEF_PRIV_SIG(C_RELEASE_response,		Coord)		\
118122205Sharti  DEF_PRIV_SIG(C_NOTIFY_request,		Coord)		\
119122205Sharti  DEF_PRIV_SIG(C_STATUS_ENQUIRY_request,	Coord)		\
120122205Sharti  DEF_PRIV_SIG(C_ADD_PARTY_request,		Coord)		\
121122205Sharti  DEF_PRIV_SIG(C_PARTY_ALERTING_request,	Coord)		\
122122205Sharti  DEF_PRIV_SIG(C_ADD_PARTY_ACK_request,		Coord)		\
123122205Sharti  DEF_PRIV_SIG(C_ADD_PARTY_REJ_request,		Coord)		\
124122205Sharti  DEF_PRIV_SIG(C_DROP_PARTY_request,		Coord)		\
125122205Sharti  DEF_PRIV_SIG(C_DROP_PARTY_ACK_request,	Coord)		\
126122205Sharti  DEF_PRIV_SIG(C_ABORT_CALL_request,		Coord)		\
127122205Sharti  DEF_PRIV_SIG(C_UNKNOWN,			Coord)		\
128122205Sharti  DEF_PRIV_SIG(C_SETUP,				Coord)		\
129122205Sharti  DEF_PRIV_SIG(C_CALL_PROC,			Coord)		\
130122205Sharti  DEF_PRIV_SIG(C_ALERTING,			Coord)		\
131122205Sharti  DEF_PRIV_SIG(C_CONNECT,			Coord)		\
132122205Sharti  DEF_PRIV_SIG(C_CONNECT_ACK,			Coord)		\
133122205Sharti  DEF_PRIV_SIG(C_RELEASE,			Coord)		\
134122205Sharti  DEF_PRIV_SIG(C_RELEASE_COMPL,			Coord)		\
135122205Sharti  DEF_PRIV_SIG(C_COBISETUP,			Coord)		\
136122205Sharti  DEF_PRIV_SIG(C_NOTIFY,			Coord)		\
137122205Sharti  DEF_PRIV_SIG(C_STATUS,			Coord)		\
138122205Sharti  DEF_PRIV_SIG(C_STATUS_ENQ,			Coord)		\
139122205Sharti  DEF_PRIV_SIG(C_ADD_PARTY,			Coord)		\
140122205Sharti  DEF_PRIV_SIG(C_PARTY_ALERTING,		Coord)		\
141122205Sharti  DEF_PRIV_SIG(C_ADD_PARTY_ACK,			Coord)		\
142122205Sharti  DEF_PRIV_SIG(C_ADD_PARTY_REJ,			Coord)		\
143122205Sharti  DEF_PRIV_SIG(C_DROP_PARTY,			Coord)		\
144122205Sharti  DEF_PRIV_SIG(C_DROP_PARTY_ACK,		Coord)		\
145122205Sharti  DEF_PRIV_SIG(C_CALL_DELETE,			CallControl)	\
146122205Sharti  DEF_PRIV_SIG(C_T301,				CallControl)	\
147122205Sharti  DEF_PRIV_SIG(C_T303,				CallControl)	\
148122205Sharti  DEF_PRIV_SIG(C_T308,				CallControl)	\
149122205Sharti  DEF_PRIV_SIG(C_T310,				CallControl)	\
150122205Sharti  DEF_PRIV_SIG(C_T313,				CallControl)	\
151122205Sharti  DEF_PRIV_SIG(C_T322,				CallControl)	\
152122205Sharti  DEF_PRIV_SIG(C_DROP_PARTY_indication,		PartyControl)	\
153122205Sharti  DEF_PRIV_SIG(C_SEND_DROP_PARTY,		PartyControl)	\
154122205Sharti  DEF_PRIV_SIG(C_DROP_PARTY_ACK_indication,	PartyControl)	\
155122205Sharti  DEF_PRIV_SIG(C_SEND_DROP_PARTY_ACK,		PartyControl)	\
156122205Sharti  DEF_PRIV_SIG(C_ADD_PARTY_REJ_indication,	PartyControl)	\
157122205Sharti  DEF_PRIV_SIG(C_SEND_ADD_PARTY_REJ,		PartyControl)	\
158122205Sharti  DEF_PRIV_SIG(C_SEND_STATUS_ENQ,		PartyControl)	\
159122205Sharti  DEF_PRIV_SIG(C_PARTY_DESTROYED,		PartyControl)	\
160122205Sharti  DEF_PRIV_SIG(C_END,				CallControl)
161122205Sharti
162122205Sharti#define DEF_PARTY_SIGS							\
163122205Sharti  DEF_PRIV_SIG(P_SETUP,				CallControl)		\
164122205Sharti  DEF_PRIV_SIG(P_ALERTING,			CallControl)		\
165122205Sharti  DEF_PRIV_SIG(P_CONNECT,			CallControl)		\
166122205Sharti  DEF_PRIV_SIG(P_CONNECT_ACK,			CallControl)		\
167122205Sharti  DEF_PRIV_SIG(P_RELEASE,			CallControl)		\
168122205Sharti  DEF_PRIV_SIG(P_RELEASE_COMPL,			CallControl)		\
169122205Sharti  DEF_PRIV_SIG(P_STATUS,			CallControl)		\
170122205Sharti  DEF_PRIV_SIG(P_ADD_PARTY,			CallControl)		\
171122205Sharti  DEF_PRIV_SIG(P_PARTY_ALERTING,		CallControl)		\
172122205Sharti  DEF_PRIV_SIG(P_ADD_PARTY_ACK,			CallControl)		\
173122205Sharti  DEF_PRIV_SIG(P_ADD_PARTY_REJ,			CallControl)		\
174122205Sharti  DEF_PRIV_SIG(P_DROP_PARTY,			CallControl)		\
175122205Sharti  DEF_PRIV_SIG(P_DROP_PARTY_ACK,		CallControl)		\
176122205Sharti  DEF_PRIV_SIG(P_SETUP_request,			CallControl)		\
177122205Sharti  DEF_PRIV_SIG(P_SETUP_response,		CallControl)		\
178122205Sharti  DEF_PRIV_SIG(P_SETUP_COMPL_request,		CallControl)		\
179122205Sharti  DEF_PRIV_SIG(P_ALERTING_request,		CallControl)		\
180122205Sharti  DEF_PRIV_SIG(P_RELEASE_request,		CallControl)		\
181122205Sharti  DEF_PRIV_SIG(P_RELEASE_response,		CallControl)		\
182122205Sharti  DEF_PRIV_SIG(P_RELEASE_confirm,		CallControl)		\
183122205Sharti  DEF_PRIV_SIG(P_STATUS_ENQUIRY_request,	CallControl)		\
184122205Sharti  DEF_PRIV_SIG(P_ADD_PARTY_request,		CallControl)		\
185122205Sharti  DEF_PRIV_SIG(P_PARTY_ALERTING_request,	CallControl)		\
186122205Sharti  DEF_PRIV_SIG(P_ADD_PARTY_ACK_request,		CallControl)		\
187122205Sharti  DEF_PRIV_SIG(P_ADD_PARTY_REJ_request,		CallControl)		\
188122205Sharti  DEF_PRIV_SIG(P_DROP_PARTY_request,		CallControl)		\
189122205Sharti  DEF_PRIV_SIG(P_DROP_PARTY_ACK_request,	CallControl)		\
190122205Sharti  DEF_PRIV_SIG(P_PARTY_DELETE,			PartyControl)		\
191122205Sharti  DEF_PRIV_SIG(P_T397,				PartyControl)		\
192122205Sharti  DEF_PRIV_SIG(P_T398,				PartyControl)		\
193122205Sharti  DEF_PRIV_SIG(P_T399,				PartyControl)		\
194122205Sharti  DEF_PRIV_SIG(P_END,				PartyControl)
195122205Sharti
196122205Sharti
197122205Sharti#define DEF_PRIV_SIG(NAME, FROM)	SIG##NAME,
198122205Shartienum coord_sig {
199122205Sharti	DEF_COORD_SIGS
200122205Sharti};
201122205Shartienum respond_sig {
202122205Sharti	DEF_RESPOND_SIGS
203122205Sharti};
204122205Shartienum start_sig {
205122205Sharti	DEF_START_SIGS
206122205Sharti};
207122205Shartienum call_sig {
208122205Sharti	DEF_CALL_SIGS
209122205Sharti};
210122205Shartienum party_sig {
211122205Sharti	DEF_PARTY_SIGS
212122205Sharti};
213122205Sharti#undef DEF_PRIV_SIG
214122205Sharti
215122205Sharti/*************************************************************
216122205Sharti *
217122205Sharti * SIGNALS and SIGNAL QUEUES
218122205Sharti */
219122205Shartienum {
220122205Sharti	SIG_COORD,
221122205Sharti	SIG_RESET_START,
222122205Sharti	SIG_RESET_RESP,
223122205Sharti	SIG_CALL,
224122205Sharti	SIG_PARTY,
225122205Sharti};
226122205Sharti
227122205Shartistruct sig {
228122205Sharti	TAILQ_ENTRY(sig) link;
229122205Sharti	u_int		type;	/* one of the above */
230122205Sharti	struct call	*call;	/* call to send to */
231122205Sharti	struct party	*party;	/* party to send to */
232131826Sharti	uint32_t	sig;	/* the signal */
233131826Sharti	uint32_t	cookie;	/* user cookie */
234122205Sharti	struct uni_msg	*msg;	/* attached message */
235122205Sharti	struct uni_all	*u;	/* dito */
236122205Sharti};
237122205ShartiTAILQ_HEAD(sigqueue, sig);
238122205Sharti
239122205Sharti#define SIGQ_CLEAR(Q)							\
240122205Sharti    do {								\
241122205Sharti	struct sig *s;							\
242122205Sharti	while(!TAILQ_EMPTY(Q)) {					\
243122205Sharti		s = TAILQ_FIRST(Q);					\
244122205Sharti		TAILQ_REMOVE(Q, s, link);				\
245122205Sharti		if(s->msg) uni_msg_destroy(s->msg);			\
246122205Sharti		if(s->u) UNI_FREE(s->u);				\
247122205Sharti		SIG_FREE(s);						\
248122205Sharti	}								\
249122205Sharti    } while(0)
250122205Sharti
251131826Shartivoid uni_sig_party(struct party *, enum party_sig, uint32_t cookie,
252122205Sharti    struct uni_msg *, struct uni_all *);
253131826Shartivoid uni_sig_call(struct call *, enum call_sig, uint32_t cookie,
254122205Sharti    struct uni_msg *, struct uni_all *);
255131826Shartivoid uni_sig_coord(struct uni *, enum coord_sig, uint32_t cookie,
256122205Sharti    struct uni_msg *);
257131826Shartivoid uni_sig_start(struct uni *, enum start_sig, uint32_t cookie,
258122205Sharti    struct uni_msg *, struct uni_all *);
259131826Shartivoid uni_sig_respond(struct uni *, enum respond_sig, uint32_t cookie,
260122205Sharti    struct uni_msg *, struct uni_all *);
261122205Sharti
262122205Sharti/*************************************************************
263122205Sharti *
264122205Sharti * CALL INSTANCES
265122205Sharti */
266122205Shartistruct party {
267122205Sharti	struct call		*call;
268122205Sharti	TAILQ_ENTRY(party)	link;
269122205Sharti	u_int			epref;	/* endpoint reference */
270122205Sharti	u_int			flags;	/* flags */
271122205Sharti	enum uni_epstate	state;	/* party state */
272122205Sharti
273122205Sharti	struct uni_timer	t397;	/* T397 */
274122205Sharti	struct uni_timer	t398;	/* T398 */
275122205Sharti	struct uni_timer	t399;	/* T399 */
276122205Sharti};
277122205Sharti#define	PARTY_MINE	0x0001		/* must be 1 */
278122205Sharti#define	PARTY_CONNECT	0x0002		/* connect request from this party */
279122205Sharti
280122205ShartiTAILQ_HEAD(partyqueue, party);
281122205Sharti
282122205Shartivoid uni_destroy_party(struct party *, int);
283122205Shartistruct party *uni_find_party(struct call *, struct uni_ie_epref *);
284122205Shartistruct party *uni_find_partyx(struct call *, u_int epref, u_int mine);
285122205Shartistruct party *uni_create_party(struct call *, struct uni_ie_epref *);
286131826Shartistruct party *uni_create_partyx(struct call *, u_int epref, u_int mine,
287131826Sharti    uint32_t cookie);
288122205Shartiu_int uni_party_act_count(struct call *, int);
289122205Sharti
290122205Shartienum call_type {
291122205Sharti	CALL_NULL,	/* not known yet */
292122205Sharti	CALL_P2P,	/* normal point-to-point call */
293122205Sharti	CALL_COBI,	/* Q.2932.1 COBI call */
294122205Sharti	CALL_ROOT,	/* point-to-multipoint root */
295122205Sharti	CALL_LEAF,	/* point-to-multipoint leaf */
296122205Sharti};
297122205Sharti
298122205Shartienum call_state {
299122205Sharti	CALLST_NULL,
300122205Sharti	CALLST_U1, CALLST_U3, CALLST_U4, CALLST_U6, CALLST_U7, CALLST_U8,
301122205Sharti	CALLST_U9, CALLST_U10, CALLST_U11, CALLST_U12,
302122205Sharti	CALLST_N1, CALLST_N3, CALLST_N4, CALLST_N6, CALLST_N7, CALLST_N8,
303122205Sharti	CALLST_N9, CALLST_N10, CALLST_N11, CALLST_N12
304122205Sharti};
305122205Sharti
306122205Shartistruct call {
307122205Sharti	TAILQ_ENTRY(call)	link;	/* link between calls */
308122205Sharti	struct uni		*uni;	/* backpointer to owning UNI */
309122205Sharti	u_int			cref;	/* call reference value or lij seqno */
310122205Sharti	u_int			mine;	/* if TRUE this is my call */
311122205Sharti	enum call_type		type;	/* what call is it */
312122205Sharti	enum call_state		cstate;	/* the state of the call */
313122205Sharti	struct uni_ie_connid	connid;	/* the connection ID */
314122205Sharti	struct uni_setup	msg_setup;	/* retransmission */
315122205Sharti	struct uni_release	msg_release;	/* retransmission */
316122205Sharti	struct uni_ie_epref	stat_epref;	/* retransmission */
317122205Sharti	struct partyqueue	parties;
318122205Sharti	u_int			se_active;	/* status enquiry active */
319122205Sharti	u_int			epref_alloc;
320122205Sharti
321122205Sharti	struct uni_timer	t308;	/* T303 */
322122205Sharti	u_int			cnt308;
323122205Sharti
324122205Sharti	struct uni_timer	t303;	/* T303 */
325122205Sharti	u_int			cnt303;
326122205Sharti
327122205Sharti	struct uni_timer	t301;	/* T301 */
328122205Sharti	struct uni_timer	t310;	/* T310 */
329122205Sharti	struct uni_timer	t313;	/* T313 */
330122205Sharti
331122205Sharti	struct uni_timer	t322;	/* T322 */
332122205Sharti	u_int			cnt322;
333122205Sharti};
334122205Sharti
335122205ShartiTAILQ_HEAD(callqueue, call);
336122205Sharti
337122205Shartistruct call *uni_find_call(struct uni *, struct uni_cref *);
338122205Shartistruct call *uni_find_callx(struct uni *, u_int cref, u_int mine);
339122205Shartistruct call *uni_create_call(struct uni *, u_int cref, u_int mine,
340131826Sharti	uint32_t cookie);
341131826Shartistruct call *uni_create_new_call(struct uni *, uint32_t cookie);
342122205Shartivoid uni_destroy_call(struct call *, int);
343122205Sharti
344122205Shartivoid uni_bad_message(struct call *, struct uni_all *, u_int,
345122205Sharti    struct uni_ie_epref *, int);
346122205Sharti
347122205Shartiextern const struct callstates {
348122205Sharti	const char *name;
349122205Sharti	enum uni_callstate ext;
350122205Sharti} callstates[];
351122205Sharti
352122205Sharti/*************************************************************
353122205Sharti *
354122205Sharti * UNI INSTANCE
355122205Sharti */
356122205Shartistruct uni {
357122205Sharti	void			*arg;	/* user arg */
358122205Sharti	const struct uni_funcs	*funcs;
359122205Sharti
360122205Sharti	enum uni_proto		proto;	/* protocol */
361122205Sharti	struct unicx		cx;	/* decoding/coding context */
362122205Sharti	int			sb_tb : 1;	/* Sb-Tb/Tb point */
363122205Sharti
364122205Sharti	struct sigqueue		workq;	/* work queue */
365122205Sharti	struct sigqueue		delq;	/* delayed signal queue */
366122205Sharti	int			working;
367122205Sharti
368131826Sharti	uint32_t		cref_alloc;
369122205Sharti
370122205Sharti	enum cu_stat		custat;	/* coordinator state */
371122205Sharti	struct uni_timer	t309;
372122205Sharti	u_int			timer309;
373122205Sharti
374122205Sharti	enum uni_callstate	glob_start;
375122205Sharti	enum uni_callstate	glob_respond;
376122205Sharti	struct uni_timer	t316;
377122205Sharti	struct uni_timer	t317;
378122205Sharti	struct uni_ie_connid	connid_start;
379122205Sharti	struct uni_ie_connid	connid_respond;
380122205Sharti	u_int			cnt316;
381122205Sharti	struct uni_ie_restart	restart_start;
382122205Sharti
383122205Sharti	struct callqueue	calls;
384122205Sharti
385122205Sharti	struct uni_ie_cause	cause;	/* working area for verify */
386122205Sharti
387122205Sharti	/* tuneable parameters */
388122205Sharti	u_int			timer301;
389122205Sharti	u_int			init303;
390122205Sharti	u_int			timer303;
391122205Sharti	u_int			init308;
392122205Sharti	u_int			timer308;
393122205Sharti	u_int			timer310;
394122205Sharti	u_int			timer313;
395122205Sharti	u_int			init316;
396122205Sharti	u_int			timer316;
397122205Sharti	u_int			timer317;
398122205Sharti	u_int			timer322;
399122205Sharti	u_int			init322;
400122205Sharti	u_int			timer397;
401122205Sharti	u_int			timer398;
402122205Sharti	u_int			timer399;
403122205Sharti
404122205Sharti	u_int			debug[UNI_MAXFACILITY];
405122205Sharti};
406122205Sharti
407131826Shartivoid uniapi_uni_error(struct uni *uni, uint32_t reason, uint32_t cookie,
408131826Sharti	uint32_t state);
409131826Shartivoid uniapi_call_error(struct call *c, uint32_t reason, uint32_t cookie);
410131826Shartivoid uniapi_party_error(struct party *p, uint32_t reason, uint32_t cookie);
411122205Sharti
412122205Sharti/*************************************************************
413122205Sharti *
414122205Sharti * INLINE FUNCTIONS
415122205Sharti */
416122205Sharti
417122205Sharti/* Enqueue a signal in the working queue */
418122205Shartivoid uni_enq_sig(struct uni *, u_int, struct call *, struct party *,
419122205Sharti    uint32_t, uint32_t, struct uni_msg *, struct uni_all *);
420122205Sharti
421122205Sharti/* Enqueue a signal in the delayed queue */
422122205Shartivoid uni_delenq_sig(struct uni *, u_int, struct call *, struct party *,
423122205Sharti    uint32_t, uint32_t, struct uni_msg *, struct uni_all *);
424122205Sharti
425122205Sharti/* Enqueue a signal to the coordinator */
426122205Sharti#define	uni_enq_coord(UNI, SIG, COOKIE, MSG) do {			\
427122205Sharti	uni_enq_sig((UNI), SIG_COORD, NULL, NULL,			\
428122205Sharti	    (SIG), (COOKIE), (MSG), NULL);				\
429122205Sharti    } while (0)
430122205Sharti
431122205Sharti/* Enqueue a delayed signal to the coordinator */
432122205Sharti#define	uni_delenq_coord(UNI, SIG, COOKIE, MSG) do {			\
433122205Sharti	uni_delenq_sig((UNI), SIG_COORD, NULL, NULL,			\
434122205Sharti	    (SIG), (COOKIE), (MSG), NULL);				\
435122205Sharti    } while (0)
436122205Sharti
437122205Sharti/* Enqueue a signal to a call */
438122205Sharti#define uni_enq_call(CALL, SIG, COOKIE, MSG, U) do {			\
439122205Sharti	uni_enq_sig((CALL)->uni, SIG_CALL, (CALL), NULL,		\
440122205Sharti	    (SIG), (COOKIE), (MSG), (U));				\
441122205Sharti    } while (0)
442122205Sharti
443122205Sharti/* Enqueue a signal to a party */
444122205Sharti#define uni_enq_party(PARTY, SIG, COOKIE, MSG, U) do {			\
445122205Sharti	uni_enq_sig((PARTY)->call->uni, SIG_PARTY, (PARTY)->call,	\
446122205Sharti	    (PARTY), (SIG), (COOKIE), (MSG), (U));			\
447122205Sharti    } while (0)
448122205Sharti
449122205Sharti/* Enqueue a signal to RESET-START */
450122205Sharti#define	uni_enq_start(UNI, SIG, COOKIE, MSG, U) do {			\
451122205Sharti	uni_enq_sig((UNI), SIG_RESET_START, NULL, NULL,			\
452122205Sharti	    (SIG), (COOKIE), (MSG), (U));				\
453122205Sharti    } while (0)
454122205Sharti
455122205Sharti/* Enqueue a signal to RESET-RESPOND */
456122205Sharti#define	uni_enq_resp(UNI, SIG, COOKIE, MSG, U) do {			\
457122205Sharti	uni_enq_sig((UNI), SIG_RESET_RESP, NULL, NULL,			\
458122205Sharti	    (SIG), (COOKIE), (MSG), (U));				\
459122205Sharti    } while (0)
460122205Sharti
461122205Shartiint uni_send_output(struct uni_all *u, struct uni *uni);
462122205Shartivoid uni_undel(struct uni *, int (*)(struct sig *, void *), void *);
463122205Shartivoid uni_delsig(struct uni *, u_int, struct call *, struct party *);
464122205Sharti
465122205Shartivoid uni_release_compl(struct call *, struct uni_all *);
466122205Sharti
467122205Sharti/*************************************************************/
468122205Sharti/*
469122205Sharti * Message verification.
470122205Sharti */
471122205Sharti#define MANDATE_IE(UNI,MSG,IE)						\
472122205Sharti    do {								\
473122205Sharti	if (!IE_ISGOOD(MSG))						\
474122205Sharti		uni_mandate_ie(UNI, IE);				\
475122205Sharti    } while(0)
476122205Sharti
477122205Shartienum verify {
478122205Sharti	VFY_OK,		/* ok */
479122205Sharti	VFY_RAP,	/* report and proceed */
480122205Sharti	VFY_RAPU,	/* report and proceed becuase of unknown IEs */
481122205Sharti	VFY_I,		/* ignore */
482122205Sharti	VFY_CLR,	/* clear call */
483122205Sharti	VFY_RAI,	/* report and ignore */
484122205Sharti	VFY_RAIM,	/* report and ignore because if mandat. IE miss */
485122205Sharti};
486122205Sharti
487122205Shartivoid uni_mandate_ie(struct uni *, enum uni_ietype);
488122205Shartivoid uni_mandate_epref(struct uni *, struct uni_ie_epref *);
489122205Shartienum verify uni_verify(struct uni *, enum uni_msgact);
490122205Shartivoid uni_respond_status_verify(struct uni *, struct uni_cref *,
491122205Sharti	enum uni_callstate, struct uni_ie_epref *, enum uni_epstate);
492122205Shartivoid uni_vfy_remove_unknown(struct uni *);
493122205Shartivoid uni_vfy_remove_cause(struct uni *);
494122205Shartivoid uni_vfy_collect_ies(struct uni *);
495122205Sharti
496122205Sharti
497122205Shartivoid uni_respond_status(struct uni *uni, struct uni_cref *cref,
498122205Sharti    enum uni_callstate cs, enum uni_cause c1);
499122205Shartivoid uni_respond_status_mtype(struct uni *uni, struct uni_cref *cref,
500122205Sharti    enum uni_callstate cs, enum uni_cause c1, u_int mtype);
501122205Sharti
502122205Sharti#define	FOREACH_ERR(E, UNI) \
503122205Sharti	for ((E) = (UNI)->cx.err; (E) < (UNI)->cx.err + (UNI)->cx.errcnt; (E)++)
504122205Sharti
505122205Sharti#define ALLOC_API(TYPE,API)					\
506122205Sharti    ({								\
507122205Sharti	TYPE *_tmp = NULL;					\
508122205Sharti								\
509122205Sharti	if(((API) = uni_msg_alloc(sizeof(TYPE))) != NULL) {	\
510122205Sharti		_tmp = uni_msg_wptr((API), TYPE *);		\
511122205Sharti		(API)->b_wptr += sizeof(TYPE);			\
512122205Sharti		memset(_tmp, 0, sizeof(TYPE));			\
513122205Sharti	}							\
514122205Sharti	_tmp;							\
515122205Sharti    })
516122205Sharti
517131826Sharti#if defined(__GNUC__) && __GNUC__ < 3
518131826Sharti
519131826Sharti#define	VERBOSE(UNI, FAC, LEVEL, ARGS...) do {			\
520122205Sharti	if ((UNI)->debug[(FAC)] >= (LEVEL)) {			\
521131826Sharti		(UNI)->funcs->verbose((UNI), (UNI)->arg, (FAC) ,\
522131826Sharti		   ## ARGS);					\
523122205Sharti	}							\
524122205Sharti    } while(0)
525122205Sharti
526131826Sharti#define VERBOSE0(UNI, FAC, ARGS...) do {			\
527131826Sharti	(UNI)->funcs->verbose((UNI), (UNI)->arg, (FAC) ,	\
528122205Sharti	    ## ARGS);						\
529122205Sharti    } while(0)
530122205Sharti
531131826Sharti#else
532131826Sharti
533131826Sharti#define VERBOSE(UNI, FAC, LEVEL, ...) do {			\
534131826Sharti	if ((UNI)->debug[(FAC)] >= (LEVEL)) {			\
535131826Sharti		(UNI)->funcs->verbose((UNI), (UNI)->arg, (FAC),	\
536131826Sharti		    __VA_ARGS__);				\
537131826Sharti	}							\
538131826Sharti    } while(0)
539131826Sharti
540131826Sharti#define VERBOSE0(UNI, FAC, ...) do {				\
541131826Sharti	(UNI)->funcs->verbose((UNI), (UNI)->arg, (FAC),		\
542131826Sharti	    __VA_ARGS__);					\
543131826Sharti    } while(0)
544131826Sharti
545131826Sharti#endif
546131826Sharti
547122205Sharti#define TIMER_INIT_UNI(U,T)	_TIMER_INIT(U,T)
548122205Sharti#define TIMER_INIT_CALL(C,T)	_TIMER_INIT(C,T)
549122205Sharti#define TIMER_INIT_PARTY(P,T)	_TIMER_INIT(P,T)
550122205Sharti
551122205Sharti#define TIMER_DESTROY_UNI(U,T)		_TIMER_DESTROY(U, (U)->T)
552122205Sharti#define TIMER_DESTROY_CALL(C,T)		_TIMER_DESTROY((C)->uni, (C)->T)
553122205Sharti#define TIMER_DESTROY_PARTY(P,T)	_TIMER_DESTROY((P)->call->uni, (P)->T)
554122205Sharti
555122205Sharti#define TIMER_STOP_UNI(U,T)	_TIMER_STOP(U, (U)->T)
556122205Sharti#define TIMER_STOP_CALL(C,T)	_TIMER_STOP((C)->uni, (C)->T)
557122205Sharti#define TIMER_STOP_PARTY(P,T)	_TIMER_STOP((P)->call->uni, (P)->T)
558122205Sharti
559122205Sharti#define TIMER_START_UNI(U,T,N) _TIMER_START(U, U, (U)->T, N, _##T##_func)
560122205Sharti#define TIMER_START_CALL(C,T,N) _TIMER_START(C->uni, C, (C)->T, N, _##T##_func)
561122205Sharti#define TIMER_START_PARTY(P,T,N) _TIMER_START(P->call->uni, P, (P)->T, N, _##T##_func)
562122205Sharti
563122205Sharti#endif
564