Merge branch 'develop' into fix-rpl-classic-addr-autoconf-root

This commit is contained in:
Simon Duquennoy 2017-12-12 12:07:27 +01:00 committed by GitHub
commit eadb9ea219
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 122 additions and 34 deletions

View File

@ -229,7 +229,7 @@ icmp_input()
uip_process(UIP_UDP_SEND_CONN);
memcpy(&mcast_buf, uip_buf, uip_len);
memcpy(&mcast_buf, &uip_buf[UIP_LLH_LEN], uip_len);
mcast_len = uip_len;
/* pass the packet to our uip_process to check if it is allowed to
* accept this packet or not */
@ -239,7 +239,7 @@ icmp_input()
uip_process(UIP_DATA);
memcpy(uip_buf, &mcast_buf, mcast_len);
memcpy(&uip_buf[UIP_LLH_LEN], &mcast_buf, mcast_len);
uip_len = mcast_len;
/* Return the IP of the original Multicast sender */
uip_ipaddr_copy(&UIP_IP_BUF->srcipaddr, &src_ip);
@ -257,7 +257,7 @@ icmp_input()
static void
mcast_fwd(void *p)
{
memcpy(uip_buf, &mcast_buf, mcast_len);
memcpy(&uip_buf[UIP_LLH_LEN], &mcast_buf, mcast_len);
uip_len = mcast_len;
UIP_IP_BUF->ttl--;
tcpip_output(NULL);
@ -291,7 +291,7 @@ in()
parent_lladdr = uip_ds6_nbr_lladdr_from_ipaddr(parent_ipaddr);
if(parent_lladdr == NULL) {
PRINTF("ESMRF: NO Parent exist \n");
PRINTF("ESMRF: No Parent found\n");
UIP_MCAST6_STATS_ADD(mcast_dropped);
return UIP_MCAST6_DROP;
}
@ -309,6 +309,7 @@ in()
if(UIP_IP_BUF->ttl <= 1) {
UIP_MCAST6_STATS_ADD(mcast_dropped);
PRINTF("ESMRF: TTL too low\n");
return UIP_MCAST6_DROP;
}
@ -350,12 +351,14 @@ in()
fwd_delay = fwd_delay * (1 + ((random_rand() >> 11) % fwd_spread));
}
memcpy(&mcast_buf, uip_buf, uip_len);
memcpy(&mcast_buf, &uip_buf[UIP_LLH_LEN], uip_len);
mcast_len = uip_len;
ctimer_set(&mcast_periodic, fwd_delay, mcast_fwd, NULL);
}
PRINTF("ESMRF: %u bytes: fwd in %u [%u]\n",
uip_len, fwd_delay, fwd_spread);
} else {
PRINTF("ESMRF: Group unknown, dropping\n");
}
/* Done with this packet unless we are a member of the mcast group */

View File

@ -1321,7 +1321,7 @@ static void
out()
{
if(uip_len + HBHO_TOTAL_LEN > UIP_BUFSIZE) {
if(uip_len + HBHO_TOTAL_LEN > UIP_BUFSIZE - UIP_LLH_LEN) {
PRINTF("ROLL TM: Multicast Out can not add HBHO. Packet too long\n");
goto drop;
}

View File

@ -82,7 +82,7 @@ static uint8_t fwd_spread;
static void
mcast_fwd(void *p)
{
memcpy(uip_buf, &mcast_buf, mcast_len);
memcpy(&uip_buf[UIP_LLH_LEN], &mcast_buf, mcast_len);
uip_len = mcast_len;
UIP_IP_BUF->ttl--;
tcpip_output(NULL);
@ -106,6 +106,7 @@ in()
*/
d = rpl_get_any_dag();
if(!d) {
PRINTF("SMRF: No DODAG\n");
UIP_MCAST6_STATS_ADD(mcast_dropped);
return UIP_MCAST6_DROP;
}
@ -115,6 +116,7 @@ in()
parent_lladdr = uip_ds6_nbr_lladdr_from_ipaddr(parent_ipaddr);
if(parent_lladdr == NULL) {
PRINTF("SMRF: No Parent found\n");
UIP_MCAST6_STATS_ADD(mcast_dropped);
return UIP_MCAST6_DROP;
}
@ -132,6 +134,7 @@ in()
if(UIP_IP_BUF->ttl <= 1) {
UIP_MCAST6_STATS_ADD(mcast_dropped);
PRINTF("SMRF: TTL too low\n");
return UIP_MCAST6_DROP;
}
@ -173,12 +176,14 @@ in()
fwd_delay = fwd_delay * (1 + ((random_rand() >> 11) % fwd_spread));
}
memcpy(&mcast_buf, uip_buf, uip_len);
memcpy(&mcast_buf, &uip_buf[UIP_LLH_LEN], uip_len);
mcast_len = uip_len;
ctimer_set(&mcast_periodic, fwd_delay, mcast_fwd, NULL);
}
PRINTF("SMRF: %u bytes: fwd in %u [%u]\n",
uip_len, fwd_delay, fwd_spread);
} else {
PRINTF("SMRF: Group unknown, dropping\n");
}
/* Done with this packet unless we are a member of the mcast group */

