|  | The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
    | 
2-way channels based on kqueue and atomic queues. More...
#include <freeradius-devel/util/table.h>#include <freeradius-devel/io/base.h>#include <freeradius-devel/io/control.h>#include <freeradius-devel/io/message.h>#include <freeradius-devel/util/dlist.h>#include <freeradius-devel/util/heap.h>#include <freeradius-devel/util/log.h>#include <sys/types.h>#include <sys/event.h> Include dependency graph for channel.h:
 Include dependency graph for channel.h:Go to the source code of this file.
| Data Structures | |
| struct | fr_channel_data_t | 
| Channel information which is added to a message.  More... | |
| union | fr_channel_data_t.__unnamed31__ | 
| struct | fr_channel_data_t.__unnamed31__.channel | 
| struct | fr_channel_data_t.__unnamed31__.live | 
| union | fr_channel_data_t.__unnamed33__ | 
| struct | fr_channel_data_t.__unnamed33__.reply | 
| struct | fr_channel_data_t.__unnamed33__.request | 
| struct | fr_channel_stats_t | 
| Statistics for the channel.  More... | |
| Macros | |
| #define | PRIORITY_HIGH (1 << 15) | 
| #define | PRIORITY_LOW (1 << 13) | 
| #define | PRIORITY_NORMAL (1 << 14) | 
| #define | PRIORITY_NOW (1 << 16) | 
| Typedefs | |
| typedef enum fr_channel_event_t | fr_channel_event_t | 
| typedef void(* | fr_channel_recv_callback_t) (void *ctx, fr_channel_t *ch, fr_channel_data_t *cd) | 
| typedef struct fr_channel_s | fr_channel_t | 
| A two-way channel (i.e. | |
| typedef struct fr_listen | fr_listen_t | 
| Enumerations | |
| enum | fr_channel_event_t { FR_CHANNEL_ERROR = 0 , FR_CHANNEL_DATA_READY_RESPONDER , FR_CHANNEL_DATA_READY_REQUESTOR , FR_CHANNEL_OPEN , FR_CHANNEL_CLOSE , FR_CHANNEL_NOOP , FR_CHANNEL_EMPTY } | 
| Functions | |
| bool | fr_channel_active (fr_channel_t *ch) | 
| Check if a channel is active. | |
| fr_channel_t * | fr_channel_create (TALLOC_CTX *ctx, fr_control_t *frontend, fr_control_t *worker, bool same) | 
| Create a new channel. | |
| int | fr_channel_null_reply (fr_channel_t *ch) | 
| Don't send a reply message into the channel. | |
| bool | fr_channel_recv_reply (fr_channel_t *ch) | 
| Receive a reply message from the channel. | |
| bool | fr_channel_recv_request (fr_channel_t *ch) | 
| Receive a request message from the channel. | |
| void | fr_channel_requestor_uctx_add (fr_channel_t *ch, void *ctx) | 
| Add network-specific data to a channel. | |
| void * | fr_channel_requestor_uctx_get (fr_channel_t *ch) | 
| Get network-specific data from a channel. | |
| int | fr_channel_responder_ack_close (fr_channel_t *ch) | 
| Acknowledge that the channel is closing. | |
| int | fr_channel_responder_sleeping (fr_channel_t *ch) | 
| Signal a channel that the responder is sleeping. | |
| void | fr_channel_responder_uctx_add (fr_channel_t *ch, void *ctx) | 
| Add responder-specific data to a channel. | |
| void * | fr_channel_responder_uctx_get (fr_channel_t *ch) | 
| Get responder-specific data from a channel. | |
| int | fr_channel_send_reply (fr_channel_t *ch, fr_channel_data_t *cd) | 
| Send a reply message into the channel. | |
| int | fr_channel_send_request (fr_channel_t *ch, fr_channel_data_t *cm) | 
| Send a request message into the channel. | |
| int | fr_channel_service_kevent (fr_channel_t *ch, fr_control_t *c, struct kevent const *kev) | 
| fr_channel_event_t | fr_channel_service_message (fr_time_t when, fr_channel_t **p_channel, void const *data, size_t data_size) | 
| Service a control-plane message. | |
| int | fr_channel_set_recv_reply (fr_channel_t *ch, void *ctx, fr_channel_recv_callback_t recv_reply)) | 
| int | fr_channel_set_recv_request (fr_channel_t *ch, void *ctx, fr_channel_recv_callback_t recv_reply)) | 
| int | fr_channel_signal_open (fr_channel_t *ch) | 
| Send a channel to a responder. | |
| int | fr_channel_signal_responder_close (fr_channel_t *ch) | 
| Signal a responder that the channel is closing. | |
| void | fr_channel_stats_log (fr_channel_t const *ch, fr_log_t const *log, char const *file, int line) | 
| Variables | |
| fr_table_num_sorted_t const | channel_packet_priority [] | 
| size_t | channel_packet_priority_len | 
| fr_table_num_sorted_t const | channel_signals [] | 
| size_t | channel_signals_len | 
2-way channels based on kqueue and atomic queues.
Definition in file channel.h.
| struct fr_channel_data_t | 
Channel information which is added to a message.
The messages are just for exchanging packet data. The channel data structure is for exchanging requests and replies.
 Collaboration diagram for fr_channel_data_t:
 Collaboration diagram for fr_channel_data_t:| Data Fields | ||
