25 #define LOG_PREFIX "process_dhcpv4"
27 #include <freeradius-devel/io/application.h>
28 #include <freeradius-devel/server/protocol.h>
29 #include <freeradius-devel/util/dict.h>
30 #include <freeradius-devel/util/debug.h>
31 #include <freeradius-devel/dhcpv4/dhcpv4.h>
58 #ifdef WITH_IFINDEX_NAME_RESOLUTION
59 char if_name[IFNAMSIZ];
66 #ifdef WITH_IFINDEX_NAME_RESOLUTION
70 received ?
"Received" :
"Sending",
73 packet->
socket.inet.src_ipaddr.
af == AF_INET6 ?
"[" :
"",
75 packet->
socket.inet.src_ipaddr.
af == AF_INET6 ?
"]" :
"",
76 packet->
socket.inet.src_port,
77 packet->
socket.inet.dst_ipaddr.
af == AF_INET6 ?
"[" :
"",
79 packet->
socket.inet.dst_ipaddr.
af == AF_INET6 ?
"]" :
"",
80 packet->
socket.inet.dst_port
81 #ifdef WITH_IFINDEX_NAME_RESOLUTION
82 , packet->
socket.inet.ifindex ?
"via " :
"",
83 packet->
socket.inet.ifindex ? fr_ifname_from_ifindex(if_name, packet->
socket.inet.ifindex) :
"",
84 packet->
socket.inet.ifindex ?
" " :
""
88 if (received || request->parent) {
122 #define FR_DHCP_PROCESS_CODE_VALID(_x) (FR_DHCP_PACKET_CODE_VALID(_x) || (_x == FR_DHCP_DO_NOT_RESPOND))
124 #define PROCESS_PACKET_TYPE fr_dhcpv4_packet_code_t
125 #define PROCESS_CODE_MAX FR_DHCP_CODE_MAX
126 #define PROCESS_CODE_DO_NOT_RESPOND FR_DHCP_DO_NOT_RESPOND
127 #define PROCESS_PACKET_CODE_VALID FR_DHCP_PROCESS_CODE_VALID
128 #define PROCESS_INST process_dhcpv4_t
129 #define PROCESS_CODE_DYNAMIC_CLIENT FR_DHCP_ACK
130 #include <freeradius-devel/server/process.h>
138 REDEBUG(
"%s packet does not have YIADDR. The client will not receive an IP address.",
142 return CALL_RESUME(send_generic);
160 .recv = recv_generic,
161 .resume = resume_recv_generic,
162 .section_offset = PROCESS_CONF_OFFSET(discover),
178 .send = send_generic,
179 .resume = resume_check_yiaddr,
180 .section_offset = PROCESS_CONF_OFFSET(offer),
197 .recv = recv_generic,
198 .resume = resume_recv_generic,
199 .section_offset = PROCESS_CONF_OFFSET(request),
215 .recv = recv_generic,
216 .resume = resume_recv_generic,
217 .section_offset = PROCESS_CONF_OFFSET(request),
234 .send = send_generic,
235 .resume = resume_check_yiaddr,
236 .section_offset = PROCESS_CONF_OFFSET(ack),
252 .send = send_generic,
253 .resume = resume_send_generic,
254 .section_offset = PROCESS_CONF_OFFSET(nak),
271 .recv = recv_generic,
272 .resume = resume_recv_generic,
273 .section_offset = PROCESS_CONF_OFFSET(inform),
290 .recv = recv_generic,
291 .resume = resume_recv_generic,
292 .section_offset = PROCESS_CONF_OFFSET(release),
309 .recv = recv_generic,
310 .resume = resume_recv_generic,
311 .section_offset = PROCESS_CONF_OFFSET(lease_query),
328 .send = send_generic,
329 .resume = resume_send_generic,
330 .section_offset = PROCESS_CONF_OFFSET(lease_unassigned),
347 .send = send_generic,
348 .resume = resume_send_generic,
349 .section_offset = PROCESS_CONF_OFFSET(lease_unknown),
366 .send = send_generic,
367 .resume = resume_send_generic,
368 .section_offset = PROCESS_CONF_OFFSET(lease_active),
385 .send = send_generic,
386 .resume = resume_send_generic,
387 .section_offset = PROCESS_CONF_OFFSET(do_not_respond),
393 fr_process_state_t
const *state;
400 request->component =
"dhcpv4";
401 request->module = NULL;
404 UPDATE_STATE(packet);
407 REDEBUG(
"Invalid packet type (%u)", request->packet->code);
414 return new_client(p_result, mctx, request);
417 return state->recv(p_result, mctx, request);
433 .offset = PROCESS_CONF_OFFSET(discover),
439 .offset = PROCESS_CONF_OFFSET(offer),
453 .offset = PROCESS_CONF_OFFSET(request),
460 .offset = PROCESS_CONF_OFFSET(ack),
466 .offset = PROCESS_CONF_OFFSET(nak),
480 .offset = PROCESS_CONF_OFFSET(decline),
495 .offset = PROCESS_CONF_OFFSET(release),
501 .offset = PROCESS_CONF_OFFSET(inform),
506 .name2 =
"Lease-Query",
508 .offset = PROCESS_CONF_OFFSET(lease_query),
512 .name2 =
"Lease-Unassigned",
514 .offset = PROCESS_CONF_OFFSET(lease_unassigned),
518 .name2 =
"Lease-Unknown",
520 .offset = PROCESS_CONF_OFFSET(lease_unknown),
524 .name2 =
"Lease-Active",
526 .offset = PROCESS_CONF_OFFSET(lease_active),
531 .name2 =
"Do-Not-Respond",
533 .offset = PROCESS_CONF_OFFSET(do_not_respond),
536 DYNAMIC_CLIENT_SECTIONS,
unlang_action_t
Returned by unlang_op_t calls, determine the next action of the interpreter.
A section grouping multiple CONF_PAIR.
@ MOD_POST_AUTH
7 methods index for postauth section.
@ FR_DHCP_LEASE_UNASSIGNED
fr_dict_attr_t const ** out
Where to write a pointer to the resolved fr_dict_attr_t.
fr_dict_t const ** out
Where to write a pointer to the loaded/resolved fr_dict_t.
Specifies an attribute which must be present for the module to function.
Specifies a dictionary which must be loaded/loadable for the module to function.
void *_CONST data
Module instance's parsed configuration.
#define MODULE_MAGIC_INIT
Stop people using different module/library/server versions together.
void log_request_proto_pair_list(fr_log_lvl_t lvl, request_t *request, fr_pair_t const *parent, fr_pair_list_t const *vps, char const *prefix)
Print a list of protocol fr_pair_ts.
void log_request(fr_log_type_t type, fr_log_lvl_t lvl, request_t *request, char const *file, int line, char const *fmt,...)
Marshal variadic log arguments into a va_list and pass to normal logging functions.
void log_request_pair_list(fr_log_lvl_t lvl, request_t *request, fr_pair_t const *parent, fr_pair_list_t const *vps, char const *prefix)
Print a fr_pair_list_t.
@ L_DBG_LVL_1
Highest priority debug messages (-x).
@ L_DBG
Only displayed when debugging is enabled.
@ FR_TYPE_IPV4_ADDR
32 Bit IPv4 Address.
@ FR_TYPE_UINT8
8 Bit unsigned integer.
@ FR_TYPE_UINT32
32 Bit unsigned integer.
dl_module_inst_t const * inst
Dynamic loader API handle for the module.
Temporary structure to hold arguments for module calls.
fr_pair_t * fr_pair_find_by_da(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *da)
Find the first pair with a matching da.
CONF_SECTION * lease_query
static fr_dict_attr_t const * attr_packet_type
static unlang_action_t mod_process(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
CONF_SECTION * lease_unassigned
static void dhcpv4_packet_debug(request_t *request, fr_packet_t *packet, fr_pair_list_t *list, bool received)
CONF_SECTION * do_not_respond
fr_process_module_t process_dhcpv4
static fr_dict_attr_t const * attr_yiaddr
CONF_SECTION * force_renew
CONF_SECTION * new_client
static const virtual_server_compile_t compile_list[]
fr_dict_attr_autoload_t process_dhcpv4_dict_attr[]
static fr_dict_t const * dict_dhcpv4
fr_dict_autoload_t process_dhcpv4_dict[]
static fr_process_state_t const process_state[]
CONF_SECTION * add_client
CONF_SECTION * lease_active
process_dhcpv4_sections_t sections
CONF_SECTION * deny_client
#define PROCESS_PACKET_CODE_VALID
CONF_SECTION * lease_unknown
static fr_dict_attr_t const * attr_message_type
#define PROCESS_TRACE
Trace each state function as it's entered.
module_t common
Common fields for all loadable modules.
Common public symbol definition for all process modules.
char const * dhcp_message_types[]
rlm_rcode_t
Return codes indicating the result of the module call.
@ RLM_MODULE_INVALID
The module considers the request invalid.
@ RLM_MODULE_OK
The module is OK, continue.
@ RLM_MODULE_FAIL
Module failed, don't reply.
@ RLM_MODULE_DISALLOW
Reject the request (user is locked out).
@ RLM_MODULE_REJECT
Immediately reject the request.
@ RLM_MODULE_NOTFOUND
User not found.
@ RLM_MODULE_UPDATED
OK (pairs modified).
@ RLM_MODULE_NOOP
Module succeeded without doing anything.
#define request_is_dynamic_client(_x)
Stores an attribute, a value and various bits of other data.
#define talloc_get_type_abort_const
unsigned int code
Packet code (type).
fr_socket_t socket
This packet was received on.
int id
Packet ID (used to link requests/responses).
int af
AF_INET, AF_INET6, or AF_UNIX.
#define fr_box_ipaddr(_val)
#define COMPILE_TERMINATOR
char const * name
Name of the processing section, such as "recv" or "send".
Processing sections which are allowed in this virtual server.
Module methods which are allowed in virtual servers.