ERROR("Out of memory");
goto error;
}
+ request->packet->uctx = request;
request->packet->socket.inet.src_ipaddr = client_ipaddr;
request->packet->socket.inet.src_port = client_port;
*/
retry:
request->packet->socket.inet.src_ipaddr.af = server_ipaddr.af;
- rcode = fr_packet_list_id_alloc(packet_list, ipproto, &request->packet, NULL);
+ rcode = fr_packet_list_id_alloc(packet_list, ipproto, request->packet, NULL);
if (!rcode) {
int mysockfd;
*/
static int recv_one_packet(fr_time_t wait_time)
{
- fd_set set;
- fr_time_delta_t our_wait_time;
- rc_request_t *request;
- fr_radius_packet_t *reply, **packet_p;
- volatile int max_fd;
+ fd_set set;
+ fr_time_delta_t our_wait_time;
+ rc_request_t *request;
+ fr_radius_packet_t *reply, *packet;
+ volatile int max_fd;
/* And wait for reply, timing out as necessary */
FD_ZERO(&set);
reply->socket.inet.src_port = server_port;
}
- packet_p = fr_packet_list_find_byreply(packet_list, reply);
- if (!packet_p) {
+ packet = fr_packet_list_find_byreply(packet_list, reply);
+ if (!packet) {
ERROR("Received reply to request we did not send. (id=%d socket %d)",
reply->id, reply->socket.fd);
fr_radius_packet_free(&reply);
return -1; /* got reply to packet we didn't send */
}
- request = fr_packet2myptr(rc_request_t, packet, packet_p);
+ request = packet->uctx;
/*
* Fails the signature validation: not a real reply.
uint32_t rounds; //!< for State[0]
size_t partial;
+
+ void *uctx;
} fr_radius_packet_t;
fr_radius_packet_t *fr_radius_packet_alloc(TALLOC_CTX *ctx, bool new_vector);
* That's because if the authentication vector is different,
* it means that the NAS has given up on the earlier request.
*/
-int fr_packet_cmp(fr_radius_packet_t const *a, fr_radius_packet_t const *b)
+int fr_packet_cmp(void const *a_v, void const *b_v)
{
+ fr_radius_packet_t const *a = a_v, *b = b_v;
int ret;
/*
int src_any;
int dst_any;
- void *ctx;
+ void *ctx;
- uint32_t num_outgoing;
+ uint32_t num_outgoing;
- bool dont_use;
+ bool dont_use;
- uint8_t id[32];
+ uint8_t id[32];
} fr_packet_socket_t;
return true;
}
-static int packet_entry_cmp(void const *one, void const *two)
-{
- fr_radius_packet_t const * const *a = one;
- fr_radius_packet_t const * const *b = two;
-
- return fr_packet_cmp(*a, *b);
-}
-
void fr_packet_list_free(fr_packet_list_t *pl)
{
if (!pl) return;
pl = talloc_zero(NULL, fr_packet_list_t);
if (!pl) return NULL;
- pl->tree = rbtree_alloc(pl, packet_entry_cmp, NULL, 0); /* elements not talloc safe */
+ pl->tree = rbtree_alloc(pl, fr_packet_cmp, NULL, 0); /* elements not talloc safe */
if (!pl->tree) {
fr_packet_list_free(pl);
return NULL;
* be called before inserting the packet into the list!
*/
bool fr_packet_list_insert(fr_packet_list_t *pl,
- fr_radius_packet_t **request_p)
+ fr_radius_packet_t *request)
{
- if (!pl || !request_p || !*request_p) return 0;
+ if (!pl || !request) return 0;
- return rbtree_insert(pl->tree, request_p);
+ return rbtree_insert(pl->tree, request);
}
-fr_radius_packet_t **fr_packet_list_find(fr_packet_list_t *pl, fr_radius_packet_t *request)
+fr_radius_packet_t *fr_packet_list_find(fr_packet_list_t *pl, fr_radius_packet_t *request)
{
if (!pl || !request) return 0;
- return rbtree_finddata(pl->tree, &request);
+ return rbtree_finddata(pl->tree, request);
}
* This presumes that the reply has dst_ipaddr && dst_port set up
* correctly (i.e. real IP, or "*").
*/
-fr_radius_packet_t **fr_packet_list_find_byreply(fr_packet_list_t *pl, fr_radius_packet_t *reply)
+fr_radius_packet_t *fr_packet_list_find_byreply(fr_packet_list_t *pl, fr_radius_packet_t *reply)
{
fr_radius_packet_t my_request, *request;
fr_packet_socket_t *ps;
my_request.id = reply->id;
request = &my_request;
- return rbtree_finddata(pl->tree, &request);
+ return rbtree_finddata(pl->tree, request);
}
if (!pl || !request) return false;
- node = rbtree_find(pl->tree, &request);
+ node = rbtree_find(pl->tree, request);
if (!node) return false;
rbtree_delete(pl->tree, node);
* should be used.
*/
bool fr_packet_list_id_alloc(fr_packet_list_t *pl, int proto,
- fr_radius_packet_t **request_p, void **pctx)
+ fr_radius_packet_t *request, void **pctx)
{
int i, j, k, fd, id, start_i, start_j, start_k;
int src_any = 0;
fr_packet_socket_t *ps= NULL;
- fr_radius_packet_t *request = *request_p;
if ((request->socket.inet.dst_ipaddr.af == AF_UNSPEC) ||
(request->socket.inet.dst_port == 0)) {
/*
* If we managed to insert it, we're done.
*/
- if (fr_packet_list_insert(pl, request_p)) {
+ if (fr_packet_list_insert(pl, request)) {
if (pctx) *pctx = ps->ctx;
ps->num_outgoing++;
pl->num_outgoing++;
#include <stdbool.h>
#include <stdint.h>
-int fr_packet_cmp(fr_radius_packet_t const *a, fr_radius_packet_t const *b);
+int fr_packet_cmp(void const *a, void const *b);
void fr_request_from_reply(fr_radius_packet_t *request,
fr_radius_packet_t const *reply);
fr_packet_list_t *fr_packet_list_create(int alloc_id);
void fr_packet_list_free(fr_packet_list_t *pl);
-bool fr_packet_list_insert(fr_packet_list_t *pl,
- fr_radius_packet_t **request_p);
+bool fr_packet_list_insert(fr_packet_list_t *pl, fr_radius_packet_t *request_p);
-fr_radius_packet_t **fr_packet_list_find(fr_packet_list_t *pl,
- fr_radius_packet_t *request);
-fr_radius_packet_t **fr_packet_list_find_byreply(fr_packet_list_t *pl,
- fr_radius_packet_t *reply);
+fr_radius_packet_t *fr_packet_list_find(fr_packet_list_t *pl, fr_radius_packet_t *request);
+fr_radius_packet_t *fr_packet_list_find_byreply(fr_packet_list_t *pl, fr_radius_packet_t *reply);
bool fr_packet_list_yank(fr_packet_list_t *pl,
fr_radius_packet_t *request);
uint32_t fr_packet_list_num_elements(fr_packet_list_t *pl);
bool fr_packet_list_id_alloc(fr_packet_list_t *pl, int proto,
- fr_radius_packet_t **request_p, void **pctx);
+ fr_radius_packet_t *request_p, void **pctx);
bool fr_packet_list_id_free(fr_packet_list_t *pl,
fr_radius_packet_t *request, bool yank);
bool fr_packet_list_socket_add(fr_packet_list_t *pl, int sockfd, int proto,
void fr_packet_header_log(fr_log_t const *log, fr_radius_packet_t *packet, bool received);
void fr_packet_log(fr_log_t const *log, fr_radius_packet_t *packet, fr_pair_list_t *list, bool received);
-
-/*
- * "find" returns a pointer to the fr_radius_packet_t* member in the
- * caller's structure. In order to get the pointer to the *top*
- * of the caller's structure, you have to subtract the offset to
- * the member from the returned pointer, and cast it to the
- * required type.
- */
-# define fr_packet2myptr(TYPE, MEMBER, PTR) (TYPE *) (((char *)PTR) - offsetof(TYPE, MEMBER))