The network stack in Contiki OS is
Layer | Protocols Available |
MAC | csma.c and nullmac.c |
RDC | contikimac.c, xmac.c, lpp.c, nullrdc-noframer.c, nullrdc.c and sicslowmac.c |
Framer | framer-802154.c and framer-nullmac.c |
By default, the following configuration is used in Contiki OS:-
- Network: rime_driver
- MAC: nullmac_driver
- RDC: nullrdc_driver
- Framer: framer_nullmac
- Radio: nullradio_driver
A detailed explanation about the network stack can be found in Contiki Wiki. Let us now dive into the tutorial.
Note: We will be using the project configuration file method as it is a much better approach and doesn’t hamper with the main platform configuration files.
Step 1: Navigate to home/contiki-2.7/examples/ipv6
Step 2: Make a copy of backup file of Makefile and name it Makefile-copy
Step 3: Let’s create a file called my-conf.h. This file should be inserted into your Makefile. Open the file named Makefile using any editor like gedit, nano or vi.
CONTIKI = ../../.. CFLAGS += -DPROJECT_CONF_H=\"my-conf.h\"
Step 4: Now open your file my-conf.h using any editor and start editing based on your required configuration
#ifndef NETSTACK_CONF_MAC #define NETSTACK_CONF_MAC csma_driver #endif /* NETSTACK_CONF_MAC */ #ifndef NETSTACK_CONF_RDC #define NETSTACK_CONF_RDC contikimac_driver #endif /* NETSTACK_CONF_RDC */ #ifndef NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE #define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8 #endif /* NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE */ #ifndef NETSTACK_CONF_RADIO #define NETSTACK_CONF_RADIO cc2420_driver #endif /* NETSTACK_CONF_RADIO */ #ifndef NETSTACK_CONF_FRAMER #define NETSTACK_CONF_FRAMER framer_802154 #endif /* NETSTACK_CONF_FRAMER */
Step 5: In order for your configuration to work you need to navigate to the folder /home/contiki-2.7/platform/sky/contiki-conf.h
Step 6: Open contiki-conf.h and bring the following lines at the start of the file below define CONTIKI_CONF_H which is located at the end of contiki-conf.h
/* include the project config / / PROJECT_CONF_H might be defined in the project Makefile */
ifdef PROJECT_CONF_H
include PROJECT_CONF_H
endif /* PROJECT_CONF_H */
Note 1: Your contiki-conf.h file beginning lines should look like this after making the changes
/* -- C -- */ ifndef CONTIKI_CONF_H define CONTIKI_CONF_H /* include the project config / / PROJECT_CONF_H might be defined in the project Makefile */ ifdef PROJECT_CONF_H include PROJECT_CONF_H endif /* PROJECT_CONF_H */
Note 2: The entire contiki-conf.h file looks like this after modifications
/* -- C -- */ ifndef CONTIKI_CONF_H define CONTIKI_CONF_H /* include the project config / / PROJECT_CONF_H might be defined in the project Makefile */ ifdef PROJECT_CONF_H include PROJECT_CONF_H endif /* PROJECT_CONF_H */ ifdef PLATFORM_CONF_H include PLATFORM_CONF_H else include "platform-conf.h" endif /* PLATFORM_CONF_H */ ifndef NETSTACK_CONF_MAC define NETSTACK_CONF_MAC csma_driver endif /* NETSTACK_CONF_MAC */ ifndef NETSTACK_CONF_RDC define NETSTACK_CONF_RDC contikimac_driver endif /* NETSTACK_CONF_RDC */ ifndef NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8 endif /* NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE */ ifndef NETSTACK_CONF_RADIO define NETSTACK_CONF_RADIO cc2420_driver endif /* NETSTACK_CONF_RADIO */ ifndef NETSTACK_CONF_FRAMER define NETSTACK_CONF_FRAMER framer_802154 endif /* NETSTACK_CONF_FRAMER */ ifndef CC2420_CONF_AUTOACK define CC2420_CONF_AUTOACK 1 endif /* CC2420_CONF_AUTOACK */ /* Specify whether the RDC layer should enable per-packet power profiling. */ define CONTIKIMAC_CONF_COMPOWER 1 define XMAC_CONF_COMPOWER 1 define CXMAC_CONF_COMPOWER 1 if WITH_UIP6 /* Network setup for IPv6 */ define NETSTACK_CONF_NETWORK sicslowpan_driver /* Specify a minimum packet size for 6lowpan compression to be enabled. This is needed for ContikiMAC, which needs packets to be larger than a specified size, if no ContikiMAC header should be used. */ define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63 define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0 define CXMAC_CONF_ANNOUNCEMENTS 0 define XMAC_CONF_ANNOUNCEMENTS 0 ifndef QUEUEBUF_CONF_NUM define QUEUEBUF_CONF_NUM 8 endif else /* WITH_UIP6 */ /* Network setup for non-IPv6 (rime). */ define NETSTACK_CONF_NETWORK rime_driver define COLLECT_CONF_ANNOUNCEMENTS 1 define CXMAC_CONF_ANNOUNCEMENTS 0 define XMAC_CONF_ANNOUNCEMENTS 0 define CONTIKIMAC_CONF_ANNOUNCEMENTS 0 ifndef COLLECT_NEIGHBOR_CONF_MAX_COLLECT_NEIGHBORS define COLLECT_NEIGHBOR_CONF_MAX_COLLECT_NEIGHBORS 32 endif /* COLLECT_NEIGHBOR_CONF_MAX_COLLECT_NEIGHBORS */ ifndef QUEUEBUF_CONF_NUM define QUEUEBUF_CONF_NUM 16 endif /* QUEUEBUF_CONF_NUM */ ifndef TIMESYNCH_CONF_ENABLED define TIMESYNCH_CONF_ENABLED 0 endif /* TIMESYNCH_CONF_ENABLED */ if TIMESYNCH_CONF_ENABLED /* CC2420 SDF timestamps must be on if timesynch is enabled. */ undef CC2420_CONF_SFD_TIMESTAMPS define CC2420_CONF_SFD_TIMESTAMPS 1 endif /* TIMESYNCH_CONF_ENABLED */ endif /* WITH_UIP6 */ define PACKETBUF_CONF_ATTRS_INLINE 1 ifndef RF_CHANNEL define RF_CHANNEL 26 endif /* RF_CHANNEL */ define CONTIKIMAC_CONF_BROADCAST_RATE_LIMIT 0 define IEEE802154_CONF_PANID 0xABCD define SHELL_VARS_CONF_RAM_BEGIN 0x1100 define SHELL_VARS_CONF_RAM_END 0x2000 define PROFILE_CONF_ON 0 ifndef ENERGEST_CONF_ON define ENERGEST_CONF_ON 1 endif /* ENERGEST_CONF_ON */ define ELFLOADER_CONF_TEXT_IN_ROM 0 ifndef ELFLOADER_CONF_DATAMEMORY_SIZE define ELFLOADER_CONF_DATAMEMORY_SIZE 0x400 endif /* ELFLOADER_CONF_DATAMEMORY_SIZE */ ifndef ELFLOADER_CONF_TEXTMEMORY_SIZE define ELFLOADER_CONF_TEXTMEMORY_SIZE 0x800 endif /* ELFLOADER_CONF_TEXTMEMORY_SIZE */ define AODV_COMPLIANCE define AODV_NUM_RT_ENTRIES 32 define WITH_ASCII 1 define PROCESS_CONF_NUMEVENTS 8 define PROCESS_CONF_STATS 1 /#define PROCESS_CONF_FASTPOLL 4/ ifdef WITH_UIP6 define RIMEADDR_CONF_SIZE 8 define UIP_CONF_LL_802154 1 define UIP_CONF_LLH_LEN 0 define UIP_CONF_ROUTER 1 ifndef UIP_CONF_IPV6_RPL define UIP_CONF_IPV6_RPL 1 endif /* UIP_CONF_IPV6_RPL */ /* configure number of neighbors and routes */ ifndef NBR_TABLE_CONF_MAX_NEIGHBORS define NBR_TABLE_CONF_MAX_NEIGHBORS 20 endif /* NBR_TABLE_CONF_MAX_NEIGHBORS */ ifndef UIP_CONF_MAX_ROUTES define UIP_CONF_MAX_ROUTES 20 endif /* UIP_CONF_MAX_ROUTES */ define UIP_CONF_ND6_SEND_RA 0 define UIP_CONF_ND6_REACHABLE_TIME 600000 define UIP_CONF_ND6_RETRANS_TIMER 10000 define UIP_CONF_IPV6 1 ifndef UIP_CONF_IPV6_QUEUE_PKT define UIP_CONF_IPV6_QUEUE_PKT 0 endif /* UIP_CONF_IPV6_QUEUE_PKT */ define UIP_CONF_IPV6_CHECKS 1 define UIP_CONF_IPV6_REASSEMBLY 0 define UIP_CONF_NETIF_MAX_ADDRESSES 3 define UIP_CONF_ND6_MAX_PREFIXES 3 define UIP_CONF_ND6_MAX_DEFROUTERS 2 define UIP_CONF_IP_FORWARD 0 ifndef UIP_CONF_BUFFER_SIZE define UIP_CONF_BUFFER_SIZE 240 endif define SICSLOWPAN_CONF_COMPRESSION_IPV6 0 define SICSLOWPAN_CONF_COMPRESSION_HC1 1 define SICSLOWPAN_CONF_COMPRESSION_HC01 2 define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06 ifndef SICSLOWPAN_CONF_FRAG define SICSLOWPAN_CONF_FRAG 1 define SICSLOWPAN_CONF_MAXAGE 8 endif /* SICSLOWPAN_CONF_FRAG */ define SICSLOWPAN_CONF_CONVENTIONAL_MAC 1 define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 2 ifndef SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS define SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS 5 endif /* SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS */ else /* WITH_UIP6 */ define UIP_CONF_IP_FORWARD 1 define UIP_CONF_BUFFER_SIZE 108 endif /* WITH_UIP6 */ define UIP_CONF_ICMP_DEST_UNREACH 1 define UIP_CONF_DHCP_LIGHT define UIP_CONF_LLH_LEN 0 ifndef UIP_CONF_RECEIVE_WINDOW define UIP_CONF_RECEIVE_WINDOW 48 endif ifndef UIP_CONF_TCP_MSS define UIP_CONF_TCP_MSS 48 endif define UIP_CONF_MAX_CONNECTIONS 4 define UIP_CONF_MAX_LISTENPORTS 8 define UIP_CONF_UDP_CONNS 12 define UIP_CONF_FWCACHE_SIZE 30 define UIP_CONF_BROADCAST 1 define UIP_ARCH_IPCHKSUM 1 define UIP_CONF_UDP 1 define UIP_CONF_UDP_CHECKSUMS 1 define UIP_CONF_PINGADDRCONF 0 define UIP_CONF_LOGGING 0 define UIP_CONF_TCP_SPLIT 0 endif /* CONTIKI_CONF_H */
Testing the MAC Protocol changes
Fire up your Cooja simulator and run a TMote sky device. Confused?? Don’t worry! Follow this Cooja Hello World Tutorial to get started on Cooja simulations immediately. Check device configurations in Mote Output Tool discussed in Cooja Tools.

Node Id | 1 |
Network Stack | Rime |
MAC Protocol | CSMA |
Radio Duty Cycle (RDC) Protocol | ContkiMAC |
Sleep Cycle | 8 Hz |
Channel | 26 |
Md. Saifur Rahman is a Full Stack Django and Laravel Developer. Additionally, he loves to spend time learning and researching about the Internet of Things (IoT). He loves to share his work and contribute to helping fellow developers.