/* * Round-robins the receivers, without priority. * * FIXME: Add sockfd, if -1, do round-robin, else do sockfd * IF in fdset. */ RADIUS_PACKET *fr_packet_list_recv(fr_packet_list_t *pl, fd_set *set) { int start; RADIUS_PACKET *packet; if (!pl || !set) return NULL; start = pl->last_recv; do { start++; start &= SOCKOFFSET_MASK; if (pl->sockets[start].sockfd == -1) continue; if (!FD_ISSET(pl->sockets[start].sockfd, set)) continue; #ifdef WITH_TCP if (pl->sockets[start].proto == IPPROTO_TCP) { packet = fr_tcp_recv(pl->sockets[start].sockfd, 0); } else #endif packet = rad_recv(pl->sockets[start].sockfd, 0); if (!packet) continue; /* * Call fr_packet_list_find_byreply(). If it * doesn't find anything, discard the reply. */ pl->last_recv = start; return packet; } while (start != pl->last_recv); return NULL; }
/* * Recieve packets from a proxy socket. */ static int proxy_socket_tcp_recv(rad_listen_t *listener, RAD_REQUEST_FUNP *pfun, REQUEST **prequest) { REQUEST *request; RADIUS_PACKET *packet; RAD_REQUEST_FUNP fun = NULL; char buffer[128]; packet = fr_tcp_recv(listener->fd, 0); if (!packet) { proxy_close_tcp_listener(listener); return 0; } /* * FIXME: Client MIB updates? */ switch(packet->code) { case PW_AUTHENTICATION_ACK: case PW_ACCESS_CHALLENGE: case PW_AUTHENTICATION_REJECT: fun = rad_authenticate; break; #ifdef WITH_ACCOUNTING case PW_ACCOUNTING_RESPONSE: fun = rad_accounting; break; #endif default: /* * FIXME: Update MIB for packet types? */ radlog(L_ERR, "Invalid packet code %d sent to a proxy port " "from home server %s port %d - ID %d : IGNORED", packet->code, ip_ntoh(&packet->src_ipaddr, buffer, sizeof(buffer)), packet->src_port, packet->id); rad_free(&packet); return 0; } request = received_proxy_tcp_response(packet, fr_listen2tcp(listener)); if (!request) { return 0; } rad_assert(fun != NULL); *pfun = fun; *prequest = request; return 1; }