diff --git a/sys/net/routing/nhdp/nhdp.c b/sys/net/routing/nhdp/nhdp.c index e582dc340a31e4557425b30536d1e4027a874899..c9d1fe1efde3f570c19ca77a6a2fffc7b3e37b03 100644 --- a/sys/net/routing/nhdp/nhdp.c +++ b/sys/net/routing/nhdp/nhdp.c @@ -20,6 +20,7 @@ #include "msg.h" #include "netapi.h" +#include "net/ng_netif.h" #include "thread.h" #include "utlist.h" #include "mutex.h" @@ -41,7 +42,7 @@ char nhdp_rcv_stack[NHDP_STACK_SIZE]; static kernel_pid_t nhdp_pid = KERNEL_PID_UNDEF; static kernel_pid_t nhdp_rcv_pid = KERNEL_PID_UNDEF; static kernel_pid_t helper_pid = KERNEL_PID_UNDEF; -static nhdp_if_entry_t *nhdp_if_entry_head = NULL; +static nhdp_if_entry_t nhdp_if_table[NG_NETIF_NUMOF]; static mutex_t send_rcv_mutex = MUTEX_INIT; static sockaddr6_t sa_bcast; static int sock_rcv; @@ -64,6 +65,12 @@ void nhdp_init(void) return; } + /* Prepare interface table */ + for (int i = 0; i < NG_NETIF_NUMOF; i++) { + nhdp_if_table[i].if_pid = KERNEL_PID_UNDEF; + memset(&nhdp_if_table[i].wr_target, 0, sizeof(struct rfc5444_writer_target)); + } + /* Initialize reader and writer */ nhdp_writer_init(); nhdp_reader_init(); @@ -98,7 +105,7 @@ int nhdp_register_if_default(kernel_pid_t if_pid, uint8_t *addr, size_t addr_siz int nhdp_register_if(kernel_pid_t if_pid, uint8_t *addr, size_t addr_size, uint8_t addr_type, uint16_t max_pl_size, uint16_t hello_int_ms, uint16_t val_time_ms) { - nhdp_if_entry_t *if_entry; + nhdp_if_entry_t *if_entry = NULL; nhdp_addr_t *nhdp_addr; msg_t signal_msg; @@ -106,63 +113,42 @@ int nhdp_register_if(kernel_pid_t if_pid, uint8_t *addr, size_t addr_size, uint8 return -2; } - if_entry = (nhdp_if_entry_t *) malloc(sizeof(nhdp_if_entry_t)); - - if (!if_entry) { - /* Insufficient memory */ - return -1; + for (int i = 0; i < NG_NETIF_NUMOF; i++) { + if (nhdp_if_table[i].if_pid == KERNEL_PID_UNDEF) { + if_entry = &nhdp_if_table[i]; + break; + } } - /* Create an interface writer targer for the nhdp_writer */ - if_entry->wr_target = (struct rfc5444_writer_target *) - calloc(1, sizeof(struct rfc5444_writer_target)); - - if (!if_entry->wr_target) { - /* Insufficient memory */ - free(if_entry); - return -1; + if (!if_entry) { + /* Maximum number of registerable interfaces reached */ + return -2; } uint16_t payload_size = max_pl_size > NHDP_MAX_RFC5444_PACKET_SZ ? NHDP_MAX_RFC5444_PACKET_SZ : max_pl_size; - if_entry->wr_target->packet_buffer = (uint8_t *) calloc(payload_size, sizeof(uint8_t)); + if_entry->wr_target.packet_buffer = (uint8_t *) calloc(payload_size, sizeof(uint8_t)); - if (!if_entry->wr_target->packet_buffer) { + if (!if_entry->wr_target.packet_buffer) { /* Insufficient memory */ - free(if_entry->wr_target); - free(if_entry); return -1; } - if_entry->wr_target->packet_size = payload_size; - if_entry->wr_target->sendPacket = write_packet; + if_entry->wr_target.packet_size = payload_size; + if_entry->wr_target.sendPacket = write_packet; /* Get NHDP address entry for the given address */ nhdp_addr = nhdp_addr_db_get_address(addr, addr_size, addr_type); if (!nhdp_addr) { /* Insufficient memory */ - free(if_entry->wr_target->packet_buffer); - free(if_entry->wr_target); - free(if_entry); + free(if_entry->wr_target.packet_buffer); return -1; } - /* Set Interface's PID */ - if_entry->if_pid = if_pid; - /* Set HELLO_INTERVAL and H_HOLD_TIME (validity time) */ - if_entry->hello_interval.seconds = 0; - if_entry->hello_interval.microseconds = MS_IN_USEC * hello_int_ms; - if_entry->validity_time.seconds = 0; - if_entry->validity_time.microseconds = MS_IN_USEC * val_time_ms; - timex_normalize(&if_entry->hello_interval); - timex_normalize(&if_entry->validity_time); - /* Add the interface to the LIB */ - if (lib_add_if_addr(if_entry->if_pid, nhdp_addr) != 0) { - free(if_entry->wr_target->packet_buffer); - free(if_entry->wr_target); - free(if_entry); + if (lib_add_if_addr(if_pid, nhdp_addr) != 0) { + free(if_entry->wr_target.packet_buffer); nhdp_decrement_addr_usage(nhdp_addr); return -1; } @@ -170,17 +156,24 @@ int nhdp_register_if(kernel_pid_t if_pid, uint8_t *addr, size_t addr_size, uint8 /* Create new IIB for the interface */ if (iib_register_if(if_pid) != 0) { /* TODO: Cleanup lib entry */ - free(if_entry->wr_target->packet_buffer); - free(if_entry->wr_target); - free(if_entry); + free(if_entry->wr_target.packet_buffer); nhdp_decrement_addr_usage(nhdp_addr); return -1; } + /* Set Interface's PID */ + if_entry->if_pid = if_pid; + /* Set HELLO_INTERVAL and H_HOLD_TIME (validity time) */ + if_entry->hello_interval.seconds = 0; + if_entry->hello_interval.microseconds = MS_IN_USEC * hello_int_ms; + if_entry->validity_time.seconds = 0; + if_entry->validity_time.microseconds = MS_IN_USEC * val_time_ms; + timex_normalize(&if_entry->hello_interval); + timex_normalize(&if_entry->validity_time); + /* Everything went well */ nhdp_decrement_addr_usage(nhdp_addr); - nhdp_writer_register_if(if_entry->wr_target); - LL_PREPEND(nhdp_if_entry_head, if_entry); + nhdp_writer_register_if(&if_entry->wr_target); helper_pid = if_pid; /* Start the receiving thread */ diff --git a/sys/net/routing/nhdp/nhdp.h b/sys/net/routing/nhdp/nhdp.h index 24652053191c6f4a1762af35c56ebd4a01dc84c5..b44f98252a769fd51d3d7385865d675ec84b0a91 100644 --- a/sys/net/routing/nhdp/nhdp.h +++ b/sys/net/routing/nhdp/nhdp.h @@ -92,8 +92,7 @@ typedef struct nhdp_if_entry_t { vtimer_t if_timer; /**< Vtimer used for the periodic signaling */ timex_t hello_interval; /**< Interval time for periodic HELLOs */ timex_t validity_time; /**< Validity time for propagated information */ - struct rfc5444_writer_target *wr_target; /**< Interface specific writer target */ - struct nhdp_if_entry_t *next; /**< Pointer to next list entry */ + struct rfc5444_writer_target wr_target; /**< Interface specific writer target */ } nhdp_if_entry_t; /** diff --git a/sys/net/routing/nhdp/nhdp_writer.c b/sys/net/routing/nhdp/nhdp_writer.c index f4c12a42b3a8a555beef64d24dd303337b8d4cae..4e5653b4ae75449655b7b697b634149c45bee221 100644 --- a/sys/net/routing/nhdp/nhdp_writer.c +++ b/sys/net/routing/nhdp/nhdp_writer.c @@ -123,8 +123,8 @@ void nhdp_writer_send_hello(nhdp_if_entry_t *if_entry) /* Create HELLO message and send it using the given interface */ rfc5444_writer_create_message(&nhdp_writer, RFC5444_MSGTYPE_HELLO, - rfc5444_writer_singletarget_selector, if_entry->wr_target); - rfc5444_writer_flush(&nhdp_writer, if_entry->wr_target, false); + rfc5444_writer_singletarget_selector, &if_entry->wr_target); + rfc5444_writer_flush(&nhdp_writer, &if_entry->wr_target, false); mutex_unlock(&mtx_packet_write); }