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
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: 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
"Welcome to our mercurial repository"