|---|---|---|
| union fr_channel_data_t.__unnamed31__ | __unnamed__ | |
| union fr_channel_data_t.__unnamed33__ | __unnamed__ | |
| fr_listen_t * | listen | for tracking packet transport, etc. | 
| fr_message_t | m | the message header | 
| void * | packet_ctx | Packet specific context for holding client information, and other proto_* specific information that needs to be passed to the request. | 
| uint32_t | priority | Priority of this packet. | 
| union fr_channel_data_t.__unnamed31__ | 
| Data Fields | ||
|---|---|---|
| struct fr_channel_data_t.__unnamed31__.channel | channel | |
| struct fr_channel_data_t.__unnamed31__.live | live | |
| struct fr_channel_data_t.__unnamed31__.channel | 
| Data Fields | ||
|---|---|---|
| fr_channel_t * | ch | channel where this messages was received | 
| fr_heap_index_t | heap_id | for the various queues | 
| struct fr_channel_data_t.__unnamed31__.live | 
| union fr_channel_data_t.__unnamed33__ | 
| Data Fields | ||
|---|---|---|
| struct fr_channel_data_t.__unnamed33__.reply | reply | |
| struct fr_channel_data_t.__unnamed33__.request | request | |
| struct fr_channel_data_t.__unnamed33__.reply | 
| Data Fields | ||
|---|---|---|
| fr_time_delta_t | cpu_time | Total CPU time, including predicted work, (only worker -> network). | 
| fr_time_delta_t | processing_time | Actual processing time for this packet (only worker -> network). | 
| fr_time_t | request_time | Timestamp of the request packet. | 
| struct fr_channel_data_t.__unnamed33__.request | 
| struct fr_channel_stats_t | 
 Collaboration diagram for fr_channel_stats_t:
 Collaboration diagram for fr_channel_stats_t:| Data Fields | ||
|---|---|---|
| uint64_t | kevents | Number of times we've looked at kevents. | 
| fr_time_t | last_read_other | Last time we successfully read a message from the other the channel. | 
| fr_time_t | last_sent_signal | The last time when we signaled the other end. | 
| fr_time_t | last_write | Last write to the channel. | 
| fr_time_delta_t | message_interval | Interval between messages. | 
| uint64_t | outstanding | Number of outstanding requests with no reply. | 
| uint64_t | packets | Number of actual data packets. | 
| uint64_t | resignals | Number of signals resent. | 
| uint64_t | signals | Number of kevent signals we've sent. | 
| typedef enum fr_channel_event_t fr_channel_event_t | 
| typedef void(* fr_channel_recv_callback_t) (void *ctx, fr_channel_t *ch, fr_channel_data_t *cd) | 
| typedef struct fr_channel_s fr_channel_t | 
| typedef struct fr_listen fr_listen_t | 
| enum fr_channel_event_t | 
| bool fr_channel_active | ( | fr_channel_t * | ch | ) | 
Check if a channel is active.
A channel may be closed by either end. If so, it stays alive (but inactive) until both ends acknowledge the close.
| [in] | ch | the channel | 
Definition at line 812 of file channel.c.
 Here is the caller graph for this function:
 Here is the caller graph for this function:| fr_channel_t * fr_channel_create | ( | TALLOC_CTX * | ctx, | 
| fr_control_t * | requestor, | ||
| fr_control_t * | responder, | ||
| bool | same | ||
| ) | 
Create a new channel.
| [in] | ctx | The talloc_ctx to allocate channel data in. | 
| [in] | requestor | control plane. | 
| [in] | responder | control plane. | 
| [in] | same | whether or not the channel is for the same thread | 
Definition at line 183 of file channel.c.
 Here is the call graph for this function:
 Here is the call graph for this function: Here is the caller graph for this function:
 Here is the caller graph for this function:| int fr_channel_null_reply | ( | fr_channel_t * | ch | ) | 
