mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
99 lines
2.9 KiB
C
99 lines
2.9 KiB
C
/*
|
|
* Copyright (C) 2021 Benjamin Valentin
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License v2. See the file LICENSE for more details.
|
|
*/
|
|
|
|
#ifndef TOPOLOGY_H
|
|
#define TOPOLOGY_H
|
|
|
|
#include "list.h"
|
|
#include <netinet/in.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Struct describing a graph of nodes and their connections
|
|
*/
|
|
typedef struct {
|
|
list_node_t nodes; /**< list of nodes */
|
|
list_node_t edges; /**< list of connections between nodes. Unused if topology is flat */
|
|
struct sockaddr_in6 sniffer_addr; /**< address of sniffer node. Unused if topology is flat */
|
|
bool has_sniffer; /**< true if a sniffer node is connected. Unused if topology is flat */
|
|
bool flat; /**< flat topology, all nodes are connected to each other */
|
|
} topology_t;
|
|
|
|
/**
|
|
* @brief Parse a file with topology information
|
|
*
|
|
* @param[in] file Filename to open & parse
|
|
* May be "-" to use stdin
|
|
* @param[out] out Topology from file
|
|
*
|
|
* @return 0 on success, error otherwise
|
|
*/
|
|
int topology_parse(const char *file, topology_t *out);
|
|
|
|
/**
|
|
* @brief Print topology as Graphviz diagram
|
|
*
|
|
* @param[in] file_out Filename to write to
|
|
* May be "-" to use stdout
|
|
* @param[in] t The topology to render
|
|
*
|
|
* @return 0 on success, error otherwise
|
|
*/
|
|
int topology_print(const char *file_out, const topology_t *t);
|
|
|
|
/**
|
|
* @brief Print send / receive statistics
|
|
*
|
|
* @param[in] t The topology to render
|
|
*/
|
|
void topology_print_stats(const topology_t *t, bool reset);
|
|
|
|
/**
|
|
* @brief Populate a spot in the topology with a connected node
|
|
*
|
|
* @param[in, out] t topology to use
|
|
* @param[in] mac ZEP l2 address of the new node
|
|
* @param[in] mac_len ZEP l2 address length
|
|
* @param[in] addr real address of the virtual node
|
|
*
|
|
* @return true if the node could be added to the topology
|
|
*/
|
|
bool topology_add(topology_t *t, const uint8_t *mac, uint8_t mac_len,
|
|
struct sockaddr_in6 *addr);
|
|
|
|
/**
|
|
* @brief Add a sniffer to the topology
|
|
* A sniffer node will receive every packet but won't be able to
|
|
* send packets on it's own.
|
|
*
|
|
* @param[in, out] t topology to configure
|
|
* @param[in] addr real address of the sniffer
|
|
*/
|
|
void topology_set_sniffer(topology_t *t, struct sockaddr_in6 *addr);
|
|
|
|
/**
|
|
* @brief Send a buffer to all nodes connected to a source node
|
|
*
|
|
* @param[in] t topology to use
|
|
* @param[in] sock socket to use for sending
|
|
* @param[in] src_addr source node address
|
|
* @param[in] buffer ZEP frame to send
|
|
* @param[in] len ZEP frame length
|
|
*/
|
|
void topology_send(const topology_t *t, int sock,
|
|
const struct sockaddr_in6 *src_addr,
|
|
void *buffer, size_t len);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* TOPOLOGY_H */
|