Refactor how packet sent callbacks are handled for TSCH, RPL, 6lowpan and DS6
This commit is contained in:
parent
aeba4c275b
commit
c3ec92dc2c
@ -71,6 +71,13 @@
|
|||||||
#include "net/packetbuf.h"
|
#include "net/packetbuf.h"
|
||||||
#include "net/queuebuf.h"
|
#include "net/queuebuf.h"
|
||||||
|
|
||||||
|
#if UIP_CONF_IPV6_RPL_LITE == 1
|
||||||
|
#include "net/rpl-lite/rpl.h"
|
||||||
|
#else /* UIP_CONF_IPV6_RPL_LITE == 1 */
|
||||||
|
#include "net/rpl/rpl.h"
|
||||||
|
#include "net/rpl/rpl-private.h"
|
||||||
|
#endif /* UIP_CONF_IPV6_RPL_LITE == 1 */
|
||||||
|
|
||||||
/* Log configuration */
|
/* Log configuration */
|
||||||
#include "sys/log.h"
|
#include "sys/log.h"
|
||||||
#define LOG_MODULE "6LoWPAN"
|
#define LOG_MODULE "6LoWPAN"
|
||||||
@ -1209,12 +1216,29 @@ compress_hdr_ipv6(linkaddr_t *link_destaddr)
|
|||||||
static void
|
static void
|
||||||
packet_sent(void *ptr, int status, int transmissions)
|
packet_sent(void *ptr, int status, int transmissions)
|
||||||
{
|
{
|
||||||
uip_ds6_link_neighbor_callback(status, transmissions);
|
const linkaddr_t *dest;
|
||||||
|
|
||||||
if(callback != NULL) {
|
if(callback != NULL) {
|
||||||
callback->output_callback(status);
|
callback->output_callback(status);
|
||||||
}
|
}
|
||||||
last_tx_status = status;
|
last_tx_status = status;
|
||||||
|
|
||||||
|
/* What follows only applies to unicast */
|
||||||
|
dest = packetbuf_addr(PACKETBUF_ADDR_RECEIVER);
|
||||||
|
if(linkaddr_cmp(dest, &linkaddr_null)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update neighbor link statistics */
|
||||||
|
link_stats_packet_sent(dest, status, transmissions);
|
||||||
|
|
||||||
|
#if UIP_CONF_IPV6_RPL
|
||||||
|
/* Call RPL link callback */
|
||||||
|
rpl_link_callback(dest, status, transmissions);
|
||||||
|
#endif /* UIP_CONF_IPV6_RPL */
|
||||||
|
|
||||||
|
/* DS6 callback, used for UIP_DS6_LL_NUD */
|
||||||
|
uip_ds6_link_callback(status, transmissions);
|
||||||
}
|
}
|
||||||
/*--------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
|
@ -64,13 +64,6 @@ void NEIGHBOR_STATE_CHANGED(uip_ds6_nbr_t *n);
|
|||||||
#define NEIGHBOR_STATE_CHANGED(n)
|
#define NEIGHBOR_STATE_CHANGED(n)
|
||||||
#endif /* UIP_DS6_CONF_NEIGHBOR_STATE_CHANGED */
|
#endif /* UIP_DS6_CONF_NEIGHBOR_STATE_CHANGED */
|
||||||
|
|
||||||
#ifdef UIP_CONF_DS6_LINK_NEIGHBOR_CALLBACK
|
|
||||||
#define LINK_NEIGHBOR_CALLBACK(addr, status, numtx) UIP_CONF_DS6_LINK_NEIGHBOR_CALLBACK(addr, status, numtx)
|
|
||||||
void LINK_NEIGHBOR_CALLBACK(const linkaddr_t *addr, int status, int numtx);
|
|
||||||
#else
|
|
||||||
#define LINK_NEIGHBOR_CALLBACK(addr, status, numtx)
|
|
||||||
#endif /* UIP_CONF_DS6_LINK_NEIGHBOR_CALLBACK */
|
|
||||||
|
|
||||||
NBR_TABLE_GLOBAL(uip_ds6_nbr_t, ds6_neighbors);
|
NBR_TABLE_GLOBAL(uip_ds6_nbr_t, ds6_neighbors);
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -205,19 +198,14 @@ uip_ds6_nbr_lladdr_from_ipaddr(const uip_ipaddr_t *ipaddr)
|
|||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
uip_ds6_link_neighbor_callback(int status, int numtx)
|
uip_ds6_link_callback(int status, int numtx)
|
||||||
{
|
{
|
||||||
|
#if UIP_DS6_LL_NUD
|
||||||
const linkaddr_t *dest = packetbuf_addr(PACKETBUF_ADDR_RECEIVER);
|
const linkaddr_t *dest = packetbuf_addr(PACKETBUF_ADDR_RECEIVER);
|
||||||
if(linkaddr_cmp(dest, &linkaddr_null)) {
|
if(linkaddr_cmp(dest, &linkaddr_null)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update neighbor link statistics */
|
|
||||||
link_stats_packet_sent(dest, status, numtx);
|
|
||||||
/* Call upper-layer callback (e.g. RPL) */
|
|
||||||
LINK_NEIGHBOR_CALLBACK(dest, status, numtx);
|
|
||||||
|
|
||||||
#if UIP_DS6_LL_NUD
|
|
||||||
/* From RFC4861, page 72, last paragraph of section 7.3.3:
|
/* From RFC4861, page 72, last paragraph of section 7.3.3:
|
||||||
*
|
*
|
||||||
* "In some cases, link-specific information may indicate that a path to
|
* "In some cases, link-specific information may indicate that a path to
|
||||||
@ -245,7 +233,6 @@ uip_ds6_link_neighbor_callback(int status, int numtx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* UIP_DS6_LL_NUD */
|
#endif /* UIP_DS6_LL_NUD */
|
||||||
|
|
||||||
}
|
}
|
||||||
#if UIP_ND6_SEND_NS
|
#if UIP_ND6_SEND_NS
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -94,7 +94,7 @@ uip_ds6_nbr_t *uip_ds6_nbr_lookup(const uip_ipaddr_t *ipaddr);
|
|||||||
uip_ds6_nbr_t *uip_ds6_nbr_ll_lookup(const uip_lladdr_t *lladdr);
|
uip_ds6_nbr_t *uip_ds6_nbr_ll_lookup(const uip_lladdr_t *lladdr);
|
||||||
uip_ipaddr_t *uip_ds6_nbr_ipaddr_from_lladdr(const uip_lladdr_t *lladdr);
|
uip_ipaddr_t *uip_ds6_nbr_ipaddr_from_lladdr(const uip_lladdr_t *lladdr);
|
||||||
const uip_lladdr_t *uip_ds6_nbr_lladdr_from_ipaddr(const uip_ipaddr_t *ipaddr);
|
const uip_lladdr_t *uip_ds6_nbr_lladdr_from_ipaddr(const uip_ipaddr_t *ipaddr);
|
||||||
void uip_ds6_link_neighbor_callback(int status, int numtx);
|
void uip_ds6_link_callback(int status, int numtx);
|
||||||
void uip_ds6_neighbor_periodic(void);
|
void uip_ds6_neighbor_periodic(void);
|
||||||
int uip_ds6_nbr_num(void);
|
int uip_ds6_nbr_num(void);
|
||||||
|
|
||||||
|
@ -233,13 +233,6 @@ typedef struct uip_ds6_maddr {
|
|||||||
#endif /* UIP_CONF_DS6_NEIGHBOR_STATE_CHANGED */
|
#endif /* UIP_CONF_DS6_NEIGHBOR_STATE_CHANGED */
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
#endif /* UIP_CONF_IPV6_RPL */
|
||||||
|
|
||||||
#if UIP_CONF_IPV6_RPL
|
|
||||||
#ifndef UIP_CONF_DS6_LINK_NEIGHBOR_CALLBACK
|
|
||||||
#define UIP_CONF_DS6_LINK_NEIGHBOR_CALLBACK rpl_link_neighbor_callback
|
|
||||||
#endif /* UIP_CONF_DS6_NEIGHBOR_STATE_CHANGED */
|
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Interface structure (contains all the interface variables) */
|
/** \brief Interface structure (contains all the interface variables) */
|
||||||
typedef struct uip_ds6_netif {
|
typedef struct uip_ds6_netif {
|
||||||
uint32_t link_mtu;
|
uint32_t link_mtu;
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
#include "net/mac/tsch/tsch-private.h"
|
#include "net/mac/tsch/tsch-private.h"
|
||||||
#include "net/mac/tsch/tsch-schedule.h"
|
#include "net/mac/tsch/tsch-schedule.h"
|
||||||
#include "net/mac/tsch/tsch-log.h"
|
#include "net/mac/tsch/tsch-log.h"
|
||||||
|
#include "net/mac/tsch/tsch-rpl.h"
|
||||||
#include "tsch-rpl.h"
|
#include "tsch-rpl.h"
|
||||||
|
|
||||||
/* Log configuration */
|
/* Log configuration */
|
||||||
@ -55,6 +56,13 @@
|
|||||||
#define LOG_MODULE "TSCH RPL"
|
#define LOG_MODULE "TSCH RPL"
|
||||||
#define LOG_LEVEL MAC_LOG_LEVEL
|
#define LOG_LEVEL MAC_LOG_LEVEL
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
/* To use, set #define TSCH_CALLBACK_KA_SENT tsch_rpl_callback_ka_sent */
|
||||||
|
void
|
||||||
|
tsch_rpl_callback_ka_sent(int status, int transmissions)
|
||||||
|
{
|
||||||
|
rpl_link_callback(packetbuf_addr(PACKETBUF_ADDR_RECEIVER), status, transmissions);
|
||||||
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* To use, set #define TSCH_CALLBACK_JOINING_NETWORK tsch_rpl_callback_joining_network */
|
/* To use, set #define TSCH_CALLBACK_JOINING_NETWORK tsch_rpl_callback_joining_network */
|
||||||
void
|
void
|
||||||
|
@ -43,6 +43,9 @@
|
|||||||
|
|
||||||
/********** Functions *********/
|
/********** Functions *********/
|
||||||
|
|
||||||
|
/* Keep-alives packet sent callback.
|
||||||
|
* To use, set #define TSCH_CALLBACK_KA_SENT tsch_rpl_callback_ka_sent */
|
||||||
|
void tsch_rpl_callback_ka_sent(int status, int transmissions);
|
||||||
/* To use, set #define TSCH_CALLBACK_JOINING_NETWORK tsch_rpl_callback_joining_network */
|
/* To use, set #define TSCH_CALLBACK_JOINING_NETWORK tsch_rpl_callback_joining_network */
|
||||||
void tsch_rpl_callback_joining_network(void);
|
void tsch_rpl_callback_joining_network(void);
|
||||||
/* Upon leaving a TSCH network, perform a local repair
|
/* Upon leaving a TSCH network, perform a local repair
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
#include "net/packetbuf.h"
|
#include "net/packetbuf.h"
|
||||||
#include "net/queuebuf.h"
|
#include "net/queuebuf.h"
|
||||||
#include "net/nbr-table.h"
|
#include "net/nbr-table.h"
|
||||||
|
#include "net/link-stats.h"
|
||||||
#include "net/mac/framer/framer-802154.h"
|
#include "net/mac/framer/framer-802154.h"
|
||||||
#include "net/mac/tsch/tsch.h"
|
#include "net/mac/tsch/tsch.h"
|
||||||
#include "net/mac/tsch/tsch-slot-operation.h"
|
#include "net/mac/tsch/tsch-slot-operation.h"
|
||||||
@ -57,6 +58,10 @@
|
|||||||
#include "net/mac/mac-sequence.h"
|
#include "net/mac/mac-sequence.h"
|
||||||
#include "lib/random.h"
|
#include "lib/random.h"
|
||||||
|
|
||||||
|
#if UIP_CONF_IPV6_RPL
|
||||||
|
#include "net/mac/tsch/tsch-rpl.h"
|
||||||
|
#endif /* UIP_CONF_IPV6_RPL */
|
||||||
|
|
||||||
#if FRAME802154_VERSION < FRAME802154_IEEE802154E_2012
|
#if FRAME802154_VERSION < FRAME802154_IEEE802154E_2012
|
||||||
#error TSCH: FRAME802154_VERSION must be at least FRAME802154_IEEE802154E_2012
|
#error TSCH: FRAME802154_VERSION must be at least FRAME802154_IEEE802154E_2012
|
||||||
#endif
|
#endif
|
||||||
@ -248,10 +253,12 @@ tsch_reset(void)
|
|||||||
static void
|
static void
|
||||||
keepalive_packet_sent(void *ptr, int status, int transmissions)
|
keepalive_packet_sent(void *ptr, int status, int transmissions)
|
||||||
{
|
{
|
||||||
if(tsch_is_associated) {
|
/* Update neighbor link statistics */
|
||||||
#ifdef TSCH_LINK_NEIGHBOR_CALLBACK
|
link_stats_packet_sent(packetbuf_addr(PACKETBUF_ADDR_RECEIVER), status, transmissions);
|
||||||
TSCH_LINK_NEIGHBOR_CALLBACK(packetbuf_addr(PACKETBUF_ADDR_RECEIVER), status, transmissions);
|
/* Call RPL callback if RPL is enabled */
|
||||||
#endif
|
#ifdef TSCH_CALLBACK_KA_SENT
|
||||||
|
TSCH_CALLBACK_KA_SENT(status, transmissions);
|
||||||
|
#endif /* TSCH_CALLBACK_KA_SENT */
|
||||||
LOG_INFO("KA sent to ");
|
LOG_INFO("KA sent to ");
|
||||||
LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
|
LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
|
||||||
LOG_INFO_(", st %d-%d\n", status, transmissions);
|
LOG_INFO_(", st %d-%d\n", status, transmissions);
|
||||||
@ -279,7 +286,6 @@ keepalive_packet_sent(void *ptr, int status, int transmissions)
|
|||||||
|
|
||||||
tsch_schedule_keepalive();
|
tsch_schedule_keepalive();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Prepare and send a keepalive message */
|
/* Prepare and send a keepalive message */
|
||||||
static void
|
static void
|
||||||
|
@ -86,7 +86,7 @@ rpl_get_global_address(void)
|
|||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
rpl_link_neighbor_callback(const linkaddr_t *addr, int status, int numtx)
|
rpl_link_callback(const linkaddr_t *addr, int status, int numtx)
|
||||||
{
|
{
|
||||||
if(curr_instance.used == 1 ) {
|
if(curr_instance.used == 1 ) {
|
||||||
rpl_nbr_t *nbr = rpl_neighbor_get_from_lladdr((uip_lladdr_t *)addr);
|
rpl_nbr_t *nbr = rpl_neighbor_get_from_lladdr((uip_lladdr_t *)addr);
|
||||||
|
@ -67,6 +67,15 @@ extern uip_ipaddr_t rpl_multicast_addr;
|
|||||||
|
|
||||||
/********** Public functions **********/
|
/********** Public functions **********/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by lower layers after every packet transmission
|
||||||
|
*
|
||||||
|
* \param addr The link-layer addrress of the packet destination
|
||||||
|
* \param status The transmission status (see core/net/mac/mac.h)
|
||||||
|
* \param numtx The total number of transmission attempts
|
||||||
|
*/
|
||||||
|
void rpl_link_callback(const linkaddr_t *addr, int status, int numtx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set prefix from an prefix data structure (from DIO)
|
* Set prefix from an prefix data structure (from DIO)
|
||||||
*
|
*
|
||||||
|
@ -250,7 +250,7 @@ rpl_add_route(rpl_dag_t *dag, uip_ipaddr_t *prefix, int prefix_len,
|
|||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
rpl_link_neighbor_callback(const linkaddr_t *addr, int status, int numtx)
|
rpl_link_callback(const linkaddr_t *addr, int status, int numtx)
|
||||||
{
|
{
|
||||||
uip_ipaddr_t ipaddr;
|
uip_ipaddr_t ipaddr;
|
||||||
rpl_parent_t *parent;
|
rpl_parent_t *parent;
|
||||||
@ -265,7 +265,7 @@ rpl_link_neighbor_callback(const linkaddr_t *addr, int status, int numtx)
|
|||||||
parent = rpl_find_parent_any_dag(instance, &ipaddr);
|
parent = rpl_find_parent_any_dag(instance, &ipaddr);
|
||||||
if(parent != NULL) {
|
if(parent != NULL) {
|
||||||
/* Trigger DAG rank recalculation. */
|
/* Trigger DAG rank recalculation. */
|
||||||
PRINTF("RPL: rpl_link_neighbor_callback triggering update\n");
|
PRINTF("RPL: rpl_link_callback triggering update\n");
|
||||||
parent->flags |= RPL_PARENT_FLAG_UPDATED;
|
parent->flags |= RPL_PARENT_FLAG_UPDATED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -292,7 +292,7 @@ uip_ds6_nbr_t *rpl_get_nbr(rpl_parent_t *parent);
|
|||||||
void rpl_print_neighbor_list(void);
|
void rpl_print_neighbor_list(void);
|
||||||
int rpl_ext_header_srh_update(void);
|
int rpl_ext_header_srh_update(void);
|
||||||
int rpl_ext_header_srh_get_next_hop(uip_ipaddr_t *ipaddr);
|
int rpl_ext_header_srh_get_next_hop(uip_ipaddr_t *ipaddr);
|
||||||
|
void rpl_link_callback(const linkaddr_t *addr, int status, int numtx);
|
||||||
/* Per-parent RPL information */
|
/* Per-parent RPL information */
|
||||||
NBR_TABLE_DECLARE(rpl_parents);
|
NBR_TABLE_DECLARE(rpl_parents);
|
||||||
|
|
||||||
|
@ -69,6 +69,7 @@
|
|||||||
/* TSCH and RPL callbacks */
|
/* TSCH and RPL callbacks */
|
||||||
#define RPL_CALLBACK_PARENT_SWITCH tsch_rpl_callback_parent_switch
|
#define RPL_CALLBACK_PARENT_SWITCH tsch_rpl_callback_parent_switch
|
||||||
#define RPL_CALLBACK_NEW_DIO_INTERVAL tsch_rpl_callback_new_dio_interval
|
#define RPL_CALLBACK_NEW_DIO_INTERVAL tsch_rpl_callback_new_dio_interval
|
||||||
|
#define TSCH_CALLBACK_KA_SENT tsch_rpl_callback_ka_sent
|
||||||
#define TSCH_CALLBACK_JOINING_NETWORK tsch_rpl_callback_joining_network
|
#define TSCH_CALLBACK_JOINING_NETWORK tsch_rpl_callback_joining_network
|
||||||
#define TSCH_CALLBACK_LEAVING_NETWORK tsch_rpl_callback_leaving_network
|
#define TSCH_CALLBACK_LEAVING_NETWORK tsch_rpl_callback_leaving_network
|
||||||
|
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
/* TSCH and RPL callbacks */
|
/* TSCH and RPL callbacks */
|
||||||
#define RPL_CALLBACK_PARENT_SWITCH tsch_rpl_callback_parent_switch
|
#define RPL_CALLBACK_PARENT_SWITCH tsch_rpl_callback_parent_switch
|
||||||
#define RPL_CALLBACK_NEW_DIO_INTERVAL tsch_rpl_callback_new_dio_interval
|
#define RPL_CALLBACK_NEW_DIO_INTERVAL tsch_rpl_callback_new_dio_interval
|
||||||
|
#define TSCH_CALLBACK_KA_SENT tsch_rpl_callback_ka_sent
|
||||||
#define TSCH_CALLBACK_JOINING_NETWORK tsch_rpl_callback_joining_network
|
#define TSCH_CALLBACK_JOINING_NETWORK tsch_rpl_callback_joining_network
|
||||||
#define TSCH_CALLBACK_LEAVING_NETWORK tsch_rpl_callback_leaving_network
|
#define TSCH_CALLBACK_LEAVING_NETWORK tsch_rpl_callback_leaving_network
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ uip_icmp6chksum(void)
|
|||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
uip_ds6_link_neighbor_callback(int status, int numtx)
|
uip_ds6_link_callback(int status, int numtx)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user