• Home
  • Raw
  • Download

Lines Matching full:radius

2  * RADIUS client
13 #include "radius.h"
17 /* Defaults for RADIUS retransmit values (exponential backoff) */
20 * RADIUS_CLIENT_FIRST_WAIT - RADIUS client timeout for first retry in seconds
25 * RADIUS_CLIENT_MAX_WAIT - RADIUS client maximum retry timeout in seconds
30 * RADIUS_CLIENT_MAX_FAILOVER - RADIUS client maximum retries
38 * RADIUS_CLIENT_MAX_ENTRIES - RADIUS client maximum pending messages
46 * RADIUS_CLIENT_NUM_FAILOVER - RADIUS client failover point
48 * The number of failed retry attempts after which the RADIUS server will be
55 * struct radius_rx_handler - RADIUS client RX handler
57 * This data structure is used internally inside the RADIUS client module to
59 * radius_client_register() and unregistered when the RADIUS client is
64 * handler - Received RADIUS message handler
80 * struct radius_msg_list - RADIUS client message retransmit list
82 * This data structure is used internally inside the RADIUS client module to
83 * store pending RADIUS requests that may still need to be retransmitted.
89 * This is used to find RADIUS messages for the same STA.
94 * msg - RADIUS message
134 * shared_secret - Shared secret with the target RADIUS server
153 * struct radius_client_data - Internal RADIUS client data
155 * This data structure is used internally inside the RADIUS client module.
158 * calls to other functions as an identifier for the RADIUS client instance.
167 * conf - RADIUS client configuration (list of RADIUS servers to use)
172 * auth_serv_sock - IPv4 socket for RADIUS authentication messages
177 * acct_serv_sock - IPv4 socket for RADIUS accounting messages
182 * auth_serv_sock6 - IPv6 socket for RADIUS authentication messages
187 * acct_serv_sock6 - IPv6 socket for RADIUS accounting messages
192 * auth_sock - Currently used socket for RADIUS authentication server
197 * acct_sock - Currently used socket for RADIUS accounting server
222 * msgs - Pending outgoing RADIUS messages
232 * next_radius_identifier - Next RADIUS message identifier to use
249 radius_change_server(struct radius_client_data *radius,
253 static int radius_client_init_acct(struct radius_client_data *radius);
254 static int radius_client_init_auth(struct radius_client_data *radius);
255 static void radius_client_auth_failover(struct radius_client_data *radius);
256 static void radius_client_acct_failover(struct radius_client_data *radius);
267 * radius_client_register - Register a RADIUS client RX handler
268 * @radius: RADIUS client context from radius_client_init()
269 * @msg_type: RADIUS client type (RADIUS_AUTH or RADIUS_ACCT)
270 * @handler: Handler for received RADIUS messages
274 * This function is used to register a handler for processing received RADIUS
276 * be called whenever a RADIUS message is received from the active server.
278 * There can be multiple registered RADIUS message handlers. The handlers will
282 int radius_client_register(struct radius_client_data *radius, in radius_client_register() argument
295 handlers = &radius->acct_handlers; in radius_client_register()
296 num = &radius->num_acct_handlers; in radius_client_register()
298 handlers = &radius->auth_handlers; in radius_client_register()
299 num = &radius->num_auth_handlers; in radius_client_register()
318 * @radius: RADIUS client context from radius_client_init()
326 void radius_client_set_interim_error_cb(struct radius_client_data *radius, in radius_client_set_interim_error_cb() argument
330 radius->interim_error_cb = cb; in radius_client_set_interim_error_cb()
331 radius->interim_error_cb_ctx = ctx; in radius_client_set_interim_error_cb()
339 static int radius_client_handle_send_error(struct radius_client_data *radius, in radius_client_handle_send_error() argument
344 wpa_printf(MSG_INFO, "send[RADIUS,s=%d]: %s", s, strerror(errno)); in radius_client_handle_send_error()
347 hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS, in radius_client_handle_send_error()
353 radius_client_init_acct(radius); in radius_client_handle_send_error()
356 radius_client_init_auth(radius); in radius_client_handle_send_error()
366 static int radius_client_retransmit(struct radius_client_data *radius, in radius_client_retransmit() argument
370 struct hostapd_radius_servers *conf = radius->conf; in radius_client_retransmit()
381 if (radius->acct_sock < 0) in radius_client_retransmit()
382 radius_client_init_acct(radius); in radius_client_retransmit()
383 if (radius->acct_sock < 0 && conf->num_acct_servers > 1) { in radius_client_retransmit()
384 prev_num_msgs = radius->num_msgs; in radius_client_retransmit()
385 radius_client_acct_failover(radius); in radius_client_retransmit()
386 if (prev_num_msgs != radius->num_msgs) in radius_client_retransmit()
389 s = radius->acct_sock; in radius_client_retransmit()
398 if (radius->auth_sock < 0) in radius_client_retransmit()
399 radius_client_init_auth(radius); in radius_client_retransmit()
400 if (radius->auth_sock < 0 && conf->num_auth_servers > 1) { in radius_client_retransmit()
401 prev_num_msgs = radius->num_msgs; in radius_client_retransmit()
402 radius_client_auth_failover(radius); in radius_client_retransmit()
403 if (prev_num_msgs != radius->num_msgs) in radius_client_retransmit()
406 s = radius->auth_sock; in radius_client_retransmit()
417 "RADIUS: Failed to transmit interim accounting update to " in radius_client_retransmit()
420 if (radius->interim_error_cb) in radius_client_retransmit()
421 radius->interim_error_cb(entry->addr, in radius_client_retransmit()
422 radius->interim_error_cb_ctx); in radius_client_retransmit()
428 "RADIUS: No valid socket for retransmission"); in radius_client_retransmit()
445 hdr->identifier = radius_client_get_id(radius); in radius_client_retransmit()
452 "RADIUS: Updated Acct-Delay-Time to %u for retransmission", in radius_client_retransmit()
456 if (radius->conf->msg_dumps) in radius_client_retransmit()
464 "RADIUS: Removing un-ACKed message due to too many failed retransmit attempts"); in radius_client_retransmit()
470 hostapd_logger(radius->ctx, entry->addr, HOSTAPD_MODULE_RADIUS, in radius_client_retransmit()
471 HOSTAPD_LEVEL_DEBUG, "Resending RADIUS message (id=%d)", in radius_client_retransmit()
477 if (radius_client_handle_send_error(radius, s, entry->msg_type) in radius_client_retransmit()
493 struct radius_client_data *radius = eloop_ctx; in radius_client_timer() local
501 entry = radius->msgs; in radius_client_timer()
509 s = entry->msg_type == RADIUS_AUTH ? radius->auth_sock : in radius_client_timer()
510 radius->acct_sock; in radius_client_timer()
524 radius_client_auth_failover(radius); in radius_client_timer()
527 radius_client_acct_failover(radius); in radius_client_timer()
529 entry = radius->msgs; in radius_client_timer()
534 prev_num_msgs = radius->num_msgs; in radius_client_timer()
536 radius_client_retransmit(radius, entry, now.sec)) { in radius_client_timer()
540 radius->msgs = entry->next; in radius_client_timer()
545 radius->num_msgs--; in radius_client_timer()
549 if (prev_num_msgs != radius->num_msgs) { in radius_client_timer()
551 "RADIUS: Message removed from queue - restart from beginning"); in radius_client_timer()
552 entry = radius->msgs; in radius_client_timer()
564 if (radius->msgs) { in radius_client_timer()
567 eloop_cancel_timeout(radius_client_timer, radius, NULL); in radius_client_timer()
569 radius_client_timer, radius, NULL); in radius_client_timer()
570 hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS, in radius_client_timer()
571 HOSTAPD_LEVEL_DEBUG, "Next RADIUS client " in radius_client_timer()
578 static void radius_client_auth_failover(struct radius_client_data *radius) in radius_client_auth_failover() argument
580 struct hostapd_radius_servers *conf = radius->conf; in radius_client_auth_failover()
586 hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS, in radius_client_auth_failover()
592 for (entry = radius->msgs; entry; entry = entry->next) { in radius_client_auth_failover()
601 radius_change_server(radius, next, old, in radius_client_auth_failover()
602 radius->auth_serv_sock, in radius_client_auth_failover()
603 radius->auth_serv_sock6, 1); in radius_client_auth_failover()
607 static void radius_client_acct_failover(struct radius_client_data *radius) in radius_client_acct_failover() argument
609 struct hostapd_radius_servers *conf = radius->conf; in radius_client_acct_failover()
615 hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS, in radius_client_acct_failover()
621 for (entry = radius->msgs; entry; entry = entry->next) { in radius_client_acct_failover()
631 radius_change_server(radius, next, old, in radius_client_acct_failover()
632 radius->acct_serv_sock, in radius_client_acct_failover()
633 radius->acct_serv_sock6, 0); in radius_client_acct_failover()
637 static void radius_client_update_timeout(struct radius_client_data *radius) in radius_client_update_timeout() argument
643 eloop_cancel_timeout(radius_client_timer, radius, NULL); in radius_client_update_timeout()
645 if (radius->msgs == NULL) { in radius_client_update_timeout()
650 for (entry = radius->msgs; entry; entry = entry->next) { in radius_client_update_timeout()
658 eloop_register_timeout(first - now.sec, 0, radius_client_timer, radius, in radius_client_update_timeout()
660 hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS, in radius_client_update_timeout()
661 HOSTAPD_LEVEL_DEBUG, "Next RADIUS client retransmit in" in radius_client_update_timeout()
666 static void radius_client_list_add(struct radius_client_data *radius, in radius_client_list_add() argument
683 wpa_printf(MSG_INFO, "RADIUS: Failed to add packet into retransmit list"); in radius_client_list_add()
702 entry->next = radius->msgs; in radius_client_list_add()
703 radius->msgs = entry; in radius_client_list_add()
704 radius_client_update_timeout(radius); in radius_client_list_add()
706 if (radius->num_msgs >= RADIUS_CLIENT_MAX_ENTRIES) { in radius_client_list_add()
707 wpa_printf(MSG_INFO, "RADIUS: Removing the oldest un-ACKed packet due to retransmit list limits"); in radius_client_list_add()
718 radius->num_msgs++; in radius_client_list_add()
723 * radius_client_send - Send a RADIUS request
724 * @radius: RADIUS client context from radius_client_init()
725 * @msg: RADIUS message to be sent
730 * This function is used to transmit a RADIUS authentication (RADIUS_AUTH) or
747 int radius_client_send(struct radius_client_data *radius, in radius_client_send() argument
751 struct hostapd_radius_servers *conf = radius->conf; in radius_client_send()
759 if (conf->acct_server && radius->acct_sock < 0) in radius_client_send()
760 radius_client_init_acct(radius); in radius_client_send()
762 if (conf->acct_server == NULL || radius->acct_sock < 0 || in radius_client_send()
764 hostapd_logger(radius->ctx, NULL, in radius_client_send()
774 s = radius->acct_sock; in radius_client_send()
777 if (conf->auth_server && radius->auth_sock < 0) in radius_client_send()
778 radius_client_init_auth(radius); in radius_client_send()
780 if (conf->auth_server == NULL || radius->auth_sock < 0 || in radius_client_send()
782 hostapd_logger(radius->ctx, NULL, in radius_client_send()
792 s = radius->auth_sock; in radius_client_send()
796 hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS, in radius_client_send()
797 HOSTAPD_LEVEL_DEBUG, "Sending RADIUS message to %s " in radius_client_send()
805 radius_client_handle_send_error(radius, s, msg_type); in radius_client_send()
807 radius_client_list_add(radius, msg, msg_type, shared_secret, in radius_client_send()
816 struct radius_client_data *radius = eloop_ctx; in radius_client_receive() local
817 struct hostapd_radius_servers *conf = radius->conf; in radius_client_receive()
833 handlers = radius->acct_handlers; in radius_client_receive()
834 num_handlers = radius->num_acct_handlers; in radius_client_receive()
837 handlers = radius->auth_handlers; in radius_client_receive()
838 num_handlers = radius->num_auth_handlers; in radius_client_receive()
849 wpa_printf(MSG_INFO, "recvmsg[RADIUS]: %s", strerror(errno)); in radius_client_receive()
853 hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS, in radius_client_receive()
854 HOSTAPD_LEVEL_DEBUG, "Received %d bytes from RADIUS " in radius_client_receive()
858 wpa_printf(MSG_INFO, "RADIUS: Possibly too long UDP frame for our buffer - dropping it"); in radius_client_receive()
864 wpa_printf(MSG_INFO, "RADIUS: Parsing incoming frame failed"); in radius_client_receive()
870 hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS, in radius_client_receive()
871 HOSTAPD_LEVEL_DEBUG, "Received RADIUS message"); in radius_client_receive()
891 req = radius->msgs; in radius_client_receive()
894 * alternative RADIUS servers (?) */ in radius_client_receive()
907 hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS, in radius_client_receive()
909 "No matching RADIUS request found (type=%d " in radius_client_receive()
918 hostapd_logger(radius->ctx, req->addr, HOSTAPD_MODULE_RADIUS, in radius_client_receive()
920 "Received RADIUS packet matched with a pending " in radius_client_receive()
925 /* Remove ACKed RADIUS packet from retransmit list */ in radius_client_receive()
929 radius->msgs = req->next; in radius_client_receive()
930 radius->num_msgs--; in radius_client_receive()
957 hostapd_logger(radius->ctx, req->addr, HOSTAPD_MODULE_RADIUS, in radius_client_receive()
958 HOSTAPD_LEVEL_DEBUG, "No RADIUS RX handler found " in radius_client_receive()
971 * radius_client_get_id - Get an identifier for a new RADIUS message
972 * @radius: RADIUS client context from radius_client_init()
976 * for a new RADIUS message.
978 u8 radius_client_get_id(struct radius_client_data *radius) in radius_client_get_id() argument
981 u8 id = radius->next_radius_identifier++; in radius_client_get_id()
984 * using new reply from the RADIUS server with an old request */ in radius_client_get_id()
985 entry = radius->msgs; in radius_client_get_id()
989 hostapd_logger(radius->ctx, entry->addr, in radius_client_get_id()
992 "Removing pending RADIUS message, " in radius_client_get_id()
997 radius->msgs = entry->next; in radius_client_get_id()
1014 * radius_client_flush - Flush all pending RADIUS client messages
1015 * @radius: RADIUS client context from radius_client_init()
1018 void radius_client_flush(struct radius_client_data *radius, int only_auth) in radius_client_flush() argument
1022 if (!radius) in radius_client_flush()
1026 entry = radius->msgs; in radius_client_flush()
1033 radius->msgs = entry->next; in radius_client_flush()
1038 radius->num_msgs--; in radius_client_flush()
1045 if (radius->msgs == NULL) in radius_client_flush()
1046 eloop_cancel_timeout(radius_client_timer, radius, NULL); in radius_client_flush()
1050 static void radius_client_update_acct_msgs(struct radius_client_data *radius, in radius_client_update_acct_msgs() argument
1056 if (!radius) in radius_client_update_acct_msgs()
1059 for (entry = radius->msgs; entry; entry = entry->next) { in radius_client_update_acct_msgs()
1071 radius_change_server(struct radius_client_data *radius, in radius_change_server() argument
1085 struct hostapd_radius_servers *conf = radius->conf; in radius_change_server()
1090 hostapd_logger(radius->ctx, NULL, HOSTAPD_MODULE_RADIUS, in radius_change_server()
1100 radius_client_flush(radius, 1); in radius_change_server()
1107 /* Pending RADIUS packets used different shared secret, so in radius_change_server()
1110 * since they would require more changes and the new RADIUS in radius_change_server()
1115 radius_client_flush(radius, 1); in radius_change_server()
1118 radius, nserv->shared_secret, in radius_change_server()
1124 for (entry = radius->msgs; oserv && entry; entry = entry->next) { in radius_change_server()
1133 if (radius->msgs) { in radius_change_server()
1134 eloop_cancel_timeout(radius_client_timer, radius, NULL); in radius_change_server()
1136 radius_client_timer, radius, NULL); in radius_change_server()
1167 "RADIUS: No server socket available (af=%d sock=%d sock6=%d auth=%d", in radius_change_server()
1175 wpa_printf(MSG_INFO, "disconnect[radius]: %s", strerror(errno)); in radius_change_server()
1183 "RADIUS: setsockopt[SO_BINDTODEVICE]: %s", in radius_change_server()
1189 "RADIUS: Bound client socket to device: %s", in radius_change_server()
1221 wpa_printf(MSG_INFO, "bind[radius]: %s", in radius_change_server()
1228 wpa_printf(MSG_INFO, "connect[radius]: %s", strerror(errno)); in radius_change_server()
1238 wpa_printf(MSG_DEBUG, "RADIUS local address: %s:%u", in radius_change_server()
1248 wpa_printf(MSG_DEBUG, "RADIUS local address: %s:%u", in radius_change_server()
1260 radius->auth_sock = sel_sock; in radius_change_server()
1262 radius->acct_sock = sel_sock; in radius_change_server()
1270 struct radius_client_data *radius = eloop_ctx; in radius_retry_primary_timer() local
1271 struct hostapd_radius_servers *conf = radius->conf; in radius_retry_primary_timer()
1274 if (radius->auth_sock >= 0 && conf->auth_servers && in radius_retry_primary_timer()
1278 if (radius_change_server(radius, conf->auth_server, oserv, in radius_retry_primary_timer()
1279 radius->auth_serv_sock, in radius_retry_primary_timer()
1280 radius->auth_serv_sock6, 1) < 0) { in radius_retry_primary_timer()
1282 radius_change_server(radius, oserv, conf->auth_server, in radius_retry_primary_timer()
1283 radius->auth_serv_sock, in radius_retry_primary_timer()
1284 radius->auth_serv_sock6, 1); in radius_retry_primary_timer()
1288 if (radius->acct_sock >= 0 && conf->acct_servers && in radius_retry_primary_timer()
1292 if (radius_change_server(radius, conf->acct_server, oserv, in radius_retry_primary_timer()
1293 radius->acct_serv_sock, in radius_retry_primary_timer()
1294 radius->acct_serv_sock6, 0) < 0) { in radius_retry_primary_timer()
1296 radius_change_server(radius, oserv, conf->acct_server, in radius_retry_primary_timer()
1297 radius->acct_serv_sock, in radius_retry_primary_timer()
1298 radius->acct_serv_sock6, 0); in radius_retry_primary_timer()
1304 radius_retry_primary_timer, radius, in radius_retry_primary_timer()
1318 wpa_printf(MSG_ERROR, "RADIUS: Failed to set IP_MTU_DISCOVER: %s", in radius_client_disable_pmtu_discovery()
1325 static void radius_close_auth_sockets(struct radius_client_data *radius) in radius_close_auth_sockets() argument
1327 radius->auth_sock = -1; in radius_close_auth_sockets()
1329 if (radius->auth_serv_sock >= 0) { in radius_close_auth_sockets()
1330 eloop_unregister_read_sock(radius->auth_serv_sock); in radius_close_auth_sockets()
1331 close(radius->auth_serv_sock); in radius_close_auth_sockets()
1332 radius->auth_serv_sock = -1; in radius_close_auth_sockets()
1335 if (radius->auth_serv_sock6 >= 0) { in radius_close_auth_sockets()
1336 eloop_unregister_read_sock(radius->auth_serv_sock6); in radius_close_auth_sockets()
1337 close(radius->auth_serv_sock6); in radius_close_auth_sockets()
1338 radius->auth_serv_sock6 = -1; in radius_close_auth_sockets()
1344 static void radius_close_acct_sockets(struct radius_client_data *radius) in radius_close_acct_sockets() argument
1346 radius->acct_sock = -1; in radius_close_acct_sockets()
1348 if (radius->acct_serv_sock >= 0) { in radius_close_acct_sockets()
1349 eloop_unregister_read_sock(radius->acct_serv_sock); in radius_close_acct_sockets()
1350 close(radius->acct_serv_sock); in radius_close_acct_sockets()
1351 radius->acct_serv_sock = -1; in radius_close_acct_sockets()
1354 if (radius->acct_serv_sock6 >= 0) { in radius_close_acct_sockets()
1355 eloop_unregister_read_sock(radius->acct_serv_sock6); in radius_close_acct_sockets()
1356 close(radius->acct_serv_sock6); in radius_close_acct_sockets()
1357 radius->acct_serv_sock6 = -1; in radius_close_acct_sockets()
1363 static int radius_client_init_auth(struct radius_client_data *radius) in radius_client_init_auth() argument
1365 struct hostapd_radius_servers *conf = radius->conf; in radius_client_init_auth()
1368 radius_close_auth_sockets(radius); in radius_client_init_auth()
1370 radius->auth_serv_sock = socket(PF_INET, SOCK_DGRAM, 0); in radius_client_init_auth()
1371 if (radius->auth_serv_sock < 0) in radius_client_init_auth()
1372 wpa_printf(MSG_INFO, "RADIUS: socket[PF_INET,SOCK_DGRAM]: %s", in radius_client_init_auth()
1375 radius_client_disable_pmtu_discovery(radius->auth_serv_sock); in radius_client_init_auth()
1380 radius->auth_serv_sock6 = socket(PF_INET6, SOCK_DGRAM, 0); in radius_client_init_auth()
1381 if (radius->auth_serv_sock6 < 0) in radius_client_init_auth()
1382 wpa_printf(MSG_INFO, "RADIUS: socket[PF_INET6,SOCK_DGRAM]: %s", in radius_client_init_auth()
1391 radius_change_server(radius, conf->auth_server, NULL, in radius_client_init_auth()
1392 radius->auth_serv_sock, radius->auth_serv_sock6, in radius_client_init_auth()
1395 if (radius->auth_serv_sock >= 0 && in radius_client_init_auth()
1396 eloop_register_read_sock(radius->auth_serv_sock, in radius_client_init_auth()
1397 radius_client_receive, radius, in radius_client_init_auth()
1399 wpa_printf(MSG_INFO, "RADIUS: Could not register read socket for authentication server"); in radius_client_init_auth()
1400 radius_close_auth_sockets(radius); in radius_client_init_auth()
1405 if (radius->auth_serv_sock6 >= 0 && in radius_client_init_auth()
1406 eloop_register_read_sock(radius->auth_serv_sock6, in radius_client_init_auth()
1407 radius_client_receive, radius, in radius_client_init_auth()
1409 wpa_printf(MSG_INFO, "RADIUS: Could not register read socket for authentication server"); in radius_client_init_auth()
1410 radius_close_auth_sockets(radius); in radius_client_init_auth()
1419 static int radius_client_init_acct(struct radius_client_data *radius) in radius_client_init_acct() argument
1421 struct hostapd_radius_servers *conf = radius->conf; in radius_client_init_acct()
1424 radius_close_acct_sockets(radius); in radius_client_init_acct()
1426 radius->acct_serv_sock = socket(PF_INET, SOCK_DGRAM, 0); in radius_client_init_acct()
1427 if (radius->acct_serv_sock < 0) in radius_client_init_acct()
1428 wpa_printf(MSG_INFO, "RADIUS: socket[PF_INET,SOCK_DGRAM]: %s", in radius_client_init_acct()
1431 radius_client_disable_pmtu_discovery(radius->acct_serv_sock); in radius_client_init_acct()
1436 radius->acct_serv_sock6 = socket(PF_INET6, SOCK_DGRAM, 0); in radius_client_init_acct()
1437 if (radius->acct_serv_sock6 < 0) in radius_client_init_acct()
1438 wpa_printf(MSG_INFO, "RADIUS: socket[PF_INET6,SOCK_DGRAM]: %s", in radius_client_init_acct()
1447 radius_change_server(radius, conf->acct_server, NULL, in radius_client_init_acct()
1448 radius->acct_serv_sock, radius->acct_serv_sock6, in radius_client_init_acct()
1451 if (radius->acct_serv_sock >= 0 && in radius_client_init_acct()
1452 eloop_register_read_sock(radius->acct_serv_sock, in radius_client_init_acct()
1453 radius_client_receive, radius, in radius_client_init_acct()
1455 wpa_printf(MSG_INFO, "RADIUS: Could not register read socket for accounting server"); in radius_client_init_acct()
1456 radius_close_acct_sockets(radius); in radius_client_init_acct()
1461 if (radius->acct_serv_sock6 >= 0 && in radius_client_init_acct()
1462 eloop_register_read_sock(radius->acct_serv_sock6, in radius_client_init_acct()
1463 radius_client_receive, radius, in radius_client_init_acct()
1465 wpa_printf(MSG_INFO, "RADIUS: Could not register read socket for accounting server"); in radius_client_init_acct()
1466 radius_close_acct_sockets(radius); in radius_client_init_acct()
1476 * radius_client_init - Initialize RADIUS client
1478 * @conf: RADIUS client configuration (RADIUS servers)
1479 * Returns: Pointer to private RADIUS client context or %NULL on failure
1482 * the lifetime of the RADIUS client, i.e., until radius_client_deinit() is
1488 struct radius_client_data *radius; in radius_client_init() local
1490 radius = os_zalloc(sizeof(struct radius_client_data)); in radius_client_init()
1491 if (radius == NULL) in radius_client_init()
1494 radius->ctx = ctx; in radius_client_init()
1495 radius->conf = conf; in radius_client_init()
1496 radius->auth_serv_sock = radius->acct_serv_sock = in radius_client_init()
1497 radius->auth_serv_sock6 = radius->acct_serv_sock6 = in radius_client_init()
1498 radius->auth_sock = radius->acct_sock = -1; in radius_client_init()
1500 if (conf->auth_server && radius_client_init_auth(radius)) { in radius_client_init()
1501 radius_client_deinit(radius); in radius_client_init()
1505 if (conf->acct_server && radius_client_init_acct(radius)) { in radius_client_init()
1506 radius_client_deinit(radius); in radius_client_init()
1512 radius_retry_primary_timer, radius, in radius_client_init()
1515 return radius; in radius_client_init()
1520 * radius_client_deinit - Deinitialize RADIUS client
1521 * @radius: RADIUS client context from radius_client_init()
1523 void radius_client_deinit(struct radius_client_data *radius) in radius_client_deinit() argument
1525 if (!radius) in radius_client_deinit()
1528 radius_close_auth_sockets(radius); in radius_client_deinit()
1529 radius_close_acct_sockets(radius); in radius_client_deinit()
1531 eloop_cancel_timeout(radius_retry_primary_timer, radius, NULL); in radius_client_deinit()
1533 radius_client_flush(radius, 0); in radius_client_deinit()
1534 os_free(radius->auth_handlers); in radius_client_deinit()
1535 os_free(radius->acct_handlers); in radius_client_deinit()
1536 os_free(radius); in radius_client_deinit()
1541 * radius_client_flush_auth - Flush pending RADIUS messages for an address
1542 * @radius: RADIUS client context from radius_client_init()
1545 * This function can be used to remove pending RADIUS authentication messages
1550 void radius_client_flush_auth(struct radius_client_data *radius, in radius_client_flush_auth() argument
1556 entry = radius->msgs; in radius_client_flush_auth()
1560 hostapd_logger(radius->ctx, addr, in radius_client_flush_auth()
1563 "Removing pending RADIUS authentication" in radius_client_flush_auth()
1569 radius->msgs = entry->next; in radius_client_flush_auth()
1574 radius->num_msgs--; in radius_client_flush_auth()
1680 * radius_client_get_mib - Get RADIUS client MIB information
1681 * @radius: RADIUS client context from radius_client_init()
1686 int radius_client_get_mib(struct radius_client_data *radius, char *buf, in radius_client_get_mib() argument
1694 if (!radius) in radius_client_get_mib()
1697 conf = radius->conf; in radius_client_get_mib()
1705 radius : NULL); in radius_client_get_mib()
1715 radius : NULL); in radius_client_get_mib()
1723 void radius_client_reconfig(struct radius_client_data *radius, in radius_client_reconfig() argument
1726 if (radius) in radius_client_reconfig()
1727 radius->conf = conf; in radius_client_reconfig()