The FreeRADIUS server  $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Data Structures | Macros | Functions | Variables
base.c File Reference

Functions to send/receive dhcp packets. More...

#include <freeradius-devel/dhcpv4/dhcpv4.h>
#include <freeradius-devel/util/net.h>
#include <freeradius-devel/util/proto.h>
#include "attrs.h"
+ Include dependency graph for base.c:

Go to the source code of this file.

Data Structures

struct  dhcp_option_t
 

Macros

#define DHCP_MAX_MESSAGE_TYPE   (NUM_ELEMENTS(dhcp_message_types))
 

Functions

static bool attr_valid (UNUSED fr_dict_t *dict, UNUSED fr_dict_attr_t const *parent, UNUSED char const *name, UNUSED int attr, fr_type_t type, fr_dict_attr_flags_t *flags)
 
int8_t fr_dhcpv4_attr_cmp (void const *a, void const *b)
 
ssize_t fr_dhcpv4_encode (uint8_t *buffer, size_t buflen, dhcp_packet_t *original, int code, uint32_t xid, fr_pair_list_t *vps)
 
ssize_t fr_dhcpv4_encode_dbuff (fr_dbuff_t *dbuff, dhcp_packet_t *original, int code, uint32_t xid, fr_pair_list_t *vps)
 
void fr_dhcpv4_global_free (void)
 
int fr_dhcpv4_global_init (void)
 Resolve/cache attributes in the DHCP dictionary. More...
 
bool fr_dhcpv4_is_encodable (void const *item, UNUSED void const *uctx)
 Evaluation function for DCHPV4-encodability. More...
 
void * fr_dhcpv4_next_encodable (fr_dlist_head_t *list, void *current, void *uctx)
 DHCPV4-specific iterator. More...
 
bool fr_dhcpv4_ok (uint8_t const *data, ssize_t data_len, uint8_t *message_type, uint32_t *xid)
 Check received DHCP request is valid and build fr_packet_t structure if it is. More...
 
void fr_dhcpv4_print_hex (FILE *fp, uint8_t const *packet, size_t packet_len)
 Print a raw DHCP packet as hex. More...
 
static void print_hex_data (FILE *fp, uint8_t const *ptr, int attrlen, int depth)
 

Variables

fr_dict_attr_t const * attr_dhcp_boot_filename
 
fr_dict_attr_t const * attr_dhcp_client_hardware_address
 
fr_dict_attr_t const * attr_dhcp_client_ip_address
 
fr_dict_attr_t const * attr_dhcp_dhcp_maximum_msg_size
 
fr_dict_attr_t const * attr_dhcp_flags
 
fr_dict_attr_t const * attr_dhcp_gateway_ip_address
 
fr_dict_attr_t const * attr_dhcp_hardware_address_length
 
fr_dict_attr_t const * attr_dhcp_hardware_type
 
fr_dict_attr_t const * attr_dhcp_hop_count
 
fr_dict_attr_t const * attr_dhcp_interface_mtu_size
 
fr_dict_attr_t const * attr_dhcp_message_type
 
fr_dict_attr_t const * attr_dhcp_network_subnet
 
fr_dict_attr_t const * attr_dhcp_number_of_seconds
 
fr_dict_attr_t const * attr_dhcp_opcode
 
fr_dict_attr_t const * attr_dhcp_overload
 
fr_dict_attr_t const * attr_dhcp_parameter_request_list
 
fr_dict_attr_t const * attr_dhcp_relay_link_selection
 
fr_dict_attr_t const * attr_dhcp_server_host_name
 
fr_dict_attr_t const * attr_dhcp_server_ip_address
 
fr_dict_attr_t const * attr_dhcp_subnet_selection_option
 
fr_dict_attr_t const * attr_dhcp_transaction_id
 
fr_dict_attr_t const * attr_dhcp_vendor_class_identifier
 
fr_dict_attr_t const * attr_dhcp_your_ip_address
 
fr_dict_attr_t const ** dhcp_header_attrs []
 
size_t dhcp_header_attrs_len = NUM_ELEMENTS(dhcp_header_attrs)
 
int dhcp_header_sizes []
 
char const * dhcp_message_types []
 
fr_dict_attr_t const * dhcp_option_82
 
fr_dict_autoload_t dhcpv4_dict []
 
fr_dict_attr_autoload_t dhcpv4_dict_attr []
 
fr_dict_t const * dict_dhcpv4
 
