@@ -325,6 +325,7 @@ static int radius_client_retransmit(struct radius_client_data *radius,
struct hostapd_radius_servers *conf = radius->conf;
int s;
struct wpabuf *buf;
+ RadiusType msg_type;
if (entry->msg_type == RADIUS_ACCT ||
entry->msg_type == RADIUS_ACCT_INTERIM) {
@@ -353,9 +354,14 @@ static int radius_client_retransmit(struct radius_client_data *radius,
os_get_reltime(&entry->last_attempt);
buf = radius_msg_get_buf(entry->msg);
- if (send(s, wpabuf_head(buf), wpabuf_len(buf), 0) < 0)
+ if (send(s, wpabuf_head(buf), wpabuf_len(buf), 0) < 0) {
+ msg_type = entry->msg_type;
radius_client_handle_send_error(radius, s, entry->msg_type);
+ if (msg_type == RADIUS_AUTH)
+ return 0;
+ }
+
entry->next_try = now + entry->next_wait;
entry->next_wait *= 2;
if (entry->next_wait > RADIUS_CLIENT_MAX_WAIT)
@@ -378,6 +384,7 @@ static void radius_client_timer(void *eloop_ctx, void *timeout_ctx)
struct radius_msg_list *entry, *prev, *tmp;
int auth_failover = 0, acct_failover = 0;
char abuf[50];
+ size_t prev_num_msgs;
entry = radius->msgs;
if (!entry)
@@ -388,6 +395,7 @@ static void radius_client_timer(void *eloop_ctx, void *timeout_ctx)
prev = NULL;
while (entry) {
+ prev_num_msgs = radius->num_msgs;
if (now.sec >= entry->next_try &&
radius_client_retransmit(radius, entry, now.sec)) {
if (prev)
@@ -402,6 +410,12 @@ static void radius_client_timer(void *eloop_ctx, void *timeout_ctx)
continue;
}
+ if (prev_num_msgs != radius->num_msgs) {
+ entry = radius->msgs;
+ prev = NULL;
+ continue;
+ }
+
if (entry->attempts > RADIUS_CLIENT_NUM_FAILOVER) {
if (entry->msg_type == RADIUS_ACCT ||
entry->msg_type == RADIUS_ACCT_INTERIM)