diff --git a/src/lib/spinel/spinel.c b/src/lib/spinel/spinel.c index 3b9632ef9..39e684617 100644 --- a/src/lib/spinel/spinel.c +++ b/src/lib/spinel/spinel.c @@ -1514,6 +1514,8 @@ const char *spinel_prop_key_to_cstr(spinel_prop_key_t prop_key) {SPINEL_PROP_RCP_MAC_KEY, "RCP_MAC_KEY"}, {SPINEL_PROP_DEBUG_LOG_TIMESTAMP_BASE, "DEBUG_LOG_TIMESTAMP_BASE"}, {SPINEL_PROP_DEBUG_TREL_TEST_MODE_ENABLE, "DEBUG_TREL_TEST_MODE_ENABLE"}, + {SPINEL_PROP_BORDER_ROUTER_DHCP6_PD_ENABLE, "SPINEL_PROP_BORDER_ROUTER_DHCP6_PD_ENABLE"}, + {SPINEL_PROP_BORDER_ROUTER_DHCP6_PD_PREFIX, "SPINEL_PROP_BORDER_ROUTER_DHCP6_PD_PREFIX"}, {0, NULL}, }; diff --git a/src/lib/spinel/spinel.h b/src/lib/spinel/spinel.h index b436f582b..3c9bcdbee 100644 --- a/src/lib/spinel/spinel.h +++ b/src/lib/spinel/spinel.h @@ -5014,6 +5014,32 @@ enum SPINEL_PROP_BACKBONE_ROUTER__END = 0x990, + SPINEL_PROP_BORDER_ROUTER__BEGIN = 0x990, + + /// Enables or Disables DHCPv6 Prefix Delegation + /** + * Format: `b` - Write-Only + * + * `b`: Enables or disables DHCPv6 Prefix Delegation + */ + SPINEL_PROP_BORDER_ROUTER_DHCP6_PD_ENABLE = SPINEL_PROP_BORDER_ROUTER__BEGIN + 1, + + /// Process DHCPv6 Prefix Delegation Prefix + /** + * Format: `6CLL` - Write-Only + * + * This property is used to provide a DHCPv6 Prefix Delegation (PD) prefix to the OpenThread stack + * via the NCP interface. It calls `otPlatBorderRoutingProcessDhcp6PdPrefix()`. + * + * `6` : IPv6 prefix address + * `C` : Prefix length in bits + * `L` : Valid lifetime in seconds + * `L` : Preferred lifetime in seconds + */ + SPINEL_PROP_BORDER_ROUTER_DHCP6_PD_PREFIX = SPINEL_PROP_BORDER_ROUTER__BEGIN + 2, + + SPINEL_PROP_BORDER_ROUTER__END = 0x9A0, + SPINEL_PROP_NEST__BEGIN = 0x3BC0, SPINEL_PROP_NEST_STREAM_MFG = SPINEL_PROP_NEST__BEGIN + 0, diff --git a/src/ncp/ncp_base_dispatcher.cpp b/src/ncp/ncp_base_dispatcher.cpp index 6646461b7..fffb9af9e 100644 --- a/src/ncp/ncp_base_dispatcher.cpp +++ b/src/ncp/ncp_base_dispatcher.cpp @@ -555,6 +555,12 @@ NcpBase::PropertyHandler NcpBase::FindSetPropertyHandler(spinel_prop_key_t aKey) #if OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_BACKBONE_ROUTER_ENABLE), #endif +#if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE && OPENTHREAD_CONFIG_BORDER_ROUTING_DHCP6_PD_ENABLE + OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_BORDER_ROUTER_DHCP6_PD_ENABLE), +#if !OPENTHREAD_CONFIG_BORDER_ROUTING_DHCP6_PD_CLIENT_ENABLE + OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_BORDER_ROUTER_DHCP6_PD_PREFIX), +#endif +#endif #endif // OPENTHREAD_FTD #if OPENTHREAD_MTD || OPENTHREAD_FTD OT_NCP_SET_HANDLER_ENTRY(SPINEL_PROP_UNSOL_UPDATE_FILTER), diff --git a/src/ncp/ncp_base_ftd.cpp b/src/ncp/ncp_base_ftd.cpp index ed20d6a64..183443303 100644 --- a/src/ncp/ncp_base_ftd.cpp +++ b/src/ncp/ncp_base_ftd.cpp @@ -1648,6 +1648,44 @@ template <> otError NcpBase::HandlePropertyGet otError NcpBase::HandlePropertySet(void) +{ + otError error = OT_ERROR_NONE; + bool enable; + + SuccessOrExit(error = mDecoder.ReadBool(enable)); + otBorderRoutingDhcp6PdSetEnabled(mInstance, enable); + +exit: + return error; +} + +#if !OPENTHREAD_CONFIG_BORDER_ROUTING_DHCP6_PD_CLIENT_ENABLE +template <> otError NcpBase::HandlePropertySet(void) +{ + otError error = OT_ERROR_NONE; + otBorderRoutingPrefixTableEntry prefixEntry; + const otIp6Address *prefixAddr; + + memset(&prefixEntry, 0, sizeof(prefixEntry)); + + SuccessOrExit(error = mDecoder.ReadIp6Address(prefixAddr)); + prefixEntry.mPrefix.mPrefix = *prefixAddr; + SuccessOrExit(error = mDecoder.ReadUint8(prefixEntry.mPrefix.mLength)); + + SuccessOrExit(error = mDecoder.ReadUint32(prefixEntry.mValidLifetime)); + SuccessOrExit(error = mDecoder.ReadUint32(prefixEntry.mPreferredLifetime)); + + otPlatBorderRoutingProcessDhcp6PdPrefix(mInstance, &prefixEntry); + +exit: + return error; +} +#endif + +#endif // OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE && OPENTHREAD_CONFIG_BORDER_ROUTING_DHCP6_PD_ENABLE + #if OPENTHREAD_CONFIG_NCP_DNSSD_ENABLE && OPENTHREAD_CONFIG_PLATFORM_DNSSD_ENABLE void NcpBase::DnssdRegisterHost(const otPlatDnssdHost *aHost,