October 1, 2020
techflow-mac

Changing and running Different MAC Protocols in Cooja Contiki OS

The network stack in Contiki OS is a little different compared to the traditional TCP/IP network stack. In place of MAC Layer, we have three layers namely Framer, Radio Duty-Cycle (RDC) and Medium Access Control (MAC). The different layers can be changed by accessing the global variables NETSTACK_FRAMER, NETSTACK_RDC and NETSTACK_MAC. These variables can be found in core/net/netstack.h

LayerProtocols 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:-

  1. Network: rime_driver
  2. MAC: nullmac_driver
  3. RDC: nullrdc_driver
  4. Framer: framer_nullmac
  5. 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.

Cooja Sky Mote 1 Output
Node Id1
Network StackRime
MAC ProtocolCSMA
Radio Duty Cycle (RDC) ProtocolContkiMAC
Sleep Cycle8 Hz
Channel26

Saifur Rahman

Saifur Rahman is a Full Stack Laravel Developer. Additionally, he has spent a significant amount of time to learn and research in the domain of the Internet of Things (IoT). He loves to share his work and contribute to helping fellow developers. Saifur also runs the following websites and services - Pingsms.in and Techmion.com

View all posts by Saifur Rahman →

Leave a Reply

Your email address will not be published. Required fields are marked *