#ifndef FR_PACKET_H
#define FR_PACKET_H
#include <freeradius-devel/ident.h>
RCSIDH(packet_h, "$Id$")
uint32_t fr_request_packet_hash(const RADIUS_PACKET *packet);
uint32_t fr_reply_packet_hash(const RADIUS_PACKET *packet);
int fr_packet_cmp(const RADIUS_PACKET *a, const RADIUS_PACKET *b);
void fr_request_from_reply(RADIUS_PACKET *request,
const RADIUS_PACKET *reply);
int fr_socket(fr_ipaddr_t *ipaddr, int port);
typedef struct fr_packet_list_t 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);
int fr_packet_list_insert(fr_packet_list_t *pl,
RADIUS_PACKET **request_p);
RADIUS_PACKET **fr_packet_list_find(fr_packet_list_t *pl,
RADIUS_PACKET *request);
RADIUS_PACKET **fr_packet_list_find_byreply(fr_packet_list_t *pl,
RADIUS_PACKET *reply);
RADIUS_PACKET **fr_packet_list_yank(fr_packet_list_t *pl,
RADIUS_PACKET *request);
int fr_packet_list_num_elements(fr_packet_list_t *pl);
int fr_packet_list_id_alloc(fr_packet_list_t *pl,
RADIUS_PACKET *request);
int fr_packet_list_id_free(fr_packet_list_t *pl,
RADIUS_PACKET *request);
int fr_packet_list_socket_add(fr_packet_list_t *pl, int sockfd);
int fr_packet_list_socket_remove(fr_packet_list_t *pl, int sockfd);
int fr_packet_list_walk(fr_packet_list_t *pl, void *ctx,
fr_hash_table_walk_t callback);
int fr_packet_list_fd_set(fr_packet_list_t *pl, fd_set *set);
RADIUS_PACKET *fr_packet_list_recv(fr_packet_list_t *pl, fd_set *set);
int fr_packet_list_num_incoming(fr_packet_list_t *pl);
int fr_packet_list_num_outgoing(fr_packet_list_t *pl);
# define fr_packet2myptr(TYPE, MEMBER, PTR) (TYPE *) (((char *)PTR) - offsetof(TYPE, MEMBER))
#endif