⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radius_client.c

📁 WLAN无线网络管理的最新程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	default:		return -1;	}	if (connect(sel_sock, addr, addrlen) < 0) {		perror("connect[radius]");		return -1;	}	if (auth)		radius->auth_sock = sel_sock;	else		radius->acct_sock = sel_sock;	return 0;}static void radius_retry_primary_timer(void *eloop_ctx, void *timeout_ctx){	struct radius_client_data *radius = eloop_ctx;	struct hostapd_radius_servers *conf = radius->conf;	struct hostapd_radius_server *oserv;	if (radius->auth_sock >= 0 && conf->auth_servers &&	    conf->auth_server != conf->auth_servers) {		oserv = conf->auth_server;		conf->auth_server = conf->auth_servers;		radius_change_server(radius, conf->auth_server, oserv,				     radius->auth_serv_sock,				     radius->auth_serv_sock6, 1);	}	if (radius->acct_sock >= 0 && conf->acct_servers &&	    conf->acct_server != conf->acct_servers) {		oserv = conf->acct_server;		conf->acct_server = conf->acct_servers;		radius_change_server(radius, conf->acct_server, oserv,				     radius->acct_serv_sock,				     radius->acct_serv_sock6, 0);	}	if (conf->retry_primary_interval)		eloop_register_timeout(conf->retry_primary_interval, 0,				       radius_retry_primary_timer, radius,				       NULL);}static int radius_client_init_auth(struct radius_client_data *radius){	struct hostapd_radius_servers *conf = radius->conf;	int ok = 0;	radius->auth_serv_sock = socket(PF_INET, SOCK_DGRAM, 0);	if (radius->auth_serv_sock < 0)		perror("socket[PF_INET,SOCK_DGRAM]");	else		ok++;#ifdef CONFIG_IPV6	radius->auth_serv_sock6 = socket(PF_INET6, SOCK_DGRAM, 0);	if (radius->auth_serv_sock6 < 0)		perror("socket[PF_INET6,SOCK_DGRAM]");	else		ok++;#endif /* CONFIG_IPV6 */	if (ok == 0)		return -1;	radius_change_server(radius, conf->auth_server, NULL,			     radius->auth_serv_sock, radius->auth_serv_sock6,			     1);	if (radius->auth_serv_sock >= 0 &&	    eloop_register_read_sock(radius->auth_serv_sock,				     radius_client_receive, radius,				     (void *) RADIUS_AUTH)) {		printf("Could not register read socket for authentication "		       "server\n");		return -1;	}#ifdef CONFIG_IPV6	if (radius->auth_serv_sock6 >= 0 &&	    eloop_register_read_sock(radius->auth_serv_sock6,				     radius_client_receive, radius,				     (void *) RADIUS_AUTH)) {		printf("Could not register read socket for authentication "		       "server\n");		return -1;	}#endif /* CONFIG_IPV6 */	return 0;}static int radius_client_init_acct(struct radius_client_data *radius){	struct hostapd_radius_servers *conf = radius->conf;	int ok = 0;	radius->acct_serv_sock = socket(PF_INET, SOCK_DGRAM, 0);	if (radius->acct_serv_sock < 0)		perror("socket[PF_INET,SOCK_DGRAM]");	else		ok++;#ifdef CONFIG_IPV6	radius->acct_serv_sock6 = socket(PF_INET6, SOCK_DGRAM, 0);	if (radius->acct_serv_sock6 < 0)		perror("socket[PF_INET6,SOCK_DGRAM]");	else		ok++;#endif /* CONFIG_IPV6 */	if (ok == 0)		return -1;	radius_change_server(radius, conf->acct_server, NULL,			     radius->acct_serv_sock, radius->acct_serv_sock6,			     0);	if (radius->acct_serv_sock >= 0 &&	    eloop_register_read_sock(radius->acct_serv_sock,				     radius_client_receive, radius,				     (void *) RADIUS_ACCT)) {		printf("Could not register read socket for accounting "		       "server\n");		return -1;	}#ifdef CONFIG_IPV6	if (radius->acct_serv_sock6 >= 0 &&	    eloop_register_read_sock(radius->acct_serv_sock6,				     radius_client_receive, radius,				     (void *) RADIUS_ACCT)) {		printf("Could not register read socket for accounting "		       "server\n");		return -1;	}#endif /* CONFIG_IPV6 */	return 0;}struct radius_client_data *radius_client_init(void *ctx, struct hostapd_radius_servers *conf){	struct radius_client_data *radius;	radius = wpa_zalloc(sizeof(struct radius_client_data));	if (radius == NULL)		return NULL;	radius->ctx = ctx;	radius->conf = conf;	radius->auth_serv_sock = radius->acct_serv_sock =		radius->auth_serv_sock6 = radius->acct_serv_sock6 =		radius->auth_sock = radius->acct_sock = -1;	if (conf->auth_server && radius_client_init_auth(radius)) {		radius_client_deinit(radius);		return NULL;	}	if (conf->acct_server && radius_client_init_acct(radius)) {		radius_client_deinit(radius);		return NULL;	}	if (conf->retry_primary_interval)		eloop_register_timeout(conf->retry_primary_interval, 0,				       radius_retry_primary_timer, radius,				       NULL);	return radius;}void radius_client_deinit(struct radius_client_data *radius){	if (!radius)		return;	if (radius->auth_serv_sock >= 0)		eloop_unregister_read_sock(radius->auth_serv_sock);	if (radius->acct_serv_sock >= 0)		eloop_unregister_read_sock(radius->acct_serv_sock);	eloop_cancel_timeout(radius_retry_primary_timer, radius, NULL);	radius_client_flush(radius, 0);	os_free(radius->auth_handlers);	os_free(radius->acct_handlers);	os_free(radius);}void radius_client_flush_auth(struct radius_client_data *radius, u8 *addr){	struct radius_msg_list *entry, *prev, *tmp;	prev = NULL;	entry = radius->msgs;	while (entry) {		if (entry->msg_type == RADIUS_AUTH &&		    os_memcmp(entry->addr, addr, ETH_ALEN) == 0) {			hostapd_logger(radius->ctx, addr,				       HOSTAPD_MODULE_RADIUS,				       HOSTAPD_LEVEL_DEBUG,				       "Removing pending RADIUS authentication"				       " message for removed client");			if (prev)				prev->next = entry->next;			else				radius->msgs = entry->next;			tmp = entry;			entry = entry->next;			radius_client_msg_free(tmp);			radius->num_msgs--;			continue;		}		prev = entry;		entry = entry->next;	}}static int radius_client_dump_auth_server(char *buf, size_t buflen,					  struct hostapd_radius_server *serv,					  struct radius_client_data *cli){	int pending = 0;	struct radius_msg_list *msg;	char abuf[50];	if (cli) {		for (msg = cli->msgs; msg; msg = msg->next) {			if (msg->msg_type == RADIUS_AUTH)				pending++;		}	}	return os_snprintf(buf, buflen,			   "radiusAuthServerIndex=%d\n"			   "radiusAuthServerAddress=%s\n"			   "radiusAuthClientServerPortNumber=%d\n"			   "radiusAuthClientRoundTripTime=%d\n"			   "radiusAuthClientAccessRequests=%u\n"			   "radiusAuthClientAccessRetransmissions=%u\n"			   "radiusAuthClientAccessAccepts=%u\n"			   "radiusAuthClientAccessRejects=%u\n"			   "radiusAuthClientAccessChallenges=%u\n"			   "radiusAuthClientMalformedAccessResponses=%u\n"			   "radiusAuthClientBadAuthenticators=%u\n"			   "radiusAuthClientPendingRequests=%u\n"			   "radiusAuthClientTimeouts=%u\n"			   "radiusAuthClientUnknownTypes=%u\n"			   "radiusAuthClientPacketsDropped=%u\n",			   serv->index,			   hostapd_ip_txt(&serv->addr, abuf, sizeof(abuf)),			   serv->port,			   serv->round_trip_time,			   serv->requests,			   serv->retransmissions,			   serv->access_accepts,			   serv->access_rejects,			   serv->access_challenges,			   serv->malformed_responses,			   serv->bad_authenticators,			   pending,			   serv->timeouts,			   serv->unknown_types,			   serv->packets_dropped);}static int radius_client_dump_acct_server(char *buf, size_t buflen,					  struct hostapd_radius_server *serv,					  struct radius_client_data *cli){	int pending = 0;	struct radius_msg_list *msg;	char abuf[50];	if (cli) {		for (msg = cli->msgs; msg; msg = msg->next) {			if (msg->msg_type == RADIUS_ACCT ||			    msg->msg_type == RADIUS_ACCT_INTERIM)				pending++;		}	}	return os_snprintf(buf, buflen,			   "radiusAccServerIndex=%d\n"			   "radiusAccServerAddress=%s\n"			   "radiusAccClientServerPortNumber=%d\n"			   "radiusAccClientRoundTripTime=%d\n"			   "radiusAccClientRequests=%u\n"			   "radiusAccClientRetransmissions=%u\n"			   "radiusAccClientResponses=%u\n"			   "radiusAccClientMalformedResponses=%u\n"			   "radiusAccClientBadAuthenticators=%u\n"			   "radiusAccClientPendingRequests=%u\n"			   "radiusAccClientTimeouts=%u\n"			   "radiusAccClientUnknownTypes=%u\n"			   "radiusAccClientPacketsDropped=%u\n",			   serv->index,			   hostapd_ip_txt(&serv->addr, abuf, sizeof(abuf)),			   serv->port,			   serv->round_trip_time,			   serv->requests,			   serv->retransmissions,			   serv->responses,			   serv->malformed_responses,			   serv->bad_authenticators,			   pending,			   serv->timeouts,			   serv->unknown_types,			   serv->packets_dropped);}int radius_client_get_mib(struct radius_client_data *radius, char *buf,			  size_t buflen){	struct hostapd_radius_servers *conf = radius->conf;	int i;	struct hostapd_radius_server *serv;	int count = 0;	if (conf->auth_servers) {		for (i = 0; i < conf->num_auth_servers; i++) {			serv = &conf->auth_servers[i];			count += radius_client_dump_auth_server(				buf + count, buflen - count, serv,				serv == conf->auth_server ?				radius : NULL);		}	}	if (conf->acct_servers) {		for (i = 0; i < conf->num_acct_servers; i++) {			serv = &conf->acct_servers[i];			count += radius_client_dump_acct_server(				buf + count, buflen - count, serv,				serv == conf->acct_server ?				radius : NULL);		}	}	return count;}static int radius_servers_diff(struct hostapd_radius_server *nserv,			       struct hostapd_radius_server *oserv,			       int num){	int i;	for (i = 0; i < num; i++) {		if (hostapd_ip_diff(&nserv[i].addr, &oserv[i].addr) ||		    nserv[i].port != oserv[i].port ||		    nserv[i].shared_secret_len != oserv[i].shared_secret_len ||		    memcmp(nserv[i].shared_secret, oserv[i].shared_secret,			   nserv[i].shared_secret_len) != 0)			return 1;	}	return 0;}struct radius_client_data *radius_client_reconfig(struct radius_client_data *old, void *ctx,		       struct hostapd_radius_servers *oldconf,		       struct hostapd_radius_servers *newconf){	radius_client_flush(old, 0);	if (newconf->retry_primary_interval !=	    oldconf->retry_primary_interval ||	    newconf->num_auth_servers != oldconf->num_auth_servers ||	    newconf->num_acct_servers != oldconf->num_acct_servers ||	    radius_servers_diff(newconf->auth_servers, oldconf->auth_servers,				newconf->num_auth_servers) ||	    radius_servers_diff(newconf->acct_servers, oldconf->acct_servers,				newconf->num_acct_servers)) {		hostapd_logger(ctx, NULL, HOSTAPD_MODULE_RADIUS,			       HOSTAPD_LEVEL_DEBUG,			       "Reconfiguring RADIUS client");		radius_client_deinit(old);		return radius_client_init(ctx, newconf);	}	return old;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -