diff --git a/sys/include/net/gnrc/gomach/gomach.h b/sys/include/net/gnrc/gomach/gomach.h index a902f0f7dd..cdb32c191f 100644 --- a/sys/include/net/gnrc/gomach/gomach.h +++ b/sys/include/net/gnrc/gomach/gomach.h @@ -276,6 +276,19 @@ extern "C" { #define GNRC_GOMACH_MAX_ALLOC_SLOTS_NUM (25U) #endif +/** + * @brief Maximum number of senders allowed to be allocated slots in one cycle. + * + * Exclude the static GoMacH MAC header payload in the beacon, which is 20 bytes, + * we have 107 bytes left for constructing the sender-ID list and the related slots-number + * list. A combined slots allocation information pair (sender ID with its corresponded + * allocate slots number) will cost 9 (8+1) bytes, thus we can hold a maximum of 11 + * i.e., ((127 - 20) / 9), sender IDs in the beacon. + */ +#ifndef GNRC_GOMACH_MAX_ALLOC_SENDER_NUM +#define GNRC_GOMACH_MAX_ALLOC_SENDER_NUM (11U) +#endif + /** * @brief Maximum t2k attempts before going to t2u in GoMacH. * diff --git a/sys/net/gnrc/link_layer/gomach/gomach_internal.c b/sys/net/gnrc/link_layer/gomach/gomach_internal.c index afe2404b17..78b66c4a47 100644 --- a/sys/net/gnrc/link_layer/gomach/gomach_internal.c +++ b/sys/net/gnrc/link_layer/gomach/gomach_internal.c @@ -488,7 +488,13 @@ int gnrc_gomach_send_beacon(gnrc_netif_t *netif) total_tdma_slot_num -= redueced_slots_num; break; } + j++; + + /* If reach the maximum sender ID number limit, stop. */ + if (total_tdma_node_num >= GNRC_GOMACH_MAX_ALLOC_SENDER_NUM) { + break; + } } }