Mercurial > hg > waaad
annotate extensions/radius_gw/rgw_extensions.c @ 404:bad497b30f54
Protect in case of NULL callback
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Mon, 08 Jun 2009 18:20:40 +0900 |
parents | 9d9c37868957 |
children | 3a8e91184d4d |
rev | line source |
---|---|
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
1 /********************************************************************************************************* |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
2 * Software License Agreement (BSD License) * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@nict.go.jp> * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
4 * * |
371
e86dba02630a
Updated copyright information
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
365
diff
changeset
|
5 * Copyright (c) 2009, WIDE Project and NICT * |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
6 * All rights reserved. * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
7 * * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
8 * Redistribution and use of this software in source and binary forms, with or without modification, are * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
9 * permitted provided that the following conditions are met: * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
10 * * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
11 * * Redistributions of source code must retain the above * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
12 * copyright notice, this list of conditions and the * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
13 * following disclaimer. * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
14 * * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
15 * * Redistributions in binary form must reproduce the above * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
16 * copyright notice, this list of conditions and the * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
17 * following disclaimer in the documentation and/or other * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
18 * materials provided with the distribution. * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
19 * * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
20 * * Neither the name of the WIDE Project or NICT nor the * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
21 * names of its contributors may be used to endorse or * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
22 * promote products derived from this software without * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
23 * specific prior written permission of WIDE Project and * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
24 * NICT. * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
25 * * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
34 *********************************************************************************************************/ |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
35 |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
36 /* Manage the list of sub-extensions that provide handlers for RADIUS messages / attributes */ |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
37 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
38 #include "radius_gw.h" |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
39 #include <dlfcn.h> |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
40 #include <libgen.h> |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
41 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
42 /* List of the extensions, in the order they are written in the configuration file. */ |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
43 static struct rg_list ext_list; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
44 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
45 /* Description of an extension entry */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
46 struct ext_descr { |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
47 struct rg_list chain; /* chaining in the ext_list list */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
48 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
49 void * dlo; /* object returned by dlopen for the extension, to use with dlclose later */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
50 struct radius_gw_api api; /* the callbacks registered by rga_register */ |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
51 struct rga_conf_state * cs; /* the configuration and state returned by rga_conf_parse_cb */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
52 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
53 int type; /* this extension is called for messages received on this(these) server(s) only */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
54 unsigned char * cc; /* array of command codes, or NULL for any cc */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
55 size_t cc_len; /* size of the previous array */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
56 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
57 char * extname; /* baseame of the extension, for debug messages. To be freed when object is detroyed */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
58 char * conffile; /* configuration file passed to the extension, or "(null)". To be freed when object is destroyed */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
59 }; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
60 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
61 /* Accelerators for each command code (one for each port). These accelerators are built on-demand, as a cache, after start_cache function has been called. */ |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
62 static struct rg_list ext_accel_auth, ext_accel_acct; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
63 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
64 /* accelerator list, one per command code value (only the ones actually used) */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
65 struct ext_accel { |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
66 struct rg_list chain; /* link in the ext_accel_* list */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
67 unsigned char ccode; /* the command code of this accelerator. The previous list is ordered according to this value. We don't handle extended CC yet */ |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
68 struct rg_list extensions; /* head for the list of extensions to be called for this command code. List of ext_accel_item items */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
69 }; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
70 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
71 /* accelerator item, references to extensions */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
72 struct ext_accel_item { |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
73 struct rg_list chain; /* link in the ext_accel "extensions" list */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
74 struct ext_descr * ext; /* pointer to the extension data */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
75 }; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
76 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
77 /* Mutex to protect all the previous lists */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
78 static pthread_mutex_t ext_mtx = PTHREAD_MUTEX_INITIALIZER; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
79 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
80 /* Has start_cache been called? */ |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
81 static int cache_started = 0; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
82 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
83 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
84 /* The lock must be held before calling this function */ |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
85 static int get_accelerator(struct rg_list ** list, unsigned char ccode, int type) |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
86 { |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
87 struct rg_list *refer, *search; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
88 struct ext_accel * accel = NULL; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
89 struct ext_accel_item * item = NULL; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
90 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
91 TRACE_ENTRY("%p %hhu %i", list, ccode, type); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
92 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
93 CHECK_PARAMS( cache_started && list && ((type == RGW_EXT_TYPE_AUTH) || (type == RGW_EXT_TYPE_ACCT)) ); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
94 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
95 if (type == RGW_EXT_TYPE_AUTH) |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
96 refer = &ext_accel_auth; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
97 else |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
98 refer = &ext_accel_acct; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
99 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
100 /* Check if we have already an accelerator for this ccode */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
101 for (search = refer->next; search != refer; search = search->next) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
102 struct ext_accel * loc = (struct ext_accel *)search; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
103 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
104 if (loc->ccode < ccode) |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
105 continue; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
106 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
107 if (loc->ccode > ccode) |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
108 break; /* we don't have an accelerator for this value yet */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
109 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
110 /* We found the matching accelerator, just return this list */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
111 *list = &loc->extensions; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
112 return 0; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
113 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
114 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
115 /* We must create the accelerator list, then save it just before "search" */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
116 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
117 CHECK_MALLOC( accel = malloc(sizeof(struct ext_accel)) ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
118 memset(accel, 0, sizeof(struct ext_accel) ); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
119 rg_list_init(&accel->chain); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
120 rg_list_init(&accel->extensions); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
121 accel->ccode = ccode; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
122 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
123 /* Check each extension from the global list for this port and ccode */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
124 for (refer = ext_list.next; refer != &ext_list; refer = refer->next) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
125 struct ext_descr * loc = (struct ext_descr *)refer; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
126 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
127 /* Skip if this extension is not registered for this port */ |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
128 if (! (loc->type & type) ) |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
129 continue; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
130 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
131 /* Check if the ccode is there */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
132 if (loc->cc) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
133 int i; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
134 int match = 0; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
135 for (i=0; i< loc->cc_len; i++) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
136 if (loc->cc[i] < ccode) |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
137 continue; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
138 if (loc->cc[i] == ccode) |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
139 match = 1; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
140 break; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
141 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
142 if (!match) |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
143 continue; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
144 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
145 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
146 /* Ok, this extension must be called for this port / ccode, add to the accelerator */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
147 CHECK_MALLOC( item = malloc(sizeof(struct ext_accel_item)) ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
148 memset(item, 0, sizeof(struct ext_accel_item)); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
149 rg_list_init(&item->chain); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
150 item->ext = loc; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
151 /* Add as last element of the accelerator */ |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
152 rg_list_insert_before(&accel->extensions, &item->chain); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
153 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
154 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
155 /* Now, save this accelerator entry in the global list */ |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
156 rg_list_insert_before(search, &accel->chain); |
364
48de36f08bec
Fix segmentation fault
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
157 *list = &accel->extensions; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
158 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
159 return 0; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
160 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
161 |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
162 |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
163 int rgw_extensions_init(void) |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
164 { |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
165 TRACE_ENTRY(); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
166 |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
167 rg_list_init(&ext_list); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
168 rg_list_init(&ext_accel_auth); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
169 rg_list_init(&ext_accel_acct); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
170 |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
171 return 0; |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
172 } |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
173 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
174 int rgw_extensions_add( char * extfile, char * conffile, int type, unsigned char ** codes_array, size_t codes_sz ) |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
175 { |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
176 struct ext_descr * new; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
177 int (* ext_rga_register)(int version, waaad_api_t * waaad, struct radius_gw_api * api); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
178 int ret = 0; |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
179 char * myextfile; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
180 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
181 TRACE_ENTRY(); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
182 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
183 CHECK_PARAMS( extfile && type && codes_array && (cache_started == 0) ); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
184 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
185 CHECK_MALLOC( myextfile = strdup(extfile) ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
186 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
187 CHECK_MALLOC( new = malloc(sizeof(struct ext_descr)) ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
188 memset(new, 0, sizeof(struct ext_descr)); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
189 |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
190 rg_list_init(&new->chain); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
191 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
192 /* Copy names, for debug */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
193 CHECK_MALLOC( new->extname = strdup(basename(myextfile)) ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
194 free(myextfile); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
195 CHECK_MALLOC( new->conffile = conffile ? conffile : strdup("(null)") ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
196 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
197 /* Try and load the extension */ |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
198 TRACE_DEBUG(FULL, "Loading subextension: %s", extfile); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
199 new->dlo = dlopen(extfile, RTLD_LAZY | RTLD_LOCAL); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
200 if (new->dlo == NULL) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
201 /* An error occured */ |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
202 log_error("Loading of subextension '%s' failed:\n %s\n", extfile, dlerror()); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
203 goto error; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
204 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
205 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
206 /* Resolve the entry point */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
207 ext_rga_register = dlsym( new->dlo, "rga_register" ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
208 if (ext_rga_register == NULL) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
209 /* An error occured */ |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
210 log_error("Unable to resolve 'rga_register' in subextension '%s':\n %s\n", extfile, dlerror()); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
211 goto error; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
212 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
213 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
214 /* Call the entry point */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
215 TRACE_DEBUG(FULL, "Calling subextension entry point..."); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
216 CHECK_FCT_DO( (*ext_rga_register) (RADIUS_GW_API_VER, waaad_api, &new->api), goto error ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
217 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
218 /* Now parse the configuration file, this will initialize all extension states and store it in the returned pointer (the subextensions must be re-entrant) */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
219 TRACE_DEBUG(FULL, "Parsing subext conf file: %s", new->conffile ); |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
220 new->cs = (*(new->api.rga_conf_parse_cb))(conffile); |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
221 if (new->cs == NULL) { |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
222 log_error("An error occurred while parsing configuration parameter for extension '%s' (%s), aborting...\n", new->extname, new->conffile); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
223 goto error; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
224 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
225 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
226 /* Now sort the array (very naive algorithm, but this list is usually small) of command codes and save */ |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
227 if (*codes_array && codes_sz) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
228 int i; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
229 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
230 new->cc = *codes_array; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
231 *codes_array = NULL; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
232 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
233 for (i = 0; i < codes_sz - 1; i++) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
234 int j, idx = i, min = new->cc[i]; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
235 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
236 /* find the smallest remaining element */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
237 for (j = i + 1; j < codes_sz; j++) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
238 if (min > new->cc[j]) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
239 min = new->cc[j]; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
240 idx = j; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
241 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
242 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
243 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
244 /* swap if needed */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
245 if (idx != i) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
246 int tmp = new->cc[i]; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
247 new->cc[i] = new->cc[idx]; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
248 new->cc[idx] = tmp; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
249 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
250 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
251 new->cc_len = codes_sz; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
252 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
253 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
254 new->type = type; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
255 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
256 /* And save this new extension in the list */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
257 CHECK_POSIX( pthread_mutex_lock(&ext_mtx) ); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
258 rg_list_insert_before(&ext_list, &new->chain); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
259 CHECK_POSIX( pthread_mutex_unlock(&ext_mtx) ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
260 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
261 return 0; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
262 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
263 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
264 error: |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
265 if (new && new->dlo) |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
266 dlclose(new->dlo); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
267 if (new) |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
268 free(new); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
269 return EINVAL; |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
270 } |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
271 |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
272 void rgw_extensions_dump(void) |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
273 { |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
274 struct ext_descr * ext; |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
275 struct rg_list * ptr, *ptraccel; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
276 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
277 if ( ! TRACE_BOOL(FULL) ) |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
278 return; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
279 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
280 CHECK_POSIX_DO( pthread_mutex_lock(&ext_mtx), ); |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
281 |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
282 if ( ! rg_list_is_empty( &ext_list ) ) |
378 | 283 log_debug(" --- List of registered sub-extensions:\n"); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
284 for (ptr = ext_list.next; ptr != &ext_list; ptr = ptr->next) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
285 char * codes = NULL; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
286 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
287 ext = (struct ext_descr *)ptr; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
288 if (ext->cc) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
289 int i; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
290 char * nxt; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
291 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
292 CHECK_MALLOC_DO( codes = malloc(ext->cc_len * 3 + 1), break ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
293 nxt = codes; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
294 for (i = 0; i < ext->cc_len; i++) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
295 sprintf(nxt, "%02hhx ", ext->cc[i]); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
296 nxt += 3; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
297 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
298 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
299 |
378 | 300 log_debug(" %-25s ( %-25s ) - types: %s%s, codes: %s\n", |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
301 ext->extname, |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
302 basename(ext->conffile), |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
303 ext->type & RGW_EXT_TYPE_AUTH ? "Au" : " ", |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
304 ext->type & RGW_EXT_TYPE_ACCT ? "Ac" : " ", |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
305 ext->cc ? codes : "*"); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
306 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
307 free(codes); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
308 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
309 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
310 CHECK_POSIX_DO( pthread_mutex_unlock(&ext_mtx), ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
311 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
312 /* Dump the list of accelerators */ |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
313 if ( ! TRACE_BOOL(FULL + 1) ) |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
314 return; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
315 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
316 CHECK_POSIX_DO( pthread_mutex_lock(&ext_mtx), ); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
317 if ( !rg_list_is_empty( &ext_accel_auth ) || !rg_list_is_empty( &ext_accel_acct )) |
378 | 318 log_debug(" --- Accelerators:\n"); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
319 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
320 for (ptraccel = ext_accel_auth.next; ptraccel != &ext_accel_auth; ptraccel = ptraccel->next) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
321 struct ext_accel * accel = (struct ext_accel *)ptraccel; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
322 log_debug(" auth, code %02hhu:\n", accel->ccode); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
323 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
324 for (ptr = accel->extensions.next; ptr != &accel->extensions; ptr = ptr->next) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
325 struct ext_accel_item * item = (struct ext_accel_item *)ptr; |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
326 log_debug(" %-15s (%s)\n", item->ext->extname, basename(item->ext->conffile)); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
327 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
328 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
329 for (ptraccel = ext_accel_acct.next; ptraccel != &ext_accel_acct; ptraccel = ptraccel->next) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
330 struct ext_accel * accel = (struct ext_accel *)ptraccel; |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
331 log_debug(" acct, code %02hhu:\n", accel->ccode); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
332 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
333 for (ptr = accel->extensions.next; ptr != &accel->extensions; ptr = ptr->next) { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
334 struct ext_accel_item * item = (struct ext_accel_item *)ptr; |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
335 log_debug(" %-15s (%s)\n", item->ext->extname, basename(item->ext->conffile)); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
336 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
337 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
338 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
339 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
340 CHECK_POSIX_DO( pthread_mutex_unlock(&ext_mtx), ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
341 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
342 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
343 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
344 void rgw_extensions_start_cache(void) |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
345 { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
346 cache_started++; |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
347 } |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
348 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
349 int rgw_extensions_loop_req(struct rgw_radius_msg_meta **rad, sess_id_t **session, msg_t **diam_msg, struct rgw_client * cli) |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
350 { |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
351 int ret = 0; |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
352 struct rg_list * head = NULL, *li; |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
353 struct radius_msg * rad_ans = NULL; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
354 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
355 TRACE_ENTRY("%p %p %p %p", rad, session, diam_msg, cli); |
389
0bd2a40ca008
Fix bad handling of session creation
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
356 CHECK_PARAMS( rad && *rad && session && diam_msg && *diam_msg && cli); |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
357 |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
358 /* First, get the list of extensions for this message */ |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
359 CHECK_FCT( get_accelerator(&head, (*rad)->radius.hdr->code, (*rad)->serv_type) ); |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
360 |
385
03b512313cc1
Added code to handle sessions
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
378
diff
changeset
|
361 /* Loop in the list of extensions */ |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
362 for (li = head->next; li != head; li = li->next) { |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
363 struct ext_descr * ext = ((struct ext_accel_item *) li)->ext; |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
364 |
404
bad497b30f54
Protect in case of NULL callback
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
390
diff
changeset
|
365 if (ext->api.rga_rad_req_cb) { |
bad497b30f54
Protect in case of NULL callback
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
390
diff
changeset
|
366 TRACE_DEBUG(ANNOYING, "Calling next extension: %s", ext->extname); |
bad497b30f54
Protect in case of NULL callback
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
390
diff
changeset
|
367 ret = (*ext->api.rga_rad_req_cb)(ext->cs, session, &(*rad)->radius, &rad_ans, diam_msg, (void *)cli); |
bad497b30f54
Protect in case of NULL callback
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
390
diff
changeset
|
368 if (ret) |
bad497b30f54
Protect in case of NULL callback
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
390
diff
changeset
|
369 break; |
bad497b30f54
Protect in case of NULL callback
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
390
diff
changeset
|
370 } else { |
bad497b30f54
Protect in case of NULL callback
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
390
diff
changeset
|
371 TRACE_DEBUG(ANNOYING, "Skipping next extension: %s (NULL callback)", ext->extname); |
bad497b30f54
Protect in case of NULL callback
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
390
diff
changeset
|
372 } |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
373 } |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
374 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
375 /* If no error encountered, we're done here */ |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
376 if (ret == 0) |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
377 return 0; |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
378 |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
379 /* Destroy the Diameter temp message, if any */ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
380 if (*diam_msg) { |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
381 CHECK_FCT_DO( msg_free(*diam_msg, 1), ); |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
382 *diam_msg = NULL; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
383 } |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
384 |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
385 /* Destroy the session unless instructed to keep it */ |
374
883330e610e1
Progress on the echo_drop sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
371
diff
changeset
|
386 if (*session && (ret != -2) && (ret != -4)) { |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
387 CHECK_FCT_DO( sess_unlink(*session), ); |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
388 *session = NULL; |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
389 } |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
390 |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
391 /* Send the radius message back if required */ |
390
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
389
diff
changeset
|
392 if (((ret == -3) || (ret == -4)) && rad_ans && rad) { |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
389
diff
changeset
|
393 CHECK_FCT_DO( rgw_client_finish_send(&rad_ans, *rad, cli), /* It failed, it can't be helped... */); |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
394 } |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
395 |
374
883330e610e1
Progress on the echo_drop sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
371
diff
changeset
|
396 if (ret > 0) { |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
397 /* Critical error, log and exit */ |
374
883330e610e1
Progress on the echo_drop sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
371
diff
changeset
|
398 log_error("An error occurred while handling a RADIUS message, turn on DEBUG for details: %s\n", strerror(ret)); |
883330e610e1
Progress on the echo_drop sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
371
diff
changeset
|
399 return ret; |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
400 } |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
401 |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
402 /* Now, discard the message and return */ |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
403 rgw_msg_free(rad); |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
404 return 0; |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
405 |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
406 } |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
407 |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
408 void rgw_extensions_fini(void) |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
409 { |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
410 struct rg_list * item, *subitem; |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
411 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
412 TRACE_ENTRY(); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
413 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
414 CHECK_POSIX_DO( pthread_mutex_lock(&ext_mtx), ); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
415 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
416 /* Remove all elements from all accelerators */ |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
417 while ( ! rg_list_is_empty(&ext_accel_auth) ) { |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
418 item = ext_accel_auth.next; |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
419 rg_list_unlink(item); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
420 { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
421 struct ext_accel * accel = (struct ext_accel *)item; |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
422 while ( ! rg_list_is_empty(&accel->extensions) ) { |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
423 subitem = accel->extensions.next; |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
424 rg_list_unlink(subitem); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
425 free(subitem); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
426 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
427 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
428 free(item); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
429 } |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
430 while ( ! rg_list_is_empty(&ext_accel_acct) ) { |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
431 item = ext_accel_acct.next; |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
432 rg_list_unlink(item); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
433 { |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
434 struct ext_accel * accel = (struct ext_accel *)item; |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
435 while ( ! rg_list_is_empty(&accel->extensions) ) { |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
436 subitem = accel->extensions.next; |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
437 rg_list_unlink(subitem); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
438 free(subitem); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
439 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
440 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
441 free(item); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
442 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
443 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
444 /* Now destroy all extensions */ |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
445 while ( ! rg_list_is_empty(&ext_list) ) { |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
446 struct ext_descr * ext = (struct ext_descr *) ext_list.next; |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
355
diff
changeset
|
447 rg_list_unlink(&ext->chain); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
448 free(ext->conffile); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
449 free(ext->extname); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
450 free(ext->cc); |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
451 if (ext->cs) |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
364
diff
changeset
|
452 (*ext->api.rga_conf_free_cb)(ext->cs); |
355
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
453 dlclose(ext->dlo); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
454 free(ext); |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
455 } |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
456 |
b811859f9963
Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
457 CHECK_POSIX_DO( pthread_mutex_unlock(&ext_mtx), ); |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
458 } |