View File

@ -128,6 +128,6 @@ uipbuf_clr_attr_flag(uint16_t flag)
uint16_t
uipbuf_is_attr_flag(uint16_t flag)
{
return (uipbuf_attrs[UIPBUF_ATTR_FLAGS] & flag) > 0;
return (uipbuf_attrs[UIPBUF_ATTR_FLAGS] & flag) == flag;
}
/*---------------------------------------------------------------------------*/

View File

@ -35,33 +35,106 @@
#include "contiki.h"
/* Get the next header given the buffer - start indicates that this is
start of the IPv6 header - needs to be set to 0 when in an ext hdr */
/**
* \brief Get the next IPv6 header.
* \param buffer A pointer to the buffer holding the IPv6 packet
* \param size The size of the data in the buffer
* \param protocol A pointer to a variable where the protocol of the header will be stored
* \param start A flag that indicates if this is expected to be the IPv6 packet header or a later header (Extension header)
* \retval returns address of the starting position of the next header
*
* This function moves to the next header in a IPv6 packet.
*/
uint8_t* uipbuf_get_next_header(uint8_t *buffer, uint16_t size, uint8_t *protocol, uint8_t start);
/* Get the final header given the buffer - that is assumed to be at start
of an IPv6 header */
/**
* \brief Get the last IPv6 header.
* \param buffer A pointer to the buffer holding the IPv6 packet
* \param size The size of the data in the buffer
* \param protocol A pointer to a variable where the protocol of the header will be stored
* \retval returns address of the starting position of the next header
*
* This function moves to the last header of the IPv6 packet.
*/
uint8_t* uipbuf_get_last_header(uint8_t *buffer, uint16_t size, uint8_t *protocol);
/* Attributes relating to the current packet in uipbuf */
/**
* \brief Get the value of the attribute
* \param type The attribute to get the value of
* \retval the value of the attribute
*
* This function gets the value of a specific uipbuf attribute.
*/
uint16_t uipbuf_get_attr(uint8_t type);
void uipbuf_set_attr_flag(uint16_t flag);
void uipbuf_clr_attr_flag(uint16_t flag);
uint16_t uipbuf_is_attr_flag(uint16_t flag);
/**
* \brief Set the value of the attribute
* \param type The attribute to set the value of
* \param value The value to set
* \retval 0 - indicates failure of setting the value
* \retval 1 - indicates success of setting the value
*
* This function sets the value of a specific uipbuf attribute.
*/
int uipbuf_set_attr(uint8_t type, uint16_t value);
/**
* \brief Set bits in the uipbuf attribute flags.
* \param flag_bits The bits to set in the flag.
*
* This function sets the uipbuf attributes flag of specified bits.
*/
void uipbuf_set_attr_flag(uint16_t flag_bits);
/**
* \brief Clear bits in the uipbuf attribute flags.
* \param flag_bits The bits to clear in the flag.
*
* This function clears the uipbuf attributes flag of specified bits.
*/
void uipbuf_clr_attr_flag(uint16_t flag_bits);
/**
* \brief Check if bits in the uipbuf attribute flag are set.
* \param flag_bits The bits to check in the flag.
*
* This function checks if the specified bits are set in the
* uipbuf attributes flag.
*/
uint16_t uipbuf_is_attr_flag(uint16_t flag_bits);
/**
* \brief Clear all attributes.
*
* This function clear all attributes in the uipbuf attributes
* including all flags.
*/
void uipbuf_clear_attr(void);
/* These flags will be used for being */
/**
* \brief The bits defined for uipbuf attributes flag.
*
*/
/* Avoid using NHC compression on the packet (6LoWPAN) */
#define UIPBUF_ATTR_FLAGS_6LOWPAN_NO_NHC_COMPRESSION 0x01
/* Avoid using prefix compression on the packet (6LoWPAN) */
#define UIPBUF_ATTR_FLAGS_6LOWPAN_NO_PREFIX_COMPRESSION 0x02
/**
* \brief The attributes defined for uipbuf attributes function.
*
*/
enum {
UIPBUF_ATTR_LLSEC_LEVEL,
UIPBUF_ATTR_LLSEC_KEY_ID,
UIPBUF_ATTR_INTERFACE_ID,
UIPBUF_ATTR_PHYSICAL_NETWORK_ID,
UIPBUF_ATTR_MAX_MAC_TRANSMISSIONS,
UIPBUF_ATTR_FLAGS,
UIPBUF_ATTR_LLSEC_LEVEL, /**< Control link layer security level. */
UIPBUF_ATTR_LLSEC_KEY_ID, /**< Control link layer security key ID. */
UIPBUF_ATTR_INTERFACE_ID, /**< The interface to output packet on */
UIPBUF_ATTR_PHYSICAL_NETWORK_ID, /**< Physical network ID (mapped to PAN ID)*/
UIPBUF_ATTR_MAX_MAC_TRANSMISSIONS, /**< MAX transmissions of the packet MAC */
UIPBUF_ATTR_FLAGS, /**< Flags that can control lower layers. see above. */
UIPBUF_ATTR_MAX
};

