1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

dhcpv6_client: make IA_PD an optional module

Prefix delegation used to be the only supported feature of our DHCPv6
client, but by now it also supports MUD, DNS recursive name servers and
IA_NA is on the horizon. So it makes sense to make IA_PD an optional
module like all those other features are as well.
This commit is contained in:
Martine Lenders 2021-07-20 15:11:13 +02:00
parent 70f3723fab
commit 38d14b6335
No known key found for this signature in database
GPG Key ID: 2134D77A5336DD80
5 changed files with 41 additions and 7 deletions

View File

@ -25,6 +25,7 @@ PSEUDOMODULES += dbgpin
PSEUDOMODULES += devfs_%
PSEUDOMODULES += dhcpv6_%
PSEUDOMODULES += dhcpv6_client_dns
PSEUDOMODULES += dhcpv6_client_ia_pd
PSEUDOMODULES += dhcpv6_client_mud_url
PSEUDOMODULES += ecc_%
PSEUDOMODULES += event_%

View File

@ -122,8 +122,13 @@ void dhcpv6_client_start(void);
* @brief Configures the client to request prefix delegation for a network
* interface from a server
*
* @pre Module `dhcpv6_client_ia_pd` is compiled in.
* @pre `pfx_len <= 128`
*
* Without module `dhcpv6_client_ia_pd` and `NDEBUG` set this function is a NOP.
* Without module `dhcpv6_client_ia_pd` and `NDEBUG` unset this function will
* abort the running code on a failed assertion.
*
* @param[in] netif The interface to request the prefix delegation for.
* @param[in] pfx_len The desired length of the prefix (note that the server
* might not consider this request). Must be <= 128

View File

