Git Product home page Git Product logo

contiki-ng / contiki-ng Goto Github PK

View Code? Open in Web Editor NEW
1.3K 85.0 690.0 80.75 MB

Contiki-NG: The OS for Next Generation IoT Devices

Home Page: https://www.contiki-ng.org/

License: BSD 3-Clause "New" or "Revised" License

Makefile 0.33% C 92.15% XSLT 0.03% Shell 0.35% JavaScript 0.10% Java 0.22% CSS 0.36% Python 1.65% Perl 0.15% Dockerfile 0.05% GSC 4.62%
iot contiki-ng wsn 6lowpan 6lowpan-border-router rpl tsch 6tisch

contiki-ng's Introduction

Logo

Contiki-NG: The OS for Next Generation IoT Devices

Github Actions Documentation Status license Latest release GitHub Release Date Last commit

Stack Overflow Tag Gitter Twitter

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 explicitly stated otherwise, Contiki-NG sources are distributed under the terms of the 3-clause BSD license. 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.

Find out more:

Engage with the community:

contiki-ng's People

Contributors

adamdunkels avatar alexandruioanp avatar alexstanoev avatar alignan avatar arurke avatar atiselsts avatar bthebaudeau avatar cmorty avatar dak664 avatar darconeous avatar enricmcalvo avatar fros4943 avatar g-oikonomou avatar herjulf avatar jimparis avatar joakimeriksson avatar kkrentz avatar laurentderu avatar malvira avatar mdlemay avatar mgrella avatar mmuman avatar nfi avatar nvt avatar oliverschmidt avatar pjonsson avatar simonduq avatar thomas-ha avatar yagoor avatar yatch avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

contiki-ng's Issues

Mobility support

If we have modular routing, it may be worth bringing back AODV (but for v6) or something else such as LOADng. This will allow mobility support.

Enhanced testing framework

The regression tests are mostly checking that the system behaves as expected for limited inputs and scenarios. A way to increase coverage and testing other aspects such as software security would be to involve more types of tests; e.g., unit testing, static analysis, and fuzzing. For the latter, the procedure takes a long time, so we may want to divide tests that are done for a PR and for a release. Perhaps it would also be interesting to involve well-defined testbed tests for releases.

General cleanup

Refactor examples, core, apps, paltforms, regression tests, everything

Adaptive channel selection for TSCH

There are multiple options how to adapt the channels. Here I'm thinking about an RSSI based approach, where the coordinator node only. I.e. the coordinator sniffs the background noise RSSI levels and accumulates the busy / not busy estimates in a TSCH local stats structure.

The core TSCH part is simple, once the TSCH stats patch is in place.

The actual selection process is more complex, but done in an application - periodically sort the channels by their qualities, replace the worst one if there is a significantly better one available etc.

After the hopping sequence is changed on the coordinator, it sends out the new one in a burst of EB packets.

Improved API for random number generation

We need to add an API for filling a buffer with random values as this is often a type of functions used for various encryption and security mechanisms.

Something like:

random_fill(uint8_t *buffer, size_t len);

HAL for common peripherals

Homogeneous API for things like SPI, I2C, sensors, so that most examples can run on multiple platforms merely through configuration, but without code modifications.

Discussion: RPL storing / non-storing

