summaryrefslogtreecommitdiff
path: root/libdhcp
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-05-26 14:58:07 -0400
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-05-26 17:10:36 -0400
commitcf4af09e9a20e9cdaec4b3896eb6d10c27f89eba (patch)
tree016f876531f7dfc822be17f686074f0c859fd508 /libdhcp
parent42fb27570262b52e2ca889030c621b5f4af76fe1 (diff)
No more (static inline) function bodies in headers
Diffstat (limited to 'libdhcp')
-rw-r--r--libdhcp/CMakeLists.txt1
-rw-r--r--libdhcp/dhcp_common.c104
-rw-r--r--libdhcp/dhcp_common.h96
3 files changed, 111 insertions, 90 deletions
diff --git a/libdhcp/CMakeLists.txt b/libdhcp/CMakeLists.txt
index dee7cb6..69ad470 100644
--- a/libdhcp/CMakeLists.txt
+++ b/libdhcp/CMakeLists.txt
@@ -7,6 +7,7 @@ add_library(libdhcp INTERFACE)
target_include_directories(libdhcp PUBLIC INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_sources(libdhcp INTERFACE
dhcp_client.c
+ dhcp_common.c
)
target_link_libraries(libdhcp INTERFACE
libmisc
diff --git a/libdhcp/dhcp_common.c b/libdhcp/dhcp_common.c
new file mode 100644
index 0000000..d691836
--- /dev/null
+++ b/libdhcp/dhcp_common.c
@@ -0,0 +1,104 @@
+/* libdhcp/dhcp_common.c - Base definitions for the DHCP protocol
+ *
+ * Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+#include "dhcp_common.h"
+
+/**
+ * DHCP Options
+ * https://www.iana.org/assignments/bootp-dhcp-parameters/bootp-dhcp-parameters.xhtml#options
+ */
+bool dhcp_opt_length_is_valid(uint8_t opt, uint16_t len) {
+ switch (opt) {
+ /* RFC 2132 */
+ case DHCP_OPT_PAD: return len == 0;
+ case DHCP_OPT_SUBNET_MASK: return len == 4;
+ case DHCP_OPT_TIME_OFFSET: return len == 4;
+ case DHCP_OPT_ROUTER: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_TIME_SERVER: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_NAME_SERVER: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_DOMAIN_SERVER: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_LOG_SERVER: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_QUOTES_SERVER: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_LPR_SERVER: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_IMPRESS_SERVER: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_RLP_SERVER: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_HOSTNAME: return len >= 1;
+ case DHCP_OPT_BOOT_FILE_SIZE: return len == 2;
+ case DHCP_OPT_MERIT_DUMP_FILE: return len >= 1;
+ case DHCP_OPT_DOMAIN_NAME: return len >= 1;
+ case DHCP_OPT_SWAP_SERVER: return len == 4; /* IANA says length is "N", but RFC 2132 says "length is 4"; likely releated to errata ID 487 */
+ case DHCP_OPT_ROOT_PATH: return len >= 1;
+ case DHCP_OPT_EXTENSION_FILE: return len >= 1;
+ case DHCP_OPT_FORWARD_ONOFF: return len == 1;
+ case DHCP_OPT_SRCRTE_ONOFF: return len == 1;
+ case DHCP_OPT_POLICY_FILTER: return len >= 8 && len % 8 == 0;
+ case DHCP_OPT_MAX_DG_ASSEMBLY: return len == 2;
+ case DHCP_OPT_DEFAULT_IP_TTL: return len == 1;
+ case DHCP_OPT_MTU_TIMEOUT: return len == 4;
+ case DHCP_OPT_MTU_PLATEAU: return len >= 2 && len % 2 == 0;
+ case DHCP_OPT_MTU_INTERFACE: return len == 2;
+ case DHCP_OPT_MTU_SUBNET: return len == 1;
+ case DHCP_OPT_BROADCAST_ADDRESS: return len == 4;
+ case DHCP_OPT_MASK_DISCOVERY: return len == 1;
+ case DHCP_OPT_MASK_SUPPLIER: return len == 1;
+ case DHCP_OPT_ROUTER_DISCOVERY: return len == 1;
+ case DHCP_OPT_ROUTER_REQUEST: return len == 4;
+ case DHCP_OPT_STATIC_ROUTE: return len >= 8 && len % 8 == 0;
+ case DHCP_OPT_TRAILERS: return len == 1;
+ case DHCP_OPT_ARP_TIMEOUT: return len == 4;
+ case DHCP_OPT_ETHERNET: return len == 1;
+ case DHCP_OPT_DEFAULT_TCP_TTL: return len == 1;
+ case DHCP_OPT_KEEPALIVE_TIME: return len == 4;
+ case DHCP_OPT_KEEPALIVE_DATA: return len == 1;
+ case DHCP_OPT_NIS_DOMAIN: return len >= 1;
+ case DHCP_OPT_NIS_SERVERS: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_NTP_SERVERS: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_VENDOR_SPECIFIC: return len >= 1;
+ case DHCP_OPT_NETBIOS_NAME_SRV: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_NETBIOS_DIST_SRV: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_NETBIOS_NODE_TYPE: return len == 1;
+ case DHCP_OPT_NETBIOS_SCOPE: return len >= 1;
+ case DHCP_OPT_X_WINDOW_FONT: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_X_WINDOW_MANAGER: return len >= 4 && len % 4 == 0;
+ case DHCP_OPT_ADDRESS_REQUEST: return len == 4;
+ case DHCP_OPT_ADDRESS_TIME: return len == 4;
+ case DHCP_OPT_OVERLOAD: return len == 1;
+ case DHCP_OPT_DHCP_MSG_TYPE: return len == 1;
+ case DHCP_OPT_DHCP_SERVER_ID: return len == 4;
+ case DHCP_OPT_PARAMETER_LIST: return len >= 1;
+ case DHCP_OPT_DHCP_MESSAGE: return len >= 1;
+ case DHCP_OPT_DHCP_MAX_MSG_SIZE: return len == 2;
+ case DHCP_OPT_RENEWAL_TIME: return len == 4;
+ case DHCP_OPT_REBINDING_TIME: return len == 4;
+ case DHCP_OPT_CLASS_ID: return len >= 1;
+ case DHCP_OPT_CLIENT_ID: return len >= 2;
+
+ /* RFC 2132 */
+ case DHCP_OPT_END: return len == 0;
+
+ /* Unrecognized */
+ default:
+ return true;
+ }
+}
+
+/**
+ * DHCP Message Type 53 Values
+ * https://www.iana.org/assignments/bootp-dhcp-parameters/bootp-dhcp-parameters.xhtml#message-type-53
+ */
+const char *dhcp_msgtyp_str(uint8_t typ) {
+ switch (typ) {
+ case DHCP_MSGTYP_DISCOVER: return "DHCP_MSGTYP_DISCOVER";
+ case DHCP_MSGTYP_OFFER: return "DHCP_MSGTYP_OFFER";
+ case DHCP_MSGTYP_REQUEST: return "DHCP_MSGTYP_REQUEST";
+ case DHCP_MSGTYP_DECLINE: return "DHCP_MSGTYP_DECLINE";
+ case DHCP_MSGTYP_ACK: return "DHCP_MSGTYP_ACK";
+ case DHCP_MSGTYP_NAK: return "DHCP_MSGTYP_NAK";
+ case DHCP_MSGTYP_RELEASE: return "DHCP_MSGTYP_RELEASE";
+ case DHCP_MSGTYP_INFORM: return "DHCP_MSGTYP_INFORM";
+ default: return const_byte_str(typ);
+ }
+}
diff --git a/libdhcp/dhcp_common.h b/libdhcp/dhcp_common.h
index 5b51ce2..a0cdd3c 100644
--- a/libdhcp/dhcp_common.h
+++ b/libdhcp/dhcp_common.h
@@ -1,6 +1,6 @@
/* libdhcp/dhcp_common.h - Base definitions for the DHCP protocol
*
- * Copyright (C) 2024 Luke T. Shumaker <lukeshu@lukeshu.com>
+ * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*
* -----------------------------------------------------------------------------
@@ -67,8 +67,9 @@
#ifndef _LIBDHCP_DHCP_COMMON_H_
#define _LIBDHCP_DHCP_COMMON_H_
-#include <libmisc/endian.h>
-#include <libmisc/log.h> /* for const_byte_str() */
+#include <libhw/generic/net.h> /* for struct net_ip4_addr */
+#include <libmisc/endian.h> /* for uint{n}be_t */
+#include <libmisc/log.h> /* for const_byte_str() */
/* Config *********************************************************************/
@@ -215,80 +216,7 @@ static const uint8_t dhcp_magic_cookie[] = {99, 130, 83, 99};
/* ... */
#define DHCP_OPT_END ((uint8_t)255) /* RFC2132: length: 0; meaning: None */
-static inline bool dhcp_opt_length_is_valid(uint8_t opt, uint16_t len) {
- switch (opt) {
- /* RFC 2132 */
- case DHCP_OPT_PAD: return len == 0;
- case DHCP_OPT_SUBNET_MASK: return len == 4;
- case DHCP_OPT_TIME_OFFSET: return len == 4;
- case DHCP_OPT_ROUTER: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_TIME_SERVER: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_NAME_SERVER: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_DOMAIN_SERVER: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_LOG_SERVER: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_QUOTES_SERVER: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_LPR_SERVER: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_IMPRESS_SERVER: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_RLP_SERVER: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_HOSTNAME: return len >= 1;
- case DHCP_OPT_BOOT_FILE_SIZE: return len == 2;
- case DHCP_OPT_MERIT_DUMP_FILE: return len >= 1;
- case DHCP_OPT_DOMAIN_NAME: return len >= 1;
- case DHCP_OPT_SWAP_SERVER: return len == 4; /* IANA says length is "N", but RFC 2132 says "length is 4"; likely releated to errata ID 487 */
- case DHCP_OPT_ROOT_PATH: return len >= 1;
- case DHCP_OPT_EXTENSION_FILE: return len >= 1;
- case DHCP_OPT_FORWARD_ONOFF: return len == 1;
- case DHCP_OPT_SRCRTE_ONOFF: return len == 1;
- case DHCP_OPT_POLICY_FILTER: return len >= 8 && len % 8 == 0;
- case DHCP_OPT_MAX_DG_ASSEMBLY: return len == 2;
- case DHCP_OPT_DEFAULT_IP_TTL: return len == 1;
- case DHCP_OPT_MTU_TIMEOUT: return len == 4;
- case DHCP_OPT_MTU_PLATEAU: return len >= 2 && len % 2 == 0;
- case DHCP_OPT_MTU_INTERFACE: return len == 2;
- case DHCP_OPT_MTU_SUBNET: return len == 1;
- case DHCP_OPT_BROADCAST_ADDRESS: return len == 4;
- case DHCP_OPT_MASK_DISCOVERY: return len == 1;
- case DHCP_OPT_MASK_SUPPLIER: return len == 1;
- case DHCP_OPT_ROUTER_DISCOVERY: return len == 1;
- case DHCP_OPT_ROUTER_REQUEST: return len == 4;
- case DHCP_OPT_STATIC_ROUTE: return len >= 8 && len % 8 == 0;
- case DHCP_OPT_TRAILERS: return len == 1;
- case DHCP_OPT_ARP_TIMEOUT: return len == 4;
- case DHCP_OPT_ETHERNET: return len == 1;
- case DHCP_OPT_DEFAULT_TCP_TTL: return len == 1;
- case DHCP_OPT_KEEPALIVE_TIME: return len == 4;
- case DHCP_OPT_KEEPALIVE_DATA: return len == 1;
- case DHCP_OPT_NIS_DOMAIN: return len >= 1;
- case DHCP_OPT_NIS_SERVERS: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_NTP_SERVERS: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_VENDOR_SPECIFIC: return len >= 1;
- case DHCP_OPT_NETBIOS_NAME_SRV: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_NETBIOS_DIST_SRV: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_NETBIOS_NODE_TYPE: return len == 1;
- case DHCP_OPT_NETBIOS_SCOPE: return len >= 1;
- case DHCP_OPT_X_WINDOW_FONT: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_X_WINDOW_MANAGER: return len >= 4 && len % 4 == 0;
- case DHCP_OPT_ADDRESS_REQUEST: return len == 4;
- case DHCP_OPT_ADDRESS_TIME: return len == 4;
- case DHCP_OPT_OVERLOAD: return len == 1;
- case DHCP_OPT_DHCP_MSG_TYPE: return len == 1;
- case DHCP_OPT_DHCP_SERVER_ID: return len == 4;
- case DHCP_OPT_PARAMETER_LIST: return len >= 1;
- case DHCP_OPT_DHCP_MESSAGE: return len >= 1;
- case DHCP_OPT_DHCP_MAX_MSG_SIZE: return len == 2;
- case DHCP_OPT_RENEWAL_TIME: return len == 4;
- case DHCP_OPT_REBINDING_TIME: return len == 4;
- case DHCP_OPT_CLASS_ID: return len >= 1;
- case DHCP_OPT_CLIENT_ID: return len >= 2;
-
- /* RFC 2132 */
- case DHCP_OPT_END: return len == 0;
-
- /* Unrecognized */
- default:
- return true;
- }
-};
+bool dhcp_opt_length_is_valid(uint8_t opt, uint16_t len);
/**
* DHCP Message Type 53 Values
@@ -303,18 +231,6 @@ static inline bool dhcp_opt_length_is_valid(uint8_t opt, uint16_t len) {
#define DHCP_MSGTYP_RELEASE ((uint8_t) 7) /* RFC2132, client->server */
#define DHCP_MSGTYP_INFORM ((uint8_t) 8) /* RFC2132, client->server */
-static const char *dhcp_msgtyp_str(uint8_t typ) {
- switch (typ) {
- case DHCP_MSGTYP_DISCOVER: return "DHCP_MSGTYP_DISCOVER";
- case DHCP_MSGTYP_OFFER: return "DHCP_MSGTYP_OFFER";
- case DHCP_MSGTYP_REQUEST: return "DHCP_MSGTYP_REQUEST";
- case DHCP_MSGTYP_DECLINE: return "DHCP_MSGTYP_DECLINE";
- case DHCP_MSGTYP_ACK: return "DHCP_MSGTYP_ACK";
- case DHCP_MSGTYP_NAK: return "DHCP_MSGTYP_NAK";
- case DHCP_MSGTYP_RELEASE: return "DHCP_MSGTYP_RELEASE";
- case DHCP_MSGTYP_INFORM: return "DHCP_MSGTYP_INFORM";
- default: return const_byte_str(typ);
- }
-}
+const char *dhcp_msgtyp_str(uint8_t typ);
#endif /* _LIBDHCP_DHCP_COMMON_H_ */