annotate extensions/radius_gw/rgw_extensions.c @ 415:540ed390c04f

Added sess_destroy function
author Sebastien Decugis <sdecugis@nict.go.jp>
date Tue, 16 Jun 2009 13:37:46 +0900
parents 3a8e91184d4d
children 8155408c6dc5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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);
406
3a8e91184d4d Added code to handle RADIUS client deconnection
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 404
diff changeset
199 new->dlo = dlopen(extfile, RTLD_LAZY | RTLD_GLOBAL);
355
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
f8509d27e453 Clean up on traces
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 374
diff changeset
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
f8509d27e453 Clean up on traces
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 374
diff changeset
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
f8509d27e453 Clean up on traces
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 374
diff changeset
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);
415
540ed390c04f Added sess_destroy function
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 406
diff changeset
367 ret = (*ext->api.rga_rad_req_cb)(ext->cs, *session, &(*rad)->radius, &rad_ans, diam_msg, (void *)cli);
404
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 {
415
540ed390c04f Added sess_destroy function
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 406
diff changeset
371 TRACE_DEBUG(ANNOYING, "Skipping extension '%s' (NULL callback)", ext->extname);
404
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
415
540ed390c04f Added sess_destroy function
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 406
diff changeset
385 /* Destroy the session, there won't be a reply message to retrieve the data */
540ed390c04f Added sess_destroy function
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 406
diff changeset
386 if (*session) {
540ed390c04f Added sess_destroy function
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 406
diff changeset
387 CHECK_FCT_DO( sess_destroy(session), );
363
9d330bd07134 Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 356
diff changeset
388 }
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 /* Send the radius message back if required */
415
540ed390c04f Added sess_destroy function
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 406
diff changeset
391 if ((ret == -2) && rad_ans && rad) {
390
9d9c37868957 Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 389
diff changeset
392 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
393 }
9d330bd07134 Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 356
diff changeset
394
374
883330e610e1 Progress on the echo_drop sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 371
diff changeset
395 if (ret > 0) {
363
9d330bd07134 Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 356
diff changeset
396 /* Critical error, log and exit */
374
883330e610e1 Progress on the echo_drop sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 371
diff changeset
397 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
398 return ret;
363
9d330bd07134 Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 356
diff changeset
399 }
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 /* 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
402 rgw_msg_free(rad);
363
9d330bd07134 Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 356
diff changeset
403 return 0;
9d330bd07134 Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 356
diff changeset
404
353
6ca21598562a Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
405 }
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 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
408 {
356
555dc5a58aef Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 355
diff changeset
409 struct rg_list * item, *subitem;
355
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
410
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
411 TRACE_ENTRY();
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
412
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
413 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
414
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
415 /* Remove all elements from all accelerators */
356
555dc5a58aef Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 355
diff changeset
416 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
417 item = ext_accel_auth.next;
356
555dc5a58aef Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 355
diff changeset
418 rg_list_unlink(item);
355
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
419 {
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
420 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
421 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
422 subitem = accel->extensions.next;
356
555dc5a58aef Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 355
diff changeset
423 rg_list_unlink(subitem);
355
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
424 free(subitem);
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
425 }
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 free(item);
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
428 }
356
555dc5a58aef Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 355
diff changeset
429 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
430 item = ext_accel_acct.next;
356
555dc5a58aef Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 355
diff changeset
431 rg_list_unlink(item);
355
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
432 {
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
433 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
434 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
435 subitem = accel->extensions.next;
356
555dc5a58aef Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 355
diff changeset
436 rg_list_unlink(subitem);
355
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
437 free(subitem);
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
438 }
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 free(item);
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
441 }
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 /* Now destroy all extensions */
356
555dc5a58aef Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 355
diff changeset
444 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
445 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
446 rg_list_unlink(&ext->chain);
355
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
447 free(ext->conffile);
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
448 free(ext->extname);
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
449 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
450 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
451 (*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
452 dlclose(ext->dlo);
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
453 free(ext);
b811859f9963 Added extensions management in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 353
diff changeset
454 }
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 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
457 }
"Welcome to our mercurial repository"