The current plan for RPL-lite (#8) is to support only non-storing mode, because storing it is basically complex and broken. Complex because of stateful route maintenance (registration and de-registration that must be done for every single child and at every node on the path to the root). Broken because it is unable to maintain the routing state consistent. As the goal of RPL-lite is to bring simplicity and reliability, I believe trashing storing mode is the way forward.

Is anybody going to miss storing mode?
If so, how do we handle this?
Do we keep the old RPL as an alternative to RPL-lite?
Or to we have to include storing in RPL-lite? (I would really like to avoid this)

Enable networking on native

Similar to the former platform minimal-net, via tun/tap. Enabled testing of network-layer and above protocols locally, e.g. run a Contiki node as process and CoAP request it from the Linux host.

New version string

At startup, the first line printed is typically the CONTIKI_VERSION_STRING value set in Makefile.include, which looks like "Contiki-3.x-3638-gc1a917a". Should we change it to "Contiki-NG-3638-g1a917a", "Contiki-NG-1.x-3638-g1a917a", or something else?

Merge MAC and RDC layers

csma+nullrdc becomes csma
tsch+nordc becomes tsch
nullmac+nordc becomes nullmac
no other MAC nor RDC left!

Homogenize platforms

Avoid code duplication.

Common main (George: Perhaps one that allows platform-specific hooks)

Common examples (now we have the same examples copied 10 times). George: See what I’ve done with sensniff in order to be able to provide a more-or-less-but-not-quite platform independent example. Design could perhaps be improved, but we should be able to have BRs and Slip Radios using similar design.

Stats for TSCH and extensions in link stats

Points for discussion:

  • have a stats structure for a single timesource node only, or for each TSCH neighbor? (currently implemented for single only; previous version for each neighbor, but had to drop that because of RAM limitations)
  • enabled by default? (currently not)

Issue found in H2020 Vessedia

uip_conns ends up declared with two different sizes in two different modules, there is a link-time clash:

when parsing examples/ipv6/rpl-udp/udp-server.c:

[kernel] user error: Incompatible declaration for uip_conns:
                     different array sizes
                     First declaration was at /contiki/core/net/ipv6/uip6.c:250
                     Current declaration is at /contiki/core/net/ip/uip.h:1370

uipbuf - module

Add a uipbuf module with uip attributes and functions for handling packets (such as uint8_t * get_next_protocol_header(uint8_t *p), get_final_protocol_header(*p) etc).

Rework RPL border router

Figure out how to add an significantly improved border router to Contiki and where it should be.

LWM2M

Significant improvement over the current implementation with more of the LWM2M 1.0 features implemented and less memory consumption

Documentation

Setup process that auto-compiled doxygen and uploads it to some web. Clean-slate restart of the /doc directory

No-IP netstack

For IP-less testing, a network layer that does essentially nothing

Non-blocking APIs

Some of the APIs have blocking functions that can take hundreds of milliseconds. "xmem", and possibly some other APIs, should be redesigned a bit so that they do not start busy-looping on a call. This would also require the CFS API to change.

What has priority when configuring netstack?

Hey guys

In netstack.h

/* MAC layer configuration. The MAC layer is configured through the Makefile,
   via the flag MAKE_MAC */
#ifdef NETSTACK_CONF_MAC
#define NETSTACK_MAC NETSTACK_CONF_MAC
#else /* NETSTACK_CONF_MAC */
#if MAC_CONF_WITH_NULLMAC
#define NETSTACK_MAC     nullmac_driver
#elif MAC_CONF_WITH_CSMA
#define NETSTACK_MAC     csma_driver
#elif MAC_CONF_WITH_TSCH
#define NETSTACK_MAC     tschmac_driver
#else
#error Unknown MAC configuration
#endif
#endif /* NETSTACK_CONF_MAC */

Unless I've mistaken something here, if Makefiles and the various -conf.h files disagree, the latter win. Is this the intention? Certainly not how I interpret the comment at the start?

Ditto for the network layer.

Cleanup apps

Move generic services to core
Move example apps to examples
Remove useless stuff

Stack guard

See the discussion here: contiki-os/contiki#2089

I can adapt it for Contiki-NG (some work required) and resubmit here.

The one thing remaining to discuss here: do you have objections against it being enabled by default?
As I stated in the "old" Contiki PR discussion, I believe it would be much more useful if enabled. "Release" builds can always explicitly remove it, by simply adding a compilation flag.

Layer configuration

This is to discuss how to handle configuration of layers. A problem with the current solution, where we set directly the driver, is that there is no way to know from a pre-processor macro which layer is being used. For instance, if you enable TSCH, then you'd like your platform-conf to figure this out and configure the radio accordingly. But instead we always need workarounds, e.g., "set the MAC layer, but don't forget to also set XYZ for platform X".

Suggestions?

Maybe something such as this in mac.h:

#define CONTIKI_MAC_CSMA 0
#define CONTIKI_MAC_TSCH 1

and in config files:

#define CONTIKI_NETSTACK_MAC CONTIKI_MAC_TSCH

and then the driver is set somewhere else by some contiki h file, but not by the config file.

Are there nicer approaches?

Add IP_LAYER to NETSTACK

We need to have a full layering in Contiki. At Yanzi we have added a upper layer in form of an IP_LAYER which means that any lower layer would rather do IP_LAYER.input() rather than tcpip_input() or similar. The same goes for upper layer that will send IP in a similar way. This way it is possible to do very advanced IP packet filters by indirection (have your own proxy-IP-LAYER in between) - and in the long run replace the current IP implementation if that would be interesting (e.g. open-thread or similar in Contiki).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.