| bool fr_channel_recv_reply | ( | fr_channel_t * | ch | ) | 
| bool fr_channel_recv_request | ( | fr_channel_t * | ch | ) | 
| void fr_channel_requestor_uctx_add | ( | fr_channel_t * | ch, | 
| void * | uctx | ||
| ) | 
| void * fr_channel_requestor_uctx_get | ( | fr_channel_t * | ch | ) | 
| int fr_channel_responder_ack_close | ( | fr_channel_t * | ch | ) | 
| int fr_channel_responder_sleeping | ( | fr_channel_t * | ch | ) | 
Signal a channel that the responder is sleeping.
This function should be called from the responders idle loop. i.e. only when it has nothing else to do.
| [in] | ch | the channel to signal we're no longer listening on. | 
Definition at line 646 of file channel.c.
 Here is the call graph for this function:
 Here is the call graph for this function:| void fr_channel_responder_uctx_add | ( | fr_channel_t * | ch, | 
| void * | uctx | ||
| ) | 
| void * fr_channel_responder_uctx_get | ( | fr_channel_t * | ch | ) | 
| int fr_channel_send_reply | ( | fr_channel_t * | ch, | 
| fr_channel_data_t * | cd | ||
| ) | 
Send a reply message into the channel.
The message should be initialized, other than "sequence" and "ack".
| [in] | ch | the channel to send the reply on. | 
| [in] | cd | the message to send | 
Definition at line 511 of file channel.c.
 Here is the call graph for this function:
 Here is the call graph for this function: Here is the caller graph for this function:
 Here is the caller graph for this function:| int fr_channel_send_request | ( | fr_channel_t * | ch, | 
| fr_channel_data_t * | cd | ||
| ) | 
Send a request message into the channel.
The message should be initialized, other than "sequence" and "ack".
This function automatically calls the recv_reply callback if there is a reply.
| [in] | ch | the channel to send the request on. | 
| [in] | cd | the message to send. | 
Definition at line 306 of file channel.c.
 Here is the call graph for this function:
 Here is the call graph for this function: Here is the caller graph for this function:
 Here is the caller graph for this function:| int fr_channel_service_kevent | ( | fr_channel_t * | ch, | 
| fr_control_t * | c, | ||
| struct kevent const * | kev | ||
| ) | 
| fr_channel_event_t fr_channel_service_message | ( | fr_time_t | when, | 
| fr_channel_t ** | p_channel, | ||
| void const * | data, | ||
| size_t | data_size | ||
| ) | 
Service a control-plane message.
| [in] | when | The current time. | 
| [out] | p_channel | The channel which should be serviced. | 
| [in] | data | The control message. | 
| [in] | data_size | The size of the control message. | 
Definition at line 685 of file channel.c.
 Here is the call graph for this function:
 Here is the call graph for this function: Here is the caller graph for this function:
 Here is the caller graph for this function:| int fr_channel_set_recv_reply | ( | fr_channel_t * | ch, | 
| void * | ctx, | ||
| fr_channel_recv_callback_t | recv_reply | ||
| ) | 
| int fr_channel_set_recv_request | ( | fr_channel_t * | ch, | 
| void * | ctx, | ||
| fr_channel_recv_callback_t | recv_reply | ||
| ) | 
| int fr_channel_signal_open | ( | fr_channel_t * | ch | ) | 
| int fr_channel_signal_responder_close | ( | fr_channel_t * | ch | ) | 
| void fr_channel_stats_log | ( | fr_channel_t const * | ch, | 
| fr_log_t const * | log, | ||
| char const * | file, | ||
| int | line | ||
| ) | 
| 
 | extern | 
| 
 | extern | 
 1.9.8
 1.9.8