uint8_t eth_bcast [ETH_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
 
static uint32_t instance_count = 0
 
fr_dict_protocol_t libfreeradius_dhcpv4_dict_protocol
 
static char const * short_header_names []
 
static fr_table_num_ordered_t const subtype_table []
 

Detailed Description

Functions to send/receive dhcp packets.

Id
76c832f04ee6fffbc085bbf3850ea4adb4aafb11

Definition in file base.c.


Data Structure Documentation

◆ dhcp_option_t

struct dhcp_option_t

Definition at line 35 of file base.c.

Data Fields
uint8_t code
uint8_t length

Macro Definition Documentation

◆ DHCP_MAX_MESSAGE_TYPE

#define DHCP_MAX_MESSAGE_TYPE   (NUM_ELEMENTS(dhcp_message_types))

Definition at line 143 of file base.c.

Function Documentation

◆ attr_valid()

static bool attr_valid ( UNUSED fr_dict_t dict,
UNUSED fr_dict_attr_t const *  parent,
UNUSED char const *  name,
UNUSED int  attr,
fr_type_t  type,
fr_dict_attr_flags_t flags 
)
static

Definition at line 689 of file base.c.

+ Here is the caller graph for this function:

◆ fr_dhcpv4_attr_cmp()

int8_t fr_dhcpv4_attr_cmp ( void const *  a,
void const *  b 
)

Definition at line 166 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_dhcpv4_encode()

ssize_t fr_dhcpv4_encode ( uint8_t buffer,
size_t  buflen,
dhcp_packet_t original,
int  code,
uint32_t  xid,
fr_pair_list_t vps 
)

Definition at line 311 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_dhcpv4_encode_dbuff()

ssize_t fr_dhcpv4_encode_dbuff ( fr_dbuff_t dbuff,
dhcp_packet_t original,
int  code,
uint32_t  xid,
fr_pair_list_t vps 
)

Definition at line 316 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_dhcpv4_global_free()

void fr_dhcpv4_global_free ( void  )

Definition at line 601 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_dhcpv4_global_init()

int fr_dhcpv4_global_init ( void  )

Resolve/cache attributes in the DHCP dictionary.

Returns
  • 0 on success.
  • -1 on failure.

Definition at line 557 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_dhcpv4_is_encodable()

bool fr_dhcpv4_is_encodable ( void const *  item,
UNUSED void const *  uctx 
)

Evaluation function for DCHPV4-encodability.

Parameters
itempointer to a fr_pair_t
uctxcontext
Returns
true if the underlying fr_pair_t is DHCPv4 encodable, false otherwise

Definition at line 283 of file base.c.

+ Here is the call graph for this function:

◆ fr_dhcpv4_next_encodable()

void* fr_dhcpv4_next_encodable ( fr_dlist_head_t list,
void *  current,
void *  uctx 
)

DHCPV4-specific iterator.

Definition at line 294 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_dhcpv4_ok()

bool fr_dhcpv4_ok ( uint8_t const *  data,
ssize_t  data_len,
uint8_t message_type,
uint32_t xid 
)

Check received DHCP request is valid and build fr_packet_t structure if it is.

Parameters
datapointer to received packet.
data_lenlength of received data, and then length of the actual DHCP data.
[out]message_typewhere the message type will be stored (if used)
[out]xidwhere the xid will be stored (if used)
Returns
  • true if the packet is well-formed
  • false if it's a bad packet

Definition at line 215 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_dhcpv4_print_hex()

void fr_dhcpv4_print_hex ( FILE *  fp,
uint8_t const *  packet,
size_t  packet_len 
)

Print a raw DHCP packet as hex.

Definition at line 645 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ print_hex_data()

static void print_hex_data ( FILE *  fp,
uint8_t const *  ptr,
int  attrlen,
int  depth 
)
static

Definition at line 628 of file base.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ attr_dhcp_boot_filename

fr_dict_attr_t const* attr_dhcp_boot_filename

Definition at line 48 of file base.c.

◆ attr_dhcp_client_hardware_address

fr_dict_attr_t const* attr_dhcp_client_hardware_address

Definition at line 49 of file base.c.

◆ attr_dhcp_client_ip_address

fr_dict_attr_t const* attr_dhcp_client_ip_address

Definition at line 50 of file base.c.

◆ attr_dhcp_dhcp_maximum_msg_size

fr_dict_attr_t const* attr_dhcp_dhcp_maximum_msg_size

Definition at line 62 of file base.c.

◆ attr_dhcp_flags

fr_dict_attr_t const* attr_dhcp_flags

Definition at line 51 of file base.c.

◆ attr_dhcp_gateway_ip_address

fr_dict_attr_t const* attr_dhcp_gateway_ip_address

Definition at line 52 of file base.c.

◆ attr_dhcp_hardware_address_length

fr_dict_attr_t const* attr_dhcp_hardware_address_length

Definition at line 53 of file base.c.

◆ attr_dhcp_hardware_type

fr_dict_attr_t const* attr_dhcp_hardware_type

Definition at line 54 of file base.c.

◆ attr_dhcp_hop_count

fr_dict_attr_t const* attr_dhcp_hop_count

Definition at line 55 of file base.c.

◆ attr_dhcp_interface_mtu_size

fr_dict_attr_t const* attr_dhcp_interface_mtu_size

Definition at line 63 of file base.c.

◆ attr_dhcp_message_type

fr_dict_attr_t const* attr_dhcp_message_type

Definition at line 64 of file base.c.

◆ attr_dhcp_network_subnet

fr_dict_attr_t const* attr_dhcp_network_subnet

Definition at line 70 of file base.c.

◆ attr_dhcp_number_of_seconds

fr_dict_attr_t const* attr_dhcp_number_of_seconds

Definition at line 56 of file base.c.

◆ attr_dhcp_opcode

fr_dict_attr_t const* attr_dhcp_opcode

Definition at line 57 of file base.c.

◆ attr_dhcp_overload

fr_dict_attr_t const* attr_dhcp_overload

Definition at line 66 of file base.c.

◆ attr_dhcp_parameter_request_list

fr_dict_attr_t const* attr_dhcp_parameter_request_list

Definition at line 65 of file base.c.

◆ attr_dhcp_relay_link_selection

fr_dict_attr_t const* attr_dhcp_relay_link_selection

Definition at line 68 of file base.c.

◆ attr_dhcp_server_host_name

fr_dict_attr_t const* attr_dhcp_server_host_name

Definition at line 58 of file base.c.

◆ attr_dhcp_server_ip_address

fr_dict_attr_t const* attr_dhcp_server_ip_address

Definition at line 59 of file base.c.

◆ attr_dhcp_subnet_selection_option

fr_dict_attr_t const* attr_dhcp_subnet_selection_option

Definition at line 69 of file base.c.

◆ attr_dhcp_transaction_id

fr_dict_attr_t const* attr_dhcp_transaction_id

Definition at line 60 of file base.c.

◆ attr_dhcp_vendor_class_identifier

fr_dict_attr_t const* attr_dhcp_vendor_class_identifier

Definition at line 67 of file base.c.

◆ attr_dhcp_your_ip_address

fr_dict_attr_t const* attr_dhcp_your_ip_address

Definition at line 61 of file base.c.

◆ dhcp_header_attrs

fr_dict_attr_t const** dhcp_header_attrs[]
Initial value:
= {
}
fr_dict_attr_t const * attr_dhcp_opcode
Definition: base.c:57
fr_dict_attr_t const * attr_dhcp_gateway_ip_address
Definition: base.c:52
fr_dict_attr_t const * attr_dhcp_server_ip_address
Definition: base.c:59
fr_dict_attr_t const * attr_dhcp_hop_count
Definition: base.c:55
fr_dict_attr_t const * attr_dhcp_server_host_name
Definition: base.c:58
fr_dict_attr_t const * attr_dhcp_hardware_address_length
Definition: base.c:53
fr_dict_attr_t const * attr_dhcp_transaction_id
Definition: base.c:60
fr_dict_attr_t const * attr_dhcp_boot_filename
Definition: base.c:48
fr_dict_attr_t const * attr_dhcp_flags
Definition: base.c:51
fr_dict_attr_t const * attr_dhcp_hardware_type
Definition: base.c:54
fr_dict_attr_t const * attr_dhcp_your_ip_address
Definition: base.c:61
fr_dict_attr_t const * attr_dhcp_client_ip_address
Definition: base.c:50
fr_dict_attr_t const * attr_dhcp_client_hardware_address
Definition: base.c:49
fr_dict_attr_t const * attr_dhcp_number_of_seconds
Definition: base.c:56

Definition at line 106 of file base.c.

◆ dhcp_header_attrs_len

size_t dhcp_header_attrs_len = NUM_ELEMENTS(dhcp_header_attrs)

Definition at line 122 of file base.c.

◆ dhcp_header_sizes

int dhcp_header_sizes[]
Initial value:
= {
1,
1,
1,
1,
4,
2,
2,
4,
4,
4,
4,
}
#define DHCP_CHADDR_LEN
Definition: dhcpv4.h:37
#define DHCP_SNAME_LEN
Definition: dhcpv4.h:38
#define DHCP_FILE_LEN
Definition: dhcpv4.h:39

Definition at line 145 of file base.c.

◆ dhcp_message_types

char const* dhcp_message_types[]
Initial value:
= {
"invalid",
"Discover",
"Offer",
"Request",
"Decline",
"Ack",
"NAK",
"Release",
"Inform",
"Force-Renew",
"Lease-Query",
"Lease-Unassigned",
"Lease-Unknown",
"Lease-Active",
"Bulk-Lease-Query",
"Lease-Query-Done"
}

Definition at line 124 of file base.c.

◆ dhcp_option_82

fr_dict_attr_t const* dhcp_option_82

Definition at line 164 of file base.c.

◆ dhcpv4_dict

fr_dict_autoload_t dhcpv4_dict
Initial value:
= {
{ .out = &dict_dhcpv4, .proto = "dhcpv4" },
{ NULL }
}
fr_dict_t const * dict_dhcpv4
Definition: base.c:40

Definition at line 43 of file base.c.

◆ dhcpv4_dict_attr

fr_dict_attr_autoload_t dhcpv4_dict_attr
Initial value:
= {
{ .out = &attr_dhcp_boot_filename, .name = "Boot-Filename", .type = FR_TYPE_STRING, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_client_hardware_address, .name = "Client-Hardware-Address", .type = FR_TYPE_ETHERNET, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_client_ip_address, .name = "Client-IP-Address", .type = FR_TYPE_IPV4_ADDR, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_flags, .name = "Flags", .type = FR_TYPE_UINT16, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_gateway_ip_address, .name = "Gateway-IP-Address", .type = FR_TYPE_IPV4_ADDR, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_hardware_address_length, .name = "Hardware-Address-Length", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_hardware_type, .name = "Hardware-Type", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_hop_count, .name = "Hop-Count", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_number_of_seconds, .name = "Number-of-Seconds", .type = FR_TYPE_UINT16, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_opcode, .name = "Opcode", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_server_host_name, .name = "Server-Host-Name", .type = FR_TYPE_STRING, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_server_ip_address, .name = "Server-IP-Address", .type = FR_TYPE_IPV4_ADDR, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_transaction_id, .name = "Transaction-Id", .type = FR_TYPE_UINT32, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_your_ip_address, .name = "Your-IP-Address", .type = FR_TYPE_IPV4_ADDR, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_dhcp_maximum_msg_size, .name = "Maximum-Msg-Size", .type = FR_TYPE_UINT16, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_interface_mtu_size, .name = "Interface-MTU-Size", .type = FR_TYPE_UINT16, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_message_type, .name = "Message-Type", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_parameter_request_list, .name = "Parameter-Request-List", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_overload, .name = "Overload", .type = FR_TYPE_UINT8, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_vendor_class_identifier, .name = "Vendor-Class-Identifier", .type = FR_TYPE_OCTETS, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_relay_link_selection, .name = "Relay-Agent-Information.Relay-Link-Selection", .type = FR_TYPE_IPV4_ADDR, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_subnet_selection_option, .name = "Subnet-Selection-Option", .type = FR_TYPE_IPV4_ADDR, .dict = &dict_dhcpv4 },
{ .out = &attr_dhcp_network_subnet, .name = "Network-Subnet", .type = FR_TYPE_IPV4_PREFIX, .dict = &dict_dhcpv4 },
{ NULL }
}
@ FR_TYPE_IPV4_ADDR
32 Bit IPv4 Address.
Definition: merged_model.c:86
@ FR_TYPE_ETHERNET
48 Bit Mac-Address.
Definition: merged_model.c:93
@ FR_TYPE_STRING
String of printable characters.
Definition: merged_model.c:83
@ FR_TYPE_UINT16
16 Bit unsigned integer.
Definition: merged_model.c:98
@ FR_TYPE_UINT8
8 Bit unsigned integer.
Definition: merged_model.c:97
@ FR_TYPE_UINT32
32 Bit unsigned integer.
Definition: merged_model.c:99
@ FR_TYPE_IPV4_PREFIX
IPv4 Prefix.
Definition: merged_model.c:87
@ FR_TYPE_OCTETS
Raw octets.
Definition: merged_model.c:84
fr_dict_attr_t const * attr_dhcp_dhcp_maximum_msg_size
Definition: base.c:62
fr_dict_attr_t const * attr_dhcp_relay_link_selection
Definition: base.c:68
fr_dict_attr_t const * attr_dhcp_vendor_class_identifier
Definition: base.c:67
fr_dict_attr_t const * attr_dhcp_parameter_request_list
Definition: base.c:65
fr_dict_attr_t const * attr_dhcp_message_type
Definition: base.c:64
fr_dict_attr_t const * attr_dhcp_overload
Definition: base.c:66
fr_dict_attr_t const * attr_dhcp_subnet_selection_option
Definition: base.c:69
fr_dict_attr_t const * attr_dhcp_network_subnet
Definition: base.c:70
fr_dict_attr_t const * attr_dhcp_interface_mtu_size
Definition: base.c:63

Definition at line 73 of file base.c.

◆ dict_dhcpv4

fr_dict_t const* dict_dhcpv4

Definition at line 40 of file base.c.

◆ eth_bcast

uint8_t eth_bcast[ETH_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }

Definition at line 162 of file base.c.

◆ instance_count

uint32_t instance_count = 0
static

Definition at line 33 of file base.c.

◆ libfreeradius_dhcpv4_dict_protocol

fr_dict_protocol_t libfreeradius_dhcpv4_dict_protocol
Initial value:
= {
.name = "dhcpv4",
.default_type_size = 1,
.default_type_length = 1,
.subtype_table = subtype_table,
.subtype_table_len = NUM_ELEMENTS(subtype_table),
.attr_valid = attr_valid,
}
#define NUM_ELEMENTS(_t)
Definition: build.h:335
ssize_t fr_dhcpv4_encode_foreign(fr_dbuff_t *dbuff, fr_pair_list_t const *list)
Definition: encode.c:759
int fr_dhcpv4_global_init(void)
Resolve/cache attributes in the DHCP dictionary.
Definition: base.c:557
void fr_dhcpv4_global_free(void)
Definition: base.c:601
static bool attr_valid(UNUSED fr_dict_t *dict, UNUSED fr_dict_attr_t const *parent, UNUSED char const *name, UNUSED int attr, fr_type_t type, fr_dict_attr_flags_t *flags)
Definition: base.c:689
static fr_table_num_ordered_t const subtype_table[]
Definition: base.c:681
ssize_t fr_dhcpv4_decode_foreign(TALLOC_CTX *ctx, fr_pair_list_t *out, uint8_t const *data, size_t data_len)
Definition: decode.c:640

Definition at line 736 of file base.c.

◆ short_header_names

char const* short_header_names[]
static
Initial value:
= {
"opcode",
"hwtype",
"hwaddrlen",
"hop_count",
"xid",
"seconds",
"flags",
"ciaddr",
"yiaddr",
"siaddr",
"giaddr",
"chaddr",
"server_hostname",
"boot_filename",
}

Definition at line 611 of file base.c.

◆ subtype_table

fr_table_num_ordered_t const subtype_table[]
static
Initial value:
= {
{ L("dns_label"), FLAG_ENCODE_DNS_LABEL },
{ L("encode=dns_label"), FLAG_ENCODE_DNS_LABEL },
{ L("prefix=split"), FLAG_ENCODE_SPLIT_PREFIX },
{ L("prefix=bits"), FLAG_ENCODE_BITS_PREFIX },
{ L("encode=exists"), FLAG_ENCODE_BOOL_EXISTS },
}
#define L(_str)
Helper for initialising arrays of string literals.
Definition: build.h:207
@ FLAG_ENCODE_SPLIT_PREFIX
encode IPv4 prefixes as Policy-Filter, split into IP/mask
Definition: dhcpv4.h:72
@ FLAG_ENCODE_BOOL_EXISTS
bool as existence checks
Definition: dhcpv4.h:74
@ FLAG_ENCODE_DNS_LABEL
encode as DNS label
Definition: dhcpv4.h:71
@ FLAG_ENCODE_BITS_PREFIX
encode IPv4 prefixes as prefix bits, followed by IP.
Definition: dhcpv4.h:73

Definition at line 681 of file base.c.