@ -17,6 +17,7 @@
#include <stdbool.h>
#include "event.h"
#include "log.h"
#include "kernel_defines.h"
#include "net/dhcpv6/client.h"
#include "net/dhcpv6.h"
@ -155,7 +156,13 @@ void dhcpv6_client_req_ia_pd(unsigned netif, unsigned pfx_len)
{
pfx_lease_t *lease = NULL;
assert(IS_USED(MODULE_DHCPV6_CLIENT_IA_PD));
assert(pfx_len <= 128);
if (!IS_USED(MODULE_DHCPV6_CLIENT_IA_PD)) {
LOG_WARNING("DHCPv6 client: Unable to request IA_PD as module "
"`dhcpv6_client_ia_pd` is not used\n");
return;
}
for (unsigned i = 0; i < CONFIG_DHCPV6_CLIENT_PFX_LEASE_MAX; i++) {
if (pfx_leases[i].parent.ia_id.id == 0) {
lease = &pfx_leases[i];
@ -300,6 +307,10 @@ static inline size_t _compose_ia_pd_opt(dhcpv6_opt_ia_pd_t *ia_pd,
static inline size_t _add_ia_pd_from_config(uint8_t *buf, size_t len_max)
{
if (!IS_USED(MODULE_DHCPV6_CLIENT_IA_PD)) {
return 0;
}
size_t msg_len = 0;
for (unsigned i = 0; i < CONFIG_DHCPV6_CLIENT_PFX_LEASE_MAX; i++) {
@ -445,7 +456,9 @@ static int _preparse_advertise(uint8_t *adv, size_t len, uint8_t **buf)
status = (dhcpv6_opt_status_t *)opt;
break;
case DHCPV6_OPT_IA_PD:
ia_pd = (dhcpv6_opt_ia_pd_t *)opt;
if (IS_USED(MODULE_DHCPV6_CLIENT_IA_PD)) {
ia_pd = (dhcpv6_opt_ia_pd_t *)opt;
}
break;
case DHCPV6_OPT_PREF:
pref = (dhcpv6_opt_pref_t *)opt;
@ -454,7 +467,8 @@ static int _preparse_advertise(uint8_t *adv, size_t len, uint8_t **buf)
break;
}
}
if ((cid == NULL) || (sid == NULL) || (ia_pd == NULL)) {
if ((cid == NULL) || (sid == NULL) ||
(IS_USED(MODULE_DHCPV6_CLIENT_IA_PD) && (ia_pd == NULL))) {
DEBUG("DHCPv6 client: ADVERTISE does not contain either server ID, "
"client ID or IA_PD option\n");
return -1;
@ -524,7 +538,10 @@ static void _parse_advertise(uint8_t *adv, size_t len)
len > 0; len -= _opt_len(opt), opt = _opt_next(opt)) {
switch (byteorder_ntohs(opt->type)) {
case DHCPV6_OPT_IA_PD:
for (unsigned i = 0; i < CONFIG_DHCPV6_CLIENT_PFX_LEASE_MAX; i++) {
for (unsigned i = 0;
IS_USED(MODULE_DHCPV6_CLIENT_IA_PD) &&
(i < CONFIG_DHCPV6_CLIENT_PFX_LEASE_MAX);
i++) {
dhcpv6_opt_ia_pd_t *ia_pd = (dhcpv6_opt_ia_pd_t *)opt;
unsigned pd_t1, pd_t2;
uint32_t ia_id = byteorder_ntohl(ia_pd->ia_id);
@ -609,7 +626,9 @@ static bool _parse_reply(uint8_t *rep, size_t len)
status = (dhcpv6_opt_status_t *)opt;
break;
case DHCPV6_OPT_IA_PD:
ia_pd = (dhcpv6_opt_ia_pd_t *)opt;
if (IS_USED(MODULE_DHCPV6_CLIENT_IA_PD)) {
ia_pd = (dhcpv6_opt_ia_pd_t *)opt;
}
break;
case DHCPV6_OPT_SMR:
smr = (dhcpv6_opt_smr_t *)opt;
@ -618,7 +637,8 @@ static bool _parse_reply(uint8_t *rep, size_t len)
break;
}
}
if ((cid == NULL) || (sid == NULL) || (ia_pd == NULL)) {
if ((cid == NULL) || (sid == NULL) ||
(IS_USED(MODULE_DHCPV6_CLIENT_IA_PD) && (ia_pd == NULL))) {
DEBUG("DHCPv6 client: ADVERTISE does not contain either server ID, "
"client ID or IA_PD option\n");
return false;
@ -643,7 +663,10 @@ static bool _parse_reply(uint8_t *rep, size_t len)
break;
#endif /* IS_USED(MODULE_DHCPV6_CLIENT_DNS) */
case DHCPV6_OPT_IA_PD:
for (unsigned i = 0; i < CONFIG_DHCPV6_CLIENT_PFX_LEASE_MAX; i++) {
for (unsigned i = 0;
IS_USED(MODULE_DHCPV6_CLIENT_IA_PD) &&
(i < CONFIG_DHCPV6_CLIENT_PFX_LEASE_MAX);
i++) {
dhcpv6_opt_iapfx_t *iapfx = NULL;
pfx_lease_t *lease = &pfx_leases[i];
ia_pd = (dhcpv6_opt_ia_pd_t *)opt;
@ -818,7 +841,10 @@ static void _request_renew_rebind(uint8_t type)
irt = DHCPV6_REB_TIMEOUT;
mrt = DHCPV6_REB_MAX_RT;
/* calculate MRD from prefix leases */
for (unsigned i = 0; i < CONFIG_DHCPV6_CLIENT_PFX_LEASE_MAX; i++) {
for (unsigned i = 0;
IS_USED(MODULE_DHCPV6_CLIENT_IA_PD) &&
(i < CONFIG_DHCPV6_CLIENT_PFX_LEASE_MAX);
i++) {
const pfx_lease_t *lease = &pfx_leases[i];
uint32_t valid_until = dhcpv6_client_prefix_valid_until(
lease->parent.ia_id.info.netif,

View File

@ -57,6 +57,7 @@ endif
ifneq (,$(filter gnrc_dhcpv6_client_simple_pd,$(USEMODULE)))
USEMODULE += gnrc_dhcpv6_client
USEMODULE += dhcpv6_client_ia_pd
endif
ifneq (,$(filter gnrc_uhcpc,$(USEMODULE)))

View File

@ -8,6 +8,7 @@ RIOTBASE ?= $(CURDIR)/../..
# boards don't support ethos
BOARD_BLACKLIST += mips-malta pic32-wifire pic32-clicker ruuvitag thingy52
USEMODULE += dhcpv6_client_ia_pd
USEMODULE += gnrc_dhcpv6_client
USEMODULE += gnrc_ipv6_default
USEMODULE += xtimer