View File

@ -370,6 +370,7 @@ rpl_set_root(uint8_t instance_id, uip_ipaddr_t *dag_id)
}
if(dag == dag->instance->current_dag) {
PRINTF("RPL: Dropping a joined DAG when setting this node as root");
rpl_set_default_route(instance, NULL);
dag->instance->current_dag = NULL;
} else {
PRINTF("RPL: Dropping a DAG when setting this node as root");
@ -667,6 +668,10 @@ rpl_free_dag(rpl_dag_t *dag)
if(RPL_IS_STORING(dag->instance)) {
rpl_remove_routes(dag);
}
/* Stop the DAO retransmit timer */
#if RPL_WITH_DAO_ACK
ctimer_stop(&dag->instance->dao_retransmit_timer);
#endif /* RPL_WITH_DAO_ACK */
/* Remove autoconfigured address */
if((dag->prefix_info.flags & UIP_ND6_RA_FLAG_AUTONOMOUS)) {
@ -1325,6 +1330,9 @@ rpl_local_repair(rpl_instance_t *instance)
/* no downward route anymore */
instance->has_downward_route = 0;
#if RPL_WITH_DAO_ACK
ctimer_stop(&instance->dao_retransmit_timer);
#endif /* RPL_WITH_DAO_ACK */
rpl_reset_dio_timer(instance);
if(RPL_IS_STORING(instance)) {

View File

@ -1282,6 +1282,12 @@ dao_ack_input(void)
parent = NULL;
}
if(instance->current_dag->rank == ROOT_RANK(instance)) {
PRINTF("RPL: DODAG root received a DAO ACK, ignoring it\n");
uip_clear_buf();
return;
}
PRINTF("RPL: Received a DAO %s with sequence number %d (%d) and status %d from ",
status < 128 ? "ACK" : "NACK",
sequence, instance->my_dao_seqno, status);

View File

@ -199,13 +199,6 @@
#define RPL_ROUTE_FROM_MULTICAST_DAO 2
#define RPL_ROUTE_FROM_DIO 3
/* Multicast Route Lifetime as a multiple of the lifetime unit */
#ifdef RPL_CONF_MCAST_LIFETIME
#define RPL_MCAST_LIFETIME RPL_CONF_MCAST_LIFETIME
#else
#define RPL_MCAST_LIFETIME 3
#endif
/* DIS related */
#define RPL_DIS_SEND 1

View File

@ -283,7 +283,7 @@ handle_dao_timer(void *ptr)
if(uip_ds6_if.maddr_list[i].isused
&& uip_is_addr_mcast_global(&uip_ds6_if.maddr_list[i].ipaddr)) {
dao_output_target(instance->current_dag->preferred_parent,
&uip_ds6_if.maddr_list[i].ipaddr, RPL_MCAST_LIFETIME);
&uip_ds6_if.maddr_list[i].ipaddr, instance->default_lifetime);
}
}
@ -293,7 +293,7 @@ handle_dao_timer(void *ptr)
/* Don't send if it's also our own address, done that already */
if(uip_ds6_maddr_lookup(&mcast_route->group) == NULL) {
dao_output_target(instance->current_dag->preferred_parent,
&mcast_route->group, RPL_MCAST_LIFETIME);
&mcast_route->group, instance->default_lifetime);
}
mcast_route = list_item_next(mcast_route);
}