#include <event2/buffer.h>
#endif
-/* Read one RADIUS packet header. Return !0 on error. A return value
- of 0 means that we need more data. */
+/** Read one RADIUS packet header. Return !0 on error. */
static int
_read_header (struct rs_packet *pkt)
{
n = bufferevent_read (pkt->conn->bev, pkt->hdr, RS_HEADER_LEN);
if (n == RS_HEADER_LEN)
{
- pkt->flags |= rs_packet_hdr_read_flag;
+ pkt->flags |= RS_PACKET_HEADER_READ;
pkt->rpkt->length = (pkt->hdr[2] << 8) + pkt->hdr[3];
if (pkt->rpkt->length < 20 || pkt->rpkt->length > RS_MAX_PACKET_LEN)
{
return 0;
}
+/** Read a message, check that it's valid RADIUS and hand it off to
+ registered user callback.
+
+ The packet is read from the bufferevent associated with \a pkt and
+ the data is stored in \a pkt->rpkt.
+
+ Return 0 on success and !0 on failure. */
static int
_read_packet (struct rs_packet *pkt)
{
{
bufferevent_disable (pkt->conn->bev, EV_READ);
rs_debug (("%s: complete packet read\n", __func__));
- pkt->flags &= ~rs_packet_hdr_read_flag;
+ pkt->flags &= ~RS_PACKET_HEADER_READ;
memset (pkt->hdr, 0, sizeof(*pkt->hdr));
/* Checks done by rad_packet_ok:
assert (pkt->rpkt);
pkt->rpkt->sockfd = pkt->conn->fd;
- pkt->rpkt->vps = NULL;
+ pkt->rpkt->vps = NULL; /* FIXME: can this be done when initializing pkt? */
+
+ /* Read a message header if not already read, return if that
+ fails. Read a message and have it dispatched to the user
+ registered callback.
- if ((pkt->flags & rs_packet_hdr_read_flag) == 0)
+ Room for improvement: Peek inside buffer (evbuffer_copyout()) to
+ avoid the extra copying. */
+ if ((pkt->flags & RS_PACKET_HEADER_READ) == 0)
if (_read_header (pkt))
return; /* Error. */
_read_packet (pkt);