Mercurial > hg > waaad
annotate extensions/radius_gw/rgw_servers.c @ 415:540ed390c04f
Added sess_destroy function
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Tue, 16 Jun 2009 13:37:46 +0900 |
parents | f63adc1b3e99 |
children |
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:
368
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 server(s): opening sockets, receiving messages, ... */ |
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:
363
diff
changeset
|
38 #include "radius_gw.h" |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
39 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
40 #define RADIUS_MAX_MSG_LEN 3000 |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
41 |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
42 /* Declare the rgw_servers */ |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
43 struct rgw_servs rgw_servers; |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
44 |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
45 void rgw_servers_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
|
46 { |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
47 char ipstr[INET6_ADDRSTRLEN]; |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
48 |
354
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
49 if ( ! TRACE_BOOL(FULL) ) |
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
50 return; |
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
51 |
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
52 log_debug(" auth server:\n"); |
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
53 log_debug(" disabled..... : %s\n", rgw_servers.auth_serv.disabled ? "TRUE":"false"); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
54 log_debug(" IP disabled.. : %s\n", rgw_servers.auth_serv.ip_disabled ? "TRUE":"false"); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
55 log_debug(" IPv6 disabled : %s\n", rgw_servers.auth_serv.ip6_disabled ? "TRUE":"false"); |
354
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
56 log_debug(" port......... : %hu\n", ntohs(rgw_servers.auth_serv.port)); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
57 inet_ntop(AF_INET, &rgw_servers.auth_serv.ip_endpoint,ipstr,sizeof(ipstr)); |
354
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
58 log_debug(" IP bind...... : %s\n", ipstr); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
59 inet_ntop(AF_INET6, &rgw_servers.auth_serv.ip6_endpoint,ipstr,sizeof(ipstr)); |
354
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
60 log_debug(" IPv6 bind.... : %s\n", ipstr); |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
61 |
354
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
62 log_debug(" acct server:\n"); |
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
63 log_debug(" disabled..... : %s\n", rgw_servers.acct_serv.disabled ? "TRUE":"false"); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
64 log_debug(" IP disabled.. : %s\n", rgw_servers.acct_serv.ip_disabled ? "TRUE":"false"); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
65 log_debug(" IPv6 disabled : %s\n", rgw_servers.acct_serv.ip6_disabled ? "TRUE":"false"); |
354
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
66 log_debug(" port......... : %hu\n", ntohs(rgw_servers.acct_serv.port)); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
67 inet_ntop(AF_INET, &rgw_servers.acct_serv.ip_endpoint,ipstr,sizeof(ipstr)); |
354
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
68 log_debug(" IP bind...... : %s\n", ipstr); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
69 inet_ntop(AF_INET6, &rgw_servers.acct_serv.ip6_endpoint,ipstr,sizeof(ipstr)); |
354
e8f36f5342d1
Fixed trace display in radius_gw
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
353
diff
changeset
|
70 log_debug(" IPv6 bind.... : %s\n", ipstr); |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
71 |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
72 } |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
73 |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
74 static struct servers_data { |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
75 int type; /* auth or acct */ |
390
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
76 int family; /* AF_INET or AF_INET6 */ |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
77 int sock; /* the socket number */ |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
78 pthread_t th; /* the running server thread, or NULL */ |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
79 char name[10]; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
80 } SERVERS[4]; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
81 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
82 int rgw_servers_init(void) |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
83 { |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
84 memset(&rgw_servers, 0, sizeof(rgw_servers)); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
85 memset(&SERVERS[0], 0, sizeof(SERVERS)); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
86 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
87 rgw_servers.auth_serv.port = htons(1812); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
88 rgw_servers.auth_serv.ip_endpoint.s_addr = INADDR_ANY; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
89 memcpy(&rgw_servers.auth_serv.ip6_endpoint, &in6addr_any, sizeof(struct in6_addr)); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
90 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
91 rgw_servers.acct_serv.port = htons(1813); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
92 rgw_servers.acct_serv.ip_endpoint.s_addr = INADDR_ANY; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
93 memcpy(&rgw_servers.acct_serv.ip6_endpoint, &in6addr_any, sizeof(struct in6_addr)); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
94 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
95 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
96 return 0; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
97 } |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
98 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
99 static void * server_thread(void * param) |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
100 { |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
101 struct servers_data * me = (struct servers_data *)param; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
102 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
103 TRACE_ENTRY("%p", param); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
104 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
105 CHECK_PARAMS_DO(param, return NULL); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
106 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
107 log_set_thread_name( me->name, "rgw server" ); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
108 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
109 /* Now loop on this socket, parse and queue each message received, until thread is cancelled. */ |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
110 while (1) { |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
111 struct sockaddr_storage from; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
112 socklen_t fromlen = sizeof(from); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
113 int len; |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
114 struct rgw_client * nas_info = NULL; |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
115 uint16_t port = 0; |
360
2206c7f2945a
Added md5 code to check authenticator
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
359
diff
changeset
|
116 unsigned char buf[RADIUS_MAX_MSG_LEN]; |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
117 struct rgw_radius_msg_meta *msg = NULL; |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
118 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
119 pthread_testcancel(); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
120 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
121 /* receive the next message */ |
360
2206c7f2945a
Added md5 code to check authenticator
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
359
diff
changeset
|
122 CHECK_SYS_DO( len = recvfrom( me->sock, &buf[0], sizeof(buf), 0, (struct sockaddr *) &from, &fromlen), break ); |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
123 |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
124 /* Get the port */ |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
125 if (from.ss_family == AF_INET) |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
126 port = ((struct sockaddr_in *)&from)->sin_port; |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
127 if (from.ss_family == AF_INET6) |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
128 port = ((struct sockaddr_in6 *)&from)->sin6_port; |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
129 if (!port) { |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
130 TRACE_DEBUG(INFO, "Invalid port (family: %d), discarding...", from.ss_family); |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
131 continue; |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
132 } |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
133 |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
134 if (TRACE_BOOL(FULL)) { |
358
505a9ee1244b
Separated attributes and codes string definitions to inc files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
135 char ipstr[INET6_ADDRSTRLEN]; |
388
1a4902b216f8
Improved initial handling of RADIUS messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
371
diff
changeset
|
136 char portstr[8]; |
1a4902b216f8
Improved initial handling of RADIUS messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
371
diff
changeset
|
137 int ret; |
358
505a9ee1244b
Separated attributes and codes string definitions to inc files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
138 |
388
1a4902b216f8
Improved initial handling of RADIUS messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
371
diff
changeset
|
139 if (ret = getnameinfo((struct sockaddr *)&from, fromlen, &ipstr[0], INET6_ADDRSTRLEN, &portstr[0], sizeof(portstr), NI_NUMERICHOST | NI_NUMERICSERV)) { |
1a4902b216f8
Improved initial handling of RADIUS messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
371
diff
changeset
|
140 TRACE_DEBUG(FULL, "Received %d bytes from unknown source: %s", len, gai_strerror(ret)); |
1a4902b216f8
Improved initial handling of RADIUS messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
371
diff
changeset
|
141 } else { |
1a4902b216f8
Improved initial handling of RADIUS messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
371
diff
changeset
|
142 TRACE_DEBUG(FULL, "Received %d bytes from [%s]:%s", len, ipstr, portstr); |
358
505a9ee1244b
Separated attributes and codes string definitions to inc files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
143 } |
505a9ee1244b
Separated attributes and codes string definitions to inc files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
144 } |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
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:
363
diff
changeset
|
146 /* Search the associated client definition, if any */ |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
147 CHECK_FCT_DO( rgw_clients_search((struct sockaddr *) &from, &nas_info), |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
148 { |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
149 TRACE_DEBUG(FULL, "Discarding message from unknown RADIUS client"); |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
150 continue; |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
151 } ); |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
152 |
360
2206c7f2945a
Added md5 code to check authenticator
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
359
diff
changeset
|
153 |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
154 /* parse the message or loop if message is bad */ |
360
2206c7f2945a
Added md5 code to check authenticator
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
359
diff
changeset
|
155 CHECK_FCT_DO( rgw_msg_parse(&buf[0], len, &msg), |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
156 { |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
157 TRACE_DEBUG(INFO, "Discarding invalid RADIUS message"); |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
158 rgw_clients_dispose(&nas_info); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
159 continue; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
160 } ); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
161 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
162 msg->serv_type = me->type; |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
163 msg->port = port; |
361
fbe54f8d535e
Added some metadata in the radius messages
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
360
diff
changeset
|
164 |
368
ccc9905c4525
Cleaned RADIUS message dump format
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
365
diff
changeset
|
165 rgw_msg_dump(msg); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
166 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
167 /* queue the message for a worker thread */ |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
168 CHECK_FCT_DO( rgw_work_add(msg, nas_info), break ); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
169 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
170 /* Then wait for next incoming message */ |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
171 } |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
172 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
173 TRACE_DEBUG(INFO, "Error: server thread terminated!!!"); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
174 return NULL; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
175 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
176 } |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
177 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
178 /* Set the socket options for UDP sockets, before bind is called */ |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
179 static int _udp_setsockopt(int family, int sk) |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
180 { |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
181 int ret = 0; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
182 int opt; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
183 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
184 /* In case of v6 address, force the v6only option, we use a different socket for v4 */ |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
185 #ifdef IPV6_V6ONLY |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
186 if (family == AF_INET6) { |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
187 opt = 1; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
188 ret = setsockopt(sk, IPPROTO_IPV6, IPV6_V6ONLY, &opt, sizeof(opt)); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
189 if (ret != 0) { |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
190 ret = errno; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
191 TRACE_DEBUG(INFO, "Unable to set the socket IPV6_V6ONLY option: %s", strerror(ret)); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
192 return ret; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
193 } |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
194 } |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
195 #endif /* IPV6_V6ONLY */ |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
196 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
197 return 0; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
198 } |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
199 |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
200 #define UDPSERV( _type_, _portval_, _family_ ) { \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
201 if ( (! rgw_servers. _type_ ## _serv.disabled) \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
202 && ( ! rgw_servers. _type_ ## _serv.ip ## _family_ ## _disabled ) ) { \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
203 struct sockaddr_in ## _family_ sin ## _family_ ; \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
204 CHECK_SYS( SERVERS[idx].sock = socket(AF_INET ## _family_, SOCK_DGRAM, 0) ); \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
205 memset(& sin ## _family_, 0, sizeof(struct sockaddr_in ## _family_)); \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
206 sin ## _family_ . sin ## _family_ ## _family = AF_INET ## _family_; \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
207 sin ## _family_ . sin ## _family_ ## _port = rgw_servers. _type_ ## _serv . port; \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
208 memcpy( &sin ## _family_ .sin ## _family_ ## _addr, \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
209 &rgw_servers. _type_ ## _serv . ip ## _family_ ## _endpoint, \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
210 sizeof(struct in ## _family_ ## _addr) ); \ |
358
505a9ee1244b
Separated attributes and codes string definitions to inc files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
356
diff
changeset
|
211 TRACE_DEBUG(ANNOYING, "Setting socket options..."); \ |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
212 CHECK_FCT( _udp_setsockopt(AF_INET ## _family_, SERVERS[idx].sock) ); \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
213 TRACE_DEBUG(ANNOYING, "Binding " #_type_ " ip" #_family_ " server..."); \ |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
214 CHECK_SYS( bind( SERVERS[idx].sock, \ |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
215 (struct sockaddr *)&sin ## _family_, \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
216 sizeof(struct sockaddr_in ## _family_) ) ); \ |
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
217 SERVERS[idx].type = _portval_; \ |
390
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
218 SERVERS[idx].family = AF_INET ## _family_; \ |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
219 snprintf(&SERVERS[idx].name[0], sizeof(SERVERS[idx].name), # _type_ "/ip" #_family_); \ |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
220 CHECK_POSIX( pthread_create(&SERVERS[idx].th, NULL, server_thread, &SERVERS[idx]) ); \ |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
221 idx++; \ |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
222 } \ |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
223 } |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
224 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
225 |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
226 int rgw_servers_start(void) |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
227 { |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
228 int idx = 0; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
229 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
230 TRACE_ENTRY(); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
231 |
365
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
232 UDPSERV( auth, RGW_EXT_TYPE_AUTH, ); |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
233 UDPSERV( auth, RGW_EXT_TYPE_AUTH, 6 ); |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
234 UDPSERV( acct, RGW_EXT_TYPE_ACCT, ); |
0146c60af026
Moved to the hostap implementation of RADIUS processing (copied radius.* and md5.* files)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
363
diff
changeset
|
235 UDPSERV( acct, RGW_EXT_TYPE_ACCT, 6 ); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
236 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
237 TRACE_DEBUG(FULL, "%d UDP servers started succesfully.", idx); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
238 return 0; |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
239 } |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
240 |
390
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
241 int rgw_servers_send(int type, unsigned char *buf, size_t buflen, struct sockaddr *to, uint16_t to_port) |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
242 { |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
243 int idx = 0; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
244 int ret = 0; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
245 struct sockaddr_storage sto; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
246 size_t sto_len = 0; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
247 |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
248 /* Find the appropriate server */ |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
249 for (idx = 0; idx < sizeof(SERVERS) / sizeof(SERVERS[0]); idx++) { |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
250 if ( SERVERS[idx].sock && (type == SERVERS[idx].type) && (to->sa_family == SERVERS[idx].family) ) { |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
251 ret = 1; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
252 break; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
253 } |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
254 } |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
255 |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
256 if (!ret) { |
415
540ed390c04f
Added sess_destroy function
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
393
diff
changeset
|
257 TRACE_DEBUG(INFO, "Trying to send a message from a disabled server: %s / %s", |
390
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
258 (type == RGW_EXT_TYPE_AUTH) ? "Auth" : "Acct", |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
259 (to->sa_family == AF_INET) ? "IPv4" : "IPv6"); |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
260 return EINVAL; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
261 } |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
262 |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
263 /* Prepare the destination info */ |
415
540ed390c04f
Added sess_destroy function
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
393
diff
changeset
|
264 memset(&sto, 0, sizeof(sto)); |
390
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
265 if (to->sa_family == AF_INET) { |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
266 memcpy(&sto, to, sizeof(struct sockaddr_in)); |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
267 ((struct sockaddr_in *)&sto)->sin_port = to_port; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
268 sto_len = sizeof(struct sockaddr_in); |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
269 } else { |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
270 memcpy(&sto, to, sizeof(struct sockaddr_in6)); |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
271 ((struct sockaddr_in6 *)&sto)->sin6_port = to_port; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
272 sto_len = sizeof(struct sockaddr_in6); |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
273 } |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
274 |
393
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
275 if (TRACE_BOOL(FULL)) { |
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
276 char ipstr[INET6_ADDRSTRLEN]; |
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
277 char portstr[8]; |
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
278 |
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
279 if (ret = getnameinfo((struct sockaddr *)&sto, sto_len, &ipstr[0], INET6_ADDRSTRLEN, &portstr[0], sizeof(portstr), NI_NUMERICHOST | NI_NUMERICSERV)) { |
415
540ed390c04f
Added sess_destroy function
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
393
diff
changeset
|
280 TRACE_DEBUG(FULL, "Sending %d bytes to unknown destination: %s", buflen, gai_strerror(ret)); |
393
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
281 } else { |
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
282 TRACE_DEBUG(FULL, "Sending %d bytes to [%s]:%s", buflen, ipstr, portstr); |
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
283 } |
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
284 } |
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
285 |
390
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
286 /* Send */ |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
287 ret = sendto(SERVERS[idx].sock, buf, buflen, 0, (struct sockaddr *)&sto, sto_len); |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
288 if (ret < 0) { |
393
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
289 ret = errno; |
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
290 TRACE_DEBUG(INFO, "An error occurred while sending the RADIUS message: %s", strerror(ret)); |
f63adc1b3e99
Renamed accounting sub extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
392
diff
changeset
|
291 return ret; |
390
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
292 } |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
293 if (ret != buflen) { |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
294 TRACE_DEBUG(INFO, "The message was not sent properly: %d bytes / %g", ret, buflen); |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
295 return EAGAIN; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
296 } |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
297 |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
298 /* Done :) */ |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
299 return 0; |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
300 } |
9d9c37868957
Added code to send RADIUS answers
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
388
diff
changeset
|
301 |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
302 void rgw_servers_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
|
303 { |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
304 int idx = 0; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
305 |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
306 for (idx = 0; idx < sizeof(SERVERS) / sizeof(SERVERS[0]); idx++) { |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
307 if (SERVERS[idx].sock == 0) |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
308 break; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
309 |
363
9d330bd07134
Progress on the radius_gw gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
361
diff
changeset
|
310 CHECK_FCT_DO( rg_thread_term(&SERVERS[idx].th), /* continue */ ); |
356
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
311 close(SERVERS[idx].sock); |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
312 SERVERS[idx].sock = 0; |
555dc5a58aef
Added server code for radius extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
354
diff
changeset
|
313 } |
353
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
314 |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
315 } |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
316 |
6ca21598562a
Unified TRACE_DEBUG handling between daemon and extensions + some progress on radius gateway
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
317 |