ft = talloc_zero(ctx, fr_tracking_t);
if (!ft) return NULL;
- memset(ft, 0, sizeof(*ft));
-
ft->num_entries = 0;
ft->src_dst_size = src_dst_size;
void *src_dst)
{
fr_tracking_entry_t *entry;
- fr_tracking_entry_t my_entry;
+ uint64_t buffer[256];
(void) talloc_get_type_abort(ft, fr_tracking_t);
* See if we're adding a duplicate, or
* over-writing an existing one.
*/
- my_entry.src_dst = src_dst;
- my_entry.src_dst_size = ft->src_dst_size;
- memcpy(my_entry.data, packet, sizeof(my_entry.data));
+ entry = (fr_tracking_entry_t *) buffer;
+ memcpy(entry->src_dst, src_dst, ft->src_dst_size);
+ entry->src_dst_size = ft->src_dst_size;
+ memcpy(entry->data, packet, sizeof(entry->data));
- entry = rbtree_finddata(ft->tree, &my_entry);
+ entry = rbtree_finddata(ft->tree, entry);
if (!entry) {
- size_t align;
- uint8_t *p;
-
- /*
- * Ensure that structures are aligned.
- */
- align = sizeof(fr_tracking_entry_t);
- align += 15;
- align &= ~(15);
-
/*
* No existing entry, create a new one.
*/
- entry = talloc_size(ft->tree, align + ft->src_dst_size);
+ entry = talloc_zero_size(ft->tree, sizeof(*entry) + ft->src_dst_size);
if (!entry) return FR_TRACKING_ERROR;
- memset(entry, 0, align + ft->src_dst_size);
+ talloc_set_name_const(entry, "fr_tracking_entry_t");
+
entry->ft = ft;
entry->timestamp = timestamp;
/*
* Copy the src_dst information over to the entry.
*/
- entry->src_dst = p = ((uint8_t *) entry) + align;
entry->src_dst_size = ft->src_dst_size;
- memcpy(p, src_dst, entry->src_dst_size);
+ memcpy(entry->src_dst, src_dst, entry->src_dst_size);
/*
* Copy the new packet over.
entry->reply_len = 0;
}
- /*
- * Don't change any of the fields we need
- * for the RB tree.
- */
- rad_assert(memcmp(my_entry.src_dst, src_dst, ft->src_dst_size) == 0);
- rad_assert(my_entry.data[0] == entry->data[0]);
- rad_assert(my_entry.data[1] == entry->data[1]);
-
/*
* Don't change src_dst. It MUST have
* the same data as the previous entry.
fr_tracking_t *ft; //!< for cleanup_delay
fr_event_timer_t const *ev; //!< for cleanup_delay
+ size_t src_dst_size; //!< size of the data in src_dst
fr_time_t timestamp; //!< when the request was received
- void *src_dst; //!< information about src/dst IP/port
- size_t src_dst_size; //!< size of the data in src_dst
uint8_t const *reply; //!< the response (if any);
size_t reply_len; //!< the length of the response
uint8_t data[20]; //!< the full RADIUS packet header
+ uint64_t src_dst[0]; //!< information about src/dst IP/port
} fr_tracking_entry_t;
/**
static int mod_src_address(fr_socket_addr_t *src, UNUSED void const *instance, void const *packet_ctx)
{
fr_tracking_entry_t const *track = packet_ctx;
- proto_radius_udp_address_t const *address = track->src_dst;
-
- rad_assert(track->src_dst_size == sizeof(proto_radius_udp_address_t));
+ proto_radius_udp_address_t const *address = (proto_radius_udp_address_t const *) &track->src_dst[0];
memset(src, 0, sizeof(*src));
static int mod_dst_address(fr_socket_addr_t *dst, UNUSED void const *instance, void const *packet_ctx)
{
fr_tracking_entry_t const *track = packet_ctx;
- proto_radius_udp_address_t const *address = track->src_dst;
-
- rad_assert(track->src_dst_size == sizeof(proto_radius_udp_address_t));
+ proto_radius_udp_address_t const *address = (proto_radius_udp_address_t const *) &track->src_dst[0];
memset(dst, 0, sizeof(*dst));
static RADCLIENT *mod_client(UNUSED void const *instance, void const *packet_ctx)
{
fr_tracking_entry_t const *track = packet_ctx;
- proto_radius_udp_address_t const *address = track->src_dst;
-
- rad_assert(track->src_dst_size == sizeof(proto_radius_udp_address_t));
+ proto_radius_udp_address_t const *address = (proto_radius_udp_address_t const *) &track->src_dst[0];
return address->client;
}
{
proto_radius_udp_t const *inst = instance;
fr_tracking_entry_t const *track = request->async->packet_ctx;
- proto_radius_udp_address_t const *address = track->src_dst;
+ proto_radius_udp_address_t const *address = (proto_radius_udp_address_t const *) &track->src_dst[0];
RADCLIENT *client;
/*
{
proto_radius_udp_t const *inst = instance;
fr_tracking_entry_t const *track = request->async->packet_ctx;
- proto_radius_udp_address_t const *address = track->src_dst;
-
- rad_assert(track->src_dst_size == sizeof(proto_radius_udp_address_t));
+ proto_radius_udp_address_t const *address = (proto_radius_udp_address_t const *) &track->src_dst[0];
request->client = address->client;
request->packet->if_index = address->if_index;
{
proto_radius_udp_t *inst = talloc_get_type_abort(instance, proto_radius_udp_t);
fr_tracking_entry_t *track = packet_ctx;
- proto_radius_udp_address_t *address = track->src_dst;
+ proto_radius_udp_address_t *address = (proto_radius_udp_address_t *) &track->src_dst[0];
ssize_t data_size;
fr_time_t reply_time;
fr_dlist_remove(&saved->entry);
fr_dlist_insert_tail(&inst->dynamic_clients.packets, &saved->entry);
- address = saved->track->src_dst;
+ address = (proto_radius_udp_address_t *) &saved->track->src_dst[0];
address->client = newclient;
rad_assert(inst->dynamic_clients.num_pending_packets > 0);