diff --git a/etc/cmake/options.cmake b/etc/cmake/options.cmake index f33312006..c97ae4256 100644 --- a/etc/cmake/options.cmake +++ b/etc/cmake/options.cmake @@ -107,6 +107,11 @@ if(OT_CSL_RECEIVER) target_compile_definitions(ot-config INTERFACE "OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE=1") endif() +option(OT_CSL_DEBUG "enable csl debug") +if(OT_CSL_DEBUG) + target_compile_definitions(ot-config INTERFACE "OPENTHREAD_CONFIG_MAC_CSL_DEBUG_ENABLE=1") +endif() + option(OT_DHCP6_CLIENT "enable DHCP6 client support") if(OT_DHCP6_CLIENT) target_compile_definitions(ot-config INTERFACE "OPENTHREAD_CONFIG_DHCP6_CLIENT_ENABLE=1") diff --git a/examples/common-switches.mk b/examples/common-switches.mk index 7fc052f3f..e53557b1b 100644 --- a/examples/common-switches.mk +++ b/examples/common-switches.mk @@ -134,6 +134,10 @@ ifeq ($(CSL_RECEIVER),1) COMMONCFLAGS += -DOPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE=1 endif +ifeq ($(CSL_DEBUG),1) +COMMONCFLAGS += -DOPENTHREAD_CONFIG_MAC_CSL_DEBUG_ENABLE=1 +endif + ifeq ($(DEBUG),1) configure_OPTIONS += --enable-debug --disable-optimization endif diff --git a/src/core/config/mac.h b/src/core/config/mac.h index 051d8971a..6f4be094e 100644 --- a/src/core/config/mac.h +++ b/src/core/config/mac.h @@ -324,8 +324,6 @@ #define OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE 0 #endif -#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE - /** * @def OPENTHREAD_CONFIG_MAC_CSL_MIN_PERIOD * @@ -366,6 +364,15 @@ #define OPENTHREAD_CONFIG_CSL_SAMPLE_WINDOW 5 #endif -#endif // OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE +/** + * @def OPENTHREAD_CONFIG_MAC_CSL_DEBUG_ENABLE + * + * CSL receiver debug option. When this option is enabled, a CSL receiver wouldn't actually sleep in CSL state so it + * can still receive packets from the CSL transmitter. + * + */ +#ifndef OPENTHREAD_CONFIG_MAC_CSL_DEBUG_ENABLE +#define OPENTHREAD_CONFIG_MAC_CSL_DEBUG_ENABLE 0 +#endif #endif // CONFIG_MAC_H_ diff --git a/src/core/config/openthread-core-config-check.h b/src/core/config/openthread-core-config-check.h index 50a13dd10..788c10edc 100644 --- a/src/core/config/openthread-core-config-check.h +++ b/src/core/config/openthread-core-config-check.h @@ -517,6 +517,12 @@ #endif #endif // OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE +#if OPENTHREAD_CONFIG_MAC_CSL_DEBUG_ENABLE +#if !OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE +#error "OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE is required for OPENTHREAD_CONFIG_MAC_CSL_DEBUG_ENABLE" +#endif +#endif + #if OPENTHREAD_CONFIG_DUA_ENABLE && (OPENTHREAD_CONFIG_THREAD_VERSION < OT_THREAD_VERSION_1_2) #error "Thread 1.2 or higher version is required for OPENTHREAD_CONFIG_DUA_ENABLE" #endif diff --git a/src/core/mac/sub_mac.cpp b/src/core/mac/sub_mac.cpp index 8f48e4169..e6383b133 100644 --- a/src/core/mac/sub_mac.cpp +++ b/src/core/mac/sub_mac.cpp @@ -217,7 +217,9 @@ otError SubMac::CslSample(void) error = Get().Receive(mCslChannel); break; case kCslSleep: - error = Get().Sleep(); +#if !OPENTHREAD_CONFIG_MAC_CSL_DEBUG_ENABLE + error = Get().Sleep(); // Don't actually sleep for debugging +#endif break; case kCslIdle: ExitNow(error = OT_ERROR_INVALID_STATE); @@ -248,6 +250,16 @@ void SubMac::HandleReceiveDone(RxFrame *aFrame, otError aError) UpdateFrameCounter(aFrame->mInfo.mRxInfo.mAckFrameCounter); } +#if OPENTHREAD_CONFIG_MAC_CSL_DEBUG_ENABLE + if (aFrame != nullptr && aError == OT_ERROR_NONE) + { + otLogDebgMac( + "Received frame in state (SubMac %s, CSL %d), timestamp %lu, target sample start time %u, time drift %d", + StateToString(mState), mCslState, aFrame->mInfo.mRxInfo.mTimestamp, mCslSampleTime.GetValue(), + static_cast(aFrame->mInfo.mRxInfo.mTimestamp) - mCslSampleTime.GetValue()); + } +#endif + mCallbacks.ReceiveDone(aFrame, aError); } @@ -905,7 +917,9 @@ void SubMac::HandleCslTimer(void) mCslTimer.StartAt(mCslSampleTime, mCslPeriod * kUsPerTenSymbols - kUsPerTenSymbols); if (mState == kStateCslSample) { - IgnoreError(Get().Sleep()); +#if !OPENTHREAD_CONFIG_MAC_CSL_DEBUG_ENABLE + IgnoreError(Get().Sleep()); // Don't actually sleep for debugging +#endif otLogDebgMac("CSL sleep %u", mCslTimer.GetNow().GetValue()); } break; @@ -921,7 +935,7 @@ void SubMac::HandleCslTimer(void) if (mState == kStateCslSample) { IgnoreError(Get().Receive(mCslChannel)); - otLogDebgMac("CSL Sample %u", mCslTimer.GetNow().GetValue()); + otLogDebgMac("CSL sample %u", mCslTimer.GetNow().GetValue()); } break;