diff --git a/sys/include/net/gnrc/netreg.h b/sys/include/net/gnrc/netreg.h index 11455c703ac0ecfd11494529a682b9a2c36ff78b..cea7d13635c5356d36957bdd364eb725932d92f4 100644 --- a/sys/include/net/gnrc/netreg.h +++ b/sys/include/net/gnrc/netreg.h @@ -333,6 +333,19 @@ void gnrc_netreg_unregister(gnrc_nettype_t type, gnrc_netreg_entry_t *entry); */ gnrc_netreg_entry_t *gnrc_netreg_lookup(gnrc_nettype_t type, uint32_t demux_ctx); +/** + * @brief Returns number of entries with the same gnrc_netreg_entry_t::type and + * gnrc_netreg_entry_t::demux_ctx. + * + * @param[in] type Type of the protocol. + * @param[in] demux_ctx The demultiplexing context for the registered thread. + * See gnrc_netreg_entry_t::demux_ctx. + * + * @return Number of entries with the same gnrc_netreg_entry_t::type and + * gnrc_netreg_entry_t::demux_ctx as the given parameters. + */ +int gnrc_netreg_num(gnrc_nettype_t type, uint32_t demux_ctx); + /** * @brief Returns the next entry after @p entry with the same * gnrc_netreg_entry_t::type and gnrc_netreg_entry_t::demux_ctx as the diff --git a/sys/net/gnrc/netreg/gnrc_netreg.c b/sys/net/gnrc/netreg/gnrc_netreg.c index 8d8ef83462185590a0d45a2b7131031e388142c1..c531ff997148379554ad7ae9cca8148f20104f13 100644 --- a/sys/net/gnrc/netreg/gnrc_netreg.c +++ b/sys/net/gnrc/netreg/gnrc_netreg.c @@ -96,6 +96,28 @@ gnrc_netreg_entry_t *gnrc_netreg_lookup(gnrc_nettype_t type, uint32_t demux_ctx) return _netreg_lookup(NULL, type, demux_ctx); } +int gnrc_netreg_num(gnrc_nettype_t type, uint32_t demux_ctx) +{ + int num = 0; + gnrc_netreg_entry_t *entry; + + if (_INVALID_TYPE(type)) { + return 0; + } + + entry = netreg[type]; + + while (entry != NULL) { + if (entry->demux_ctx == demux_ctx) { + num++; + } + + entry = entry->next; + } + + return num; +} + gnrc_netreg_entry_t *gnrc_netreg_getnext(gnrc_netreg_entry_t *entry) { return (entry ? _netreg_lookup(entry, 0, entry->demux_ctx) : NULL);