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"
52#define LOG_MODULE "Orchestra"
53#define LOG_LEVEL LOG_LEVEL_MAC
56static void orchestra_packet_received(
void);
57static void orchestra_packet_sent(
int mac_status);
58NETSTACK_SNIFFER(orchestra_sniffer, orchestra_packet_received, orchestra_packet_sent);
61linkaddr_t orchestra_parent_linkaddr;
63int orchestra_parent_knows_us = 0;
66const struct orchestra_rule *all_rules[] = ORCHESTRA_RULES;
67#define NUM_RULES (sizeof(all_rules) / sizeof(struct orchestra_rule *))
71orchestra_packet_received(
void)
76orchestra_packet_sent(
int mac_status)
79 if(orchestra_parent_knows_us == 0
81 && packetbuf_attr(PACKETBUF_ATTR_NETWORK_ID) == UIP_PROTO_ICMP6
82 && packetbuf_attr(PACKETBUF_ATTR_CHANNEL) == (
ICMP6_RPL << 8 | RPL_CODE_DAO)) {
84 &&
linkaddr_cmp(&orchestra_parent_linkaddr, packetbuf_addr(PACKETBUF_ADDR_RECEIVER))) {
85 orchestra_parent_knows_us = 1;
91orchestra_callback_child_added(
const linkaddr_t *
addr)
95 for(i = 0; i < NUM_RULES; i++) {
96 if(all_rules[i]->child_added != NULL) {
97 all_rules[i]->child_added(
addr);
103orchestra_callback_child_removed(
const linkaddr_t *
addr)
107 for(i = 0; i < NUM_RULES; i++) {
108 if(all_rules[i]->child_removed != NULL) {
109 all_rules[i]->child_removed(
addr);
115orchestra_callback_neighbor_updated(
const linkaddr_t *
addr, uint8_t is_added)
119 for(i = 0; i < NUM_RULES; i++) {
120 if(all_rules[i]->neighbor_updated != NULL) {
121 all_rules[i]->neighbor_updated(
addr, is_added);
127orchestra_callback_packet_ready(
void)
131 uint16_t slotframe = 0xffff;
132 uint16_t timeslot = 0xffff;
136 uint16_t channel_offset = 0xffff;
137 int matched_rule = -1;
140 for(i = 0; i < NUM_RULES; i++) {
141 if(all_rules[i]->select_packet != NULL) {
142 if(all_rules[i]->select_packet(&slotframe, ×lot, &channel_offset)) {
149#if TSCH_WITH_LINK_SELECTOR
150 packetbuf_set_attr(PACKETBUF_ATTR_TSCH_SLOTFRAME, slotframe);
151 packetbuf_set_attr(PACKETBUF_ATTR_TSCH_TIMESLOT, timeslot);
152 packetbuf_set_attr(PACKETBUF_ATTR_TSCH_CHANNEL_OFFSET, channel_offset);
168 orchestra_parent_knows_us = 0;
170 for(i = 0; i < NUM_RULES; i++) {
171 if(all_rules[i]->new_time_source != NULL) {
172 all_rules[i]->new_time_source(old,
new);
178orchestra_callback_root_node_updated(
const linkaddr_t *root, uint8_t is_added)
182 for(i = 0; i < NUM_RULES; i++) {
183 if(all_rules[i]->root_node_updated != NULL) {
184 all_rules[i]->root_node_updated(root, is_added);
195 netstack_sniffer_add(&orchestra_sniffer);
198 for(i = 0; i < NUM_RULES; i++) {
199 LOG_INFO(
"Initializing rule %s (%u), size %d\n", all_rules[i]->name, i, all_rules[i]->slotframe_size);
200 if(all_rules[i]->init != NULL) {
201 all_rules[i]->init(i);
204 LOG_INFO(
"Initialization done\n");
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.