From 663d1f121dcc947d0d9767aba98028deb36de07b Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Thu, 12 Oct 2017 16:59:28 +0200 Subject: [PATCH] Autoconfigure Orchestra whenever the module is included --- arch/platform/cc2538dk/contiki-main.c | 6 ++++++ arch/platform/cooja/contiki-cooja-main.c | 6 ++++++ arch/platform/jn516x/contiki-jn516x-main.c | 6 ++++++ arch/platform/native/contiki-main.c | 6 ++++++ arch/platform/nrf52dk/contiki-main.c | 6 ++++++ arch/platform/openmote-cc2538/contiki-main.c | 6 ++++++ arch/platform/sky/contiki-sky-main.c | 6 ++++++ arch/platform/srf06-cc26xx/contiki-main.c | 6 ++++++ arch/platform/zoul/contiki-main.c | 6 ++++++ examples/ipv6/rpl-tsch-sixtop/project-conf.h | 1 - examples/ipv6/rpl-tsch/Makefile | 4 ++-- examples/ipv6/rpl-tsch/node.c | 7 ------- examples/ipv6/rpl-tsch/project-conf.h | 19 ------------------- .../jn516x/rpl/common-conf.h | 19 ------------------- .../jn516x/tsch/common-conf.h | 7 ------- .../jn516x/tsch/tools/rpl-tools.c | 5 ----- os/net/ipv6/uip-ds6-route.c | 12 ++++++++++++ os/net/mac/tsch/tsch-conf.h | 2 +- os/net/mac/tsch/tsch-queue.h | 12 ++++++++++++ os/net/mac/tsch/tsch-schedule.h | 2 +- os/services/orchestra/Makefile.orchestra | 1 + os/services/orchestra/orchestra-conf.h | 2 +- 22 files changed, 84 insertions(+), 63 deletions(-) create mode 100644 os/services/orchestra/Makefile.orchestra diff --git a/arch/platform/cc2538dk/contiki-main.c b/arch/platform/cc2538dk/contiki-main.c index d258fb26a..4ac32a2af 100644 --- a/arch/platform/cc2538dk/contiki-main.c +++ b/arch/platform/cc2538dk/contiki-main.c @@ -68,6 +68,9 @@ #include "reg.h" #include "ieee-addr.h" #include "lpm.h" +#if BUILD_WITH_ORCHESTRA +#include "orchestra.h" +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL #include "serial-shell.h" #endif /* BUILD_WITH_SHELL */ @@ -227,6 +230,9 @@ main(void) energest_init(); ENERGEST_ON(ENERGEST_TYPE_CPU); +#if BUILD_WITH_ORCHESTRA + orchestra_init(); +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL serial_shell_init(); #endif /* BUILD_WITH_SHELL */ diff --git a/arch/platform/cooja/contiki-cooja-main.c b/arch/platform/cooja/contiki-cooja-main.c index bdef04128..f39d3fbb1 100644 --- a/arch/platform/cooja/contiki-cooja-main.c +++ b/arch/platform/cooja/contiki-cooja-main.c @@ -61,6 +61,9 @@ #include "dev/vib-sensor.h" #include "sys/node-id.h" +#if BUILD_WITH_ORCHESTRA +#include "orchestra.h" +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL #include "serial-shell.h" #endif /* BUILD_WITH_SHELL */ @@ -260,6 +263,9 @@ contiki_init() /* Start serial process */ serial_line_init(); +#if BUILD_WITH_ORCHESTRA + orchestra_init(); +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL serial_shell_init(); #endif /* BUILD_WITH_SHELL */ diff --git a/arch/platform/jn516x/contiki-jn516x-main.c b/arch/platform/jn516x/contiki-jn516x-main.c index a50328bd4..af1ce5f94 100644 --- a/arch/platform/jn516x/contiki-jn516x-main.c +++ b/arch/platform/jn516x/contiki-jn516x-main.c @@ -96,6 +96,9 @@ extern uint32_t heap_location; #include "experiment-setup.h" #endif +#if BUILD_WITH_ORCHESTRA +#include "orchestra.h" +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL #include "serial-shell.h" #endif /* BUILD_WITH_SHELL */ @@ -350,6 +353,9 @@ main(void) auto-start processes */ (void)u32AHI_Init(); +#if BUILD_WITH_ORCHESTRA + orchestra_init(); +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL serial_shell_init(); #endif /* BUILD_WITH_SHELL */ diff --git a/arch/platform/native/contiki-main.c b/arch/platform/native/contiki-main.c index 148a13ef6..344713479 100644 --- a/arch/platform/native/contiki-main.c +++ b/arch/platform/native/contiki-main.c @@ -69,6 +69,9 @@ #include "net/ipv6/uip-ds6.h" #endif /* NETSTACK_CONF_WITH_IPV6 */ +#if BUILD_WITH_ORCHESTRA +#include "orchestra.h" +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL #include "serial-shell.h" #endif /* BUILD_WITH_SHELL */ @@ -278,6 +281,9 @@ main(int argc, char **argv) serial_line_init(); +#if BUILD_WITH_ORCHESTRA + orchestra_init(); +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL serial_shell_init(); #endif /* BUILD_WITH_SHELL */ diff --git a/arch/platform/nrf52dk/contiki-main.c b/arch/platform/nrf52dk/contiki-main.c index d676718f8..35d4ddf94 100644 --- a/arch/platform/nrf52dk/contiki-main.c +++ b/arch/platform/nrf52dk/contiki-main.c @@ -69,6 +69,9 @@ #endif #endif +#if BUILD_WITH_ORCHESTRA +#include "orchestra.h" +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL #include "serial-shell.h" #endif /* BUILD_WITH_SHELL */ @@ -183,6 +186,9 @@ main(void) process_start(&sensors_process, NULL); +#if BUILD_WITH_ORCHESTRA + orchestra_init(); +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL serial_shell_init(); #endif /* BUILD_WITH_SHELL */ diff --git a/arch/platform/openmote-cc2538/contiki-main.c b/arch/platform/openmote-cc2538/contiki-main.c index aa8996939..8ddaeea73 100644 --- a/arch/platform/openmote-cc2538/contiki-main.c +++ b/arch/platform/openmote-cc2538/contiki-main.c @@ -72,6 +72,9 @@ #include "ieee-addr.h" #include "lpm.h" +#if BUILD_WITH_ORCHESTRA +#include "orchestra.h" +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL #include "serial-shell.h" #endif /* BUILD_WITH_SHELL */ @@ -224,6 +227,9 @@ main(void) energest_init(); ENERGEST_ON(ENERGEST_TYPE_CPU); +#if BUILD_WITH_ORCHESTRA + orchestra_init(); +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL serial_shell_init(); #endif /* BUILD_WITH_SHELL */ diff --git a/arch/platform/sky/contiki-sky-main.c b/arch/platform/sky/contiki-sky-main.c index 212b932ba..22947af37 100644 --- a/arch/platform/sky/contiki-sky-main.c +++ b/arch/platform/sky/contiki-sky-main.c @@ -53,6 +53,9 @@ #include "cfs/cfs-coffee.h" #include "sys/autostart.h" +#if BUILD_WITH_ORCHESTRA +#include "orchestra.h" +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL #include "serial-shell.h" #endif /* BUILD_WITH_SHELL */ @@ -310,6 +313,9 @@ main(int argc, char **argv) watchdog_start(); +#if BUILD_WITH_ORCHESTRA + orchestra_init(); +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL serial_shell_init(); #endif /* BUILD_WITH_SHELL */ diff --git a/arch/platform/srf06-cc26xx/contiki-main.c b/arch/platform/srf06-cc26xx/contiki-main.c index 7680b6d97..cfd33ea06 100644 --- a/arch/platform/srf06-cc26xx/contiki-main.c +++ b/arch/platform/srf06-cc26xx/contiki-main.c @@ -71,6 +71,9 @@ #include "driverlib/driverlib_release.h" +#if BUILD_WITH_ORCHESTRA +#include "orchestra.h" +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL #include "serial-shell.h" #endif /* BUILD_WITH_SHELL */ @@ -230,6 +233,9 @@ main(void) process_start(&sensors_process, NULL); +#if BUILD_WITH_ORCHESTRA + orchestra_init(); +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL serial_shell_init(); #endif /* BUILD_WITH_SHELL */ diff --git a/arch/platform/zoul/contiki-main.c b/arch/platform/zoul/contiki-main.c index a6a763d1a..bd46cb809 100644 --- a/arch/platform/zoul/contiki-main.c +++ b/arch/platform/zoul/contiki-main.c @@ -71,6 +71,9 @@ #include "ieee-addr.h" #include "lpm.h" #include "sys/autostart.h" +#if BUILD_WITH_ORCHESTRA +#include "orchestra.h" +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL #include "serial-shell.h" #endif /* BUILD_WITH_SHELL */ @@ -289,6 +292,9 @@ main(void) energest_init(); ENERGEST_ON(ENERGEST_TYPE_CPU); +#if BUILD_WITH_ORCHESTRA + orchestra_init(); +#endif /* BUILD_WITH_ORCHESTRA */ #if BUILD_WITH_SHELL serial_shell_init(); #endif /* BUILD_WITH_SHELL */ diff --git a/examples/ipv6/rpl-tsch-sixtop/project-conf.h b/examples/ipv6/rpl-tsch-sixtop/project-conf.h index 6ce893bd7..ff8b96ad7 100755 --- a/examples/ipv6/rpl-tsch-sixtop/project-conf.h +++ b/examples/ipv6/rpl-tsch-sixtop/project-conf.h @@ -41,7 +41,6 @@ /*******************************************************/ #define UIP_CONF_MAX_ROUTES 0 /* No need for routes */ #define RPL_CONF_MOP RPL_MOP_NON_STORING /* Mode of operation*/ -#define ORCHESTRA_CONF_RULES { &eb_per_time_source, &unicast_per_neighbor_rpl_ns, &default_common } /* Orchestra in non-storing */ /*******************************************************/ /********************* Enable TSCH *********************/ diff --git a/examples/ipv6/rpl-tsch/Makefile b/examples/ipv6/rpl-tsch/Makefile index 1986812ce..e6cb76944 100644 --- a/examples/ipv6/rpl-tsch/Makefile +++ b/examples/ipv6/rpl-tsch/Makefile @@ -8,10 +8,10 @@ MAKE_WITH_SECURITY ?= 0 # force Security from command line MAKE_WITH_PERIODIC_ROUTES_PRINT ?= 0 # print #routes periodically, used for regression tests MAKE_MAC = MAKE_MAC_TSCH -MODULES += os/services/shell os/services/orchestra +MODULES += os/services/shell ifeq ($(MAKE_WITH_ORCHESTRA),1) -CFLAGS += -DWITH_ORCHESTRA=1 +MODULES += os/services/orchestra endif ifeq ($(MAKE_WITH_SECURITY),1) diff --git a/examples/ipv6/rpl-tsch/node.c b/examples/ipv6/rpl-tsch/node.c index 297c46637..b27157783 100644 --- a/examples/ipv6/rpl-tsch/node.c +++ b/examples/ipv6/rpl-tsch/node.c @@ -47,9 +47,6 @@ #if UIP_CONF_IPV6_RPL_LITE == 0 #include "rpl-private.h" #endif /* UIP_CONF_IPV6_RPL_LITE == 0 */ -#if WITH_ORCHESTRA -#include "orchestra.h" -#endif /* WITH_ORCHESTRA */ #if WITH_SHELL #include "serial-shell.h" #endif /* WITH_SHELL */ @@ -85,10 +82,6 @@ PROCESS_THREAD(node_process, ev, data) } NETSTACK_MAC.on(); -#if WITH_ORCHESTRA - orchestra_init(); -#endif /* WITH_ORCHESTRA */ - #if WITH_PERIODIC_ROUTES_PRINT { static struct etimer et; diff --git a/examples/ipv6/rpl-tsch/project-conf.h b/examples/ipv6/rpl-tsch/project-conf.h index dab7407f4..b40eca3c1 100644 --- a/examples/ipv6/rpl-tsch/project-conf.h +++ b/examples/ipv6/rpl-tsch/project-conf.h @@ -38,11 +38,6 @@ /* Set to use the Contiki shell */ #define WITH_SHELL 1 -/* Set to run orchestra */ -#ifndef WITH_ORCHESTRA -#define WITH_ORCHESTRA 0 -#endif /* WITH_ORCHESTRA */ - /* Set to enable TSCH security */ #ifndef WITH_SECURITY #define WITH_SECURITY 0 @@ -53,7 +48,6 @@ /*******************************************************/ #define RPL_CONF_MOP RPL_MOP_NON_STORING /* Mode of operation*/ -#define ORCHESTRA_CONF_RULES { &eb_per_time_source, &unicast_per_neighbor_rpl_ns, &default_common } /* Orchestra in non-storing */ /*******************************************************/ /********************* Configure TSCH *********************/ @@ -88,19 +82,6 @@ #endif /* WITH_SECURITY */ -#if WITH_ORCHESTRA - -/* See os/services//orchestra/README.md for more Orchestra configuration options */ -#define TSCH_SCHEDULE_CONF_WITH_6TISCH_MINIMAL 0 /* No 6TiSCH minimal schedule */ -#define TSCH_CONF_WITH_LINK_SELECTOR 1 /* Orchestra requires per-packet link selection */ -/* Orchestra callbacks */ -#define TSCH_CALLBACK_NEW_TIME_SOURCE orchestra_callback_new_time_source -#define TSCH_CALLBACK_PACKET_READY orchestra_callback_packet_ready -#define NETSTACK_CONF_ROUTING_NEIGHBOR_ADDED_CALLBACK orchestra_callback_child_added -#define NETSTACK_CONF_ROUTING_NEIGHBOR_REMOVED_CALLBACK orchestra_callback_child_removed - -#endif /* WITH_ORCHESTRA */ - /*******************************************************/ /************* Other system configuration **************/ /*******************************************************/ diff --git a/examples/platform-specific/jn516x/rpl/common-conf.h b/examples/platform-specific/jn516x/rpl/common-conf.h index d82be3963..daa66ae29 100644 --- a/examples/platform-specific/jn516x/rpl/common-conf.h +++ b/examples/platform-specific/jn516x/rpl/common-conf.h @@ -43,11 +43,6 @@ #elif MAC_CONFIG == MAC_CONFIG_TSCH -/* Set to run orchestra */ -#ifndef WITH_ORCHESTRA -#define WITH_ORCHESTRA 0 -#endif /* WITH_ORCHESTRA */ - /* Set to enable TSCH security */ #ifndef WITH_SECURITY #define WITH_SECURITY 0 @@ -67,20 +62,6 @@ #endif /* WITH_SECURITY */ -#if WITH_ORCHESTRA - -/* See os/services/orchestra/README.md for more Orchestra configuration options */ -#define TSCH_SCHEDULE_CONF_WITH_6TISCH_MINIMAL 0 /* No 6TiSCH minimal schedule */ -#define TSCH_CONF_WITH_LINK_SELECTOR 1 /* Orchestra requires per-packet link selection */ -/* Orchestra callbacks */ -#define TSCH_CALLBACK_NEW_TIME_SOURCE orchestra_callback_new_time_source -#define TSCH_CALLBACK_PACKET_READY orchestra_callback_packet_ready -#define NETSTACK_CONF_ROUTING_NEIGHBOR_ADDED_CALLBACK orchestra_callback_child_added -#define NETSTACK_CONF_ROUTING_NEIGHBOR_REMOVED_CALLBACK orchestra_callback_child_removed - -#endif /* WITH_ORCHESTRA */ - - #else #error Unsupported MAC configuration diff --git a/examples/platform-specific/jn516x/tsch/common-conf.h b/examples/platform-specific/jn516x/tsch/common-conf.h index 232c9f404..39d012d52 100644 --- a/examples/platform-specific/jn516x/tsch/common-conf.h +++ b/examples/platform-specific/jn516x/tsch/common-conf.h @@ -58,13 +58,6 @@ #define TSCH_CONF_EB_PERIOD (4 * CLOCK_SECOND) #define TSCH_CONF_KEEPALIVE_TIMEOUT (24 * CLOCK_SECOND) -#define TSCH_SCHEDULE_CONF_WITH_6TISCH_MINIMAL 0 -#define TSCH_CONF_WITH_LINK_SELECTOR 1 -#define TSCH_CALLBACK_NEW_TIME_SOURCE orchestra_callback_new_time_source -#define TSCH_CALLBACK_PACKET_READY orchestra_callback_packet_ready -#define NETSTACK_CONF_ROUTING_NEIGHBOR_ADDED_CALLBACK orchestra_callback_child_added -#define NETSTACK_CONF_ROUTING_NEIGHBOR_REMOVED_CALLBACK orchestra_callback_child_removed - /* Dimensioning */ #define ORCHESTRA_CONF_EBSF_PERIOD 41 #define ORCHESTRA_CONF_COMMON_SHARED_PERIOD 7 /* Common shared slot, 7 is a very short slotframe (high energy, high capacity). Must be prime and at least equal to number of nodes (incl. BR) */ diff --git a/examples/platform-specific/jn516x/tsch/tools/rpl-tools.c b/examples/platform-specific/jn516x/tsch/tools/rpl-tools.c index 7973982ff..e71a19bc9 100644 --- a/examples/platform-specific/jn516x/tsch/tools/rpl-tools.c +++ b/examples/platform-specific/jn516x/tsch/tools/rpl-tools.c @@ -38,7 +38,6 @@ #include "net/ipv6/uip.h" #include "rpl.h" #include "rpl-dag-root.h" -#include "orchestra.h" #include #include @@ -109,10 +108,6 @@ print_local_addresses(void) void rpl_tools_init(uip_ipaddr_t *br_prefix) { -#if TSCH_CONFIG == TSCH_CONFIG_ORCHESTRA - orchestra_init(); -#endif - if(br_prefix) { /* We are root */ rpl_dag_root_init(br_prefix, NULL); rpl_dag_root_init_dag_immediately(); diff --git a/os/net/ipv6/uip-ds6-route.c b/os/net/ipv6/uip-ds6-route.c index e8327583a..9321b632c 100644 --- a/os/net/ipv6/uip-ds6-route.c +++ b/os/net/ipv6/uip-ds6-route.c @@ -51,6 +51,18 @@ #define LOG_MODULE "IPv6 Route" #define LOG_LEVEL LOG_LEVEL_IPV6 +#if BUILD_WITH_ORCHESTRA + +#ifndef NETSTACK_CONF_ROUTING_NEIGHBOR_ADDED_CALLBACK +#define NETSTACK_CONF_ROUTING_NEIGHBOR_ADDED_CALLBACK orchestra_callback_child_added +#endif /* NETSTACK_CONF_ROUTING_NEIGHBOR_ADDED_CALLBACK */ + +#ifndef NETSTACK_CONF_ROUTING_NEIGHBOR_REMOVED_CALLBACK +#define NETSTACK_CONF_ROUTING_NEIGHBOR_REMOVED_CALLBACK orchestra_callback_child_removed +#endif /* NETSTACK_CONF_ROUTING_NEIGHBOR_REMOVED_CALLBACK */ + +#endif /* BUILD_WITH_ORCHESTRA */ + /* A configurable function called after adding a new neighbor as next hop */ #ifdef NETSTACK_CONF_ROUTING_NEIGHBOR_ADDED_CALLBACK void NETSTACK_CONF_ROUTING_NEIGHBOR_ADDED_CALLBACK(const linkaddr_t *addr); diff --git a/os/net/mac/tsch/tsch-conf.h b/os/net/mac/tsch/tsch-conf.h index f7657f7d6..2934738b8 100644 --- a/os/net/mac/tsch/tsch-conf.h +++ b/os/net/mac/tsch/tsch-conf.h @@ -172,7 +172,7 @@ #ifdef TSCH_CONF_WITH_LINK_SELECTOR #define TSCH_WITH_LINK_SELECTOR TSCH_CONF_WITH_LINK_SELECTOR #else /* TSCH_CONF_WITH_LINK_SELECTOR */ -#define TSCH_WITH_LINK_SELECTOR 0 +#define TSCH_WITH_LINK_SELECTOR (BUILD_WITH_ORCHESTRA) #endif /* TSCH_CONF_WITH_LINK_SELECTOR */ /* Estimate the drift of the time-source neighbor and compensate for it? */ diff --git a/os/net/mac/tsch/tsch-queue.h b/os/net/mac/tsch/tsch-queue.h index fad8630c1..037461e7d 100644 --- a/os/net/mac/tsch/tsch-queue.h +++ b/os/net/mac/tsch/tsch-queue.h @@ -104,6 +104,18 @@ /*********** Callbacks *********/ +#if BUILD_WITH_ORCHESTRA + +#ifndef TSCH_CALLBACK_NEW_TIME_SOURCE +#define TSCH_CALLBACK_NEW_TIME_SOURCE orchestra_callback_new_time_source +#endif /* TSCH_CALLBACK_NEW_TIME_SOURCE */ + +#ifndef TSCH_CALLBACK_PACKET_READY +#define TSCH_CALLBACK_PACKET_READY orchestra_callback_packet_ready +#endif /* TSCH_CALLBACK_PACKET_READY */ + +#endif /* BUILD_WITH_ORCHESTRA */ + /* Called by TSCH when switching time source */ #ifdef TSCH_CALLBACK_NEW_TIME_SOURCE struct tsch_neighbor; diff --git a/os/net/mac/tsch/tsch-schedule.h b/os/net/mac/tsch/tsch-schedule.h index 206b40aab..12699b0e3 100644 --- a/os/net/mac/tsch/tsch-schedule.h +++ b/os/net/mac/tsch/tsch-schedule.h @@ -53,7 +53,7 @@ #ifdef TSCH_SCHEDULE_CONF_WITH_6TISCH_MINIMAL #define TSCH_SCHEDULE_WITH_6TISCH_MINIMAL TSCH_SCHEDULE_CONF_WITH_6TISCH_MINIMAL #else -#define TSCH_SCHEDULE_WITH_6TISCH_MINIMAL 1 +#define TSCH_SCHEDULE_WITH_6TISCH_MINIMAL (!(BUILD_WITH_ORCHESTRA)) #endif /* 6TiSCH Minimal schedule slotframe length */ diff --git a/os/services/orchestra/Makefile.orchestra b/os/services/orchestra/Makefile.orchestra new file mode 100644 index 000000000..0cdff2688 --- /dev/null +++ b/os/services/orchestra/Makefile.orchestra @@ -0,0 +1 @@ +CFLAGS += -DBUILD_WITH_ORCHESTRA=1 diff --git a/os/services/orchestra/orchestra-conf.h b/os/services/orchestra/orchestra-conf.h index d8116ff16..a23b31f9b 100644 --- a/os/services/orchestra/orchestra-conf.h +++ b/os/services/orchestra/orchestra-conf.h @@ -46,7 +46,7 @@ * - a sender-based or receiver-based slotframe for unicast to RPL parents and children * - a common shared slotframe for any other traffic (mostly broadcast) * */ -#define ORCHESTRA_RULES { &eb_per_time_source, &unicast_per_neighbor_rpl_storing, &default_common } +#define ORCHESTRA_RULES { &eb_per_time_source, &unicast_per_neighbor_rpl_ns, &default_common } /* Example configuration for RPL non-storing mode: */ /* #define ORCHESTRA_RULES { &eb_per_time_source, &unicast_per_neighbor_rpl_ns, &default_common } */