1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/net/crosslayer/ng_netreg/ng_netreg.c
Martine Lenders 6a31fa80a7 Merge pull request #2568 from authmillenon/ng_netreg/feat/allow_nettype_undef
ng_netreg: Allow registration of NG_NETTYPE_UNDEF
2015-03-20 17:06:37 +01:00

105 lines
1.9 KiB
C

/*
* Copyright (C) 2015 Martine Lenders <mlenders@inf.fu-berlin.de>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @{
*
* @file ng_netreg.c
*/
#include <errno.h>
#include <string.h>
#include "clist.h"
#include "utlist.h"
#include "net/ng_netreg.h"
#include "net/ng_nettype.h"
#define _INVALID_TYPE(type) (((type) < NG_NETTYPE_UNDEF) || ((type) >= NG_NETTYPE_NUMOF))
/* The registry as lookup table by ng_nettype_t */
static ng_netreg_entry_t *netreg[NG_NETTYPE_NUMOF];
void ng_netreg_init(void)
{
/* set all pointers in registry to NULL */
memset(netreg, 0, NG_NETTYPE_NUMOF * sizeof(ng_netreg_entry_t *));
}
int ng_netreg_register(ng_nettype_t type, ng_netreg_entry_t *entry)
{
if (_INVALID_TYPE(type)) {
return -EINVAL;
}
LL_PREPEND(netreg[type], entry);
return 0;
}
void ng_netreg_unregister(ng_nettype_t type, ng_netreg_entry_t *entry)
{
if (_INVALID_TYPE(type)) {
return;
}
LL_DELETE(netreg[type], entry);
}
ng_netreg_entry_t *ng_netreg_lookup(ng_nettype_t type, uint32_t demux_ctx)
{
ng_netreg_entry_t *res;
if (_INVALID_TYPE(type)) {
return NULL;
}
LL_SEARCH_SCALAR(netreg[type], res, demux_ctx, demux_ctx);
return res;
}
int ng_netreg_num(ng_nettype_t type, uint32_t demux_ctx)
{
int num = 0;
ng_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;
}
ng_netreg_entry_t *ng_netreg_getnext(ng_netreg_entry_t *entry)
{
uint32_t demux_ctx;
if (entry == NULL) {
return NULL;
}
demux_ctx = entry->demux_ctx;
LL_SEARCH_SCALAR(entry->next, entry, demux_ctx, demux_ctx);
return entry;
}
/** @} */