* @param[in,out] buffer the buffer where the raw packet will be written to (or read from)
* @param[in] buffer_len the length of the buffer
* @param[out] leftover bytes left in the buffer after reading a full packet.
+ * @param[out] priority priority of this packet (0 = low, 65535 = high)
* @return
* - <0 on error
* - >=0 length of the data read or written.
*/
-typedef ssize_t (*fr_io_data_read_t)(void const *instance, void **packet_ctx, fr_time_t **recv_time, uint8_t *buffer, size_t buffer_len, size_t *leftover);
+typedef ssize_t (*fr_io_data_read_t)(void const *instance, void **packet_ctx, fr_time_t **recv_time, uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority);
/** Write a socket.
*
*/
next_message:
data_size = s->listen->app_io->read(s->listen->app_io_instance, &cd->packet_ctx, &recv_time,
- cd->m.data, cd->m.rb_size, &s->leftover);
+ cd->m.data, cd->m.rb_size, &s->leftover, &cd->priority);
if (data_size == 0) {
// fr_log(nr->log, L_DBG_ERR, "got no data from transport read");
} else {
cd->m.when = fr_time();
}
- cd->priority = 0;
+
cd->listen = s->listen;
cd->request.recv_time = recv_time;
return 0;
}
-static ssize_t mod_read(void const *instance, void **packet_ctx, fr_time_t **recv_time, uint8_t *buffer, size_t buffer_len, size_t *leftover)
+static uint32_t priorities[FR_MAX_PACKET_CODE] = {
+ [FR_CODE_ACCESS_REQUEST] = (1 << 15),
+ [FR_CODE_ACCOUNTING_REQUEST] = (1 << 14),
+ [FR_CODE_COA_REQUEST] = (1 << 14) + 1,
+ [FR_CODE_DISCONNECT_REQUEST] = (1 << 14) + 1,
+ [FR_CODE_STATUS_SERVER] = (1 << 16),
+};
+
+static ssize_t mod_read(void const *instance, void **packet_ctx, fr_time_t **recv_time, uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority)
{
proto_radius_udp_t const *inst = talloc_get_type_abort(instance, proto_radius_udp_t);
*packet_ctx = track;
*recv_time = &track->timestamp;
+ *priority = priorities[buffer[0]];
return packet_len;
}
static fr_time_t start_time;
-static ssize_t test_read(void const *ctx, UNUSED void **packet_ctx, fr_time_t **recv_time, uint8_t *buffer, size_t buffer_len, size_t *leftover)
+static ssize_t test_read(void const *ctx, UNUSED void **packet_ctx, fr_time_t **recv_time, uint8_t *buffer, size_t buffer_len, size_t *leftover, uint32_t *priority)
{
ssize_t data_size;
fr_listen_test_t *io_ctx = talloc_get_type_abort(ctx, fr_listen_test_t);
start_time = fr_time();
*recv_time = &start_time;
+ *priority = 0;
return data_size;
}