xref: /freebsd/contrib/openbsm/libbsm/bsm_domain.c (revision c697fb7f)
1 /*-
2  * Copyright (c) 2008 Apple Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
21  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
26  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #include <sys/types.h>
31 #include <sys/socket.h>
32 
33 #include <config/config.h>
34 
35 #include <bsm/audit_domain.h>
36 #include <bsm/libbsm.h>
37 
38 struct bsm_domain {
39 	u_short	bd_bsm_domain;
40 	int	bd_local_domain;
41 };
42 
43 #define	PF_NO_LOCAL_MAPPING	-600
44 
45 static const struct bsm_domain bsm_domains[] = {
46 	{ BSM_PF_UNSPEC, PF_UNSPEC },
47 	{ BSM_PF_LOCAL, PF_LOCAL },
48 	{ BSM_PF_INET, PF_INET },
49 	{ BSM_PF_IMPLINK,
50 #ifdef PF_IMPLINK
51 	PF_IMPLINK
52 #else
53 	PF_NO_LOCAL_MAPPING
54 #endif
55 	},
56 	{ BSM_PF_PUP,
57 #ifdef PF_PUP
58 	PF_PUP
59 #else
60 	PF_NO_LOCAL_MAPPING
61 #endif
62 	},
63 	{ BSM_PF_CHAOS,
64 #ifdef PF_CHAOS
65 	PF_CHAOS
66 #else
67 	PF_NO_LOCAL_MAPPING
68 #endif
69 	},
70 	{ BSM_PF_NS,
71 #ifdef PF_NS
72 	PF_NS
73 #else
74 	PF_NO_LOCAL_MAPPING
75 #endif
76 	},
77 	{ BSM_PF_NBS,
78 #ifdef PF_NBS
79 	PF_NBS
80 #else
81 	PF_NO_LOCAL_MAPPING
82 #endif
83 	},
84 	{ BSM_PF_ECMA,
85 #ifdef PF_ECMA
86 	PF_ECMA
87 #else
88 	PF_NO_LOCAL_MAPPING
89 #endif
90 	},
91 	{ BSM_PF_DATAKIT,
92 #ifdef PF_DATAKIT
93 	PF_DATAKIT
94 #else
95 	PF_NO_LOCAL_MAPPING
96 #endif
97 	},
98 	{ BSM_PF_CCITT,
99 #ifdef PF_CCITT
100 	PF_CCITT
101 #else
102 	PF_NO_LOCAL_MAPPING
103 #endif
104 	},
105 	{ BSM_PF_SNA, PF_SNA },
106 	{ BSM_PF_DECnet, PF_DECnet },
107 	{ BSM_PF_DLI,
108 #ifdef PF_DLI
109 	PF_DLI
110 #else
111 	PF_NO_LOCAL_MAPPING
112 #endif
113 	},
114 	{ BSM_PF_LAT,
115 #ifdef PF_LAT
116 	PF_LAT
117 #else
118 	PF_NO_LOCAL_MAPPING
119 #endif
120 	},
121 	{ BSM_PF_HYLINK,
122 #ifdef PF_HYLINK
123 	PF_HYLINK
124 #else
125 	PF_NO_LOCAL_MAPPING
126 #endif
127 	},
128 	{ BSM_PF_APPLETALK, PF_APPLETALK },
129 	{ BSM_PF_NIT,
130 #ifdef PF_NIT
131 	PF_NIT
132 #else
133 	PF_NO_LOCAL_MAPPING
134 #endif
135 	},
136 	{ BSM_PF_802,
137 #ifdef PF_802
138 	PF_802
139 #else
140 	PF_NO_LOCAL_MAPPING
141 #endif
142 	},
143 	{ BSM_PF_OSI,
144 #ifdef PF_OSI
145 	PF_OSI
146 #else
147 	PF_NO_LOCAL_MAPPING
148 #endif
149 	},
150 	{ BSM_PF_X25,
151 #ifdef PF_X25
152 	PF_X25
153 #else
154 	PF_NO_LOCAL_MAPPING
155 #endif
156 	},
157 	{ BSM_PF_OSINET,
158 #ifdef PF_OSINET
159 	PF_OSINET
160 #else
161 	PF_NO_LOCAL_MAPPING
162 #endif
163 	},
164 	{ BSM_PF_GOSIP,
165 #ifdef PF_GOSIP
166 	PF_GOSIP
167 #else
168 	PF_NO_LOCAL_MAPPING
169 #endif
170 	},
171 	{ BSM_PF_IPX, PF_IPX },
172 	{ BSM_PF_ROUTE, PF_ROUTE },
173 	{ BSM_PF_LINK,
174 #ifdef PF_LINK
175 	PF_LINK
176 #else
177 	PF_NO_LOCAL_MAPPING
178 #endif
179 	},
180 	{ BSM_PF_INET6, PF_INET6 },
181 	{ BSM_PF_KEY, PF_KEY },
182 	{ BSM_PF_NCA,
183 #ifdef PF_NCA
184 	PF_NCA
185 #else
186 	PF_NO_LOCAL_MAPPING
187 #endif
188 	},
189 	{ BSM_PF_POLICY,
190 #ifdef PF_POLICY
191 	PF_POLICY
192 #else
193 	PF_NO_LOCAL_MAPPING
194 #endif
195 	},
196 	{ BSM_PF_INET_OFFLOAD,
197 #ifdef PF_INET_OFFLOAD
198 	PF_INET_OFFLOAD
199 #else
200 	PF_NO_LOCAL_MAPPING
201 #endif
202 	},
203 	{ BSM_PF_NETBIOS,
204 #ifdef PF_NETBIOS
205 	PF_NETBIOS
206 #else
207 	PF_NO_LOCAL_MAPPING
208 #endif
209 	},
210 	{ BSM_PF_ISO,
211 #ifdef PF_ISO
212 	PF_ISO
213 #else
214 	PF_NO_LOCAL_MAPPING
215 #endif
216 	},
217 	{ BSM_PF_XTP,
218 #ifdef PF_XTP
219 	PF_XTP
220 #else
221 	PF_NO_LOCAL_MAPPING
222 #endif
223 	},
224 	{ BSM_PF_COIP,
225 #ifdef PF_COIP
226 	PF_COIP
227 #else
228 	PF_NO_LOCAL_MAPPING
229 #endif
230 	},
231 	{ BSM_PF_CNT,
232 #ifdef PF_CNT
233 	PF_CNT
234 #else
235 	PF_NO_LOCAL_MAPPING
236 #endif
237 	},
238 	{ BSM_PF_RTIP,
239 #ifdef PF_RTIP
240 	PF_RTIP
241 #else
242 	PF_NO_LOCAL_MAPPING
243 #endif
244 	},
245 	{ BSM_PF_SIP,
246 #ifdef PF_SIP
247 	PF_SIP
248 #else
249 	PF_NO_LOCAL_MAPPING
250 #endif
251 	},
252 	{ BSM_PF_PIP,
253 #ifdef PF_PIP
254 	PF_PIP
255 #else
256 	PF_NO_LOCAL_MAPPING
257 #endif
258 	},
259 	{ BSM_PF_ISDN,
260 #ifdef PF_ISDN
261 	PF_ISDN
262 #else
263 	PF_NO_LOCAL_MAPPING
264 #endif
265 	},
266 	{ BSM_PF_E164,
267 #ifdef PF_E164
268 	PF_E164
269 #else
270 	PF_NO_LOCAL_MAPPING
271 #endif
272 	},
273 	{ BSM_PF_NATM,
274 #ifdef PF_NATM
275 	PF_NATM
276 #else
277 	PF_NO_LOCAL_MAPPING
278 #endif
279 	},
280 	{ BSM_PF_ATM,
281 #ifdef PF_ATM
282 	PF_ATM
283 #else
284 	PF_NO_LOCAL_MAPPING
285 #endif
286 	},
287 	{ BSM_PF_NETGRAPH,
288 #ifdef PF_NETGRAPH
289 	PF_NETGRAPH
290 #else
291 	PF_NO_LOCAL_MAPPING
292 #endif
293 	},
294 	{ BSM_PF_SLOW,
295 #ifdef PF_SLOW
296 	PF_SLOW
297 #else
298 	PF_NO_LOCAL_MAPPING
299 #endif
300 	},
301 	{ BSM_PF_SCLUSTER,
302 #ifdef PF_SCLUSTER
303 	PF_SCLUSTER
304 #else
305 	PF_NO_LOCAL_MAPPING
306 #endif
307 	},
308 	{ BSM_PF_ARP,
309 #ifdef PF_ARP
310 	PF_ARP
311 #else
312 	PF_NO_LOCAL_MAPPING
313 #endif
314 	},
315 	{ BSM_PF_BLUETOOTH,
316 #ifdef PF_BLUETOOTH
317 	PF_BLUETOOTH
318 #else
319 	PF_NO_LOCAL_MAPPING
320 #endif
321 	},
322 	{ BSM_PF_AX25,
323 #ifdef PF_AX25
324 	PF_AX25
325 #else
326 	PF_NO_LOCAL_MAPPING
327 #endif
328 	},
329 	{ BSM_PF_ROSE,
330 #ifdef PF_ROSE
331 	PF_ROSE
332 #else
333 	PF_NO_LOCAL_MAPPING
334 #endif
335 	},
336 	{ BSM_PF_NETBEUI,
337 #ifdef PF_NETBEUI
338 	PF_NETBEUI
339 #else
340 	PF_NO_LOCAL_MAPPING
341 #endif
342 	},
343 	{ BSM_PF_SECURITY,
344 #ifdef PF_SECURITY
345 	PF_SECURITY
346 #else
347 	PF_NO_LOCAL_MAPPING
348 #endif
349 	},
350 	{ BSM_PF_PACKET,
351 #ifdef PF_PACKET
352 	PF_PACKET
353 #else
354 	PF_NO_LOCAL_MAPPING
355 #endif
356 	},
357 	{ BSM_PF_ASH,
358 #ifdef PF_ASH
359 	PF_ASH
360 #else
361 	PF_NO_LOCAL_MAPPING
362 #endif
363 	},
364 	{ BSM_PF_ECONET,
365 #ifdef PF_ECONET
366 	PF_ECONET
367 #else
368 	PF_NO_LOCAL_MAPPING
369 #endif
370 	},
371 	{ BSM_PF_ATMSVC,
372 #ifdef PF_ATMSVC
373 	PF_ATMSVC
374 #else
375 	PF_NO_LOCAL_MAPPING
376 #endif
377 	},
378 	{ BSM_PF_IRDA,
379 #ifdef PF_IRDA
380 	PF_IRDA
381 #else
382 	PF_NO_LOCAL_MAPPING
383 #endif
384 	},
385 	{ BSM_PF_PPPOX,
386 #ifdef PF_PPPOX
387 	PF_PPPOX
388 #else
389 	PF_NO_LOCAL_MAPPING
390 #endif
391 	},
392 	{ BSM_PF_WANPIPE,
393 #ifdef PF_WANPIPE
394 	PF_WANPIPE
395 #else
396 	PF_NO_LOCAL_MAPPING
397 #endif
398 	},
399 	{ BSM_PF_LLC,
400 #ifdef PF_LLC
401 	PF_LLC
402 #else
403 	PF_NO_LOCAL_MAPPING
404 #endif
405 	},
406 	{ BSM_PF_CAN,
407 #ifdef PF_CAN
408 	PF_CAN
409 #else
410 	PF_NO_LOCAL_MAPPING
411 #endif
412 	},
413 	{ BSM_PF_TIPC,
414 #ifdef PF_TIPC
415 	PF_TIPC
416 #else
417 	PF_NO_LOCAL_MAPPING
418 #endif
419 	},
420 	{ BSM_PF_IUCV,
421 #ifdef PF_IUCV
422 	PF_IUCV
423 #else
424 	PF_NO_LOCAL_MAPPING
425 #endif
426 	},
427 	{ BSM_PF_RXRPC,
428 #ifdef PF_RXRPC
429 	PF_RXRPC
430 #else
431 	PF_NO_LOCAL_MAPPING
432 #endif
433 	},
434 	{ BSM_PF_PHONET,
435 #ifdef PF_PHONET
436 	PF_PHONET
437 #else
438 	PF_NO_LOCAL_MAPPING
439 #endif
440 	},
441 };
442 static const int bsm_domains_count = sizeof(bsm_domains) /
443 	    sizeof(bsm_domains[0]);
444 
445 static const struct bsm_domain *
446 bsm_lookup_local_domain(int local_domain)
447 {
448 	int i;
449 
450 	for (i = 0; i < bsm_domains_count; i++) {
451 		if (bsm_domains[i].bd_local_domain == local_domain)
452 			return (&bsm_domains[i]);
453 	}
454 	return (NULL);
455 }
456 
457 u_short
458 au_domain_to_bsm(int local_domain)
459 {
460 	const struct bsm_domain *bstp;
461 
462 	bstp = bsm_lookup_local_domain(local_domain);
463 	if (bstp == NULL)
464 		return (BSM_PF_UNKNOWN);
465 	return (bstp->bd_bsm_domain);
466 }
467 
468 static const struct bsm_domain *
469 bsm_lookup_bsm_domain(u_short bsm_domain)
470 {
471 	int i;
472 
473 	for (i = 0; i < bsm_domains_count; i++) {
474 		if (bsm_domains[i].bd_bsm_domain == bsm_domain)
475 			return (&bsm_domains[i]);
476 	}
477 	return (NULL);
478 }
479 
480 int
481 au_bsm_to_domain(u_short bsm_domain, int *local_domainp)
482 {
483 	const struct bsm_domain *bstp;
484 
485 	bstp = bsm_lookup_bsm_domain(bsm_domain);
486 	if (bstp == NULL || bstp->bd_local_domain)
487 		return (-1);
488 	*local_domainp = bstp->bd_local_domain;
489 	return (0);
490 }
491