Merge branch 'develop' into contrib/ci-frag-large
This commit is contained in:
commit
00cd589c84
1
.gitignore
vendored
1
.gitignore
vendored
@ -16,6 +16,7 @@ obj_*
|
|||||||
Makefile.target
|
Makefile.target
|
||||||
Makefile.*.defines
|
Makefile.*.defines
|
||||||
tools/doxygen/html
|
tools/doxygen/html
|
||||||
|
tools/readthedocs/_build
|
||||||
patches-*
|
patches-*
|
||||||
tools/serial-io/tunslip6
|
tools/serial-io/tunslip6
|
||||||
tools/serial-io/serialdump
|
tools/serial-io/serialdump
|
||||||
|
@ -7,7 +7,7 @@ notifications:
|
|||||||
# Environment setup before test script. Runs for each build
|
# Environment setup before test script. Runs for each build
|
||||||
before_install:
|
before_install:
|
||||||
# Check if anything has changed within the docker directory
|
# Check if anything has changed within the docker directory
|
||||||
- DOCKER_CHANGED=`git diff --name-only $TRAVIS_BRANCH...HEAD -- tools/docker | wc -l`
|
- DOCKER_CHANGED=`git diff --name-only $TRAVIS_COMMIT_RANGE -- tools/docker | wc -l`
|
||||||
# If Docker directory has not changed, pull image from Dockerhub. Else, build
|
# If Docker directory has not changed, pull image from Dockerhub. Else, build
|
||||||
# image from Dockerifle. This needs to be done for each job. Any build error
|
# image from Dockerifle. This needs to be done for each job. Any build error
|
||||||
# will count as Travis test failure. In case this updates develop, push new
|
# will count as Travis test failure. In case this updates develop, push new
|
||||||
@ -20,6 +20,10 @@ before_install:
|
|||||||
else
|
else
|
||||||
echo "Docker image changed, build from Dockerfile"
|
echo "Docker image changed, build from Dockerfile"
|
||||||
docker build tools/docker -t $DOCKER_IMG;
|
docker build tools/docker -t $DOCKER_IMG;
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo "Failed to build Docker image"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
if [ $TRAVIS_SECURE_ENV_VARS == true ] && [ $TRAVIS_PULL_REQUEST == false ] && [ $TRAVIS_BRANCH == 'develop' ]; then
|
if [ $TRAVIS_SECURE_ENV_VARS == true ] && [ $TRAVIS_PULL_REQUEST == false ] && [ $TRAVIS_BRANCH == 'develop' ]; then
|
||||||
echo "This build is for an update of branch develop. Push image to Dockerhub"
|
echo "This build is for an update of branch develop. Push image to Dockerhub"
|
||||||
echo $DOCKERHUB_PASSWD | docker login --username contiker --password-stdin
|
echo $DOCKERHUB_PASSWD | docker login --username contiker --password-stdin
|
||||||
@ -58,7 +62,7 @@ env:
|
|||||||
- TEST_NAME='simulation-base'
|
- TEST_NAME='simulation-base'
|
||||||
- TEST_NAME='ieee802154'
|
- TEST_NAME='ieee802154'
|
||||||
- TEST_NAME='compile-nxp-ports'
|
- TEST_NAME='compile-nxp-ports'
|
||||||
- TEST_NAME='doxygen'
|
- TEST_NAME='documentation'
|
||||||
- TEST_NAME='compile-tools'
|
- TEST_NAME='compile-tools'
|
||||||
- TEST_NAME='native-runs'
|
- TEST_NAME='native-runs'
|
||||||
- TEST_NAME='ipv6'
|
- TEST_NAME='ipv6'
|
||||||
|
67
LICENSE.md
67
LICENSE.md
@ -1,41 +1,30 @@
|
|||||||
Contiki-NG is licensed under the 3-clause BSD license. This license gives
|
Copyright (c) (Year), (Name of copyright holder)
|
||||||
everyone the right to use and distribute the code, either in binary or
|
All rights reserved.
|
||||||
source code format, as long as the copyright license is retained in
|
|
||||||
the source code.
|
|
||||||
|
|
||||||
The copyright for different parts of the code is held by different
|
Redistribution and use in source and binary forms, with or without
|
||||||
people and organizations, but the code is licensed under the same type
|
modification, are permitted provided that the following conditions
|
||||||
of license. The license text is:
|
are met:
|
||||||
|
|
||||||
```
|
1. Redistributions of source code must retain the above copyright
|
||||||
/*
|
notice, this list of conditions and the following disclaimer.
|
||||||
* Copyright (c) (Year), (Name of copyright holder)
|
|
||||||
* All rights reserved.
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
*
|
notice, this list of conditions and the following disclaimer in the
|
||||||
* Redistribution and use in source and binary forms, with or without
|
documentation and/or other materials provided with the distribution.
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
3. Neither the name of the copyright holder nor the names of its
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
contributors may be used to endorse or promote products derived
|
||||||
* notice, this list of conditions and the following disclaimer.
|
from this software without specific prior written permission.
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
* documentation and/or other materials provided with the distribution.
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
*
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
* 3. Neither the name of the copyright holder nor the names of its
|
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
* contributors may be used to endorse or promote products derived
|
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
* from this software without specific prior written permission.
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
*
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
||||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
```
|
|
||||||
|
@ -9,7 +9,10 @@
|
|||||||
Contiki-NG is an open-source, cross-platform operating system for Next-Generation IoT devices. It focuses on dependable (secure and reliable) low-power communication and standard protocols, such as IPv6/6LoWPAN, 6TiSCH, RPL, and CoAP. Contiki-NG comes with extensive documentation, tutorials, a roadmap, release cycle, and well-defined development flow for smooth integration of community contributions.
|
Contiki-NG is an open-source, cross-platform operating system for Next-Generation IoT devices. It focuses on dependable (secure and reliable) low-power communication and standard protocols, such as IPv6/6LoWPAN, 6TiSCH, RPL, and CoAP. Contiki-NG comes with extensive documentation, tutorials, a roadmap, release cycle, and well-defined development flow for smooth integration of community contributions.
|
||||||
|
|
||||||
Unless excplicitly stated otherwise, Contiki-NG sources are distributed under
|
Unless excplicitly stated otherwise, Contiki-NG sources are distributed under
|
||||||
the terms of the [3-clause BSD license](LICENSE.md).
|
the terms of the [3-clause BSD license](LICENSE.md). This license gives
|
||||||
|
everyone the right to use and distribute the code, either in binary or
|
||||||
|
source code format, as long as the copyright license is retained in
|
||||||
|
the source code.
|
||||||
|
|
||||||
Contiki-NG started as a fork of the Contiki OS and retains some of its original features.
|
Contiki-NG started as a fork of the Contiki OS and retains some of its original features.
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
#include "net/netstack.h"
|
#include "net/netstack.h"
|
||||||
#include "sys/energest.h"
|
#include "sys/energest.h"
|
||||||
#include "sys/clock.h"
|
#include "sys/clock.h"
|
||||||
|
#include "sys/critical.h"
|
||||||
#include "sys/rtimer.h"
|
#include "sys/rtimer.h"
|
||||||
#include "sys/cc.h"
|
#include "sys/cc.h"
|
||||||
#include "lpm.h"
|
#include "lpm.h"
|
||||||
@ -766,6 +767,7 @@ send(const void *payload, unsigned short payload_len)
|
|||||||
static int
|
static int
|
||||||
read_frame(void *buf, unsigned short buf_len)
|
read_frame(void *buf, unsigned short buf_len)
|
||||||
{
|
{
|
||||||
|
int_master_status_t status;
|
||||||
rfc_dataEntryGeneral_t *entry = (rfc_dataEntryGeneral_t *)rx_read_entry;
|
rfc_dataEntryGeneral_t *entry = (rfc_dataEntryGeneral_t *)rx_read_entry;
|
||||||
uint8_t *data_ptr = &entry->data;
|
uint8_t *data_ptr = &entry->data;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
@ -795,6 +797,14 @@ read_frame(void *buf, unsigned short buf_len)
|
|||||||
entry->status = DATA_ENTRY_STATUS_PENDING;
|
entry->status = DATA_ENTRY_STATUS_PENDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status = critical_enter();
|
||||||
|
if(rx_is_full) {
|
||||||
|
rx_is_full = false;
|
||||||
|
PRINTF("RXQ was full, re-enabling radio!\n");
|
||||||
|
rx_on_prop();
|
||||||
|
}
|
||||||
|
critical_exit(status);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -76,7 +76,7 @@
|
|||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* RF interrupts */
|
/* RF interrupts */
|
||||||
#define RX_FRAME_IRQ IRQ_RX_ENTRY_DONE
|
#define RX_FRAME_IRQ IRQ_RX_ENTRY_DONE
|
||||||
#define ERROR_IRQ IRQ_INTERNAL_ERROR
|
#define ERROR_IRQ (IRQ_INTERNAL_ERROR | IRQ_RX_BUF_FULL)
|
||||||
#define RX_NOK_IRQ IRQ_RX_NOK
|
#define RX_NOK_IRQ IRQ_RX_NOK
|
||||||
|
|
||||||
/* Those IRQs are enabled all the time */
|
/* Those IRQs are enabled all the time */
|
||||||
@ -103,6 +103,9 @@ static const rf_core_primary_mode_t *primary_mode = NULL;
|
|||||||
int32_t rat_offset = 0;
|
int32_t rat_offset = 0;
|
||||||
static bool rat_offset_known = false;
|
static bool rat_offset_known = false;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
/* Buffer full flag */
|
||||||
|
volatile bool rx_is_full = false;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
PROCESS(rf_core_process, "CC13xx / CC26xx RF driver");
|
PROCESS(rf_core_process, "CC13xx / CC26xx RF driver");
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#define RF_CORE_CLOCKS_MASK (RFC_PWR_PWMCLKEN_RFC_M | RFC_PWR_PWMCLKEN_CPE_M \
|
#define RF_CORE_CLOCKS_MASK (RFC_PWR_PWMCLKEN_RFC_M | RFC_PWR_PWMCLKEN_CPE_M \
|
||||||
@ -574,6 +577,16 @@ cc26xx_rf_cpe1_isr(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) & IRQ_RX_BUF_FULL) {
|
||||||
|
PRINTF("\nRF: BUF_FULL\n\n");
|
||||||
|
/* set a flag that the buffer is full*/
|
||||||
|
rx_is_full = true;
|
||||||
|
/* make sure read_frame() will be called to make space in RX buffer */
|
||||||
|
process_poll(&rf_core_process);
|
||||||
|
/* Clear the IRQ_RX_BUF_FULL interrupt flag by writing zero to bit */
|
||||||
|
HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = ~(IRQ_RX_BUF_FULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* Clear INTERNAL_ERROR interrupt flag */
|
/* Clear INTERNAL_ERROR interrupt flag */
|
||||||
HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x7FFFFFFF;
|
HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x7FFFFFFF;
|
||||||
|
@ -263,6 +263,9 @@ typedef struct rf_core_primary_mode_s {
|
|||||||
/* Radio timer register */
|
/* Radio timer register */
|
||||||
#define RATCNT 0x00000004
|
#define RATCNT 0x00000004
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
/* Buffer full flag */
|
||||||
|
extern volatile bool rx_is_full;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Make the main driver process visible to mode drivers */
|
/* Make the main driver process visible to mode drivers */
|
||||||
PROCESS_NAME(rf_core_process);
|
PROCESS_NAME(rf_core_process);
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -108,7 +108,7 @@ print_cell_list(const uint8_t *cell_list, uint16_t cell_list_len)
|
|||||||
uint16_t i;
|
uint16_t i;
|
||||||
sf_simple_cell_t cell;
|
sf_simple_cell_t cell;
|
||||||
|
|
||||||
for(i = 0; i < (cell_list_len / sizeof(cell)); i++) {
|
for(i = 0; i < cell_list_len; i += sizeof(cell)) {
|
||||||
read_cell(&cell_list[i], &cell);
|
read_cell(&cell_list[i], &cell);
|
||||||
PRINTF("%u ", cell.timeslot_offset);
|
PRINTF("%u ", cell.timeslot_offset);
|
||||||
}
|
}
|
||||||
@ -132,7 +132,7 @@ add_links_to_schedule(const linkaddr_t *peer_addr, uint8_t link_option,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < (cell_list_len / sizeof(cell)); i++) {
|
for(i = 0; i < cell_list_len; i += sizeof(cell)) {
|
||||||
read_cell(&cell_list[i], &cell);
|
read_cell(&cell_list[i], &cell);
|
||||||
if(cell.timeslot_offset == 0xffff) {
|
if(cell.timeslot_offset == 0xffff) {
|
||||||
continue;
|
continue;
|
||||||
@ -166,7 +166,7 @@ remove_links_to_schedule(const uint8_t *cell_list, uint16_t cell_list_len)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < (cell_list_len / sizeof(cell)); i++) {
|
for(i = 0; i < cell_list_len; i += sizeof(cell)) {
|
||||||
read_cell(&cell_list[i], &cell);
|
read_cell(&cell_list[i], &cell);
|
||||||
if(cell.timeslot_offset == 0xffff) {
|
if(cell.timeslot_offset == 0xffff) {
|
||||||
continue;
|
continue;
|
||||||
@ -335,7 +335,7 @@ delete_req_input(const uint8_t *body, uint16_t body_len,
|
|||||||
|
|
||||||
if(num_cells > 0 && cell_list_len > 0) {
|
if(num_cells > 0 && cell_list_len > 0) {
|
||||||
/* ensure before delete */
|
/* ensure before delete */
|
||||||
for(i = 0, removed_link = 0; i < (cell_list_len / sizeof(cell)); i++) {
|
for(i = 0, removed_link = 0; i < cell_list_len; i += sizeof(cell)) {
|
||||||
read_cell(&cell_list[i], &cell);
|
read_cell(&cell_list[i], &cell);
|
||||||
if(tsch_schedule_get_link_by_timeslot(slotframe,
|
if(tsch_schedule_get_link_by_timeslot(slotframe,
|
||||||
cell.timeslot_offset) != NULL) {
|
cell.timeslot_offset) != NULL) {
|
||||||
|
7
examples/libs/deployment/Makefile
Normal file
7
examples/libs/deployment/Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
CONTIKI_PROJECT = node
|
||||||
|
all: $(CONTIKI_PROJECT)
|
||||||
|
|
||||||
|
MODULES += os/services/deployment
|
||||||
|
|
||||||
|
CONTIKI = ../../..
|
||||||
|
include $(CONTIKI)/Makefile.include
|
3
examples/libs/deployment/README.md
Normal file
3
examples/libs/deployment/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
A simple example of how to use the deployment module. Intended for Cooja,
|
||||||
|
with a Cooja motes, as in the provided simulation file `sim.csc`. For use
|
||||||
|
in a real deployment, set DEPLOYMENT_MAPPING to your own ID-MAC mapping table.
|
126
examples/libs/deployment/node.c
Normal file
126
examples/libs/deployment/node.c
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, RISE SICS.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Benchmark: the root sends requests to all nodes in a randomized
|
||||||
|
* order, and receives resopnses back.
|
||||||
|
* \author
|
||||||
|
* Simon Duquennoy <simon.duquennoy@ri.se>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
#include "services/deployment/deployment.h"
|
||||||
|
|
||||||
|
/* Log configuration */
|
||||||
|
#include "sys/log.h"
|
||||||
|
#define LOG_MODULE "App"
|
||||||
|
#define LOG_LEVEL LOG_LEVEL_INFO
|
||||||
|
|
||||||
|
#include "services/deployment/deployment.h"
|
||||||
|
|
||||||
|
/** \brief A mapping table for a 8-node Cooja mote simulation.
|
||||||
|
* Define your own for any given deployment environment */
|
||||||
|
const struct id_mac deployment_cooja8[] = {
|
||||||
|
{ 1, {{0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01}}},
|
||||||
|
{ 2, {{0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02}}},
|
||||||
|
{ 3, {{0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03}}},
|
||||||
|
{ 4, {{0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04}}},
|
||||||
|
{ 5, {{0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05}}},
|
||||||
|
{ 6, {{0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06}}},
|
||||||
|
{ 7, {{0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07}}},
|
||||||
|
{ 8, {{0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08}}},
|
||||||
|
{ 0, {{0}}}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** \brief An example mapping for Openmotes in Flocklab.
|
||||||
|
* To use, set DEPLOYMENT_MAPPING to deployment_flocklab_openmotes */
|
||||||
|
const struct id_mac deployment_flocklab_openmotes[] = {
|
||||||
|
{ 3, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0x9b,0x29}}},
|
||||||
|
{ 6, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0x9b,0x34}}},
|
||||||
|
{ 8, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0x9b,0x1f}}},
|
||||||
|
{ 15, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0x9b,0x85}}},
|
||||||
|
{ 16, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0x9b,0x00}}},
|
||||||
|
{ 18, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0x9b,0x37}}},
|
||||||
|
{ 22, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0x9b,0x08}}},
|
||||||
|
{ 23, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0x9b,0x5f}}},
|
||||||
|
{ 31, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0x9b,0xb1}}},
|
||||||
|
{ 0, {{0}}}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
PROCESS(app_process, "App process");
|
||||||
|
AUTOSTART_PROCESSES(&app_process);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
PROCESS_THREAD(app_process, ev, data)
|
||||||
|
{
|
||||||
|
static struct etimer timer;
|
||||||
|
static uip_ipaddr_t ipaddr;
|
||||||
|
static linkaddr_t lladdr;
|
||||||
|
static int i;
|
||||||
|
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
if(node_id == ROOT_ID) {
|
||||||
|
/* We are the root, start a DAG */
|
||||||
|
NETSTACK_ROUTING.root_start();
|
||||||
|
/* Setup a periodic timer that expires after 10 seconds. */
|
||||||
|
etimer_set(&timer, CLOCK_SECOND * 10);
|
||||||
|
/* Wait until all nodes have joined */
|
||||||
|
while(1) {
|
||||||
|
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));
|
||||||
|
etimer_reset(&timer);
|
||||||
|
/* Log expected IPv6 addresses of all nodes */
|
||||||
|
LOG_INFO("Node list:\n");
|
||||||
|
for(i = 0; i<deployment_node_count(); i++) {
|
||||||
|
int id;
|
||||||
|
id = deployment_id_from_index(i);
|
||||||
|
/* Set ipaddr with DODAG ID, so we get the prefix */
|
||||||
|
NETSTACK_ROUTING.get_root_ipaddr(&ipaddr);
|
||||||
|
/* Set IID */
|
||||||
|
deployment_iid_from_id(&ipaddr, id);
|
||||||
|
/* Get lladdr */
|
||||||
|
deployment_lladdr_from_id(&lladdr, id);
|
||||||
|
LOG_INFO("-- ID: %02u, Link-layer address: ", id);
|
||||||
|
LOG_INFO_LLADDR(&lladdr);
|
||||||
|
LOG_INFO_(", IPv6 address: ");
|
||||||
|
LOG_INFO_6ADDR(&ipaddr);
|
||||||
|
LOG_INFO_("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
12
examples/libs/deployment/project-conf.h
Normal file
12
examples/libs/deployment/project-conf.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef PROJECT_CONF_H_
|
||||||
|
#define PROJECT_CONF_H_
|
||||||
|
|
||||||
|
/* The node-id of the root */
|
||||||
|
#define ROOT_ID 1
|
||||||
|
/* The deployment map (ID<->MAC) */
|
||||||
|
#define DEPLOYMENT_MAPPING deployment_cooja8
|
||||||
|
/* Compact address logging (both link-layer and IPv6).
|
||||||
|
* Shows an abbreviated form that contains the node-id */
|
||||||
|
#define LOG_CONF_WITH_COMPACT_ADDR 1
|
||||||
|
|
||||||
|
#endif /* PROJECT_CONF_H_ */
|
275
examples/libs/deployment/sim.csc
Normal file
275
examples/libs/deployment/sim.csc
Normal file
@ -0,0 +1,275 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mrm</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/mspsim</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/avrora</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[APPS_DIR]/powertracker</project>
|
||||||
|
<simulation>
|
||||||
|
<title>My simulation</title>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
org.contikios.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>100.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
|
<identifier>mtype90</identifier>
|
||||||
|
<description>Cooja Mote Type #1</description>
|
||||||
|
<source>[CONTIKI_DIR]/examples/libs/deployment/node.c</source>
|
||||||
|
<commands>make node.cooja TARGET=cooja</commands>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Battery</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiVib</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiMoteID</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRS232</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiBeeper</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiIPAddress</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiRadio</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiButton</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiPIR</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiClock</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiLED</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiCFS</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.contikimote.interfaces.ContikiEEPROM</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>org.contikios.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<symbols>false</symbols>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>12.478629242391953</x>
|
||||||
|
<y>42.201041276604826</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiEEPROM
|
||||||
|
<eeprom>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</eeprom>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype90</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>25.625935608473608</x>
|
||||||
|
<y>82.53975431376661</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiEEPROM
|
||||||
|
<eeprom>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</eeprom>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype90</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>51.615094138350024</x>
|
||||||
|
<y>59.70602651475372</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiEEPROM
|
||||||
|
<eeprom>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</eeprom>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype90</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>41.04314122620578</x>
|
||||||
|
<y>121.24693889311891</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>4</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiEEPROM
|
||||||
|
<eeprom>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</eeprom>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype90</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>64.9463558635099</x>
|
||||||
|
<y>104.25039302469283</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>5</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiEEPROM
|
||||||
|
<eeprom>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</eeprom>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype90</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>93.59263858654369</x>
|
||||||
|
<y>75.40399148300003</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>6</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiEEPROM
|
||||||
|
<eeprom>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</eeprom>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype90</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>75.6297158696234</x>
|
||||||
|
<y>139.97002035548905</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>7</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiEEPROM
|
||||||
|
<eeprom>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</eeprom>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype90</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.interfaces.Position
|
||||||
|
<x>104.34293924684245</x>
|
||||||
|
<y>116.07658566915099</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiMoteID
|
||||||
|
<id>8</id>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio
|
||||||
|
<bitrate>250.0</bitrate>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
org.contikios.cooja.contikimote.interfaces.ContikiEEPROM
|
||||||
|
<eeprom>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</eeprom>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>mtype90</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.SimControl
|
||||||
|
<width>280</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>160</height>
|
||||||
|
<location_x>400</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<moterelations>true</moterelations>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.GridVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.TrafficVisualizerSkin</skin>
|
||||||
|
<skin>org.contikios.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<viewport>2.4250860844175466 0.0 0.0 2.4250860844175466 35.26895372864869 -46.9106236441515</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>400</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>400</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter>App</filter>
|
||||||
|
<formatted_time />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>827</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>665</height>
|
||||||
|
<location_x>681</location_x>
|
||||||
|
<location_y>-1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
org.contikios.cooja.plugins.TimeLine
|
||||||
|
<plugin_config>
|
||||||
|
<mote>0</mote>
|
||||||
|
<mote>1</mote>
|
||||||
|
<mote>2</mote>
|
||||||
|
<mote>3</mote>
|
||||||
|
<mote>4</mote>
|
||||||
|
<mote>5</mote>
|
||||||
|
<mote>6</mote>
|
||||||
|
<mote>7</mote>
|
||||||
|
<showRadioRXTX />
|
||||||
|
<showRadioHW />
|
||||||
|
<showLEDs />
|
||||||
|
<zoomfactor>500.0</zoomfactor>
|
||||||
|
</plugin_config>
|
||||||
|
<width>1539</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>263</height>
|
||||||
|
<location_x>0</location_x>
|
||||||
|
<location_y>709</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018, Swedish Institute of Computer Science.
|
* Copyright (c) 2018, RISE SICS.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018, Swedish Institute of Computer Science.
|
* Copyright (c) 2018, RISE SICS.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -64,7 +64,7 @@
|
|||||||
#define LWM2M_QUEUE_MODE_CONF_INCLUDE_DYNAMIC_ADAPTATION 1
|
#define LWM2M_QUEUE_MODE_CONF_INCLUDE_DYNAMIC_ADAPTATION 1
|
||||||
#define LWM2M_QUEUE_MODE_CONF_DEFAULT_CLIENT_AWAKE_TIME 2000
|
#define LWM2M_QUEUE_MODE_CONF_DEFAULT_CLIENT_AWAKE_TIME 2000
|
||||||
#define LWM2M_QUEUE_MODE_CONF_DEFAULT_CLIENT_SLEEP_TIME 10000
|
#define LWM2M_QUEUE_MODE_CONF_DEFAULT_CLIENT_SLEEP_TIME 10000
|
||||||
#define LWM2M_QUEUE_MODE_CONF_DEFAULT_DYNAMIC_ADAPTATION_FLAG 1
|
#define LWM2M_QUEUE_MODE_CONF_DEFAULT_DYNAMIC_ADAPTATION_FLAG 0
|
||||||
#define LWM2M_QUEUE_MODE_OBJECT_CONF_ENABLED 0 */
|
#define LWM2M_QUEUE_MODE_OBJECT_CONF_ENABLED 1 */
|
||||||
|
|
||||||
#endif /* PROJECT_CONF_H_ */
|
#endif /* PROJECT_CONF_H_ */
|
||||||
|
@ -493,6 +493,7 @@ publish(void)
|
|||||||
int len;
|
int len;
|
||||||
int remaining = APP_BUFFER_SIZE;
|
int remaining = APP_BUFFER_SIZE;
|
||||||
int i;
|
int i;
|
||||||
|
char def_rt_str[64];
|
||||||
|
|
||||||
seq_nr_value++;
|
seq_nr_value++;
|
||||||
|
|
||||||
@ -519,7 +520,6 @@ publish(void)
|
|||||||
buf_ptr += len;
|
buf_ptr += len;
|
||||||
|
|
||||||
/* Put our Default route's string representation in a buffer */
|
/* Put our Default route's string representation in a buffer */
|
||||||
char def_rt_str[64];
|
|
||||||
memset(def_rt_str, 0, sizeof(def_rt_str));
|
memset(def_rt_str, 0, sizeof(def_rt_str));
|
||||||
ipaddr_sprintf(def_rt_str, sizeof(def_rt_str), uip_ds6_defrt_choose());
|
ipaddr_sprintf(def_rt_str, sizeof(def_rt_str), uip_ds6_defrt_choose());
|
||||||
|
|
||||||
|
@ -60,37 +60,36 @@
|
|||||||
void
|
void
|
||||||
coap_blocking_request_callback(void *callback_data, coap_message_t *response)
|
coap_blocking_request_callback(void *callback_data, coap_message_t *response)
|
||||||
{
|
{
|
||||||
coap_request_state_t *state = (coap_request_state_t *)callback_data;
|
coap_blocking_request_state_t *blocking_state = (coap_blocking_request_state_t *)callback_data;
|
||||||
|
|
||||||
state->response = response;
|
blocking_state->state.response = response;
|
||||||
process_poll(state->process);
|
process_poll(blocking_state->process);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
PT_THREAD(coap_blocking_request
|
PT_THREAD(coap_blocking_request
|
||||||
(coap_request_state_t *state, process_event_t ev,
|
(coap_blocking_request_state_t *blocking_state, process_event_t ev,
|
||||||
coap_endpoint_t *remote_ep,
|
coap_endpoint_t *remote_ep,
|
||||||
coap_message_t *request,
|
coap_message_t *request,
|
||||||
coap_blocking_response_handler_t request_callback))
|
coap_blocking_response_handler_t request_callback))
|
||||||
{
|
{
|
||||||
PT_BEGIN(&state->pt);
|
/* Before PT_BEGIN in order to not be a local variable in the PT_Thread and maintain it */
|
||||||
|
coap_request_state_t *state = &blocking_state->state;
|
||||||
|
|
||||||
static uint32_t res_block;
|
PT_BEGIN(&blocking_state->pt);
|
||||||
static uint8_t more;
|
|
||||||
static uint8_t block_error;
|
|
||||||
|
|
||||||
state->block_num = 0;
|
state->block_num = 0;
|
||||||
state->response = NULL;
|
state->response = NULL;
|
||||||
state->process = PROCESS_CURRENT();
|
blocking_state->process = PROCESS_CURRENT();
|
||||||
|
|
||||||
more = 0;
|
state->more = 0;
|
||||||
res_block = 0;
|
state->res_block = 0;
|
||||||
block_error = 0;
|
state->block_error = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
request->mid = coap_get_mid();
|
request->mid = coap_get_mid();
|
||||||
if((state->transaction = coap_new_transaction(request->mid, remote_ep))) {
|
if((state->transaction = coap_new_transaction(request->mid, remote_ep))) {
|
||||||
state->transaction->callback = coap_blocking_request_callback;
|
state->transaction->callback = coap_blocking_request_callback;
|
||||||
state->transaction->callback_data = state;
|
state->transaction->callback_data = blocking_state;
|
||||||
|
|
||||||
if(state->block_num > 0) {
|
if(state->block_num > 0) {
|
||||||
coap_set_header_block2(request, state->block_num, 0,
|
coap_set_header_block2(request, state->block_num, 0,
|
||||||
@ -104,33 +103,46 @@ PT_THREAD(coap_blocking_request
|
|||||||
coap_send_transaction(state->transaction);
|
coap_send_transaction(state->transaction);
|
||||||
LOG_DBG("Requested #%"PRIu32" (MID %u)\n", state->block_num, request->mid);
|
LOG_DBG("Requested #%"PRIu32" (MID %u)\n", state->block_num, request->mid);
|
||||||
|
|
||||||
PT_YIELD_UNTIL(&state->pt, ev == PROCESS_EVENT_POLL);
|
PT_YIELD_UNTIL(&blocking_state->pt, ev == PROCESS_EVENT_POLL);
|
||||||
|
|
||||||
if(!state->response) {
|
if(!state->response) {
|
||||||
LOG_WARN("Server not responding\n");
|
LOG_WARN("Server not responding\n");
|
||||||
PT_EXIT(&state->pt);
|
state->status = COAP_REQUEST_STATUS_TIMEOUT;
|
||||||
|
PT_EXIT(&blocking_state->pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
coap_get_header_block2(state->response, &res_block, &more, NULL, NULL);
|
coap_get_header_block2(state->response, &state->res_block, &state->more, NULL, NULL);
|
||||||
|
|
||||||
LOG_DBG("Received #%"PRIu32"%s (%u bytes)\n", res_block, more ? "+" : "",
|
LOG_DBG("Received #%"PRIu32"%s (%u bytes)\n", state->res_block, state->more ? "+" : "",
|
||||||
state->response->payload_len);
|
state->response->payload_len);
|
||||||
|
if(state->more) {
|
||||||
|
state->status = COAP_REQUEST_STATUS_MORE;
|
||||||
|
} else {
|
||||||
|
state->status = COAP_REQUEST_STATUS_RESPONSE;
|
||||||
|
}
|
||||||
|
|
||||||
if(res_block == state->block_num) {
|
if(state->res_block == state->block_num) {
|
||||||
request_callback(state->response);
|
request_callback(state->response);
|
||||||
++(state->block_num);
|
++(state->block_num);
|
||||||
} else {
|
} else {
|
||||||
LOG_WARN("WRONG BLOCK %"PRIu32"/%"PRIu32"\n",
|
LOG_WARN("WRONG BLOCK %"PRIu32"/%"PRIu32"\n",
|
||||||
res_block, state->block_num);
|
state->res_block, state->block_num);
|
||||||
++block_error;
|
++(state->block_error);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_WARN("Could not allocate transaction buffer");
|
LOG_WARN("Could not allocate transaction buffer");
|
||||||
PT_EXIT(&state->pt);
|
PT_EXIT(&blocking_state->pt);
|
||||||
}
|
}
|
||||||
} while(more && block_error < COAP_MAX_ATTEMPTS);
|
} while(state->more && (state->block_error) < COAP_MAX_ATTEMPTS);
|
||||||
|
|
||||||
PT_END(&state->pt);
|
if((state->block_error) >= COAP_MAX_ATTEMPTS) {
|
||||||
|
/* failure - now we give up */
|
||||||
|
state->status = COAP_REQUEST_STATUS_BLOCK_ERROR;
|
||||||
|
} else {
|
||||||
|
/* No more blocks, request finished */
|
||||||
|
state->status = COAP_REQUEST_STATUS_FINISHED;
|
||||||
|
}
|
||||||
|
PT_END(&blocking_state->pt);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -39,31 +39,30 @@
|
|||||||
|
|
||||||
#include "sys/pt.h"
|
#include "sys/pt.h"
|
||||||
#include "coap-transactions.h"
|
#include "coap-transactions.h"
|
||||||
|
#include "coap-request-state.h"
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/*- Client Part -------------------------------------------------------------*/
|
/*- Client Part -------------------------------------------------------------*/
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
typedef struct coap_request_state {
|
typedef struct coap_blocking_request_state {
|
||||||
|
coap_request_state_t state;
|
||||||
struct pt pt;
|
struct pt pt;
|
||||||
struct process *process;
|
struct process *process;
|
||||||
coap_transaction_t *transaction;
|
} coap_blocking_request_state_t;
|
||||||
coap_message_t *response;
|
|
||||||
uint32_t block_num;
|
|
||||||
} coap_request_state_t;
|
|
||||||
|
|
||||||
typedef void (* coap_blocking_response_handler_t)(coap_message_t *response);
|
typedef void (* coap_blocking_response_handler_t)(coap_message_t *response);
|
||||||
|
|
||||||
PT_THREAD(coap_blocking_request
|
PT_THREAD(coap_blocking_request
|
||||||
(coap_request_state_t *state, process_event_t ev,
|
(coap_blocking_request_state_t *blocking_state, process_event_t ev,
|
||||||
coap_endpoint_t *remote,
|
coap_endpoint_t *remote,
|
||||||
coap_message_t *request,
|
coap_message_t *request,
|
||||||
coap_blocking_response_handler_t request_callback));
|
coap_blocking_response_handler_t request_callback));
|
||||||
|
|
||||||
#define COAP_BLOCKING_REQUEST(server_endpoint, request, chunk_handler) \
|
#define COAP_BLOCKING_REQUEST(server_endpoint, request, chunk_handler) \
|
||||||
{ \
|
{ \
|
||||||
static coap_request_state_t request_state; \
|
static coap_blocking_request_state_t blocking_state; \
|
||||||
PT_SPAWN(process_pt, &request_state.pt, \
|
PT_SPAWN(process_pt, &blocking_state.pt, \
|
||||||
coap_blocking_request(&request_state, ev, \
|
coap_blocking_request(&blocking_state, ev, \
|
||||||
server_endpoint, \
|
server_endpoint, \
|
||||||
request, chunk_handler) \
|
request, chunk_handler) \
|
||||||
); \
|
); \
|
||||||
|
@ -54,19 +54,13 @@
|
|||||||
#define LOG_MODULE "coap"
|
#define LOG_MODULE "coap"
|
||||||
#define LOG_LEVEL LOG_LEVEL_COAP
|
#define LOG_LEVEL LOG_LEVEL_COAP
|
||||||
|
|
||||||
/* These should go into the state struct so that we can have multiple
|
|
||||||
requests */
|
|
||||||
|
|
||||||
static uint32_t res_block;
|
|
||||||
static uint8_t more;
|
|
||||||
static uint8_t block_error;
|
|
||||||
|
|
||||||
static void coap_request_callback(void *callback_data, coap_message_t *response);
|
static void coap_request_callback(void *callback_data, coap_message_t *response);
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
progress_request(coap_request_state_t *state) {
|
progress_request(coap_callback_request_state_t *callback_state) {
|
||||||
|
coap_request_state_t *state = &callback_state->state;
|
||||||
coap_message_t *request = state->request;
|
coap_message_t *request = state->request;
|
||||||
request->mid = coap_get_mid();
|
request->mid = coap_get_mid();
|
||||||
if((state->transaction =
|
if((state->transaction =
|
||||||
@ -93,7 +87,9 @@ progress_request(coap_request_state_t *state) {
|
|||||||
static void
|
static void
|
||||||
coap_request_callback(void *callback_data, coap_message_t *response)
|
coap_request_callback(void *callback_data, coap_message_t *response)
|
||||||
{
|
{
|
||||||
coap_request_state_t *state = (coap_request_state_t *)callback_data;
|
coap_callback_request_state_t *callback_state = (coap_callback_request_state_t*)callback_data;
|
||||||
|
coap_request_state_t *state = &callback_state->state;
|
||||||
|
|
||||||
uint32_t res_block1;
|
uint32_t res_block1;
|
||||||
|
|
||||||
state->response = response;
|
state->response = response;
|
||||||
@ -102,58 +98,70 @@ coap_request_callback(void *callback_data, coap_message_t *response)
|
|||||||
|
|
||||||
if(!state->response) {
|
if(!state->response) {
|
||||||
LOG_WARN("Server not responding giving up...\n");
|
LOG_WARN("Server not responding giving up...\n");
|
||||||
state->callback(state);
|
state->status = COAP_REQUEST_STATUS_TIMEOUT;
|
||||||
|
callback_state->callback(callback_state);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Got a response */
|
/* Got a response */
|
||||||
coap_get_header_block2(state->response, &res_block, &more, NULL, NULL);
|
coap_get_header_block2(state->response, &state->res_block, &state->more, NULL, NULL);
|
||||||
coap_get_header_block1(state->response, &res_block1, NULL, NULL, NULL);
|
coap_get_header_block1(state->response, &res_block1, NULL, NULL, NULL);
|
||||||
|
|
||||||
LOG_DBG("Received #%lu%s B1:%lu (%u bytes)\n",
|
LOG_DBG("Received #%lu%s B1:%lu (%u bytes)\n",
|
||||||
(unsigned long)res_block, (unsigned)more ? "+" : "",
|
(unsigned long)state->res_block, (unsigned)state->more ? "+" : "",
|
||||||
(unsigned long)res_block1,
|
(unsigned long)res_block1,
|
||||||
state->response->payload_len);
|
state->response->payload_len);
|
||||||
|
|
||||||
if(res_block == state->block_num) {
|
if(state->res_block == state->block_num) {
|
||||||
/* Call the callback function as we have more data */
|
/* Call the callback function as we have more data */
|
||||||
state->callback(state);
|
if(state->more) {
|
||||||
|
state->status = COAP_REQUEST_STATUS_MORE;
|
||||||
|
} else {
|
||||||
|
state->status = COAP_REQUEST_STATUS_RESPONSE;
|
||||||
|
}
|
||||||
|
callback_state->callback(callback_state);
|
||||||
/* this is only for counting BLOCK2 blocks.*/
|
/* this is only for counting BLOCK2 blocks.*/
|
||||||
++(state->block_num);
|
++(state->block_num);
|
||||||
} else {
|
} else {
|
||||||
LOG_WARN("WRONG BLOCK %"PRIu32"/%"PRIu32"\n", res_block, state->block_num);
|
LOG_WARN("WRONG BLOCK %"PRIu32"/%"PRIu32"\n", state->res_block, state->block_num);
|
||||||
++block_error;
|
++(state->block_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(more && block_error < COAP_MAX_ATTEMPTS) {
|
if(state->more) {
|
||||||
progress_request(state);
|
if((state->block_error) < COAP_MAX_ATTEMPTS) {
|
||||||
|
progress_request(callback_state);
|
||||||
|
} else {
|
||||||
|
/* failure - now we give up and notify the callback */
|
||||||
|
state->status = COAP_REQUEST_STATUS_BLOCK_ERROR;
|
||||||
|
callback_state->callback(callback_state);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* failure - now we give up and notify the callback */
|
/* No more blocks, finish and notify the callback */
|
||||||
|
state->status = COAP_REQUEST_STATUS_FINISHED;
|
||||||
state->response = NULL;
|
state->response = NULL;
|
||||||
state->callback(state);
|
callback_state->callback(callback_state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
int
|
int
|
||||||
coap_send_request(coap_request_state_t *state, coap_endpoint_t *endpoint,
|
coap_send_request(coap_callback_request_state_t *callback_state, coap_endpoint_t *endpoint,
|
||||||
coap_message_t *request,
|
coap_message_t *request,
|
||||||
void (*callback)(coap_request_state_t *state))
|
void (*callback)(coap_callback_request_state_t *callback_state))
|
||||||
{
|
{
|
||||||
/* can we have these variables shared between multiple requests? */
|
coap_request_state_t *state = &callback_state->state;
|
||||||
/* ripped from blocking request */
|
|
||||||
more = 0;
|
|
||||||
res_block = 0;
|
|
||||||
block_error = 0;
|
|
||||||
|
|
||||||
|
state->more = 0;
|
||||||
|
state->res_block = 0;
|
||||||
|
state->block_error = 0;
|
||||||
state->block_num = 0;
|
state->block_num = 0;
|
||||||
state->response = NULL;
|
state->response = NULL;
|
||||||
state->request = request;
|
state->request = request;
|
||||||
state->remote_endpoint = endpoint;
|
state->remote_endpoint = endpoint;
|
||||||
state->callback = callback;
|
callback_state->callback = callback;
|
||||||
|
|
||||||
return progress_request(state);
|
return progress_request(callback_state);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -47,35 +47,30 @@
|
|||||||
|
|
||||||
#include "coap-engine.h"
|
#include "coap-engine.h"
|
||||||
#include "coap-transactions.h"
|
#include "coap-transactions.h"
|
||||||
|
#include "coap-request-state.h"
|
||||||
#include "sys/cc.h"
|
#include "sys/cc.h"
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/*- Client Part -------------------------------------------------------------*/
|
/*- Client Part -------------------------------------------------------------*/
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
typedef struct coap_request_state coap_request_state_t;
|
typedef struct coap_callback_request_state coap_callback_request_state_t;
|
||||||
|
|
||||||
struct coap_request_state {
|
struct coap_callback_request_state {
|
||||||
coap_transaction_t *transaction;
|
coap_request_state_t state;
|
||||||
coap_message_t *response;
|
void (*callback)(coap_callback_request_state_t *state);
|
||||||
coap_message_t *request;
|
|
||||||
coap_endpoint_t *remote_endpoint;
|
|
||||||
uint32_t block_num;
|
|
||||||
void *user_data;
|
|
||||||
coap_timer_t coap_timer;
|
|
||||||
void (*callback)(coap_request_state_t *state);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Send a CoAP request to a remote endpoint
|
* \brief Send a CoAP request to a remote endpoint
|
||||||
* \param state The state to handle the CoAP request
|
* \param callback_state The callback state to handle the CoAP request
|
||||||
* \param endpoint The destination endpoint
|
* \param endpoint The destination endpoint
|
||||||
* \param request The request to be sent
|
* \param request The request to be sent
|
||||||
* \param callback callback to execute when the response arrives or the timeout expires
|
* \param callback callback to execute when the response arrives or the timeout expires
|
||||||
* \return 1 if there is a transaction available to send, 0 otherwise
|
* \return 1 if there is a transaction available to send, 0 otherwise
|
||||||
*/
|
*/
|
||||||
int coap_send_request(coap_request_state_t *state, coap_endpoint_t *endpoint,
|
int coap_send_request(coap_callback_request_state_t *callback_state, coap_endpoint_t *endpoint,
|
||||||
coap_message_t *request,
|
coap_message_t *request,
|
||||||
void (*callback)(coap_request_state_t *state));
|
void (*callback)(coap_callback_request_state_t *callback_state));
|
||||||
|
|
||||||
#endif /* COAP_CALLBACK_API_H_ */
|
#endif /* COAP_CALLBACK_API_H_ */
|
||||||
/** @} */
|
/** @} */
|
||||||
|
69
os/net/app-layer/coap/coap-request-state.h
Normal file
69
os/net/app-layer/coap/coap-request-state.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, RISE SICS AB.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup coap
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Common request state for all the APIs
|
||||||
|
* \author
|
||||||
|
* Carlos Gonzalo Peces <carlosgp143@gmail.com>
|
||||||
|
*/
|
||||||
|
#ifndef COAP_REQUEST_STATE_H_
|
||||||
|
#define COAP_REQUEST_STATE_H_
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
COAP_REQUEST_STATUS_RESPONSE, /* Response received and no more blocks */
|
||||||
|
COAP_REQUEST_STATUS_MORE, /* Response received and there are more blocks */
|
||||||
|
COAP_REQUEST_STATUS_FINISHED, /* Request finished */
|
||||||
|
COAP_REQUEST_STATUS_TIMEOUT, /* Request Timeout after all retransmissions */
|
||||||
|
COAP_REQUEST_STATUS_BLOCK_ERROR /* Blocks in wrong order */
|
||||||
|
} coap_request_status_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct coap_request_state {
|
||||||
|
coap_transaction_t *transaction;
|
||||||
|
coap_message_t *response;
|
||||||
|
coap_message_t *request;
|
||||||
|
coap_endpoint_t *remote_endpoint;
|
||||||
|
uint32_t block_num;
|
||||||
|
uint32_t res_block;
|
||||||
|
uint8_t more;
|
||||||
|
uint8_t block_error;
|
||||||
|
void *user_data;
|
||||||
|
coap_request_status_t status;
|
||||||
|
} coap_request_state_t;
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* COAP_REQUEST_STATE_H_ */
|
||||||
|
/** @} */
|
@ -49,6 +49,7 @@
|
|||||||
#include "contiki.h"
|
#include "contiki.h"
|
||||||
#include "net/ipv6/uip-udp-packet.h"
|
#include "net/ipv6/uip-udp-packet.h"
|
||||||
#include "net/ipv6/uiplib.h"
|
#include "net/ipv6/uiplib.h"
|
||||||
|
#include "net/routing/routing.h"
|
||||||
#include "coap.h"
|
#include "coap.h"
|
||||||
#include "coap-engine.h"
|
#include "coap-engine.h"
|
||||||
#include "coap-endpoint.h"
|
#include "coap-endpoint.h"
|
||||||
@ -58,10 +59,6 @@
|
|||||||
#include "coap-keystore.h"
|
#include "coap-keystore.h"
|
||||||
#include "coap-keystore-simple.h"
|
#include "coap-keystore-simple.h"
|
||||||
|
|
||||||
#if UIP_CONF_IPV6_RPL
|
|
||||||
#include "rpl.h"
|
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
|
||||||
|
|
||||||
/* Log configuration */
|
/* Log configuration */
|
||||||
#include "coap-log.h"
|
#include "coap-log.h"
|
||||||
#define LOG_MODULE "coap-uip"
|
#define LOG_MODULE "coap-uip"
|
||||||
@ -260,13 +257,12 @@ coap_endpoint_is_secure(const coap_endpoint_t *ep)
|
|||||||
int
|
int
|
||||||
coap_endpoint_is_connected(const coap_endpoint_t *ep)
|
coap_endpoint_is_connected(const coap_endpoint_t *ep)
|
||||||
{
|
{
|
||||||
#if UIP_CONF_IPV6_RPL
|
|
||||||
#ifndef CONTIKI_TARGET_NATIVE
|
#ifndef CONTIKI_TARGET_NATIVE
|
||||||
if(rpl_get_any_dag() == NULL) {
|
if(!uip_is_addr_linklocal(&ep->ipaddr)
|
||||||
|
&& NETSTACK_ROUTING.node_is_reachable() == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
|
||||||
|
|
||||||
#ifdef WITH_DTLS
|
#ifdef WITH_DTLS
|
||||||
if(ep != NULL && ep->secure != 0) {
|
if(ep != NULL && ep->secure != 0) {
|
||||||
|
@ -253,10 +253,6 @@ uip_icmp6_error_output(uint8_t type, uint8_t code, uint32_t param) {
|
|||||||
void
|
void
|
||||||
uip_icmp6_send(const uip_ipaddr_t *dest, int type, int code, int payload_len)
|
uip_icmp6_send(const uip_ipaddr_t *dest, int type, int code, int payload_len)
|
||||||
{
|
{
|
||||||
LOG_INFO("Sending ICMPv6 packet to ");
|
|
||||||
LOG_INFO_6ADDR(&UIP_IP_BUF->destipaddr);
|
|
||||||
LOG_INFO_(", type %u, code %u, len %u\n", type, code, payload_len);
|
|
||||||
|
|
||||||
UIP_IP_BUF->vtc = 0x60;
|
UIP_IP_BUF->vtc = 0x60;
|
||||||
UIP_IP_BUF->tcflow = 0;
|
UIP_IP_BUF->tcflow = 0;
|
||||||
UIP_IP_BUF->flow = 0;
|
UIP_IP_BUF->flow = 0;
|
||||||
@ -279,6 +275,10 @@ uip_icmp6_send(const uip_ipaddr_t *dest, int type, int code, int payload_len)
|
|||||||
UIP_STAT(++uip_stat.icmp.sent);
|
UIP_STAT(++uip_stat.icmp.sent);
|
||||||
UIP_STAT(++uip_stat.ip.sent);
|
UIP_STAT(++uip_stat.ip.sent);
|
||||||
|
|
||||||
|
LOG_INFO("Sending ICMPv6 packet to ");
|
||||||
|
LOG_INFO_6ADDR(&UIP_IP_BUF->destipaddr);
|
||||||
|
LOG_INFO_(", type %u, code %u, len %u\n", type, code, payload_len);
|
||||||
|
|
||||||
tcpip_ipv6_output();
|
tcpip_ipv6_output();
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -258,7 +258,11 @@ uip_sr_link_snprint(char *buf, int buflen, uip_sr_node_t *link)
|
|||||||
NETSTACK_ROUTING.get_sr_node_ipaddr(&child_ipaddr, link);
|
NETSTACK_ROUTING.get_sr_node_ipaddr(&child_ipaddr, link);
|
||||||
NETSTACK_ROUTING.get_sr_node_ipaddr(&parent_ipaddr, link->parent);
|
NETSTACK_ROUTING.get_sr_node_ipaddr(&parent_ipaddr, link->parent);
|
||||||
|
|
||||||
index += uiplib_ipaddr_snprint(buf+index, buflen-index, &child_ipaddr);
|
if(LOG_WITH_COMPACT_ADDR) {
|
||||||
|
index += log_6addr_compact_snprint(buf+index, buflen-index, &child_ipaddr);
|
||||||
|
} else {
|
||||||
|
index += uiplib_ipaddr_snprint(buf+index, buflen-index, &child_ipaddr);
|
||||||
|
}
|
||||||
if(index >= buflen) {
|
if(index >= buflen) {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
@ -273,7 +277,11 @@ uip_sr_link_snprint(char *buf, int buflen, uip_sr_node_t *link)
|
|||||||
if(index >= buflen) {
|
if(index >= buflen) {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
index += uiplib_ipaddr_snprint(buf+index, buflen-index, &parent_ipaddr);
|
if(LOG_WITH_COMPACT_ADDR) {
|
||||||
|
index += log_6addr_compact_snprint(buf+index, buflen-index, &parent_ipaddr);
|
||||||
|
} else {
|
||||||
|
index += uiplib_ipaddr_snprint(buf+index, buflen-index, &parent_ipaddr);
|
||||||
|
}
|
||||||
if(index >= buflen) {
|
if(index >= buflen) {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
@ -53,6 +53,10 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#if LLSEC802154_ENABLED && !LLSEC802154_USES_EXPLICIT_KEYS
|
||||||
|
#error LLSEC802154_ENABLED set but LLSEC802154_USES_EXPLICIT_KEYS unset
|
||||||
|
#endif /* LLSEC802154_ENABLED */
|
||||||
|
|
||||||
/* The two keys K1 and K2 from 6TiSCH minimal configuration
|
/* The two keys K1 and K2 from 6TiSCH minimal configuration
|
||||||
* K1: well-known, used for EBs
|
* K1: well-known, used for EBs
|
||||||
* K2: secret, used for data and ACK
|
* K2: secret, used for data and ACK
|
||||||
|
@ -54,10 +54,6 @@
|
|||||||
* - set LLSEC802154_CONF_USES_EXPLICIT_KEYS
|
* - set LLSEC802154_CONF_USES_EXPLICIT_KEYS
|
||||||
* */
|
* */
|
||||||
|
|
||||||
#if LLSEC802154_ENABLED && !LLSEC802154_USES_EXPLICIT_KEYS
|
|
||||||
#error LLSEC802154_ENABLED set but LLSEC802154_USES_EXPLICIT_KEYS unset
|
|
||||||
#endif /* LLSEC802154_ENABLED */
|
|
||||||
|
|
||||||
/* K1, defined in 6TiSCH minimal, is well-known (offers no security) and used for EBs only */
|
/* K1, defined in 6TiSCH minimal, is well-known (offers no security) and used for EBs only */
|
||||||
#ifdef TSCH_SECURITY_CONF_K1
|
#ifdef TSCH_SECURITY_CONF_K1
|
||||||
#define TSCH_SECURITY_K1 TSCH_SECURITY_CONF_K1
|
#define TSCH_SECURITY_K1 TSCH_SECURITY_CONF_K1
|
||||||
|
@ -94,7 +94,11 @@ rpl_neighbor_snprint(char *buf, int buflen, rpl_nbr_t *nbr)
|
|||||||
const struct link_stats *stats = rpl_neighbor_get_link_stats(nbr);
|
const struct link_stats *stats = rpl_neighbor_get_link_stats(nbr);
|
||||||
clock_time_t clock_now = clock_time();
|
clock_time_t clock_now = clock_time();
|
||||||
|
|
||||||
index += uiplib_ipaddr_snprint(buf+index, buflen-index, rpl_neighbor_get_ipaddr(nbr));
|
if(LOG_WITH_COMPACT_ADDR) {
|
||||||
|
index += log_6addr_compact_snprint(buf+index, buflen-index, rpl_neighbor_get_ipaddr(nbr));
|
||||||
|
} else {
|
||||||
|
index += uiplib_ipaddr_snprint(buf+index, buflen-index, rpl_neighbor_get_ipaddr(nbr));
|
||||||
|
}
|
||||||
if(index >= buflen) {
|
if(index >= buflen) {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
141
os/services/deployment/deployment.c
Normal file
141
os/services/deployment/deployment.c
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, RISE SICS.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup deployment
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Code managing id<->mac address<->IPv6 address mapping, and doing this
|
||||||
|
* for different deployment scenarios: Cooja, Nodes, Indriya or Twist testbeds
|
||||||
|
*
|
||||||
|
* \author Simon Duquennoy <simonduq@sics.se>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
#include "deployment.h"
|
||||||
|
#include "sys/node-id.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief List of ID<->MAC mapping used for different deployments
|
||||||
|
*/
|
||||||
|
extern const struct id_mac DEPLOYMENT_MAPPING[];
|
||||||
|
/**
|
||||||
|
* \brief The number of nodes in the deployment
|
||||||
|
*/
|
||||||
|
static int node_count = 0;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
deployment_init(void)
|
||||||
|
{
|
||||||
|
const struct id_mac *curr = DEPLOYMENT_MAPPING;
|
||||||
|
/* Initialize node_id */
|
||||||
|
node_id = deployment_id_from_lladdr((const linkaddr_t *)&linkaddr_node_addr);
|
||||||
|
/* Count nodes */
|
||||||
|
node_count = 0;
|
||||||
|
while(curr->id != 0) {
|
||||||
|
node_count++;
|
||||||
|
curr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
deployment_node_count(void)
|
||||||
|
{
|
||||||
|
return node_count;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
uint16_t
|
||||||
|
deployment_id_from_lladdr(const linkaddr_t *lladdr)
|
||||||
|
{
|
||||||
|
const struct id_mac *curr = DEPLOYMENT_MAPPING;
|
||||||
|
if(lladdr == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
while(curr->id != 0) {
|
||||||
|
/* Assume network-wide unique 16-bit MAC addresses */
|
||||||
|
if(linkaddr_cmp(lladdr, &curr->mac)) {
|
||||||
|
return curr->id;
|
||||||
|
}
|
||||||
|
curr++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
deployment_lladdr_from_id(linkaddr_t *lladdr, uint16_t id)
|
||||||
|
{
|
||||||
|
const struct id_mac *curr = DEPLOYMENT_MAPPING;
|
||||||
|
if(id == 0 || lladdr == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while(curr->id != 0) {
|
||||||
|
if(curr->id == id) {
|
||||||
|
linkaddr_copy(lladdr, &curr->mac);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
curr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
uint16_t
|
||||||
|
deployment_id_from_iid(const uip_ipaddr_t *ipaddr)
|
||||||
|
{
|
||||||
|
const linkaddr_t lladdr;
|
||||||
|
uip_ds6_set_lladdr_from_iid((uip_lladdr_t *)&lladdr, ipaddr);
|
||||||
|
return deployment_id_from_lladdr(&lladdr);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
deployment_iid_from_id(uip_ipaddr_t *ipaddr, uint16_t id)
|
||||||
|
{
|
||||||
|
linkaddr_t lladdr;
|
||||||
|
deployment_lladdr_from_id(&lladdr, id);
|
||||||
|
uip_ds6_set_addr_iid(ipaddr, (uip_lladdr_t *)&lladdr);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
uint16_t
|
||||||
|
deployment_id_from_index(uint16_t index)
|
||||||
|
{
|
||||||
|
if(index < deployment_node_count()) {
|
||||||
|
return DEPLOYMENT_MAPPING[index].id;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/** @} */
|
126
os/services/deployment/deployment.h
Normal file
126
os/services/deployment/deployment.h
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, RISE SICS.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup deployment
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* \file
|
||||||
|
Per-deployment MAC <-> nodeid mapping
|
||||||
|
* \author Simon Duquennoy <simon.duquennoy@ri.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DEPLOYMENT_H_
|
||||||
|
#define DEPLOYMENT_H_
|
||||||
|
|
||||||
|
#include "contiki-conf.h"
|
||||||
|
#include "sys/node-id.h"
|
||||||
|
#include "net/ipv6/uip.h"
|
||||||
|
#include "net/linkaddr.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief ID<->MAC address mapping structure
|
||||||
|
*/
|
||||||
|
struct id_mac {
|
||||||
|
uint16_t id;
|
||||||
|
linkaddr_t mac;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DEPLOYMENT_MAPPING:
|
||||||
|
* A table of struct id_mac that provides ID-MAC mapping for a deployment.
|
||||||
|
* Example with four nodes:
|
||||||
|
* In configuration file:
|
||||||
|
* \#define DEPLOYMENT_MAPPING custom_array
|
||||||
|
* In a .c file:
|
||||||
|
* const struct id_mac custom_array[] = {
|
||||||
|
{ 1, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb6,0x14}}},
|
||||||
|
{ 2, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xe7}}},
|
||||||
|
{ 3, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb4,0x35}}},
|
||||||
|
{ 4, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xcf}}},
|
||||||
|
{ 0, {{0}}}
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the deployment module
|
||||||
|
*/
|
||||||
|
void deployment_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of nodes for the deployment (length of mapping table)
|
||||||
|
*
|
||||||
|
* \return The number of nodes in the deployment
|
||||||
|
*/
|
||||||
|
int deployment_node_count(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get node ID from a link-layer address, from the deployment mapping table
|
||||||
|
*
|
||||||
|
* \param lladdr The link-layer address to look up for
|
||||||
|
* \return Node ID from a corresponding link-layer address
|
||||||
|
*/
|
||||||
|
uint16_t deployment_id_from_lladdr(const linkaddr_t *lladdr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get node link-layer address from a node ID, from the deployment mapping table
|
||||||
|
*
|
||||||
|
* \param lladdr A pointer where to write the link-layer address
|
||||||
|
* \param id The node ID to look up for
|
||||||
|
*/
|
||||||
|
void deployment_lladdr_from_id(linkaddr_t *lladdr, uint16_t id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get node ID from the IID of an IPv6 address
|
||||||
|
*
|
||||||
|
* \param ipaddr The IPv6 (global or link-local) address that contains the IID
|
||||||
|
* \return Node ID from a corresponding IID
|
||||||
|
*/
|
||||||
|
uint16_t deployment_id_from_iid(const uip_ipaddr_t *ipaddr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get IPv6 IID from node IDs
|
||||||
|
*
|
||||||
|
* \param ipaddr The IPv6 where to write the IID
|
||||||
|
* \param id The node ID
|
||||||
|
*/
|
||||||
|
void deployment_iid_from_id(uip_ipaddr_t *ipaddr, uint16_t id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get node ID from index in mapping table
|
||||||
|
*
|
||||||
|
* \param index The index in the deployment mapping table
|
||||||
|
* \return Node ID at the corresponding index
|
||||||
|
*/
|
||||||
|
uint16_t deployment_id_from_index(uint16_t index);
|
||||||
|
|
||||||
|
#endif /* DEPLOYMENT_H_ */
|
||||||
|
/** @} */
|
1
os/services/deployment/module-macros.h
Normal file
1
os/services/deployment/module-macros.h
Normal file
@ -0,0 +1 @@
|
|||||||
|
#define BUILD_WITH_DEPLOYMENT 1
|
@ -84,7 +84,7 @@
|
|||||||
#define STATE_MACHINE_UPDATE_INTERVAL 500
|
#define STATE_MACHINE_UPDATE_INTERVAL 500
|
||||||
|
|
||||||
static struct lwm2m_session_info session_info;
|
static struct lwm2m_session_info session_info;
|
||||||
static coap_request_state_t rd_request_state;
|
static coap_callback_request_state_t rd_request_state;
|
||||||
|
|
||||||
static coap_message_t request[1]; /* This way the message can be treated as pointer as usual. */
|
static coap_message_t request[1]; /* This way the message can be treated as pointer as usual. */
|
||||||
|
|
||||||
@ -118,7 +118,6 @@ static uint8_t rd_state = 0;
|
|||||||
static uint8_t rd_flags = FLAG_RD_DATA_UPDATE_ON_DIRTY;
|
static uint8_t rd_flags = FLAG_RD_DATA_UPDATE_ON_DIRTY;
|
||||||
static uint64_t wait_until_network_check = 0;
|
static uint64_t wait_until_network_check = 0;
|
||||||
static uint64_t last_update;
|
static uint64_t last_update;
|
||||||
static uint64_t last_rd_progress = 0;
|
|
||||||
|
|
||||||
static char query_data[64]; /* allocate some data for queries and updates */
|
static char query_data[64]; /* allocate some data for queries and updates */
|
||||||
static uint8_t rd_data[128]; /* allocate some data for the RD */
|
static uint8_t rd_data[128]; /* allocate some data for the RD */
|
||||||
@ -126,7 +125,7 @@ static uint8_t rd_data[128]; /* allocate some data for the RD */
|
|||||||
static uint32_t rd_block1;
|
static uint32_t rd_block1;
|
||||||
static uint8_t rd_more;
|
static uint8_t rd_more;
|
||||||
static coap_timer_t rd_timer;
|
static coap_timer_t rd_timer;
|
||||||
static void (*rd_callback)(coap_request_state_t *state);
|
static void (*rd_callback)(coap_callback_request_state_t *callback_state);
|
||||||
|
|
||||||
static coap_timer_t block1_timer;
|
static coap_timer_t block1_timer;
|
||||||
|
|
||||||
@ -143,7 +142,7 @@ static void queue_mode_awake_timer_callback(coap_timer_t *timer);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void check_periodic_observations();
|
static void check_periodic_observations();
|
||||||
static void update_callback(coap_request_state_t *state);
|
static void update_callback(coap_callback_request_state_t *callback_state);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
set_rd_data(coap_message_t *request)
|
set_rd_data(coap_message_t *request)
|
||||||
@ -370,10 +369,11 @@ update_bootstrap_server(void)
|
|||||||
* TODO
|
* TODO
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
bootstrap_callback(coap_request_state_t *state)
|
bootstrap_callback(coap_callback_request_state_t *callback_state)
|
||||||
{
|
{
|
||||||
|
coap_request_state_t *state = &callback_state->state;
|
||||||
LOG_DBG("Bootstrap callback Response: %d, ", state->response != NULL);
|
LOG_DBG("Bootstrap callback Response: %d, ", state->response != NULL);
|
||||||
if(state->response) {
|
if(state->status == COAP_REQUEST_STATUS_RESPONSE) {
|
||||||
if(CHANGED_2_04 == state->response->code) {
|
if(CHANGED_2_04 == state->response->code) {
|
||||||
LOG_DBG_("Considered done!\n");
|
LOG_DBG_("Considered done!\n");
|
||||||
rd_state = BOOTSTRAP_DONE;
|
rd_state = BOOTSTRAP_DONE;
|
||||||
@ -383,12 +383,14 @@ bootstrap_callback(coap_request_state_t *state)
|
|||||||
LOG_DBG_("Failed with code %d. Retrying\n", state->response->code);
|
LOG_DBG_("Failed with code %d. Retrying\n", state->response->code);
|
||||||
/* TODO Application callback? */
|
/* TODO Application callback? */
|
||||||
rd_state = INIT;
|
rd_state = INIT;
|
||||||
} else if(BOOTSTRAP_SENT == rd_state) { /* this can handle double invocations */
|
} else if(state->status == COAP_REQUEST_STATUS_TIMEOUT) {
|
||||||
/* Failure! */
|
LOG_DBG_("Server not responding! Retry?");
|
||||||
LOG_DBG("Bootstrap failed! Retry?");
|
|
||||||
rd_state = DO_BOOTSTRAP;
|
rd_state = DO_BOOTSTRAP;
|
||||||
|
} else if(state->status == COAP_REQUEST_STATUS_FINISHED) {
|
||||||
|
LOG_DBG_("Request finished. Ignore\n");
|
||||||
} else {
|
} else {
|
||||||
LOG_DBG("Ignore\n");
|
LOG_DBG_("Unexpected error! Retry?");
|
||||||
|
rd_state = DO_BOOTSTRAP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -427,10 +429,11 @@ block1_rd_callback(coap_timer_t *timer)
|
|||||||
* Page 65-66 in 07 April 2016 spec.
|
* Page 65-66 in 07 April 2016 spec.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
registration_callback(coap_request_state_t *state)
|
registration_callback(coap_callback_request_state_t *callback_state)
|
||||||
{
|
{
|
||||||
LOG_DBG("Registration callback. Response: %d, ", state->response != NULL);
|
coap_request_state_t *state = &callback_state->state;
|
||||||
if(state->response) {
|
LOG_DBG("Registration callback. Status: %d. Response: %d, ", state->status, state->response != NULL);
|
||||||
|
if(state->status == COAP_REQUEST_STATUS_RESPONSE) {
|
||||||
/* check state and possibly set registration to done */
|
/* check state and possibly set registration to done */
|
||||||
/* If we get a continue - we need to call the rd generator one more time */
|
/* If we get a continue - we need to call the rd generator one more time */
|
||||||
if(CONTINUE_2_31 == state->response->code) {
|
if(CONTINUE_2_31 == state->response->code) {
|
||||||
@ -472,10 +475,14 @@ registration_callback(coap_request_state_t *state)
|
|||||||
}
|
}
|
||||||
/* TODO Application callback? */
|
/* TODO Application callback? */
|
||||||
rd_state = INIT;
|
rd_state = INIT;
|
||||||
/* remember last progress time */
|
} else if(state->status == COAP_REQUEST_STATUS_TIMEOUT) {
|
||||||
last_rd_progress = coap_timer_uptime();
|
LOG_DBG_("Server not responding, trying to reconnect\n");
|
||||||
|
rd_state = INIT;
|
||||||
|
} else if(state->status == COAP_REQUEST_STATUS_FINISHED){
|
||||||
|
LOG_DBG_("Request finished. Ignore\n");
|
||||||
} else {
|
} else {
|
||||||
LOG_DBG_("Ignore\n");
|
LOG_DBG_("Unexpected error, trying to reconnect\n");
|
||||||
|
rd_state = INIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -483,11 +490,12 @@ registration_callback(coap_request_state_t *state)
|
|||||||
* Page 65-66 in 07 April 2016 spec.
|
* Page 65-66 in 07 April 2016 spec.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
update_callback(coap_request_state_t *state)
|
update_callback(coap_callback_request_state_t *callback_state)
|
||||||
{
|
{
|
||||||
LOG_DBG("Update callback. Response: %d, ", state->response != NULL);
|
coap_request_state_t *state = &callback_state->state;
|
||||||
|
LOG_DBG("Update callback. Status: %d. Response: %d, ", state->status, state->response != NULL);
|
||||||
|
|
||||||
if(state->response) {
|
if(state->status == COAP_REQUEST_STATUS_RESPONSE) {
|
||||||
/* If we get a continue - we need to call the rd generator one more time */
|
/* If we get a continue - we need to call the rd generator one more time */
|
||||||
if(CONTINUE_2_31 == state->response->code) {
|
if(CONTINUE_2_31 == state->response->code) {
|
||||||
/* We assume that size never change?! */
|
/* We assume that size never change?! */
|
||||||
@ -522,20 +530,26 @@ update_callback(coap_request_state_t *state)
|
|||||||
state->response->code);
|
state->response->code);
|
||||||
rd_state = DO_REGISTRATION;
|
rd_state = DO_REGISTRATION;
|
||||||
}
|
}
|
||||||
/* remember last progress */
|
} else if(state->status == COAP_REQUEST_STATUS_TIMEOUT) {
|
||||||
last_rd_progress = coap_timer_uptime();
|
LOG_DBG_("Server not responding, trying to reconnect\n");
|
||||||
|
rd_state = INIT;
|
||||||
|
} else if(state->status == COAP_REQUEST_STATUS_FINISHED){
|
||||||
|
LOG_DBG_("Request finished. Ignore\n");
|
||||||
} else {
|
} else {
|
||||||
LOG_DBG("Ignore\n");
|
LOG_DBG_("Unexpected error, trying to reconnect\n");
|
||||||
|
rd_state = INIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
static void
|
||||||
deregister_callback(coap_request_state_t *state)
|
deregister_callback(coap_callback_request_state_t *callback_state)
|
||||||
{
|
{
|
||||||
LOG_DBG("Deregister callback. Response Code: %d\n",
|
coap_request_state_t *state = &callback_state->state;
|
||||||
|
LOG_DBG("Deregister callback. Status: %d. Response Code: %d\n",
|
||||||
|
state->status,
|
||||||
state->response != NULL ? state->response->code : 0);
|
state->response != NULL ? state->response->code : 0);
|
||||||
|
|
||||||
if(state->response && (DELETED_2_02 == state->response->code)) {
|
if(state->status == COAP_REQUEST_STATUS_RESPONSE && (DELETED_2_02 == state->response->code)) {
|
||||||
LOG_DBG("Deregistration success\n");
|
LOG_DBG("Deregistration success\n");
|
||||||
rd_state = DEREGISTERED;
|
rd_state = DEREGISTERED;
|
||||||
perform_session_callback(LWM2M_RD_CLIENT_DEREGISTERED);
|
perform_session_callback(LWM2M_RD_CLIENT_DEREGISTERED);
|
||||||
@ -548,13 +562,6 @@ deregister_callback(coap_request_state_t *state)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
|
||||||
recover_from_rd_delay(void)
|
|
||||||
{
|
|
||||||
/* This can be improved in the future... */
|
|
||||||
rd_state = INIT;
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
/* CoAP timer callback */
|
/* CoAP timer callback */
|
||||||
static void
|
static void
|
||||||
periodic_process(coap_timer_t *timer)
|
periodic_process(coap_timer_t *timer)
|
||||||
@ -611,10 +618,10 @@ periodic_process(coap_timer_t *timer)
|
|||||||
LOG_INFO_COAP_EP(&session_info.bs_server_ep);
|
LOG_INFO_COAP_EP(&session_info.bs_server_ep);
|
||||||
LOG_INFO_("] as '%s'\n", query_data);
|
LOG_INFO_("] as '%s'\n", query_data);
|
||||||
|
|
||||||
coap_send_request(&rd_request_state, &session_info.bs_server_ep,
|
if(coap_send_request(&rd_request_state, &session_info.bs_server_ep,
|
||||||
request, bootstrap_callback);
|
request, bootstrap_callback)) {
|
||||||
|
rd_state = BOOTSTRAP_SENT;
|
||||||
rd_state = BOOTSTRAP_SENT;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -710,18 +717,14 @@ periodic_process(coap_timer_t *timer)
|
|||||||
}
|
}
|
||||||
LOG_INFO_("' More:%d\n", rd_more);
|
LOG_INFO_("' More:%d\n", rd_more);
|
||||||
|
|
||||||
coap_send_request(&rd_request_state, &session_info.server_ep,
|
if(coap_send_request(&rd_request_state, &session_info.server_ep,
|
||||||
request, registration_callback);
|
request, registration_callback)){
|
||||||
last_rd_progress = coap_timer_uptime();
|
rd_state = REGISTRATION_SENT;
|
||||||
rd_state = REGISTRATION_SENT;
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case REGISTRATION_SENT:
|
case REGISTRATION_SENT:
|
||||||
/* just wait until the callback kicks us to the next state... */
|
/* just wait until the callback kicks us to the next state... */
|
||||||
if(last_rd_progress + MAX_RD_UPDATE_WAIT < coap_timer_uptime()) {
|
|
||||||
/* Timeout on the update - something is wrong? */
|
|
||||||
recover_from_rd_delay();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case REGISTRATION_DONE:
|
case REGISTRATION_DONE:
|
||||||
/* All is done! */
|
/* All is done! */
|
||||||
@ -733,10 +736,10 @@ periodic_process(coap_timer_t *timer)
|
|||||||
((uint32_t)session_info.lifetime * 500) <= now - last_update) {
|
((uint32_t)session_info.lifetime * 500) <= now - last_update) {
|
||||||
/* triggered or time to send an update to the server, at half-time! sec vs ms */
|
/* triggered or time to send an update to the server, at half-time! sec vs ms */
|
||||||
prepare_update(request, rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED);
|
prepare_update(request, rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED);
|
||||||
coap_send_request(&rd_request_state, &session_info.server_ep, request,
|
if(coap_send_request(&rd_request_state, &session_info.server_ep, request,
|
||||||
update_callback);
|
update_callback)) {
|
||||||
last_rd_progress = coap_timer_uptime();
|
rd_state = UPDATE_SENT;
|
||||||
rd_state = UPDATE_SENT;
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#if LWM2M_QUEUE_MODE_ENABLED
|
#if LWM2M_QUEUE_MODE_ENABLED
|
||||||
@ -754,27 +757,24 @@ periodic_process(coap_timer_t *timer)
|
|||||||
LWM2M_QUEUE_MODE_WAKE_UP();
|
LWM2M_QUEUE_MODE_WAKE_UP();
|
||||||
#endif /* LWM2M_QUEUE_MODE_WAKE_UP */
|
#endif /* LWM2M_QUEUE_MODE_WAKE_UP */
|
||||||
prepare_update(request, rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED);
|
prepare_update(request, rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED);
|
||||||
coap_send_request(&rd_request_state, &session_info.server_ep, request,
|
if(coap_send_request(&rd_request_state, &session_info.server_ep, request,
|
||||||
update_callback);
|
update_callback)) {
|
||||||
last_rd_progress = coap_timer_uptime();
|
rd_state = UPDATE_SENT;
|
||||||
rd_state = UPDATE_SENT;
|
}
|
||||||
break;
|
break;
|
||||||
#endif /* LWM2M_QUEUE_MODE_ENABLED */
|
#endif /* LWM2M_QUEUE_MODE_ENABLED */
|
||||||
|
|
||||||
case UPDATE_SENT:
|
case UPDATE_SENT:
|
||||||
/* just wait until the callback kicks us to the next state... */
|
/* just wait until the callback kicks us to the next state... */
|
||||||
if(last_rd_progress + MAX_RD_UPDATE_WAIT < coap_timer_uptime()) {
|
|
||||||
/* Timeout on the update - something is wrong? */
|
|
||||||
recover_from_rd_delay();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case DEREGISTER:
|
case DEREGISTER:
|
||||||
LOG_INFO("DEREGISTER %s\n", session_info.assigned_ep);
|
LOG_INFO("DEREGISTER %s\n", session_info.assigned_ep);
|
||||||
coap_init_message(request, COAP_TYPE_CON, COAP_DELETE, 0);
|
coap_init_message(request, COAP_TYPE_CON, COAP_DELETE, 0);
|
||||||
coap_set_header_uri_path(request, session_info.assigned_ep);
|
coap_set_header_uri_path(request, session_info.assigned_ep);
|
||||||
coap_send_request(&rd_request_state, &session_info.server_ep, request,
|
if(coap_send_request(&rd_request_state, &session_info.server_ep, request,
|
||||||
deregister_callback);
|
deregister_callback)) {
|
||||||
rd_state = DEREGISTER_SENT;
|
rd_state = DEREGISTER_SENT;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DEREGISTER_SENT:
|
case DEREGISTER_SENT:
|
||||||
break;
|
break;
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
#include "contiki.h"
|
#include "contiki.h"
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
#include "shell-commands.h"
|
#include "shell-commands.h"
|
||||||
|
#include "lib/list.h"
|
||||||
#include "sys/log.h"
|
#include "sys/log.h"
|
||||||
#include "dev/watchdog.h"
|
#include "dev/watchdog.h"
|
||||||
#include "net/ipv6/uip.h"
|
#include "net/ipv6/uip.h"
|
||||||
@ -76,7 +77,8 @@ static uint16_t curr_ping_datalen;
|
|||||||
#if TSCH_WITH_SIXTOP
|
#if TSCH_WITH_SIXTOP
|
||||||
static shell_command_6top_sub_cmd_t sixtop_sub_cmd = NULL;
|
static shell_command_6top_sub_cmd_t sixtop_sub_cmd = NULL;
|
||||||
#endif /* TSCH_WITH_SIXTOP */
|
#endif /* TSCH_WITH_SIXTOP */
|
||||||
|
static struct shell_command_set_t builtin_shell_command_set;
|
||||||
|
LIST(shell_command_sets);
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static const char *
|
static const char *
|
||||||
ds6_nbr_state_to_str(uint8_t state)
|
ds6_nbr_state_to_str(uint8_t state)
|
||||||
@ -345,15 +347,16 @@ PT_THREAD(cmd_log(struct pt *pt, shell_output_func output, char *args))
|
|||||||
static
|
static
|
||||||
PT_THREAD(cmd_help(struct pt *pt, shell_output_func output, char *args))
|
PT_THREAD(cmd_help(struct pt *pt, shell_output_func output, char *args))
|
||||||
{
|
{
|
||||||
struct shell_command_t *cmd_ptr;
|
struct shell_command_set_t *set;
|
||||||
|
const struct shell_command_t *cmd;
|
||||||
PT_BEGIN(pt);
|
PT_BEGIN(pt);
|
||||||
|
|
||||||
SHELL_OUTPUT(output, "Available commands:\n");
|
SHELL_OUTPUT(output, "Available commands:\n");
|
||||||
cmd_ptr = shell_commands;
|
/* Note: we explicitly don't expend any code space to deal with shadowing */
|
||||||
while(cmd_ptr->name != NULL) {
|
for(set = list_head(shell_command_sets); set != NULL; set = list_item_next(set)) {
|
||||||
SHELL_OUTPUT(output, "%s\n", cmd_ptr->help);
|
for(cmd = set->commands; cmd->name != NULL; ++cmd) {
|
||||||
cmd_ptr++;
|
SHELL_OUTPUT(output, "%s\n", cmd->help);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PT_END(pt);
|
PT_END(pt);
|
||||||
@ -729,12 +732,48 @@ PT_THREAD(cmd_6top(struct pt *pt, shell_output_func output, char *args))
|
|||||||
void
|
void
|
||||||
shell_commands_init(void)
|
shell_commands_init(void)
|
||||||
{
|
{
|
||||||
|
list_init(shell_command_sets);
|
||||||
|
list_add(shell_command_sets, &builtin_shell_command_set);
|
||||||
/* Set up Ping Reply callback */
|
/* Set up Ping Reply callback */
|
||||||
uip_icmp6_echo_reply_callback_add(&echo_reply_notification,
|
uip_icmp6_echo_reply_callback_add(&echo_reply_notification,
|
||||||
echo_reply_handler);
|
echo_reply_handler);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
struct shell_command_t shell_commands[] = {
|
void
|
||||||
|
shell_command_set_register(struct shell_command_set_t *set)
|
||||||
|
{
|
||||||
|
list_push(shell_command_sets, set);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
shell_command_set_deregister(struct shell_command_set_t *set)
|
||||||
|
{
|
||||||
|
if(!list_contains(shell_command_sets, set)) {
|
||||||
|
return !0;
|
||||||
|
}
|
||||||
|
list_remove(shell_command_sets, set);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
const struct shell_command_t *
|
||||||
|
shell_command_lookup(const char *name)
|
||||||
|
{
|
||||||
|
struct shell_command_set_t *set;
|
||||||
|
const struct shell_command_t *cmd;
|
||||||
|
|
||||||
|
for(set = list_head(shell_command_sets);
|
||||||
|
set != NULL;
|
||||||
|
set = list_item_next(set)) {
|
||||||
|
for(cmd = set->commands; cmd->name != NULL; ++cmd) {
|
||||||
|
if(!strcmp(cmd->name, name)) {
|
||||||
|
return cmd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
const struct shell_command_t builtin_shell_commands[] = {
|
||||||
{ "help", cmd_help, "'> help': Shows this help" },
|
{ "help", cmd_help, "'> help': Shows this help" },
|
||||||
{ "reboot", cmd_reboot, "'> reboot': Reboot the board by watchdog_reboot()" },
|
{ "reboot", cmd_reboot, "'> reboot': Reboot the board by watchdog_reboot()" },
|
||||||
{ "ip-addr", cmd_ipaddr, "'> ip-addr': Shows all IPv6 addresses" },
|
{ "ip-addr", cmd_ipaddr, "'> ip-addr': Shows all IPv6 addresses" },
|
||||||
@ -765,4 +804,8 @@ struct shell_command_t shell_commands[] = {
|
|||||||
{ NULL, NULL, NULL },
|
{ NULL, NULL, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct shell_command_set_t builtin_shell_command_set = {
|
||||||
|
.next = NULL,
|
||||||
|
.commands = builtin_shell_commands,
|
||||||
|
};
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -53,8 +53,14 @@ struct shell_command_t {
|
|||||||
const char *help;
|
const char *help;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The set of supported commands */
|
struct shell_command_set_t {
|
||||||
extern struct shell_command_t shell_commands[];
|
struct shell_command_set_t *next;
|
||||||
|
const struct shell_command_t *const commands;
|
||||||
|
};
|
||||||
|
|
||||||
|
void shell_command_set_register(struct shell_command_set_t *);
|
||||||
|
int shell_command_set_deregister(struct shell_command_set_t *);
|
||||||
|
const struct shell_command_t *shell_command_lookup(const char *);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes Shell-commands module
|
* Initializes Shell-commands module
|
||||||
|
@ -89,7 +89,7 @@ output_prompt(shell_output_func output)
|
|||||||
PT_THREAD(shell_input(struct pt *pt, shell_output_func output, const char *cmd))
|
PT_THREAD(shell_input(struct pt *pt, shell_output_func output, const char *cmd))
|
||||||
{
|
{
|
||||||
static char *args;
|
static char *args;
|
||||||
static struct shell_command_t *cmd_ptr;
|
static const struct shell_command_t *cmd_descr = NULL;
|
||||||
|
|
||||||
PT_BEGIN(pt);
|
PT_BEGIN(pt);
|
||||||
|
|
||||||
@ -105,20 +105,14 @@ PT_THREAD(shell_input(struct pt *pt, shell_output_func output, const char *cmd))
|
|||||||
args++;
|
args++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lookup for command */
|
cmd_descr = shell_command_lookup(cmd);
|
||||||
cmd_ptr = shell_commands;
|
if(cmd_descr != NULL) {
|
||||||
while(cmd_ptr->name != NULL) {
|
static struct pt cmd_pt;
|
||||||
if(strcmp(cmd, cmd_ptr->name) == 0) {
|
PT_SPAWN(pt, &cmd_pt, cmd_descr->func(&cmd_pt, output, args));
|
||||||
static struct pt cmd_pt;
|
} else {
|
||||||
PT_SPAWN(pt, &cmd_pt, cmd_ptr->func(&cmd_pt, output, args));
|
SHELL_OUTPUT(output, "Command not found. Type 'help' for a list of commands\n");
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
cmd_ptr++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SHELL_OUTPUT(output, "Command not found. Type 'help' for a list of commands\n");
|
|
||||||
|
|
||||||
done:
|
|
||||||
output_prompt(output);
|
output_prompt(output);
|
||||||
PT_END(pt);
|
PT_END(pt);
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,8 @@
|
|||||||
#ifndef __LOG_CONF_H__
|
#ifndef __LOG_CONF_H__
|
||||||
#define __LOG_CONF_H__
|
#define __LOG_CONF_H__
|
||||||
|
|
||||||
/* Log only the last 16 bytes of link-layer and IPv6 addresses */
|
/* Log only the last 16 bytes of link-layer and IPv6 addresses (or, if)
|
||||||
|
* the deployment module is enabled, the node IDs */
|
||||||
#ifdef LOG_CONF_WITH_COMPACT_ADDR
|
#ifdef LOG_CONF_WITH_COMPACT_ADDR
|
||||||
#define LOG_WITH_COMPACT_ADDR LOG_CONF_WITH_COMPACT_ADDR
|
#define LOG_WITH_COMPACT_ADDR LOG_CONF_WITH_COMPACT_ADDR
|
||||||
#else /* LOG_CONF_WITH_COMPACT_ADDR */
|
#else /* LOG_CONF_WITH_COMPACT_ADDR */
|
||||||
|
41
os/sys/log.c
41
os/sys/log.c
@ -51,6 +51,7 @@
|
|||||||
#include "sys/log.h"
|
#include "sys/log.h"
|
||||||
#include "net/ipv6/ip64-addr.h"
|
#include "net/ipv6/ip64-addr.h"
|
||||||
#include "net/ipv6/uiplib.h"
|
#include "net/ipv6/uiplib.h"
|
||||||
|
#include "deployment/deployment.h"
|
||||||
|
|
||||||
int curr_log_level_rpl = LOG_CONF_LEVEL_RPL;
|
int curr_log_level_rpl = LOG_CONF_LEVEL_RPL;
|
||||||
int curr_log_level_tcpip = LOG_CONF_LEVEL_TCPIP;
|
int curr_log_level_tcpip = LOG_CONF_LEVEL_TCPIP;
|
||||||
@ -90,22 +91,36 @@ log_6addr(const uip_ipaddr_t *ipaddr)
|
|||||||
LOG_OUTPUT("%s", buf);
|
LOG_OUTPUT("%s", buf);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
log_6addr_compact_snprint(char *buf, size_t size, const uip_ipaddr_t *ipaddr)
|
||||||
|
{
|
||||||
|
if(ipaddr == NULL) {
|
||||||
|
return snprintf(buf, size, "6A-NULL");
|
||||||
|
} else {
|
||||||
|
char *prefix = NULL;
|
||||||
|
if(uip_is_addr_mcast(ipaddr)) {
|
||||||
|
prefix = "6M";
|
||||||
|
} else if(uip_is_addr_linklocal(ipaddr)) {
|
||||||
|
prefix = "6L";
|
||||||
|
} else {
|
||||||
|
prefix = "6G";
|
||||||
|
}
|
||||||
|
#if BUILD_WITH_DEPLOYMENT
|
||||||
|
return snprintf(buf, size, "%s-%03u", prefix, deployment_id_from_iid(ipaddr));
|
||||||
|
#else /* BUILD_WITH_DEPLOYMENT */
|
||||||
|
return snprintf(buf, size, "%s-%04x", prefix, UIP_HTONS(ipaddr->u16[sizeof(uip_ipaddr_t)/2-1]));
|
||||||
|
#endif /* BUILD_WITH_DEPLOYMENT */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
log_6addr_compact(const uip_ipaddr_t *ipaddr)
|
log_6addr_compact(const uip_ipaddr_t *ipaddr)
|
||||||
{
|
{
|
||||||
if(ipaddr == NULL) {
|
char buf[8];
|
||||||
LOG_OUTPUT("6A-NULL");
|
log_6addr_compact_snprint(buf, sizeof(buf), ipaddr);
|
||||||
} else if(uip_is_addr_mcast(ipaddr)) {
|
LOG_OUTPUT("%s", buf);
|
||||||
LOG_OUTPUT("6M-%04x", UIP_HTONS(ipaddr->u16[sizeof(uip_ipaddr_t)/2-1]));
|
|
||||||
} else if(uip_is_addr_linklocal(ipaddr)) {
|
|
||||||
LOG_OUTPUT("6L-%04x", UIP_HTONS(ipaddr->u16[sizeof(uip_ipaddr_t)/2-1]));
|
|
||||||
} else {
|
|
||||||
LOG_OUTPUT("6G-%04x", UIP_HTONS(ipaddr->u16[sizeof(uip_ipaddr_t)/2-1]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* NETSTACK_CONF_WITH_IPV6 */
|
#endif /* NETSTACK_CONF_WITH_IPV6 */
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
log_lladdr(const linkaddr_t *lladdr)
|
log_lladdr(const linkaddr_t *lladdr)
|
||||||
@ -130,11 +145,15 @@ log_lladdr_compact(const linkaddr_t *lladdr)
|
|||||||
if(lladdr == NULL || linkaddr_cmp(lladdr, &linkaddr_null)) {
|
if(lladdr == NULL || linkaddr_cmp(lladdr, &linkaddr_null)) {
|
||||||
LOG_OUTPUT("LL-NULL");
|
LOG_OUTPUT("LL-NULL");
|
||||||
} else {
|
} else {
|
||||||
|
#if BUILD_WITH_DEPLOYMENT
|
||||||
|
LOG_OUTPUT("LL-%04u", deployment_id_from_lladdr(lladdr));
|
||||||
|
#else /* BUILD_WITH_DEPLOYMENT */
|
||||||
#if LINKADDR_SIZE == 8
|
#if LINKADDR_SIZE == 8
|
||||||
LOG_OUTPUT("LL-%04x", UIP_HTONS(lladdr->u16[LINKADDR_SIZE/2-1]));
|
LOG_OUTPUT("LL-%04x", UIP_HTONS(lladdr->u16[LINKADDR_SIZE/2-1]));
|
||||||
#elif LINKADDR_SIZE == 2
|
#elif LINKADDR_SIZE == 2
|
||||||
LOG_OUTPUT("LL-%04x", UIP_HTONS(lladdr->u16));
|
LOG_OUTPUT("LL-%04x", UIP_HTONS(lladdr->u16));
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* BUILD_WITH_DEPLOYMENT */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
11
os/sys/log.h
11
os/sys/log.h
@ -194,6 +194,17 @@ void log_6addr(const uip_ipaddr_t *ipaddr);
|
|||||||
*/
|
*/
|
||||||
void log_6addr_compact(const uip_ipaddr_t *ipaddr);
|
void log_6addr_compact(const uip_ipaddr_t *ipaddr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write at most size - 1 characters of the IP address to the output string,
|
||||||
|
* in a compact representation. The output is always null-terminated, unless
|
||||||
|
* size is 0.
|
||||||
|
*
|
||||||
|
* \param buf A pointer to an output string with at least size bytes.
|
||||||
|
* \param size The max number of characters to write to the output string.
|
||||||
|
* \param ipaddr A pointer to a uip_ipaddr_t that will be printed with printf().
|
||||||
|
*/
|
||||||
|
int log_6addr_compact_snprint(char *buf, size_t size, const uip_ipaddr_t *ipaddr);
|
||||||
|
|
||||||
#endif /* NETSTACK_CONF_WITH_IPV6 */
|
#endif /* NETSTACK_CONF_WITH_IPV6 */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -40,12 +40,17 @@
|
|||||||
#include "contiki.h"
|
#include "contiki.h"
|
||||||
#include "sys/node-id.h"
|
#include "sys/node-id.h"
|
||||||
#include "net/linkaddr.h"
|
#include "net/linkaddr.h"
|
||||||
|
#include "services/deployment/deployment.h"
|
||||||
|
|
||||||
uint16_t node_id = 0;
|
uint16_t node_id = 0;
|
||||||
|
|
||||||
void
|
void
|
||||||
node_id_init(void) {
|
node_id_init(void) {
|
||||||
|
#if BUILD_WITH_DEPLOYMENT
|
||||||
|
deployment_init();
|
||||||
|
#else /* BUILD_WITH_DEPLOYMENT */
|
||||||
/* Initialize with a default value derived from linkaddr */
|
/* Initialize with a default value derived from linkaddr */
|
||||||
node_id = linkaddr_node_addr.u8[LINKADDR_SIZE - 1]
|
node_id = linkaddr_node_addr.u8[LINKADDR_SIZE - 1]
|
||||||
+ (linkaddr_node_addr.u8[LINKADDR_SIZE - 2] << 8);
|
+ (linkaddr_node_addr.u8[LINKADDR_SIZE - 2] << 8);
|
||||||
|
#endif /* BUILD_WITH_DEPLOYMENT */
|
||||||
}
|
}
|
||||||
|
@ -24,35 +24,56 @@
|
|||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
# SUCH DAMAGE.
|
# SUCH DAMAGE.
|
||||||
|
TOOLS_DIR = ../../tools
|
||||||
|
|
||||||
DOCDIR=../../tools/doxygen
|
DOXYGEN = doxygen
|
||||||
|
DOXYGEN_DIR = $(TOOLS_DIR)/doxygen
|
||||||
|
DOXYGEN_LOG = $(DOXYGEN).log
|
||||||
|
DOXYGEN_ERR = $(DOXYGEN).err
|
||||||
|
|
||||||
|
RAEDTHEDOCS = readthedocs
|
||||||
|
READTHEDOCS_DIR = $(TOOLS_DIR)/readthedocs
|
||||||
|
READTHEDOCS_LOG = $(RAEDTHEDOCS).log
|
||||||
|
READTHEDOCS_ERR = $(RAEDTHEDOCS).err
|
||||||
|
|
||||||
|
CLEAN_TARGETS += $(DOXYGEN_LOG) $(DOXYGEN_ERR)
|
||||||
|
CLEAN_TARGETS += $(READTHEDOCS_LOG) $(READTHEDOCS_ERR)
|
||||||
|
|
||||||
all: clean summary
|
all: clean summary
|
||||||
|
|
||||||
doxygen:
|
doxygen:
|
||||||
-@$(MAKE) -C $(DOCDIR) 2> doxygen.err > /dev/null
|
-@$(MAKE) -C $(DOXYGEN_DIR) 2> $(DOXYGEN_ERR) > /dev/null
|
||||||
|
|
||||||
summary: doxygen
|
readthedocs:
|
||||||
|
-@$(MAKE) -C $(READTHEDOCS_DIR) 2> $(READTHEDOCS_ERR) > /dev/null
|
||||||
|
|
||||||
|
summary: doxygen readthedocs
|
||||||
@( \
|
@( \
|
||||||
1> summary; \
|
1> summary; \
|
||||||
if [ -s doxygen.err ] ; then \
|
if [ -s $(DOXYGEN_ERR) ] ; then \
|
||||||
echo "Doxygen: TEST FAIL" | tee summary; \
|
echo "Doxygen: TEST FAIL" | tee -a summary; \
|
||||||
echo "Errors:"; \
|
echo "Errors:"; \
|
||||||
cat doxygen.err; \
|
cat $(DOXYGEN_ERR); \
|
||||||
fi ; \
|
fi ; \
|
||||||
if [ -s $(DOCDIR)/doxygen.log ] ; then \
|
if [ -s $(DOXYGEN_DIR)/doxygen.log ] ; then \
|
||||||
echo "Doxygen: TEST FAIL" | tee summary; \
|
echo "Doxygen: TEST FAIL" | tee -a summary; \
|
||||||
echo "Warnings:"; \
|
echo "Warnings:"; \
|
||||||
cat $(DOCDIR)/doxygen.log; \
|
cat $(DOXYGEN_DIR)/doxygen.log; \
|
||||||
|
fi ; \
|
||||||
|
if [ -s $(READTHEDOCS_ERR) ] ; then \
|
||||||
|
echo "Readthedocs: TEST FAIL" | tee -a summary; \
|
||||||
|
echo "Errors:"; \
|
||||||
|
cat $(READTHEDOCS_ERR); \
|
||||||
fi ; \
|
fi ; \
|
||||||
if [ ! -s summary ] ; then \
|
if [ ! -s summary ] ; then \
|
||||||
echo "Doxygen: TEST OK (no warning nor error)" | tee summary; \
|
echo "Documentation: TEST OK (no warning nor error)" | tee summary; \
|
||||||
fi ; \
|
fi ; \
|
||||||
)
|
)
|
||||||
@rm doxygen.err
|
@rm -f $(CLEAN_TARGETS)
|
||||||
@echo "========== Summary =========="
|
@echo "========== Summary =========="
|
||||||
@cat summary
|
@cat summary
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -f summary doxygen.err
|
@rm -f summary $(CLEAN_TARGETS)
|
||||||
@$(MAKE) -C $(DOCDIR) clean
|
@$(MAKE) -C $(DOXYGEN_DIR) clean
|
||||||
|
@$(MAKE) -C $(READTHEDOCS_DIR) clean
|
@ -66,6 +66,7 @@ rpl-border-router/openmote-cc2538 \
|
|||||||
libs/ipv6-hooks/openmote-cc2538 \
|
libs/ipv6-hooks/openmote-cc2538 \
|
||||||
libs/shell/openmote-cc2538 \
|
libs/shell/openmote-cc2538 \
|
||||||
libs/simple-energest/openmote-cc2538 \
|
libs/simple-energest/openmote-cc2538 \
|
||||||
|
libs/deployment/openmote-cc2538 \
|
||||||
|
|
||||||
TOOLS=
|
TOOLS=
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 81cd4cbe5e05e4fa97782d1859ed15b769f4bf2b
|
Subproject commit edb3c8c73c4688ebd336b278450db216512a769b
|
@ -3,9 +3,9 @@ FROM 32bit/ubuntu:16.04
|
|||||||
# Tools
|
# Tools
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
build-essential doxygen git wget unzip python-serial \
|
build-essential doxygen git wget unzip python-serial python-pip \
|
||||||
default-jdk ant srecord iputils-tracepath rlwrap \
|
default-jdk ant srecord iputils-tracepath rlwrap \
|
||||||
mosquitto mosquitto-clients \
|
mosquitto mosquitto-clients gdb \
|
||||||
&& apt-get clean
|
&& apt-get clean
|
||||||
|
|
||||||
# Install ARM toolchain
|
# Install ARM toolchain
|
||||||
@ -42,6 +42,12 @@ RUN wget https://developer.nordicsemi.com/nRF5_IoT_SDK/nRF5_IoT_SDK_v0.9.x/nrf5_
|
|||||||
|
|
||||||
ENV NRF52_SDK_ROOT /usr/nrf52-sdk
|
ENV NRF52_SDK_ROOT /usr/nrf52-sdk
|
||||||
|
|
||||||
|
# Install sphinx and sphinx_rtd_theme, required for building and testing the
|
||||||
|
# readthedocs API documentation
|
||||||
|
RUN pip install --upgrade pip
|
||||||
|
RUN pip install setuptools
|
||||||
|
RUN pip install sphinx_rtd_theme sphinx
|
||||||
|
|
||||||
# Create user, enable X forwarding, add to group dialout
|
# Create user, enable X forwarding, add to group dialout
|
||||||
# -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix
|
# -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix
|
||||||
RUN export uid=1000 gid=1000 && \
|
RUN export uid=1000 gid=1000 && \
|
||||||
|
19
tools/readthedocs/Makefile
Normal file
19
tools/readthedocs/Makefile
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Makefile used to generate documentation with sphinx, which is used on
|
||||||
|
# readthedocs. Use this Makefile to test readthedocs generation locally on
|
||||||
|
# your computer.
|
||||||
|
#
|
||||||
|
# For this to work, you will need to install sphinx and sphinx_rtd_theme. They
|
||||||
|
# can be installed through pip
|
||||||
|
.PHONY = clean all readthedocs
|
||||||
|
|
||||||
|
SPHINX = sphinx-build
|
||||||
|
SPHINX_CONF_DIR = .
|
||||||
|
SPHINX_OUT_DIR = _build
|
||||||
|
|
||||||
|
all: readthedocs
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf $(SPHINX_OUT_DIR)
|
||||||
|
|
||||||
|
readthedocs:
|
||||||
|
$(SPHINX) -b html $(SPHINX_CONF_DIR) $(SPHINX_OUT_DIR)
|
65
tools/readthedocs/api-doc.py
Normal file
65
tools/readthedocs/api-doc.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# Sphinx extension that builds Contiki-NG documentation and copies it over to
|
||||||
|
# the sphinx build dir
|
||||||
|
import subprocess
|
||||||
|
from sphinx.util import logging
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
api_doc_defaults = {
|
||||||
|
'doxygen_src_dir': '../doxygen',
|
||||||
|
'doxygen_out_dir': 'html',
|
||||||
|
'doxygen_suppress_out': True,
|
||||||
|
'doxygen_build': True,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def api_doc_build(app, exception):
|
||||||
|
if exception is not None:
|
||||||
|
logger.warning('%s exiting without building' % (__name__,))
|
||||||
|
return
|
||||||
|
|
||||||
|
if app.config.api_doc_doxygen_build:
|
||||||
|
make_invocation_suffix = ('> /dev/null'
|
||||||
|
if app.config.api_doc_doxygen_suppress_out
|
||||||
|
else '')
|
||||||
|
make_invocation = ' '.join(('make -C',
|
||||||
|
app.config.api_doc_doxygen_src_dir,
|
||||||
|
make_invocation_suffix))
|
||||||
|
|
||||||
|
logger.info('%s building API docs from "%s"'
|
||||||
|
% (__name__, app.config.api_doc_doxygen_src_dir))
|
||||||
|
logger.info('%s executing "%s"'
|
||||||
|
% (__name__, make_invocation))
|
||||||
|
|
||||||
|
subprocess.call(make_invocation, shell=True)
|
||||||
|
|
||||||
|
api_doc_build_dir = "/".join((app.config.api_doc_doxygen_src_dir,
|
||||||
|
app.config.api_doc_doxygen_out_dir))
|
||||||
|
api_doc_static_api_dir = "/".join((app.outdir, '_api'))
|
||||||
|
|
||||||
|
logger.info('%s moving "%s" to "%s"'
|
||||||
|
% (__name__, api_doc_build_dir, api_doc_static_api_dir))
|
||||||
|
subprocess.call(' '.join(('mv', api_doc_build_dir,
|
||||||
|
api_doc_static_api_dir)),
|
||||||
|
shell=True)
|
||||||
|
|
||||||
|
# Fundamentally a workaround: Readthedocs doxygen build plain refulses
|
||||||
|
# to build the same html/*.js files as local builds do. So we ship them
|
||||||
|
# and we copy them over to the output dir by force, till readthedocs
|
||||||
|
# starts behaving, hopefully in the near future
|
||||||
|
subprocess.call(' '.join(('cp js/dynsections.js',
|
||||||
|
api_doc_static_api_dir)),
|
||||||
|
shell=True)
|
||||||
|
|
||||||
|
|
||||||
|
def setup(app):
|
||||||
|
for k, v in api_doc_defaults.items():
|
||||||
|
config_val = 'api_doc_' + k
|
||||||
|
logger.debug('Add config value %s: %s' %(config_val, v))
|
||||||
|
app.add_config_value(config_val, v, '')
|
||||||
|
|
||||||
|
# We will build and copy the docs after the end of the sphinx build, and.
|
||||||
|
# only if it has been successful. Regsiter for the build-finished event.
|
||||||
|
app.connect('build-finished', api_doc_build)
|
||||||
|
|
||||||
|
logger.info('%s initialised' % (__name__,))
|
112
tools/readthedocs/conf.py
Normal file
112
tools/readthedocs/conf.py
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Configuration file for the Sphinx documentation builder.
|
||||||
|
#
|
||||||
|
# This file does only contain a selection of the most common options. For a
|
||||||
|
# full list see the documentation:
|
||||||
|
# http://www.sphinx-doc.org/en/master/config
|
||||||
|
|
||||||
|
|
||||||
|
# -- Path setup --------------------------------------------------------------
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
#
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
sys.path.insert(0, os.path.abspath('.'))
|
||||||
|
|
||||||
|
|
||||||
|
# -- Project information -----------------------------------------------------
|
||||||
|
|
||||||
|
project = u'Contiki-NG'
|
||||||
|
copyright = u'2018, Contiki-NG maintainers and contributors'
|
||||||
|
author = u'Contiki-NG maintainers and contributors'
|
||||||
|
|
||||||
|
# The short X.Y version
|
||||||
|
version = u''
|
||||||
|
# The full version, including alpha/beta/rc tags
|
||||||
|
release = u''
|
||||||
|
|
||||||
|
|
||||||
|
# -- General configuration ---------------------------------------------------
|
||||||
|
|
||||||
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
|
#
|
||||||
|
# needs_sphinx = '1.0'
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
|
# ones.
|
||||||
|
extensions = [
|
||||||
|
'api-doc'
|
||||||
|
]
|
||||||
|
|
||||||
|
# api-doc configuration
|
||||||
|
api_doc_doxygen_src_dir = '../doxygen'
|
||||||
|
api_doc_doxygen_out_dir = 'html'
|
||||||
|
api_doc_doxygen_suppress_out = True
|
||||||
|
api_doc_doxygen_build = True
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
#templates_path = ['_templates']
|
||||||
|
|
||||||
|
# The suffix(es) of source filenames.
|
||||||
|
# You can specify multiple suffix as a list of string:
|
||||||
|
#
|
||||||
|
# source_suffix = ['.rst', '.md']
|
||||||
|
source_suffix = '.rst'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#
|
||||||
|
# This is also used if you do content translation via gettext catalogs.
|
||||||
|
# Usually you set "language" from the command line for these cases.
|
||||||
|
language = None
|
||||||
|
|
||||||
|
# List of patterns, relative to source directory, that match files and
|
||||||
|
# directories to ignore when looking for source files.
|
||||||
|
# This pattern also affects html_static_path and html_extra_path .
|
||||||
|
exclude_patterns = [u'_build', 'Thumbs.db', '.DS_Store']
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = 'sphinx'
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for HTML output -------------------------------------------------
|
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
|
# a list of builtin themes.
|
||||||
|
#
|
||||||
|
html_theme = 'sphinx_rtd_theme'
|
||||||
|
|
||||||
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
|
# further. For a list of options available for each theme, see the
|
||||||
|
# documentation.
|
||||||
|
#
|
||||||
|
# html_theme_options = {}
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
#html_static_path = ['_static']
|
||||||
|
|
||||||
|
# Custom sidebar templates, must be a dictionary that maps document names
|
||||||
|
# to template names.
|
||||||
|
#
|
||||||
|
# The default sidebars (for documents that don't match any pattern) are
|
||||||
|
# defined by theme itself. Builtin themes are using these templates by
|
||||||
|
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
|
||||||
|
# 'searchbox.html']``.
|
||||||
|
#
|
||||||
|
# html_sidebars = {}
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for HTMLHelp output ---------------------------------------------
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = 'Contiki-NGdoc'
|
23
tools/readthedocs/index.rst
Normal file
23
tools/readthedocs/index.rst
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
Contiki-NG API documentation!
|
||||||
|
=============================
|
||||||
|
|
||||||
|
These pages host Contiki-NG's API documentation.
|
||||||
|
|
||||||
|
The primary target audience
|
||||||
|
consists developers who want to develop an application with Contiki-NG or who
|
||||||
|
want to modify Contiki-NG itself.
|
||||||
|
|
||||||
|
For guides and tutorials, visit the `Contiki-NG wiki`_.
|
||||||
|
|
||||||
|
Index
|
||||||
|
=====
|
||||||
|
* `API Home`_
|
||||||
|
* `List of Modules`_
|
||||||
|
* `Data Structure Index`_
|
||||||
|
* `Index of Files`_
|
||||||
|
|
||||||
|
.. _Contiki-NG wiki: https://github.com/contiki-ng/contiki-ng/wiki
|
||||||
|
.. _API Home: _api/index.html
|
||||||
|
.. _List of Modules: _api/modules.html
|
||||||
|
.. _Data Structure Index: _api/annotated.html
|
||||||
|
.. _Index of Files: _api/files.html
|
127
tools/readthedocs/js/dynsections.js
Normal file
127
tools/readthedocs/js/dynsections.js
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
@licstart The following is the entire license notice for the
|
||||||
|
JavaScript code in this file.
|
||||||
|
|
||||||
|
Copyright (C) 1997-2017 by Dimitri van Heesch
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
@licend The above is the entire license notice
|
||||||
|
for the JavaScript code in this file
|
||||||
|
*/
|
||||||
|
function toggleVisibility(linkObj)
|
||||||
|
{
|
||||||
|
var base = $(linkObj).attr('id');
|
||||||
|
var summary = $('#'+base+'-summary');
|
||||||
|
var content = $('#'+base+'-content');
|
||||||
|
var trigger = $('#'+base+'-trigger');
|
||||||
|
var src=$(trigger).attr('src');
|
||||||
|
if (content.is(':visible')===true) {
|
||||||
|
content.hide();
|
||||||
|
summary.show();
|
||||||
|
$(linkObj).addClass('closed').removeClass('opened');
|
||||||
|
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
|
||||||
|
} else {
|
||||||
|
content.show();
|
||||||
|
summary.hide();
|
||||||
|
$(linkObj).removeClass('closed').addClass('opened');
|
||||||
|
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateStripes()
|
||||||
|
{
|
||||||
|
$('table.directory tr').
|
||||||
|
removeClass('even').filter(':visible:even').addClass('even');
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleLevel(level)
|
||||||
|
{
|
||||||
|
$('table.directory tr').each(function() {
|
||||||
|
var l = this.id.split('_').length-1;
|
||||||
|
var i = $('#img'+this.id.substring(3));
|
||||||
|
var a = $('#arr'+this.id.substring(3));
|
||||||
|
if (l<level+1) {
|
||||||
|
i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
|
||||||
|
a.html('▼');
|
||||||
|
$(this).show();
|
||||||
|
} else if (l==level+1) {
|
||||||
|
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
|
||||||
|
a.html('▶');
|
||||||
|
$(this).show();
|
||||||
|
} else {
|
||||||
|
$(this).hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
updateStripes();
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleFolder(id)
|
||||||
|
{
|
||||||
|
// the clicked row
|
||||||
|
var currentRow = $('#row_'+id);
|
||||||
|
|
||||||
|
// all rows after the clicked row
|
||||||
|
var rows = currentRow.nextAll("tr");
|
||||||
|
|
||||||
|
var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
|
||||||
|
|
||||||
|
// only match elements AFTER this one (can't hide elements before)
|
||||||
|
var childRows = rows.filter(function() { return this.id.match(re); });
|
||||||
|
|
||||||
|
// first row is visible we are HIDING
|
||||||
|
if (childRows.filter(':first').is(':visible')===true) {
|
||||||
|
// replace down arrow by right arrow for current row
|
||||||
|
var currentRowSpans = currentRow.find("span");
|
||||||
|
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
|
||||||
|
currentRowSpans.filter(".arrow").html('▶');
|
||||||
|
rows.filter("[id^=row_"+id+"]").hide(); // hide all children
|
||||||
|
} else { // we are SHOWING
|
||||||
|
// replace right arrow by down arrow for current row
|
||||||
|
var currentRowSpans = currentRow.find("span");
|
||||||
|
currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
|
||||||
|
currentRowSpans.filter(".arrow").html('▼');
|
||||||
|
// replace down arrows by right arrows for child rows
|
||||||
|
var childRowsSpans = childRows.find("span");
|
||||||
|
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
|
||||||
|
childRowsSpans.filter(".arrow").html('▶');
|
||||||
|
childRows.show(); //show all children
|
||||||
|
}
|
||||||
|
updateStripes();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function toggleInherit(id)
|
||||||
|
{
|
||||||
|
var rows = $('tr.inherit.'+id);
|
||||||
|
var img = $('tr.inherit_header.'+id+' img');
|
||||||
|
var src = $(img).attr('src');
|
||||||
|
if (rows.filter(':first').is(':visible')===true) {
|
||||||
|
rows.css('display','none');
|
||||||
|
$(img).attr('src',src.substring(0,src.length-8)+'closed.png');
|
||||||
|
} else {
|
||||||
|
rows.css('display','table-row'); // using show() causes jump in firefox
|
||||||
|
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* @license-end */
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('.code,.codeRef').each(function() {
|
||||||
|
$(this).data('powertip',$('#'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html());
|
||||||
|
$(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true });
|
||||||
|
});
|
||||||
|
});
|
@ -885,6 +885,17 @@ exit(1);
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
if(*tundev == '\0') {
|
||||||
|
/* Use default. */
|
||||||
|
if(tap) {
|
||||||
|
strcpy(tundev, "tap0");
|
||||||
|
} else {
|
||||||
|
strcpy(tundev, "tun0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if(host != NULL) {
|
if(host != NULL) {
|
||||||
struct addrinfo hints, *servinfo, *p;
|
struct addrinfo hints, *servinfo, *p;
|
||||||
int rv;
|
int rv;
|
||||||
|
Loading…
Reference in New Issue
Block a user