]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Simplify uses of rbtrees in radclient/packet list tracking code
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 27 Jan 2021 01:55:10 +0000 (01:55 +0000)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 27 Jan 2021 01:57:40 +0000 (01:57 +0000)
src/bin/radclient.c
src/lib/util/packet.h
src/protocols/radius/list.c
src/protocols/radius/list.h

index c5cba43e9a6b3d151d3cfbd346901d61fa07c0ab..93b80ca1266e1873770fa28f728760414578bbda 100644 (file)
@@ -376,6 +376,7 @@ static int radclient_init(TALLOC_CTX *ctx, rc_file_pair_t *files)
                        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;
@@ -796,7 +797,7 @@ static int send_one_packet(rc_request_t *request)
                 */
        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;
 
@@ -960,11 +961,11 @@ static int send_one_packet(rc_request_t *request)
  */
 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);
@@ -1017,14 +1018,14 @@ static int recv_one_packet(fr_time_t wait_time)
                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.
index f4cc49128439ea596a58ecff3dd3022f52a464d0..ea2fac8d7fbcb0c661abcf689b3688ec23322772 100644 (file)
@@ -69,6 +69,8 @@ typedef struct {
        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);
index fc025519f988711f183a9355870f679fd32430b3..5952e1116d9c9c4b37b98f0fce181cac41eba44e 100644 (file)
@@ -41,8 +41,9 @@ RCSID("$Id$")
  *     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;
 
        /*
@@ -102,13 +103,13 @@ typedef struct {
 
        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;
 
 
@@ -279,14 +280,6 @@ bool fr_packet_list_socket_add(fr_packet_list_t *pl, int sockfd, int proto,
        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;
@@ -306,7 +299,7 @@ fr_packet_list_t *fr_packet_list_create(int alloc_id)
 
        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;
@@ -327,18 +320,18 @@ fr_packet_list_t *fr_packet_list_create(int alloc_id)
  *     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);
 }
 
 
@@ -346,7 +339,7 @@ fr_radius_packet_t **fr_packet_list_find(fr_packet_list_t *pl, fr_radius_packet_
  *     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;
@@ -380,7 +373,7 @@ fr_radius_packet_t **fr_packet_list_find_byreply(fr_packet_list_t *pl, fr_radius
        my_request.id = reply->id;
        request = &my_request;
 
-       return rbtree_finddata(pl->tree, &request);
+       return rbtree_finddata(pl->tree, request);
 }
 
 
@@ -390,7 +383,7 @@ bool fr_packet_list_yank(fr_packet_list_t *pl, fr_radius_packet_t *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);
@@ -425,12 +418,11 @@ uint32_t fr_packet_list_num_elements(fr_packet_list_t *pl)
  *     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)) {
@@ -623,7 +615,7 @@ bool fr_packet_list_id_alloc(fr_packet_list_t *pl, int proto,
        /*
         *      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++;
index 6dcd312daa6800cc238ce91a3f3cd3a90ab3355f..8c4a48bbf4d85899e15e7ede581250ddb4859f81 100644 (file)
@@ -29,7 +29,7 @@ RCSIDH(list_h, "$Id$")
 #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);
 
@@ -37,18 +37,15 @@ typedef struct fr_packet_list_s fr_packet_list_t;
 
 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,
@@ -66,12 +63,3 @@ uint32_t fr_packet_list_num_outgoing(fr_packet_list_t *pl);
 
 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))