44#if ROUTING_CONF_RPL_LITE
45#include "net/routing/rpl-lite/rpl.h"
46#elif ROUTING_CONF_RPL_CLASSIC
47#include "net/routing/rpl-classic/rpl.h"
48#include "net/routing/rpl-classic/rpl-private.h"
53#define LOG_MODULE "Orchestra"
54#define LOG_LEVEL LOG_LEVEL_MAC
57static void orchestra_packet_received(
void);
58static void orchestra_packet_sent(
int mac_status);
59NETSTACK_SNIFFER(orchestra_sniffer, orchestra_packet_received, orchestra_packet_sent);
62linkaddr_t orchestra_parent_linkaddr;
64int orchestra_parent_knows_us = 0;
67const struct orchestra_rule *all_rules[] = ORCHESTRA_RULES;
68#define NUM_RULES CC_ARRAY_LENGTH(all_rules)
72orchestra_packet_received(
void)
77orchestra_packet_sent(
int mac_status)
80 if(orchestra_parent_knows_us == 0
82 && packetbuf_attr(PACKETBUF_ATTR_NETWORK_ID) == UIP_PROTO_ICMP6
83 && packetbuf_attr(PACKETBUF_ATTR_CHANNEL) == (
ICMP6_RPL << 8 | RPL_CODE_DAO)) {
85 &&
linkaddr_cmp(&orchestra_parent_linkaddr, packetbuf_addr(PACKETBUF_ADDR_RECEIVER))) {
86 orchestra_parent_knows_us = 1;
92orchestra_callback_child_added(
const linkaddr_t *
addr)
96 for(i = 0; i < NUM_RULES; i++) {
97 if(all_rules[i]->child_added != NULL) {
98 all_rules[i]->child_added(
addr);
104orchestra_callback_child_removed(
const linkaddr_t *
addr)
108 for(i = 0; i < NUM_RULES; i++) {
109 if(all_rules[i]->child_removed != NULL) {
110 all_rules[i]->child_removed(
addr);
116orchestra_callback_neighbor_updated(
const linkaddr_t *
addr, uint8_t is_added)
120 for(i = 0; i < NUM_RULES; i++) {
121 if(all_rules[i]->neighbor_updated != NULL) {
122 all_rules[i]->neighbor_updated(
addr, is_added);
128orchestra_callback_packet_ready(
void)
132 uint16_t slotframe = 0xffff;
133 uint16_t timeslot = 0xffff;
137 uint16_t channel_offset = 0xffff;
138 int matched_rule = -1;
141 for(i = 0; i < NUM_RULES; i++) {
142 if(all_rules[i]->select_packet != NULL) {
143 if(all_rules[i]->select_packet(&slotframe, ×lot, &channel_offset)) {
150#if TSCH_WITH_LINK_SELECTOR
151 packetbuf_set_attr(PACKETBUF_ATTR_TSCH_SLOTFRAME, slotframe);
152 packetbuf_set_attr(PACKETBUF_ATTR_TSCH_TIMESLOT, timeslot);
153 packetbuf_set_attr(PACKETBUF_ATTR_TSCH_CHANNEL_OFFSET, channel_offset);
169 orchestra_parent_knows_us = 0;
171 for(i = 0; i < NUM_RULES; i++) {
172 if(all_rules[i]->new_time_source != NULL) {
173 all_rules[i]->new_time_source(old,
new);
179orchestra_callback_root_node_updated(
const linkaddr_t *root, uint8_t is_added)
183 for(i = 0; i < NUM_RULES; i++) {
184 if(all_rules[i]->root_node_updated != NULL) {
185 all_rules[i]->root_node_updated(root, is_added);
196 netstack_sniffer_add(&orchestra_sniffer);
199 for(i = 0; i < NUM_RULES; i++) {
200 LOG_INFO(
"Initializing rule %s (%u), size %d\n", all_rules[i]->name, i, all_rules[i]->slotframe_size);
201 if(all_rules[i]->init != NULL) {
202 all_rules[i]->init(i);
205 LOG_INFO(
"Initialization done\n");
Default definitions of C compiler quirk work-arounds.
void linkaddr_copy(linkaddr_t *dest, const linkaddr_t *src)
Copy a link-layer address.
bool linkaddr_cmp(const linkaddr_t *addr1, const linkaddr_t *addr2)
Compare two link-layer addresses.
const linkaddr_t linkaddr_null
The null link-layer address.
Header file for the logging system.
@ MAC_TX_OK
The MAC layer transmission was OK.
Header file for the Packet buffer (packetbuf) management.
Routing driver header file.
TSCH neighbor information.
Header file for ICMPv6 message and error handing (RFC 4443).
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.