1/*
2 * Copyright (c) 2010 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1.  Redistributions of source code must retain the above copyright
11 *     notice, this list of conditions and the following disclaimer.
12 * 2.  Redistributions in binary form must reproduce the above copyright
13 *     notice, this list of conditions and the following disclaimer in the
14 *     documentation and/or other materials provided with the distribution.
15 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of its
16 *     contributors may be used to endorse or promote products derived from
17 *     this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * Portions of this software have been released under the following terms:
31 *
32 * (c) Copyright 1989-1993 OPEN SOFTWARE FOUNDATION, INC.
33 * (c) Copyright 1989-1993 HEWLETT-PACKARD COMPANY
34 * (c) Copyright 1989-1993 DIGITAL EQUIPMENT CORPORATION
35 *
36 * To anyone who acknowledges that this file is provided "AS IS"
37 * without any express or implied warranty:
38 * permission to use, copy, modify, and distribute this file for any
39 * purpose is hereby granted without fee, provided that the above
40 * copyright notices and this notice appears in all source code copies,
41 * and that none of the names of Open Software Foundation, Inc., Hewlett-
42 * Packard Company or Digital Equipment Corporation be used
43 * in advertising or publicity pertaining to distribution of the software
44 * without specific, written prior permission.  Neither Open Software
45 * Foundation, Inc., Hewlett-Packard Company nor Digital
46 * Equipment Corporation makes any representations about the suitability
47 * of this software for any purpose.
48 *
49 * Copyright (c) 2007, Novell, Inc. All rights reserved.
50 * Redistribution and use in source and binary forms, with or without
51 * modification, are permitted provided that the following conditions
52 * are met:
53 *
54 * 1.  Redistributions of source code must retain the above copyright
55 *     notice, this list of conditions and the following disclaimer.
56 * 2.  Redistributions in binary form must reproduce the above copyright
57 *     notice, this list of conditions and the following disclaimer in the
58 *     documentation and/or other materials provided with the distribution.
59 * 3.  Neither the name of Novell Inc. nor the names of its contributors
60 *     may be used to endorse or promote products derived from this
61 *     this software without specific prior written permission.
62 *
63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
64 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
65 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY
67 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
68 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
69 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
70 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
71 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
72 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
73 *
74 * @APPLE_LICENSE_HEADER_END@
75 */
76
77/*
78**
79**  NAME
80**
81**      cnsm.h
82**
83**  FACILITY:
84**
85**      Remote Procedure Call (RPC)
86**
87**  ABSTRACT:
88**
89**  Interface to the NCA Connection Protocol State Machine Service
90**
91**
92*/
93
94#ifndef _CNSM_H
95#define _CNSM_H	1
96
97/*
98 * R P C _ _ C N _ S M _ I N I T
99 */
100
101void rpc__cn_sm_init (
102    rpc_cn_sm_state_entry_p_t   */* state_tbl */,
103    rpc_cn_sm_action_fn_p_t     /* action_tbl */,
104    rpc_cn_sm_ctlblk_p_t         /* sm */,
105    unsigned32			 /* tbl_id */);
106
107/*
108 * R P C _ _ C N _ S M _ E V A L _ E V E N T
109 */
110
111unsigned32     rpc__cn_sm_eval_event (
112    unsigned32                  /* event_id */,
113    dce_pointer_t                   /* event_parameter */,
114    dce_pointer_t                   /* spc_struct */,
115    rpc_cn_sm_ctlblk_p_t         /* sm */);
116
117/*
118 * R P C _ _ C N _ S M _ I N I T _ E V E N T _ L I S T
119 */
120
121void rpc__cn_sm_init_event_list (rpc_cn_sm_ctlblk_t  *);
122
123/*
124 * R P C _ _ C N _ S M _ I N S E R T _ E V E N T
125 */
126
127void rpc__cn_sm_insert_event (
128    rpc_cn_sm_event_entry_p_t   /* event */,
129    rpc_cn_sm_ctlblk_t          * /* sm */);
130
131/*
132**++
133**
134**  MACRO NAME:       RPC_CN_INCR_ACTIVE_SVR_ACTION
135**
136**  SCOPE:            Internal to the rpc;  used here and in cnassoc.c.
137**
138**  DESCRIPTION:
139**
140**  MACRO to set the active predicate to true. The server
141**  runtime allocated the association for the new call and its
142**  callbacks. Only one call and its related callbacks may allocate an
143**  association at a time.  This macro includes the essence of
144**  incr_active_action_rtn.
145**
146**  INPUTS:
147**
148**      assoc		Pointer to the association.
149**
150**   	sm 		The control block from the event evaluation
151**                      routine.  Input is the current state and
152**                      event for the control block.  Output is the
153**                      next state or updated current state, for the
154**                      control block.
155**
156**  INPUTS/OUTPUTS:     none
157**
158**  OUTPUTS:            Modifies the association reference count and the
159**			current state of the control block.
160**
161**  IMPLICIT INPUTS:    none
162**
163**  IMPLICIT OUTPUTS:   none
164**
165**  FUNCTION VALUE:     none
166**
167**  SIDE EFFECTS:       none
168**
169**--
170**/
171#define RPC_CN_INCR_ACTIVE_SVR_ACTION(assoc, sm)\
172{\
173    	RPC_CN_DBG_RTN_PRINTF(SERVER rpc_cn_incr_active_svr_action_macro); \
174	assoc->assoc_ref_count++;\
175	sm->cur_state = RPC_C_SERVER_ASSOC_OPEN;\
176}
177
178
179
180/*
181**++
182**
183**  MACRO NAME:         RPC_CN_INCR_ACTIVE_CL_ACTION
184**
185**  SCOPE:              GLOBAL
186**
187**  DESCRIPTION:
188**
189**  Action client side macro, to set the active predicate to true. The client
190**  runtime allocated the association for the new call and its
191**  callbacks. Only one call and its related callbacks may allocate an
192**  association at a time.
193**
194**  INPUTS:
195**
196**      assoc		A pointer to the association.
197**
198**   	sm 		The control block from the event evaluation
199**                      routine.  Input is the current state and
200**                      event for the control block.  Output is the
201**                      next state or updated current state, for the
202**                      control block.
203**
204**  INPUTS/OUTPUTS:     none
205**
206**  OUTPUTS:            Modifies the association reference count and the
207**			current state of the control block.
208**
209**  IMPLICIT INPUTS:    none
210**
211**  IMPLICIT OUTPUTS:   none
212**
213**  FUNCTION VALUE:     none
214**
215**  SIDE EFFECTS:       none
216**
217**--
218*/
219#define RPC_CN_INCR_ACTIVE_CL_ACTION(assoc, sm)\
220{\
221    RPC_CN_DBG_RTN_PRINTF(CLIENT rpc_cn_incr_active_cl_action_macro); \
222    assoc->assoc_ref_count++;\
223    sm->cur_state = RPC_C_CLIENT_ASSOC_ACTIVE;\
224}
225/*
226**++
227**
228**  MACRO NAME:       RPC_CN_DECR_ACTIVE_SVR_ACTION
229**
230**  SCOPE:            Internal to the rpc;  used here and in cnassoc.c.
231**
232**  DESCRIPTION:
233**
234**  MACRO to set the active predicate to true. The server
235**  runtime allocated the association for the new call and its
236**  callbacks. Only one call and its related callbacks may allocate an
237**  association at a time.  This macro includes the essence of
238**  decr_active_action_rtn.
239**
240**  INPUTS:
241**
242**      assoc		Pointer to the association.
243**
244**   	sm 		The control block from the event evaluation
245**                      routine.  Input is the current state and
246**                      event for the control block.  Output is the
247**                      next state or updated current state, for the
248**                      control block.
249**
250**  INPUTS/OUTPUTS:     none
251**
252**  OUTPUTS:            Modifies the association reference count and the
253**			current state of the control block.
254**
255**  IMPLICIT INPUTS:    none
256**
257**  IMPLICIT OUTPUTS:   none
258**
259**  FUNCTION VALUE:     none
260**
261**  SIDE EFFECTS:       none
262**
263**--
264**/
265#define RPC_CN_DECR_ACTIVE_SVR_ACTION(assoc, sm)\
266{\
267    	RPC_CN_DBG_RTN_PRINTF(SERVER rpc_cn_decr_active_svr_action_macro); \
268	assoc->assoc_ref_count--;\
269	sm->cur_state = RPC_C_SERVER_ASSOC_OPEN;\
270}
271
272
273
274#define RPC_CN_SM_GET_NEXT_EVENT(sm, event, more)\
275{\
276    if ((sm)->event_list_state == RPC_C_CN_SM_EVENT_LIST_EMPTY)\
277    {\
278        more = false;\
279    }\
280    else\
281    {\
282        (event)->event_id = (sm)->event_list[(sm)->event_list_hindex].event_id;\
283        (event)->event_param = (sm)->event_list[(sm)->event_list_hindex].event_param;\
284        (sm)->event_list_hindex = ((sm)->event_list_hindex + 1) &\
285        (RPC_C_CN_SM_EVENT_LIST_MAX_ENTRIES - 1); \
286        if ((sm)->event_list_hindex == (sm)->event_list_tindex)\
287        {\
288            (sm)->event_list_state = RPC_C_CN_SM_EVENT_LIST_EMPTY;\
289        }\
290        more = true;\
291    }\
292}
293
294#endif
295