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