mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
0c67c02047
This PR depends on #1766. It contains a minimal implementation of the AODVv2 routing protocol. *Not* implemented are: - AckReqs - alternate metrics - multiple interfaces - clients and Client Networks - buffering - all addresses, TLVs, and features that are marked as optional An example application can be found at https://github.com/Lotterleben/RIOT-AODVv2/tree/master/aodvv2_demo. The implementation relies heavily on a functioning Neighbor Discovery Protocol. It might be necessary to fill the neighbor cache manually with the current state of RIOTs NDP implementation. The value of AODVV2_MAX_UNREACHABLE_NODES has been chosen arbitrarily and will be subject to future improvement. Please note that based on my experience, with the default transceiver buffer size (3) of the native port, about 2/3 of the route discoveries will fail. This has been addressed in issue #1747. It is advised to increase the transceiver buffer size when using AODVv2 as a routing protocol.
102 lines
3.5 KiB
C
102 lines
3.5 KiB
C
/*
|
|
* Copyright (C) 2014 Freie Universität Berlin
|
|
* Copyright (C) 2014 Lotte Steenbrink <lotte.steenbrink@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.
|
|
*/
|
|
|
|
/**
|
|
* @ingroup aodvv2
|
|
* @{
|
|
*
|
|
* @file writer.h
|
|
* @brief writer to create RFC5444 aodvv2 messages
|
|
*
|
|
* @author Lotte Steenbrink <lotte.steenbrink@fu-berlin.de>
|
|
*/
|
|
|
|
#ifndef AODVV2_WRITER_H_
|
|
#define AODVV2_WRITER_H_
|
|
|
|
#include "common/netaddr.h"
|
|
#include "rfc5444/rfc5444_writer.h"
|
|
#include "mutex.h"
|
|
|
|
#include "constants.h"
|
|
#include "seqnum.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Wrapper for the rfc5444_writer_target that the _write_packet() callback receives.
|
|
* _write_packet() needs to know the type, payload and target address
|
|
* of the RFC5444 message to be sent as well, but the oonf api does not
|
|
* offer this feature. Having this wrapper enables the use of the
|
|
* container_of macro to fetch this information.
|
|
* It is hacky, but it does the trick.
|
|
*/
|
|
struct writer_target
|
|
{
|
|
struct rfc5444_writer_target interface; /**< Interface for generating rfc5444 packets */
|
|
struct netaddr target_addr; /**< Address to which the packet should be sent */
|
|
struct aodvv2_packet_data packet_data; /**< Payload of the AODVv2 Message */
|
|
int type; /**< Type of the AODVv2 Message (i.e. rfc5444_msg_type) */
|
|
};
|
|
|
|
/**
|
|
* @brief oonf api voodo. Pointer to a callback function which is passed to
|
|
* writer_init() and called when the packet is ready to send.
|
|
*/
|
|
typedef void (*write_packet_func_ptr)(
|
|
struct rfc5444_writer *wr, struct rfc5444_writer_target *iface,
|
|
void *buffer, size_t length);
|
|
|
|
/**
|
|
* @brief Initialize RFC5444 writer
|
|
* @param ptr pointer to "send_packet" callback
|
|
*/
|
|
void aodv_packet_writer_init(write_packet_func_ptr ptr);
|
|
|
|
/**
|
|
* @brief Clean up after the RFC5444 writer
|
|
*/
|
|
void aodv_packet_writer_cleanup(void);
|
|
|
|
/**
|
|
* @brief Send a RREQ. DO NOT use this function to dispatch packets from anything else
|
|
* than the sender_thread. To send RREQs, use aodv_send_rreq().
|
|
* @param packet_data parameters of the RREQ
|
|
* @param next_hop Address the RREP is sent to
|
|
*/
|
|
void aodv_packet_writer_send_rreq(struct aodvv2_packet_data *packet_data, struct netaddr *next_hop);
|
|
|
|
/**
|
|
* @brief Send a RREP. DO NOT use this function to dispatch packets from anything else
|
|
* than the sender_thread. To send RREPs, use aodv_send_rrep().
|
|
* @param packet_data parameters of the RREP
|
|
* @param next_hop Address the RREP is sent to
|
|
*/
|
|
void aodv_packet_writer_send_rrep(struct aodvv2_packet_data *packet_data, struct netaddr *next_hop);
|
|
|
|
/**
|
|
* @brief Send a RERR. DO NOT use this function to dispatch packets from anything else
|
|
* than the sender_thread. To send RERRs, use aodv_send_rerr().
|
|
* @param unreachable_nodes[] array containing all newly unreachable nodes. each
|
|
* in a struct unreachable_node
|
|
* @param len length of unreachable_nodes[]
|
|
* @param hoplimit the message's hop limit
|
|
* @param next_hop Address the RREP is sent to
|
|
*/
|
|
void aodv_packet_writer_send_rerr(struct unreachable_node unreachable_nodes[], size_t len,
|
|
int hoplimit, struct netaddr *next_hop);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* AODVV2_WRITER_H_ */
|