xref: /f-stack/freebsd/netgraph/atm/uni/ng_uni_cust.h (revision 22ce4aff)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2001-2003
5  *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
6  * 	All rights reserved.
7  *
8  * Author: Hartmut Brandt <[email protected]>
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 AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  * Customisation of signalling source to the NG environment.
32  *
33  * $FreeBSD$
34  */
35 
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/kernel.h>
39 #include <sys/malloc.h>
40 #include <sys/queue.h>
41 #include <sys/lock.h>
42 #include <sys/mutex.h>
43 #include <sys/mbuf.h>
44 #include <netgraph/ng_message.h>
45 #include <netgraph/netgraph.h>
46 #include <netgraph/atm/ngatmbase.h>
47 
48 #define	ASSERT(E, M) KASSERT(E,M)
49 
50 /*
51  * Memory
52  */
53 enum unimem {
54 	UNIMEM_INS = 0,
55 	UNIMEM_ALL,
56 	UNIMEM_SIG,
57 	UNIMEM_CALL,
58 	UNIMEM_PARTY,
59 };
60 #define	UNIMEM_TYPES	5
61 
62 void *ng_uni_malloc(enum unimem, const char *, u_int);
63 void ng_uni_free(enum unimem, void *, const char *, u_int);
64 
65 #define	INS_ALLOC()	ng_uni_malloc(UNIMEM_INS, __FILE__, __LINE__)
66 #define	INS_FREE(P)	ng_uni_free(UNIMEM_INS, P, __FILE__, __LINE__)
67 
68 #define	UNI_ALLOC()	ng_uni_malloc(UNIMEM_ALL, __FILE__, __LINE__)
69 #define	UNI_FREE(P)	ng_uni_free(UNIMEM_ALL, P, __FILE__, __LINE__)
70 
71 #define	SIG_ALLOC()	ng_uni_malloc(UNIMEM_SIG, __FILE__, __LINE__)
72 #define	SIG_FREE(P)	ng_uni_free(UNIMEM_SIG, P, __FILE__, __LINE__)
73 
74 #define	CALL_ALLOC()	ng_uni_malloc(UNIMEM_CALL, __FILE__, __LINE__)
75 #define	CALL_FREE(P)	ng_uni_free(UNIMEM_CALL, P, __FILE__, __LINE__)
76 
77 #define	PARTY_ALLOC()	ng_uni_malloc(UNIMEM_PARTY, __FILE__, __LINE__)
78 #define	PARTY_FREE(P)	ng_uni_free(UNIMEM_PARTY, P, __FILE__, __LINE__)
79 
80 /*
81  * Timers
82  */
83 struct uni_timer {
84 	struct callout c;
85 };
86 
87 #define	_TIMER_INIT(X,T)	ng_callout_init(&(X)->T.c)
88 #define	_TIMER_DESTROY(UNI,FIELD) _TIMER_STOP(UNI,FIELD)
89 #define	_TIMER_STOP(UNI,FIELD) do {						\
90 	ng_uncallout(&FIELD.c, (UNI)->arg);					\
91     } while (0)
92 #define	TIMER_ISACT(UNI,T)	(callout_active(&(UNI)->T.c) ||		\
93 	callout_pending(&(UNI)->T.c))
94 #define	_TIMER_START(UNI,ARG,FIELD,DUE,FUNC) do {			\
95 	_TIMER_STOP(UNI, FIELD);					\
96 	ng_callout(&FIELD.c, (UNI)->arg, NULL,				\
97 	    hz * (DUE) / 1000, FUNC, (ARG), 0);				\
98     } while (0)
99 
100 #define	TIMER_FUNC_UNI(T,F)						\
101 static void F(struct uni *);						\
102 static void								\
103 _##T##_func(node_p node, hook_p hook, void *arg1, int arg2)		\
104 {									\
105 	struct uni *uni = (struct uni *)arg1;				\
106 									\
107 	(F)(uni);							\
108 	uni_work(uni);							\
109 }
110 
111 /*
112  * Be careful: call may be invalid after the call to F
113  */
114 #define	TIMER_FUNC_CALL(T,F)						\
115 static void F(struct call *);						\
116 static void								\
117 _##T##_func(node_p node, hook_p hook, void *arg1, int arg2)		\
118 {									\
119 	struct call *call = (struct call *)arg1;			\
120 	struct uni *uni = call->uni;					\
121 									\
122 	(F)(call);							\
123 	uni_work(uni);							\
124 }
125 
126 /*
127  * Be careful: call/party may be invalid after the call to F
128  */
129 #define	TIMER_FUNC_PARTY(T,F)						\
130 static void F(struct party *);						\
131 static void								\
132 _##T##_func(node_p node, hook_p hook, void *arg1, int arg2)		\
133 {									\
134 	struct party *party = (struct party *)arg1;			\
135 	struct uni *uni = party->call->uni;				\
136 									\
137 	(F)(party);							\
138 	uni_work(uni);							\
139 }
140 
141 extern size_t unimem_sizes[UNIMEM_TYPES];
142 
143 #define	UNICORE								\
144 size_t unimem_sizes[UNIMEM_TYPES] = {					\
145 	[UNIMEM_INS]	= sizeof(struct uni),				\
146 	[UNIMEM_ALL]	= sizeof(struct uni_all),			\
147 	[UNIMEM_SIG]	= sizeof(struct sig),				\
148 	[UNIMEM_CALL]	= sizeof(struct call),				\
149 	[UNIMEM_PARTY]	= sizeof(struct party)				\
150 };
151