diff --git a/cpu/Makefile b/cpu/Makefile index 19c8c895337e9dfcf4fd4bcfdf84d050dbc94473..88427b8e839460884aca2ebda00e781ae333637f 100644 --- a/cpu/Makefile +++ b/cpu/Makefile @@ -2,10 +2,6 @@ ifeq ($(CPU),lpc2387) DIRS = arm_common lpc_common lpc2387 endif -ifeq ($(CPU),lpc214x) - DIRS = arm_common lpc_common lpc214x -endif - ifeq ($(CPU),mc1322x) DIRS = arm_common mc1322x endif diff --git a/cpu/Makefile.base b/cpu/Makefile.base index bdac81639b60fc7af2d08d78acdb27b8a00fd236..f39482ad04c3fd47c4bbbe210d697fe9eee0cabf 100644 --- a/cpu/Makefile.base +++ b/cpu/Makefile.base @@ -3,11 +3,6 @@ ifeq ($(CPU),lpc2387) INCLUDES += -I$(MAKEBASE)/cpu/lpc_common/include/ INCLUDES += -I$(MAKEBASE)/cpu/lpc2387/include endif -ifeq ($(CPU),lpc214x) - INCLUDES += -I$(MAKEBASE)/cpu/arm_common/include/ - INCLUDES += -I$(MAKEBASE)/cpu/lpc_common/include/ - INCLUDES += -I$(MAKEBASE)/cpu/lpc214x/include -endif ifeq ($(CPU),mc1322x) INCLUDES += -I$(MAKEBASE)/cpu/arm_common/include/ INCLUDES += -I$(MAKEBASE)/cpu/mc1322x/include diff --git a/cpu/Makefile.include b/cpu/Makefile.include index 3cf0e0184d8abdd48fc33b2cabd816a4d96ea118..0f01f6df09b636eb0f5580f3de8ae3fcc4f96850 100644 --- a/cpu/Makefile.include +++ b/cpu/Makefile.include @@ -5,12 +5,6 @@ ifeq ($(CPU),lpc2387) export INCLUDES += -I$(RIOTCPU)/arm_common/include export INCLUDES += -I$(RIOTCPU)/lpc_common/include endif -ifeq ($(CPU),lpc214x) - export USEMODULE += arm_common lpc_common - export UNDEF += $(BINDIR)syscalls.o $(BINDIR)lpc_syscalls.o - export INCLUDES += -I$(RIOTCPU)/arm_common/include - export INCLUDES += -I$(RIOTCPU)/lpc_common/include -endif ifeq ($(CPU),mc1322x) export USEMODULE += arm_common export UNDEF += $(BINDIR)syscalls.o diff --git a/cpu/arm_common/common.s b/cpu/arm_common/common.s index f296f51dd108cce18721a0fb7e2ae8f84b26ff4c..66646adef4aaa6a8b0f1e72367d5fa6378a500c1 100644 --- a/cpu/arm_common/common.s +++ b/cpu/arm_common/common.s @@ -139,10 +139,6 @@ arm_irq_handler: /* jump into vic interrupt */ mov r0, #0xffffff00 /* lpc23xx */ -.ifdef lpc214x - sub r0, r0, #0xed0 /* lpc214x won't accept non-8bit aligned constant... */ -.endif - ldr r0, [r0] add lr,pc,#4 mov pc, r0 diff --git a/cpu/arm_common/syscalls.c b/cpu/arm_common/syscalls.c index 9441ddc693290105814c41e23f9600a07604e89c..6d329d2b8b3a73be2f57dd63ee90fa9930baf3c0 100644 --- a/cpu/arm_common/syscalls.c +++ b/cpu/arm_common/syscalls.c @@ -67,10 +67,6 @@ extern uintptr_t __heap3_max; ///< maximum for end of heap memory space /*-----------------------------------------------------------------------------------*/ void __assert_func(const char *file, int line, const char *func, const char *failedexpr) { -#if SYSLOG_CONF_ASSERT - trace_number(TRACELOG_EV_ASSERTION, line); - syslog(SL_EMERGENCY, "assert", "%s() in %s:%u\n", func, file, line); -#endif printf("#!assertion %s failed\n\t%s() in %s:%u\n", failedexpr, func, file, line); _exit(3); } @@ -253,9 +249,6 @@ int _unlink_r(struct _reent *r, char *path) /*---------------------------------------------------------------------------*/ void _exit(int n) { -#ifdef MODULE_TRACELOG - trace_number(TRACELOG_EV_EXIT, n); -#endif printf("#!exit %i: resetting\n", n); stdio_flush(); diff --git a/cpu/lpc214x/Makefile b/cpu/lpc214x/Makefile deleted file mode 100644 index a281d08a000586b79300fef3d5b18b499f356d21..0000000000000000000000000000000000000000 --- a/cpu/lpc214x/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -SRC = blocklist.c kernel_init.c msg.c scheduler.c blocklist_malloc.c ktimer.c mutex.c thread.c clist.c queue.c -OBJ = $(SRC:%.c=../bin/%.o) - -INCLUDES = -Iinclude/ -I../sys/include -I../sys/lib -I../sys/drivers/include -I../cpu/$(CPU)/include/ - -ifeq ($(CPU),lpc2387) - INCLUDES += -I../cpu/arm_common/include/ - CPUINCLUDE = -includecpu-conf.h -endif -ifeq ($(CPU),lpc214x) - INCLUDES += -I../cpu/arm_common/include/ -endif - -../bin/core.a: $(OBJ) - $(AR) rcs ../bin/core.a $(OBJ) - -# pull in dependency info for *existing* .o files --include $(OBJ:.o=.d) - -# compile and generate dependency info -../bin/%.o: %.c - $(CC) $(CFLAGS) $(INCLUDES) $(CPUINCLUDE) -c $*.c -o ../bin/$*.o - $(CC) $(CFLAGS) $(INCLUDES) $(CPUINCLUDE) -MM $*.c > ../bin/$*.d - @printf "../bin/"|cat - ../bin/$*.d > /tmp/fw_out && mv /tmp/fw_out ../bin/$*.d - -# remove compilation products -clean: - rm -f ../bin/core.a ../bin/*.o ../bin/*.d - - - - diff --git a/cpu/lpc214x/cpu.c b/cpu/lpc214x/cpu.c deleted file mode 100644 index 1c89e625be899c847567fd66500ba4e91691b7c0..0000000000000000000000000000000000000000 --- a/cpu/lpc214x/cpu.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "cpu.h" -#include "bits.h" -#include "VIC.h" - -void cpu_clock_scale(uint32_t source, uint32_t target, uint32_t *prescale) -{ - *prescale = source / PCLK_DIV / target; -} - -/****************************************************************************** -** Function name: install_irq -** -** Descriptions: Install interrupt handler -** parameters: Interrupt number, interrupt handler address, -** interrupt priority -** Returned value: true or false, return false if IntNum is out of range -** -******************************************************************************/ -#define VIC_BASE_ADDR 0xFFFFF000 - -bool cpu_install_irq(int IntNumber, void *HandlerAddr, int Priority) -{ - int *vect_addr; - int *vect_cntl; - - VICIntEnClear = 1 << IntNumber; /* Disable Interrupt */ - - if (IntNumber >= VIC_SIZE) { - return (false); - } - else { - /* find first un-assigned VIC address for the handler */ - vect_addr = (int *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + Priority * 4); - vect_cntl = (int *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + Priority * 4); - - *vect_addr = (int)HandlerAddr; /* set interrupt vector */ - *vect_cntl = IntNumber + BIT5; - VICIntEnable = 1 << IntNumber; /* Enable Interrupt */ - return(true); - } -} diff --git a/cpu/lpc214x/include/cpu.h b/cpu/lpc214x/include/cpu.h deleted file mode 100644 index 1531fec8641d897390babac8d52f625398d3eab2..0000000000000000000000000000000000000000 --- a/cpu/lpc214x/include/cpu.h +++ /dev/null @@ -1,19 +0,0 @@ -/****************************************************************************** -Copyright 2009, Freie Universitaet Berlin (FUB). All rights reserved. - -These sources were developed at the Freie Universitaet Berlin, Computer Systems -and Telematics group (http://cst.mi.fu-berlin.de). -------------------------------------------------------------------------------- -This file is part of RIOT. - -This file subject to the terms and conditions of the GNU Lesser General Public -License. See the file LICENSE in the top level directory for more details. -*******************************************************************************/ - -#ifndef __CPU_H -#define __CPU_H - -#include "arm_cpu.h" -#include "lpc2148.h" - -#endif /* __CPU_H */ diff --git a/cpu/lpc214x/include/lpc2148.h b/cpu/lpc214x/include/lpc2148.h deleted file mode 100644 index 5b56818ca16cf08e56e66026bb3cba3a8416f125..0000000000000000000000000000000000000000 --- a/cpu/lpc214x/include/lpc2148.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * lpc2148.h - * - * Copyright (C) 2009 Kaspar Schleiser <kaspar@schleiser.de> - * - * Parts taken from FeuerWhere-Project, lpc2148.h. - */ - -#ifndef __LPC2148_H -#define __LPC2148_H - -#include "lpc214x.h" - -#define F_CCO 240000000 -#define CL_CPU_DIV 4 ///< CPU clock divider -#define F_CPU (F_CCO / CL_CPU_DIV) ///< CPU target speed in Hz -#define F_RC_OSCILLATOR 12000000 ///< Frequency of internal RC oscillator -#define F_RTC_OSCILLATOR 32767 ///< Frequency of RTC oscillator -#define PCLK_DIV 0x2 ///< PCLK clock divider, F_CPU/PCLK_DIV=PCLK - -#define VIC_SIZE 16 - -#endif // __LPC2148_H - diff --git a/cpu/lpc214x/include/lpc214x.h b/cpu/lpc214x/include/lpc214x.h deleted file mode 100644 index ce9e8c1f017938f3a0fbba419190cd9cbb8d27c5..0000000000000000000000000000000000000000 --- a/cpu/lpc214x/include/lpc214x.h +++ /dev/null @@ -1,428 +0,0 @@ -/* Copyright (C) 2005, 2006, 2007, 2008 by Thomas Hillebrandt and Heiko Will - -This file is part of RIOT. - -This file subject to the terms and conditions of the GNU Lesser General -Public License. See the file LICENSE in the top level directory for more -details. -*/ - -/* As a special exception, if you include this header file into source - files compiled by GCC, this header file does not by itself cause - the resulting executable to be covered by the GNU Lesser General Public - License. This exception does not however invalidate any other - reasons why the executable file might be covered by the GNU Lesser General - Public License. */ - -#ifndef __LPC214x_H -#define __LPC214x_H -#define BIT0 0x00000001 -#define BIT1 0x00000002 -#define BIT2 0x00000004 -#define BIT3 0x00000008 -#define BIT4 0x00000010 -#define BIT5 0x00000020 -#define BIT6 0x00000040 -#define BIT7 0x00000080 -#define BIT8 0x00000100 -#define BIT9 0x00000200 -#define BIT10 0x00000400 -#define BIT11 0x00000800 -#define BIT12 0x00001000 -#define BIT13 0x00002000 -#define BIT14 0x00004000 -#define BIT15 0x00008000 -#define BIT16 0x00010000 -#define BIT17 0x00020000 -#define BIT18 0x00040000 -#define BIT19 0x00080000 -#define BIT20 0x00100000 -#define BIT21 0x00200000 -#define BIT22 0x00400000 -#define BIT23 0x00800000 -#define BIT24 0x01000000 -#define BIT25 0x02000000 -#define BIT26 0x04000000 -#define BIT27 0x08000000 -#define BIT28 0x10000000 -#define BIT29 0x20000000 -#define BIT30 0x40000000 -#define BIT31 0x80000000 - -/* Vectored Interrupt Controller (VIC) */ -#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) -#define VICFIQStatus (*((volatile unsigned long *) 0xFFFFF004)) -#define VICRawIntr (*((volatile unsigned long *) 0xFFFFF008)) -#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C)) -#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010)) -#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014)) -#define VICIntEnClear (*((volatile unsigned long *) 0xFFFFF014)) -#define VICSoftInt (*((volatile unsigned long *) 0xFFFFF018)) -#define VICSoftIntClr (*((volatile unsigned long *) 0xFFFFF01C)) -#define VICProtection (*((volatile unsigned long *) 0xFFFFF020)) -#define VICVectAddr (*((volatile unsigned long *) 0xFFFFF030)) -#define VICDefVectAddr (*((volatile unsigned long *) 0xFFFFF034)) -#define VICVectAddr0 (*((volatile unsigned long *) 0xFFFFF100)) -#define VICVectAddr1 (*((volatile unsigned long *) 0xFFFFF104)) -#define VICVectAddr2 (*((volatile unsigned long *) 0xFFFFF108)) -#define VICVectAddr3 (*((volatile unsigned long *) 0xFFFFF10C)) -#define VICVectAddr4 (*((volatile unsigned long *) 0xFFFFF110)) -#define VICVectAddr5 (*((volatile unsigned long *) 0xFFFFF114)) -#define VICVectAddr6 (*((volatile unsigned long *) 0xFFFFF118)) -#define VICVectAddr7 (*((volatile unsigned long *) 0xFFFFF11C)) -#define VICVectAddr8 (*((volatile unsigned long *) 0xFFFFF120)) -#define VICVectAddr9 (*((volatile unsigned long *) 0xFFFFF124)) -#define VICVectAddr10 (*((volatile unsigned long *) 0xFFFFF128)) -#define VICVectAddr11 (*((volatile unsigned long *) 0xFFFFF12C)) -#define VICVectAddr12 (*((volatile unsigned long *) 0xFFFFF130)) -#define VICVectAddr13 (*((volatile unsigned long *) 0xFFFFF134)) -#define VICVectAddr14 (*((volatile unsigned long *) 0xFFFFF138)) -#define VICVectAddr15 (*((volatile unsigned long *) 0xFFFFF13C)) -#define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200)) -#define VICVectCntl1 (*((volatile unsigned long *) 0xFFFFF204)) -#define VICVectCntl2 (*((volatile unsigned long *) 0xFFFFF208)) -#define VICVectCntl3 (*((volatile unsigned long *) 0xFFFFF20C)) -#define VICVectCntl4 (*((volatile unsigned long *) 0xFFFFF210)) -#define VICVectCntl5 (*((volatile unsigned long *) 0xFFFFF214)) -#define VICVectCntl6 (*((volatile unsigned long *) 0xFFFFF218)) -#define VICVectCntl7 (*((volatile unsigned long *) 0xFFFFF21C)) -#define VICVectCntl8 (*((volatile unsigned long *) 0xFFFFF220)) -#define VICVectCntl9 (*((volatile unsigned long *) 0xFFFFF224)) -#define VICVectCntl10 (*((volatile unsigned long *) 0xFFFFF228)) -#define VICVectCntl11 (*((volatile unsigned long *) 0xFFFFF22C)) -#define VICVectCntl12 (*((volatile unsigned long *) 0xFFFFF230)) -#define VICVectCntl13 (*((volatile unsigned long *) 0xFFFFF234)) -#define VICVectCntl14 (*((volatile unsigned long *) 0xFFFFF238)) -#define VICVectCntl15 (*((volatile unsigned long *) 0xFFFFF23C)) - -/* Pin Connect Block */ -#define PINSEL0 (*((volatile unsigned long *) 0xE002C000)) -#define PINSEL1 (*((volatile unsigned long *) 0xE002C004)) -#define PINSEL2 (*((volatile unsigned long *) 0xE002C014)) - -/* General Purpose Input/Output (GPIO) */ -#define IOPIN0 (*((volatile unsigned long *) 0xE0028000)) -#define IOSET0 (*((volatile unsigned long *) 0xE0028004)) -#define IODIR0 (*((volatile unsigned long *) 0xE0028008)) -#define IOCLR0 (*((volatile unsigned long *) 0xE002800C)) -#define IOPIN1 (*((volatile unsigned long *) 0xE0028010)) -#define IOSET1 (*((volatile unsigned long *) 0xE0028014)) -#define IODIR1 (*((volatile unsigned long *) 0xE0028018)) -#define IOCLR1 (*((volatile unsigned long *) 0xE002801C)) -#define IO0PIN (*((volatile unsigned long *) 0xE0028000)) -#define IO0SET (*((volatile unsigned long *) 0xE0028004)) -#define IO0DIR (*((volatile unsigned long *) 0xE0028008)) -#define IO0CLR (*((volatile unsigned long *) 0xE002800C)) -#define IO1PIN (*((volatile unsigned long *) 0xE0028010)) -#define IO1SET (*((volatile unsigned long *) 0xE0028014)) -#define IO1DIR (*((volatile unsigned long *) 0xE0028018)) -#define IO1CLR (*((volatile unsigned long *) 0xE002801C)) -#define FIO0DIR (*((volatile unsigned long *) 0x3FFFC000)) -#define FIO0MASK (*((volatile unsigned long *) 0x3FFFC010)) -#define FIO0PIN (*((volatile unsigned long *) 0x3FFFC014)) -#define FIO0SET (*((volatile unsigned long *) 0x3FFFC018)) -#define FIO0CLR (*((volatile unsigned long *) 0x3FFFC01C)) -#define FIO1DIR (*((volatile unsigned long *) 0x3FFFC020)) -#define FIO1MASK (*((volatile unsigned long *) 0x3FFFC030)) -#define FIO1PIN (*((volatile unsigned long *) 0x3FFFC034)) -#define FIO1SET (*((volatile unsigned long *) 0x3FFFC038)) -#define FIO1CLR (*((volatile unsigned long *) 0x3FFFC03C)) - -/* Memory Accelerator Module (MAM) */ -#define MAMCR (*((volatile unsigned char *) 0xE01FC000)) -#define MAMTIM (*((volatile unsigned char *) 0xE01FC004)) -#define MEMMAP (*((volatile unsigned char *) 0xE01FC040)) - -/* Phase Locked Loop 0 (PLL0) */ -#define PLL0CON (*((volatile unsigned char *) 0xE01FC080)) -#define PLL0CFG (*((volatile unsigned char *) 0xE01FC084)) -#define PLL0STAT (*((volatile unsigned short*) 0xE01FC088)) -#define PLL0FEED (*((volatile unsigned char *) 0xE01FC08C)) - -/* Phase Locked Loop 1 (PLL1) */ -#define PLL1CON (*((volatile unsigned char *) 0xE01FC0A0)) -#define PLL1CFG (*((volatile unsigned char *) 0xE01FC0A4)) -#define PLL1STAT (*((volatile unsigned short*) 0xE01FC0A8)) -#define PLL1FEED (*((volatile unsigned char *) 0xE01FC0AC)) - -/* VPB Divider */ -#define VPBDIV (*((volatile unsigned char *) 0xE01FC100)) - -/* Power Control */ -#define PCON (*((volatile unsigned char *) 0xE01FC0C0)) -#define PCONP (*((volatile unsigned long *) 0xE01FC0C4)) - -/* External Interrupts */ -#define EXTINT (*((volatile unsigned char *) 0xE01FC140)) -#define INTWAKE (*((volatile unsigned short*) 0xE01FC144)) -#define EXTMODE (*((volatile unsigned char *) 0xE01FC148)) -#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C)) - -/* Reset */ -#define RSID (*((volatile unsigned char *) 0xE01FC180)) - -/* Code Security / Debugging */ -#define CSPR (*((volatile unsigned char *) 0xE01FC184)) - -/* System Control Miscellaneous */ -#define SCS (*((volatile unsigned long *) 0xE01FC1A0)) - -/* Timer 0 */ -#define TMR0_BASE_ADDR 0xE0004000 -#define T0IR (*((volatile unsigned long *) 0xE0004000)) -#define T0TCR (*((volatile unsigned long *) 0xE0004004)) -#define T0TC (*((volatile unsigned long *) 0xE0004008)) -#define T0PR (*((volatile unsigned long *) 0xE000400C)) -#define T0PC (*((volatile unsigned long *) 0xE0004010)) -#define T0MCR (*((volatile unsigned long *) 0xE0004014)) -#define T0MR0 (*((volatile unsigned long *) 0xE0004018)) -#define T0MR1 (*((volatile unsigned long *) 0xE000401C)) -#define T0MR2 (*((volatile unsigned long *) 0xE0004020)) -#define T0MR3 (*((volatile unsigned long *) 0xE0004024)) -#define T0CCR (*((volatile unsigned long *) 0xE0004028)) -#define T0CR0 (*((volatile unsigned long *) 0xE000402C)) -#define T0CR1 (*((volatile unsigned long *) 0xE0004030)) -#define T0CR2 (*((volatile unsigned long *) 0xE0004034)) -#define T0CR3 (*((volatile unsigned long *) 0xE0004038)) -#define T0EMR (*((volatile unsigned long *) 0xE000403C)) -#define T0CTCR (*((volatile unsigned long *) 0xE0004070)) - -/* Timer 1 */ -#define TMR1_BASE_ADDR 0xE0008000 -#define T1IR (*((volatile unsigned long *) 0xE0008000)) -#define T1TCR (*((volatile unsigned long *) 0xE0008004)) -#define T1TC (*((volatile unsigned long *) 0xE0008008)) -#define T1PR (*((volatile unsigned long *) 0xE000800C)) -#define T1PC (*((volatile unsigned long *) 0xE0008010)) -#define T1MCR (*((volatile unsigned long *) 0xE0008014)) -#define T1MR0 (*((volatile unsigned long *) 0xE0008018)) -#define T1MR1 (*((volatile unsigned long *) 0xE000801C)) -#define T1MR2 (*((volatile unsigned long *) 0xE0008020)) -#define T1MR3 (*((volatile unsigned long *) 0xE0008024)) -#define T1CCR (*((volatile unsigned long *) 0xE0008028)) -#define T1CR0 (*((volatile unsigned long *) 0xE000802C)) -#define T1CR1 (*((volatile unsigned long *) 0xE0008030)) -#define T1CR2 (*((volatile unsigned long *) 0xE0008034)) -#define T1CR3 (*((volatile unsigned long *) 0xE0008038)) -#define T1EMR (*((volatile unsigned long *) 0xE000803C)) -#define T1CTCR (*((volatile unsigned long *) 0xE0008070)) - -/* Pulse Width Modulator (PWM) */ -#define PWMIR (*((volatile unsigned long *) 0xE0014000)) -#define PWMTCR (*((volatile unsigned long *) 0xE0014004)) -#define PWMTC (*((volatile unsigned long *) 0xE0014008)) -#define PWMPR (*((volatile unsigned long *) 0xE001400C)) -#define PWMPC (*((volatile unsigned long *) 0xE0014010)) -#define PWMMCR (*((volatile unsigned long *) 0xE0014014)) -#define PWMMR0 (*((volatile unsigned long *) 0xE0014018)) -#define PWMMR1 (*((volatile unsigned long *) 0xE001401C)) -#define PWMMR2 (*((volatile unsigned long *) 0xE0014020)) -#define PWMMR3 (*((volatile unsigned long *) 0xE0014024)) -#define PWMMR4 (*((volatile unsigned long *) 0xE0014040)) -#define PWMMR5 (*((volatile unsigned long *) 0xE0014044)) -#define PWMMR6 (*((volatile unsigned long *) 0xE0014048)) -#define PWMPCR (*((volatile unsigned long *) 0xE001404C)) -#define PWMLER (*((volatile unsigned long *) 0xE0014050)) - -/* Universal Asynchronous Receiver Transmitter 0 (UART0) */ -#define U0RBR (*((volatile unsigned char *) 0xE000C000)) -#define U0THR (*((volatile unsigned char *) 0xE000C000)) -#define U0IER (*((volatile unsigned long *) 0xE000C004)) -#define U0IIR (*((volatile unsigned long *) 0xE000C008)) -#define U0FCR (*((volatile unsigned char *) 0xE000C008)) -#define U0LCR (*((volatile unsigned char *) 0xE000C00C)) -#define U0MCR (*((volatile unsigned char *) 0xE000C010)) -#define U0LSR (*((volatile unsigned char *) 0xE000C014)) -#define U0MSR (*((volatile unsigned char *) 0xE000C018)) -#define U0SCR (*((volatile unsigned char *) 0xE000C01C)) -#define U0DLL (*((volatile unsigned char *) 0xE000C000)) -#define U0DLM (*((volatile unsigned char *) 0xE000C004)) -#define U0ACR (*((volatile unsigned long *) 0xE000C020)) -#define U0FDR (*((volatile unsigned long *) 0xE000C028)) -#define U0TER (*((volatile unsigned char *) 0xE000C030)) - -/* Universal Asynchronous Receiver Transmitter 1 (UART1) */ -#define U1RBR (*((volatile unsigned char *) 0xE0010000)) -#define U1THR (*((volatile unsigned char *) 0xE0010000)) -#define U1IER (*((volatile unsigned long *) 0xE0010004)) -#define U1IIR (*((volatile unsigned long *) 0xE0010008)) -#define U1FCR (*((volatile unsigned char *) 0xE0010008)) -#define U1LCR (*((volatile unsigned char *) 0xE001000C)) -#define U1MCR (*((volatile unsigned char *) 0xE0010010)) -#define U1LSR (*((volatile unsigned char *) 0xE0010014)) -#define U1MSR (*((volatile unsigned char *) 0xE0010018)) -#define U1SCR (*((volatile unsigned char *) 0xE001001C)) -#define U1DLL (*((volatile unsigned char *) 0xE0010000)) -#define U1DLM (*((volatile unsigned char *) 0xE0010004)) -#define U1ACR (*((volatile unsigned long *) 0xE0010020)) -#define U1FDR (*((volatile unsigned long *) 0xE0010028)) -#define U1TER (*((volatile unsigned char *) 0xE0010030)) - -/* I2C Interface 0 */ -#define I2C0CONSET (*((volatile unsigned char *) 0xE001C000)) -#define I2C0STAT (*((volatile unsigned char *) 0xE001C004)) -#define I2C0DAT (*((volatile unsigned char *) 0xE001C008)) -#define I2C0ADR (*((volatile unsigned char *) 0xE001C00C)) -#define I2C0SCLH (*((volatile unsigned short*) 0xE001C010)) -#define I2C0SCLL (*((volatile unsigned short*) 0xE001C014)) -#define I2C0CONCLR (*((volatile unsigned char *) 0xE001C018)) - -/* I2C Interface 1 */ -#define I2C1CONSET (*((volatile unsigned char *) 0xE005C000)) -#define I2C1STAT (*((volatile unsigned char *) 0xE005C004)) -#define I2C1DAT (*((volatile unsigned char *) 0xE005C008)) -#define I2C1ADR (*((volatile unsigned char *) 0xE005C00C)) -#define I2C1SCLH (*((volatile unsigned short*) 0xE005C010)) -#define I2C1SCLL (*((volatile unsigned short*) 0xE005C014)) -#define I2C1CONCLR (*((volatile unsigned char *) 0xE005C018)) - -/* SPI0 (Serial Peripheral Interface 0) */ -#define S0SPCR (*((volatile unsigned short*) 0xE0020000)) -#define S0SPSR (*((volatile unsigned char *) 0xE0020004)) -#define S0SPDR (*((volatile unsigned short*) 0xE0020008)) -#define S0SPCCR (*((volatile unsigned char *) 0xE002000C)) -#define S0SPINT (*((volatile unsigned char *) 0xE002001C)) - -/* SSP Controller (SPI1) */ -#define SSPCR0 (*((volatile unsigned short*) 0xE0068000)) -#define SSPCR1 (*((volatile unsigned char *) 0xE0068004)) -#define SSPDR (*((volatile unsigned short*) 0xE0068008)) -#define SSPSR (*((volatile unsigned char *) 0xE006800C)) -#define SSPCPSR (*((volatile unsigned char *) 0xE0068010)) -#define SSPIMSC (*((volatile unsigned char *) 0xE0068014)) -#define SSPRIS (*((volatile unsigned char *) 0xE0068018)) -#define SSPMIS (*((volatile unsigned char *) 0xE006801C)) -#define SSPICR (*((volatile unsigned char *) 0xE0068020)) - -/* Real Time Clock */ -#define ILR (*((volatile unsigned char *) 0xE0024000)) -#define CTC (*((volatile unsigned short*) 0xE0024004)) -#define CCR (*((volatile unsigned char *) 0xE0024008)) -#define CIIR (*((volatile unsigned char *) 0xE002400C)) -#define AMR (*((volatile unsigned char *) 0xE0024010)) -#define CTIME0 (*((volatile unsigned long *) 0xE0024014)) -#define CTIME1 (*((volatile unsigned long *) 0xE0024018)) -#define CTIME2 (*((volatile unsigned long *) 0xE002401C)) -#define SEC (*((volatile unsigned char *) 0xE0024020)) -#define MINUTE (*((volatile unsigned char *) 0xE0024024)) -#define HOUR (*((volatile unsigned char *) 0xE0024028)) -#define DOM (*((volatile unsigned char *) 0xE002402C)) -#define DOW (*((volatile unsigned char *) 0xE0024030)) -#define DOY (*((volatile unsigned short*) 0xE0024034)) -#define MONTH (*((volatile unsigned char *) 0xE0024038)) -#define YEAR (*((volatile unsigned short*) 0xE002403C)) -#define ALSEC (*((volatile unsigned char *) 0xE0024060)) -#define ALMIN (*((volatile unsigned char *) 0xE0024064)) -#define ALHOUR (*((volatile unsigned char *) 0xE0024068)) -#define ALDOM (*((volatile unsigned char *) 0xE002406C)) -#define ALDOW (*((volatile unsigned char *) 0xE0024070)) -#define ALDOY (*((volatile unsigned short*) 0xE0024074)) -#define ALMON (*((volatile unsigned char *) 0xE0024078)) -#define ALYEAR (*((volatile unsigned short*) 0xE002407C)) -#define PREINT (*((volatile unsigned short*) 0xE0024080)) -#define PREFRAC (*((volatile unsigned short*) 0xE0024084)) - -/* A/D Converter 0 (AD0) */ -#define AD0CR (*((volatile unsigned long *) 0xE0034000)) -#define AD0GDR (*((volatile unsigned long *) 0xE0034004)) -#define AD0STAT (*((volatile unsigned long *) 0xE0034030)) -#define AD0INTEN (*((volatile unsigned long *) 0xE003400C)) -#define AD0DR0 (*((volatile unsigned long *) 0xE0034010)) -#define AD0DR1 (*((volatile unsigned long *) 0xE0034014)) -#define AD0DR2 (*((volatile unsigned long *) 0xE0034018)) -#define AD0DR3 (*((volatile unsigned long *) 0xE003401C)) -#define AD0DR4 (*((volatile unsigned long *) 0xE0034020)) -#define AD0DR5 (*((volatile unsigned long *) 0xE0034024)) -#define AD0DR6 (*((volatile unsigned long *) 0xE0034028)) -#define AD0DR7 (*((volatile unsigned long *) 0xE003402C)) - -/* A/D Converter 1 (AD1) */ -#define AD1CR (*((volatile unsigned long *) 0xE0060000)) -#define AD1GDR (*((volatile unsigned long *) 0xE0060004)) -#define AD1STAT (*((volatile unsigned long *) 0xE0060030)) -#define AD1INTEN (*((volatile unsigned long *) 0xE006000C)) -#define AD1DR0 (*((volatile unsigned long *) 0xE0060010)) -#define AD1DR1 (*((volatile unsigned long *) 0xE0060014)) -#define AD1DR2 (*((volatile unsigned long *) 0xE0060018)) -#define AD1DR3 (*((volatile unsigned long *) 0xE006001C)) -#define AD1DR4 (*((volatile unsigned long *) 0xE0060020)) -#define AD1DR5 (*((volatile unsigned long *) 0xE0060024)) -#define AD1DR6 (*((volatile unsigned long *) 0xE0060028)) -#define AD1DR7 (*((volatile unsigned long *) 0xE006002C)) - -/* A/D Converter Global */ -#define ADGSR (*((volatile unsigned long *) 0xE0034008)) - -/* D/A Converter */ -#define DACR (*((volatile unsigned long *) 0xE006C000)) - -/* Watchdog */ -#define WDMOD (*((volatile unsigned char *) 0xE0000000)) -#define WDTC (*((volatile unsigned long *) 0xE0000004)) -#define WDFEED (*((volatile unsigned char *) 0xE0000008)) -#define WDTV (*((volatile unsigned long *) 0xE000000C)) - -/* USB Controller */ -#define USBIntSt (*((volatile unsigned long *) 0xE01FC1C0)) -#define USBDevIntSt (*((volatile unsigned long *) 0xE0090000)) -#define USBDevIntEn (*((volatile unsigned long *) 0xE0090004)) -#define USBDevIntClr (*((volatile unsigned long *) 0xE0090008)) -#define USBDevIntSet (*((volatile unsigned long *) 0xE009000C)) -#define USBDevIntPri (*((volatile unsigned char *) 0xE009002C)) -#define USBEpIntSt (*((volatile unsigned long *) 0xE0090030)) -#define USBEpIntEn (*((volatile unsigned long *) 0xE0090034)) -#define USBEpIntClr (*((volatile unsigned long *) 0xE0090038)) -#define USBEpIntSet (*((volatile unsigned long *) 0xE009003C)) -#define USBEpIntPri (*((volatile unsigned long *) 0xE0090040)) -#define USBReEp (*((volatile unsigned long *) 0xE0090044)) -#define USBEpInd (*((volatile unsigned long *) 0xE0090048)) -#define USBMaxPSize (*((volatile unsigned long *) 0xE009004C)) -#define USBRxData (*((volatile unsigned long *) 0xE0090018)) -#define USBRxPLen (*((volatile unsigned long *) 0xE0090020)) -#define USBTxData (*((volatile unsigned long *) 0xE009001C)) -#define USBTxPLen (*((volatile unsigned long *) 0xE0090024)) -#define USBCtrl (*((volatile unsigned long *) 0xE0090028)) -#define USBCmdCode (*((volatile unsigned long *) 0xE0090010)) -#define USBCmdData (*((volatile unsigned long *) 0xE0090014)) -#define USBDMARSt (*((volatile unsigned long *) 0xE0090050)) -#define USBDMARClr (*((volatile unsigned long *) 0xE0090054)) -#define USBDMARSet (*((volatile unsigned long *) 0xE0090058)) -#define USBUDCAH (*((volatile unsigned long *) 0xE0090080)) -#define USBEpDMASt (*((volatile unsigned long *) 0xE0090084)) -#define USBEpDMAEn (*((volatile unsigned long *) 0xE0090088)) -#define USBEpDMADis (*((volatile unsigned long *) 0xE009008C)) -#define USBDMAIntSt (*((volatile unsigned long *) 0xE0090090)) -#define USBDMAIntEn (*((volatile unsigned long *) 0xE0090094)) -#define USBEoTIntSt (*((volatile unsigned long *) 0xE00900A0)) -#define USBEoTIntClr (*((volatile unsigned long *) 0xE00900A4)) -#define USBEoTIntSet (*((volatile unsigned long *) 0xE00900A8)) -#define USBNDDRIntSt (*((volatile unsigned long *) 0xE00900AC)) -#define USBNDDRIntClr (*((volatile unsigned long *) 0xE00900B0)) -#define USBNDDRIntSet (*((volatile unsigned long *) 0xE00900B4)) -#define USBSysErrIntSt (*((volatile unsigned long *) 0xE00900B8)) -#define USBSysErrIntClr (*((volatile unsigned long *) 0xE00900BC)) -#define USBSysErrIntSet (*((volatile unsigned long *) 0xE00900C0)) - - - -// Pheripherals - -#define PCTIM0 BIT1 -#define PCTIM1 BIT2 -#define PCUART0 BIT3 -#define PCUART1 BIT4 -#define PCPWM0 BIT5 -#define PCI2C0 BIT7 -#define PCSPI0 BIT8 -#define PCRTC BIT9 -#define PCSPI1 BIT10 -#define PCAD0 BIT12 -#define PCI2C1 BIT19 -#define PCAD1 BIT20 -#define PUSB BIT31 - -//inline void TurOffPeripheral(int p); -//inline void TurOnPeripheral(int p); - -#endif - diff --git a/cpu/lpc214x/linkerscript.x b/cpu/lpc214x/linkerscript.x deleted file mode 100644 index 9a573998dac9608bc40b08b7a10c11e8d0de9f7d..0000000000000000000000000000000000000000 --- a/cpu/lpc214x/linkerscript.x +++ /dev/null @@ -1,197 +0,0 @@ -/* ****************************************************************************************************** */ -/* demo2148_blink_flash.cmd LINKER SCRIPT */ -/* */ -/* */ -/* The Linker Script defines how the code and data emitted by the GNU C compiler and assembler are */ -/* to be loaded into memory (code goes into FLASH, variables go into RAM). */ -/* */ -/* Any symbols defined in the Linker Script are automatically global and available to the rest of the */ -/* program. */ -/* */ -/* To force the linker to use this LINKER SCRIPT, just add the -T demo2148_blink_flash.cmd directive */ -/* to the linker flags in the makefile. */ -/* */ -/* LFLAGS = -Map main.map -nostartfiles -T demo2148_blink_flash.cmd */ -/* */ -/* */ -/* The Philips boot loader supports the ISP (In System Programming) via the serial port and the IAP */ -/* (In Application Programming) for flash programming from within your application. */ -/* */ -/* The boot loader uses RAM memory and we MUST NOT load variables or code in these areas. */ -/* */ -/* RAM used by boot loader: 0x40000120 - 0x400001FF (223 bytes) for ISP variables */ -/* 0x40007FE0 - 0x4000FFFF (32 bytes) for ISP and IAP variables */ -/* 0x40007EE0 - 0x40007FE0 (256 bytes) stack for ISP and IAP */ -/* */ -/* */ -/* MEMORY MAP */ -/* | |0x40008000 */ -/* .-------->|---------------------------------| */ -/* . | variables and stack |0x40007FFF */ -/* ram_isp_high | for Philips boot loader | */ -/* . | 32 + 256 = 288 bytes | */ -/* . | | */ -/* . | Do not put anything here |0x40007EE0 */ -/* .-------->|---------------------------------| */ -/* | UDF Stack 4 bytes |0x40007EDC <---------- _stack_end */ -/* .-------->|---------------------------------| */ -/* | ABT Stack 4 bytes |0x40007ED8 */ -/* .-------->|---------------------------------| */ -/* | FIQ Stack 4 bytes |0x40007ED4 */ -/* .-------->|---------------------------------| */ -/* | IRQ Stack 4 bytes |0x40007ED0 */ -/* .-------->|---------------------------------| */ -/* | SVC Stack 4 bytes |0x40007ECC */ -/* .-------->|---------------------------------| */ -/* . | |0x40007EC8 */ -/* . | stack area for user program | */ -/* . | | | */ -/* . | | | */ -/* . | | | */ -/* . | V | */ -/* . | | */ -/* . | | */ -/* . | | */ -/* . | free ram | */ -/* ram | | */ -/* . | | */ -/* . | | */ -/* . |.................................|0x40000234 <---------- _bss_end */ -/* . | | */ -/* . | .bss uninitialized variables | */ -/* . |.................................|0x40000218 <---------- _bss_start, _edata */ -/* . | | */ -/* . | .data initialized variables | */ -/* . | |0x40000200 <---------- _data */ -/* .-------->|---------------------------------| */ -/* . | variables used by |0x400001FF */ -/* ram_isp_low | Philips boot loader | */ -/* . | 223 bytes |0x40000120 */ -/* .-------->|---------------------------------| */ -/* . | |0x4000011F */ -/* ram_vectors | free ram | */ -/* . |---------------------------------|0x40000040 */ -/* . | |0x4000003F */ -/* . | Interrupt Vectors (re-mapped) | */ -/* . | 64 bytes |0x40000000 */ -/* .-------->|---------------------------------| */ -/* | | */ -/* */ -/* */ -/* */ -/* | | */ -/* .--------> |---------------------------------| */ -/* . | |0x0001FFFF */ -/* . | | */ -/* . | | */ -/* . | | */ -/* . | | */ -/* . | | */ -/* . | unused flash eprom | */ -/* . | | */ -/* . |.................................|0x0000032c */ -/* . | | */ -/* . | copy of .data area | */ -/* flash | | */ -/* . |---------------------------------|0x00000314 <----------- _etext */ -/* . | | */ -/* . | |0x00000180 main */ -/* . | |0x00000278 feed */ -/* . | main() |0x000002c4 FIQ_Routine */ -/* . | |0x000002d8 SWI_Routine */ -/* . | |0x000002ec UNDEF_Routine */ -/* . | |0x000002b0 IRQ_routine */ -/* . |---------------------------------|0x000001cc initialize */ -/* . | |0x000000D4 */ -/* . | Startup Code | */ -/* . | (assembler) | */ -/* . | | */ -/* . |---------------------------------|0x00000040 Reset_Handler */ -/* . | |0x0000003F */ -/* . | Interrupt Vector Table (unused) | */ -/* . | 64 bytes | */ -/* .--------->|---------------------------------|0x00000000 _startup * -/* */ -/* */ -/* The easy way to prevent the linker from loading anything into a memory area is to define */ -/* a MEMORY region for it and then avoid assigning any .text, .data or .bss sections into it. */ -/* */ -/* */ -/* MEMORY */ -/* { */ -/* ram_isp_low(A) : ORIGIN = 0x40000120, LENGTH = 223 */ -/* */ -/* } */ -/* */ -/* */ -/* Author: James P. Lynch */ -/* */ -/* ****************************************************************************************************** */ - - -/* identify the Entry Point */ - -ENTRY(_startup) -/* STARTUP(bin/startup.o)*/ - - -/* specify the LPC2148 memory areas */ - -MEMORY -{ - flash : ORIGIN = 0, LENGTH = 512K /* FLASH ROM */ - ram_isp_low(A) : ORIGIN = 0x40000120, LENGTH = 223 /* variables used by Philips ISP bootloader */ - ram : ORIGIN = 0x40000200, LENGTH = 32513 /* free RAM area */ - ram_isp_high(A) : ORIGIN = 0x40007FE0, LENGTH = 32 /* variables used by Philips ISP bootloader */ - ram_usb_dma : ORIGIN = 0x7FD00000, LENGTH = 8192 /* on-chip USB DMA RAM area (not used) */ -} - - - -/* define a global symbol _stack_end */ - -_stack_end = 0x40007EDC; - - - -/* now define the output sections */ - -SECTIONS -{ - . = 0; /* set location counter to address zero */ - - .text : /* collect all sections that should go into FLASH after startup */ - { - *(.vectors) /* Exception Vectors and branch table >= 64 bytes */ - . = ALIGN(64); - *(.init) - *(.text) /* all .text sections (code) */ - *(.rodata) /* all .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ - *(.glue_7) /* all .glue_7 sections (no idea what these are) */ - *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ - _etext = .; /* define a global symbol _etext just after the last code byte */ - } >flash /* put all the above into FLASH */ - - - - - .data : /* collect all initialized .data sections that go into RAM */ - { - _data = .; /* create a global symbol marking the start of the .data section */ - *(.data) /* all .data sections */ - _edata = .; /* define a global symbol marking the end of the .data section */ - } >ram AT >flash /* put all the above into RAM (but load the LMA copy into FLASH) */ - - .bss : /* collect all uninitialized .bss sections that go into RAM */ - { - _bss_start = .; /* define a global symbol marking the start of the .bss section */ - *(.bss) /* all .bss sections */ - } >ram /* put all the above in RAM (it will be cleared in the startup code */ - - . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ - _bss_end = . ; /* define a global symbol marking the end of the .bss section */ -} - _end = .; /* define a global symbol marking the end of application RAM */ - PROVIDE(end = .); - diff --git a/cpu/lpc214x/startup.s b/cpu/lpc214x/startup.s deleted file mode 100644 index 8a0c95b8833d09240faf1621c004e971b44612dc..0000000000000000000000000000000000000000 --- a/cpu/lpc214x/startup.s +++ /dev/null @@ -1,112 +0,0 @@ -/* *************************************************************************************************************** - - crt.s STARTUP ASSEMBLY CODE - ----------------------- - - - Module includes the interrupt vectors and start-up code. - - *************************************************************************************************************** */ - -/* Stack Sizes */ -.set UND_STACK_SIZE, 0x00000040 /* stack for "undefined instruction" interrupts */ -.set ABT_STACK_SIZE, 0x00000040 /* stack for "abort" interrupts */ -.set FIQ_STACK_SIZE, 0x00000040 /* stack for "FIQ" interrupts */ -.set IRQ_STACK_SIZE, 0X00000100 /* stack for "IRQ" normal interrupts */ -.set SVC_STACK_SIZE, 0x00000400 /* stack for "SVC" supervisor mode */ - - - -/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs (program status registers) */ -.set MODE_USR, 0x10 /* Normal User Mode */ -.set MODE_FIQ, 0x11 /* FIQ Processing Fast Interrupts Mode */ -.set MODE_IRQ, 0x12 /* IRQ Processing Standard Interrupts Mode */ -.set MODE_SVC, 0x13 /* Supervisor Processing Software Interrupts Mode */ -.set MODE_ABT, 0x17 /* Abort Processing memory Faults Mode */ -.set MODE_UND, 0x1B /* Undefined Processing Undefined Instructions Mode */ -.set MODE_SYS, 0x1F /* System Running Priviledged Operating System Tasks Mode */ - -.set I_BIT, 0x80 /* when I bit is set, IRQ is disabled (program status registers) */ -.set F_BIT, 0x40 /* when F bit is set, FIQ is disabled (program status registers) */ - - -.text -.arm - -.global Reset_Handler -.global _startup -.func _startup - -_startup: - -# Exception Vectors - -_vectors: ldr PC, Reset_Addr - ldr PC, Undef_Addr - ldr PC, SWI_Addr - ldr PC, PAbt_Addr - ldr PC, DAbt_Addr - nop /* Reserved Vector (holds Philips ISP checksum) */ - ldr PC, IRQ_Addr /* see page 71 of "Insiders Guide to the Philips ARM7-Based Microcontrollers" by Trevor Martin */ - ldr PC, FIQ_Addr - -Reset_Addr: .word Reset_Handler /* defined in this module below */ -Undef_Addr: .word UNDEF_Routine /* defined in main.c */ -SWI_Addr: .word ctx_switch /* defined in main.c */ -PAbt_Addr: .word UNDEF_Routine /* defined in main.c */ -DAbt_Addr: .word UNDEF_Routine /* defined in main.c */ -IRQ_Addr: .word arm_irq_handler /* defined in main.c */ -FIQ_Addr: .word FIQ_Routine /* defined in main.c */ - .word 0 /* rounds the vectors and ISR addresses to 64 bytes total */ - - -# Reset Handler - -Reset_Handler: - - /* Setup a stack for each mode - note that this only sets up a usable stack - for User mode. Also each mode is setup with interrupts initially disabled. */ - - ldr r0, =_stack_end - msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */ - mov sp, r0 - sub r0, r0, #UND_STACK_SIZE - msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */ - mov sp, r0 - sub r0, r0, #ABT_STACK_SIZE - msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */ - mov sp, r0 - sub r0, r0, #FIQ_STACK_SIZE - msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */ - mov sp, r0 - sub r0, r0, #IRQ_STACK_SIZE - msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */ - mov sp, r0 - sub r0, r0, #SVC_STACK_SIZE - msr CPSR_c, #MODE_SYS|I_BIT|F_BIT /* User Mode */ - mov sp, r0 - - /* copy .data section (Copy from ROM to RAM) */ - ldr R1, =_etext - ldr R2, =_data - ldr R3, =_edata -1: cmp R2, R3 - ldrlo R0, [R1], #4 - strlo R0, [R2], #4 - blo 1b - - /* Clear .bss section (Zero init) */ - mov R0, #0 - ldr R1, =_bss_start - ldr R2, =_bss_end -2: cmp R1, R2 - strlo R0, [R1], #4 - blo 2b - - /* Enter the C code */ - bl bootloader - b kernel_init - - -.endfunc -.end diff --git a/cpu/lpc_common/lpc_syscalls.c b/cpu/lpc_common/lpc_syscalls.c index 0699c80e056a3ea7097f51672e52012e662fdf2a..fa8f2e2f9e6c45e678d5948461f9e5b63fcd3964 100644 --- a/cpu/lpc_common/lpc_syscalls.c +++ b/cpu/lpc_common/lpc_syscalls.c @@ -54,14 +54,8 @@ caddr_t _sbrk_r(struct _reent *r, size_t incr) for (volatile uint8_t iUsedHeap = 0; iUsedHeap < NUM_HEAPS; iUsedHeap++ ) { caddr_t new_heap = heap[iUsedHeap] + incr; - #ifdef MODULE_TRACELOG - trace_pointer(TRACELOG_EV_MEMORY, heap[iUsedHeap]); - #endif if( new_heap <= heap_max[iUsedHeap] ) { caddr_t prev_heap = heap[iUsedHeap]; - #ifdef MODULE_TRACELOG - trace_pointer(TRACELOG_EV_MEMORY, new_heap); - #endif heap[iUsedHeap] = new_heap; r->_errno = 0; @@ -70,9 +64,6 @@ caddr_t _sbrk_r(struct _reent *r, size_t incr) } } restoreIRQ(cpsr); - #ifdef MODULE_TRACELOG - trace_string(TRACELOG_EV_MEMORY, "heap!"); // heap full - #endif r->_errno = ENOMEM; return NULL; diff --git a/cpu/mc1322x/mc1322x_syscalls.c b/cpu/mc1322x/mc1322x_syscalls.c index 4844e7fccc49f497b3284f88dc943678a17e88fc..3c8bd4f02b311d26ebdd155a5569a07ac18f64c1 100644 --- a/cpu/mc1322x/mc1322x_syscalls.c +++ b/cpu/mc1322x/mc1322x_syscalls.c @@ -32,14 +32,8 @@ caddr_t _sbrk_r(struct _reent *r, size_t incr) /* check all heaps for a chunk of the requested size */ caddr_t new_heap = heap + incr; - #ifdef MODULE_TRACELOG - trace_pointer(TRACELOG_EV_MEMORY, heap); - #endif if( new_heap <= heap_max ) { caddr_t prev_heap = heap; -#ifdef MODULE_TRACELOG - trace_pointer(TRACELOG_EV_MEMORY, new_heap); -#endif heap = new_heap; r->_errno = 0; @@ -47,9 +41,6 @@ caddr_t _sbrk_r(struct _reent *r, size_t incr) return prev_heap; } restoreIRQ(cpsr); - #ifdef MODULE_TRACELOG - trace_string(TRACELOG_EV_MEMORY, "heap!"); // heap full - #endif r->_errno = ENOMEM; return NULL; diff --git a/sys/Makefile b/sys/Makefile index 292e70b3e22c3a653f45ca6a926593cf422ee60c..8e84f4a01748aee34af63b5d86a8cd936309409f 100644 --- a/sys/Makefile +++ b/sys/Makefile @@ -10,9 +10,6 @@ endif ifneq (,$(findstring lib,$(USEMODULE))) DIRS += lib endif -ifneq (,$(findstring logd,$(USEMODULE))) - DIRS += logd -endif ifneq (,$(findstring cmdd,$(USEMODULE))) DIRS += cmdd endif @@ -28,9 +25,6 @@ endif ifneq (,$(findstring sync_read,$(USEMODULE))) DIRS += sync_read endif -ifneq (,$(findstring syslog,$(USEMODULE))) - DIRS += syslog -endif ifneq (,$(findstring sysmon,$(USEMODULE))) DIRS += sysmon endif @@ -49,9 +43,6 @@ endif ifneq (,$(findstring timex,$(USEMODULE))) DIRS += timex endif -ifneq (,$(findstring tracelog,$(USEMODULE))) - DIRS += tracelog -endif ifneq (,$(findstring transceiver,$(USEMODULE))) DIRS += transceiver endif diff --git a/sys/logd/Makefile b/sys/logd/Makefile deleted file mode 100644 index 6b81d22e04b4d14916f21cb38a94a9f659be784a..0000000000000000000000000000000000000000 --- a/sys/logd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -INCLUDES = -I../include -I../drivers/include -I../lib -I$(RIOTCPU)/$(CPU)/include -I../net -I../../core/include - -MODULE =logd - -include $(MAKEBASE)/Makefile.base - diff --git a/sys/logd/logd.c b/sys/logd/logd.c deleted file mode 100644 index de5ceb66e24b1aea8cfa183a3ab2add230ba1fe8..0000000000000000000000000000000000000000 --- a/sys/logd/logd.c +++ /dev/null @@ -1,207 +0,0 @@ -/** - * Logging daemon - * - * Copyright (C) 2009-2013 Freie Universitaet Berlin - * - * This file subject to the terms and conditions of the GNU Lesser General - * Public License. See the file LICENSE in the top level directory for more - * details. - */ - -/** - * @file logd.c - * @brief Simple logging demon implementation - * - * @author Freie Universität Berlin, Computer Systems & Telematics - * @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de> - * @version $Revision: 3854 $ - * - * @note $Id: logd.c 3854 2011-12-06 15:27:01Z hwill $ - */ - -#include <stdio.h> -#include <stdlib.h> -#include <fcntl.h> -#include <string.h> -/* core */ -#include "msg.h" -#include "flags.h" -#include "mutex.h" -#include "thread.h" -#include "kernel.h" -/* system */ -#include "logd.h" -#include "list.h" - -typedef struct { - list_node_t listnode; - char *str; - int str_len; -} log_queue_t; - -static volatile int log_pid = -1; -static int logd_stack_size = LOGD_STACK_SIZE_NORMAL; -static FILE *fh = NULL; -static int log_count = 0; -static mutex_t log_mutex; -static list_t log_msg_queue; -static volatile bool exit_flag = false; -static volatile bool echo_on = false; - -/*---------------------------------------------------------------------------*/ - -static void close_file_handle(void) -{ - if (fh != NULL) { - fclose(fh); - fh = NULL; - } -} - -static void write_to_file(char *str, int str_len) -{ - if (fh != NULL && str_len > 0) { - if (fwrite(str, sizeof(char), str_len, fh) != str_len) { - if (echo_on && logd_stack_size >= LOGD_STACK_SIZE_CONSOLE) { - printf("LOGD [WARN]: file write failed, closing file\n"); - } - - close_file_handle(); - return; - } - - if (fflush(fh) == EOF) { - if (echo_on && logd_stack_size >= LOGD_STACK_SIZE_CONSOLE) { - printf("LOGD [WARN]: file write failed, closing file\n"); - } - - close_file_handle(); - return; - } - } - else { - fh = fopen("/LOGD.LOG", "w"); - - if (!fh) { - if (echo_on && logd_stack_size >= LOGD_STACK_SIZE_CONSOLE) { - printf("LOGD [WARN]: file reopen failed, damn!\n"); - } - } - else { - write_to_file(str, str_len); - } - } -} - -static void logd_process(void) -{ - msg m; - log_queue_t *node; - - do { - if (!exit_flag) { - msg_receive(&m); - } - - mutex_lock(&log_mutex); - - while ((node = (log_queue_t *) list_remove_head(&log_msg_queue)) != NULL) { - write_to_file(node->str, node->str_len); - - if (echo_on && logd_stack_size >= LOGD_STACK_SIZE_CONSOLE) { - printf("%s", node->str); - } - - log_count++; - free(node->str); - free(node); - } - - mutex_unlock(&log_mutex); - } - while (m.type != MSG_EXIT && !exit_flag); - - /* Logging thread is terminating, close log file */ - close_file_handle(); -} - -/*---------------------------------------------------------------------------*/ - -static void logd_init0(void) -{ - fh = fopen("/LOGD.LOG", "w"); - - if (!fh) { - return; - } - - log_pid = thread_create(logd_stack_size, PRIORITY_LOGD, CREATE_STACKTEST, logd_process, "logd"); -} - -void logd_init(int stack_size) -{ - logd_stack_size = stack_size; - mutex_init(&log_mutex); - list_init(&log_msg_queue); - logd_init0(); -} - -void logd_set_console_enabled(bool enabled) -{ - echo_on = enabled; -} - -bool logd_log(char *str, int str_len) -{ - msg m; - - /* Test if logd process was created */ - if (log_pid == -1) { - /* no logd created, because fopen() on log file failed. So try again */ - logd_init0(); - - if (log_pid == -1) { - /* Still errors opening log file, exit now */ - return false; - } - } - - log_queue_t *lq = malloc(sizeof(*lq)); - - if (lq == NULL) { - return false; - } - - lq->str = malloc(sizeof(char) * str_len + 1); /* 1 byte for string termination char */ - - if (lq->str == NULL) { - free(lq); - return false; - } - - strncpy(lq->str, str, str_len); - lq->str_len = str_len; - lq->str[str_len] = '\0'; /* add string termination char at end of buffer */ - mutex_lock(&log_mutex); - list_append(&log_msg_queue, (list_node_t *) lq); - mutex_unlock(&log_mutex); - m.type = MSG_POLL; - m.content.ptr = NULL; - msg_send(&m, log_pid, false); - return true; -} - -void logd_exit(void) -{ - msg m; - - /* Test if logd process was created */ - if (log_pid == -1) { - return; - } - - exit_flag = true; - m.type = MSG_EXIT; - m.content.ptr = NULL; - msg_send(&m, log_pid, false); -} diff --git a/sys/net/mm/Makefile b/sys/net/mm/Makefile deleted file mode 100644 index e8e3b660736deac083bb3c080dcb44aa6f3a566f..0000000000000000000000000000000000000000 --- a/sys/net/mm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -INCLUDES = -I.. -I../../include -I../../drivers/include -I../../../core/include -I../../lib -I../../lib/cmdengine -I../../../hal/include - -MODULE =net_mm - -include $(MAKEBASE)/Makefile.base - diff --git a/sys/net/mm/mmr.c b/sys/net/mm/mmr.c deleted file mode 100644 index db15020e83d18a300679aaa22082671a96a283dc..0000000000000000000000000000000000000000 --- a/sys/net/mm/mmr.c +++ /dev/null @@ -1,967 +0,0 @@ -/****************************************************************************** -Copyright 2009, Freie Universitaet Berlin (FUB). All rights reserved. - -These sources were developed at the Freie Universitaet Berlin, Computer Systems -and Telematics group (http://cst.mi.fu-berlin.de). -------------------------------------------------------------------------------- -This file is part of RIOT. - -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 3 of the License, or (at your option) any later -version. - -RIOT 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, see http://www.gnu.org/licenses/ . --------------------------------------------------------------------------------- -For further information and questions please use the web site - http://scatterweb.mi.fu-berlin.de -and the mailinglist (subscription via web site) - scatterweb@lists.spline.inf.fu-berlin.de -*******************************************************************************/ - -/** - * @file - * @internal - * @brief Micro Mesh Routing - * - * @author Freie Universität Berlin, Computer Systems & Telematics - * @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de> - * @version $Revision: 3854 $ - * - * @note $Id: mmr.c 3854 2011-12-06 15:27:01Z hwill $ - */ - -#include "configure.h" -#include "mmr.h" -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include "net.h" - -#include "clock.h" -#include "utimer.h" -#include "kernel.h" -#include "thread.h" -#include "msg.h" - -#define LEVEL_INFO 2 ///< All messages are printed -#define LEVEL_WARN 1 ///< Only warnings and error messages are printed -#define LEVEL_ERROR 0 ///< Only error messages are printed -#define MMR_INFO_LEVEL LEVEL_WARN ///< Current information level - -#define DEBUG(...) -//#define DEBUG(...) printf(__VA_ARGS__) - -#define CONSTANT_SECOND (1) - -#define RREQ_ID_SEQUENCE_NUMBER_START (1) -#define RREQ_THRESHOLD (3) -#define RREQ_NONE (0xFF) /* Send no RREQs for these messages, value */ -/* must be greater than RREQ_THRESHOLD */ - -#define TTL_START (1) -#define TTL_THRESHOLD (10) - -#define RREQ_TIMEOUT_BASE (2*CONSTANT_SECOND) -#define RREQ_TIMEOUT_PER_TTL (1*CONSTANT_SECOND) - -/*---------------------------------------------------------------------------*/ -// Message queue data structures -/*---------------------------------------------------------------------------*/ - -#define MESSAGE_QUEUE_SIZE (20) - -typedef struct { - net_message_t message; - volatile uint32_t timestamp; - uint8_t retry_count; -} message_queue_entry_t; - -static message_queue_entry_t message_queue[MESSAGE_QUEUE_SIZE]; - -/*---------------------------------------------------------------------------*/ -// RREQ-Timeout data structures -/*---------------------------------------------------------------------------*/ - -static struct utimer ut; -static volatile bool rreq_to_active = false; /* RREQ timeout active bit */ -static const char *rreq_timeout_process_name = "mmrd"; -static uint16_t rreq_timeout_process_pid; -static void rreq_timeout_process(void); -static void post_next_rreq_timeout(void); - -/*---------------------------------------------------------------------------*/ -// Statistic data structures -/*---------------------------------------------------------------------------*/ - -typedef struct mmr_stat { - uint32_t rreq_originated; - uint32_t rrep_originated; - uint32_t rerr_originated; - uint32_t rreq_received; - uint32_t rrep_received; - uint32_t rerr_received; - uint32_t messages_no_route_found; /* RREQ found no route */ - uint32_t messages_no_route_avail_on_forward; /* Forwarding: no route in route table */ - uint32_t messages_broken_link_on_forward; /* Forwarding: broken link detected */ - uint32_t rreq_duplicated; -} mmr_stat_t; - -static mmr_stat_t mmr_stats; - -/*---------------------------------------------------------------------------*/ - -/** - * Returns time of RTC in seconds. - * - * @return Time of RTC in seconds - */ -static uint32_t rtc_now(void) -{ - return (uint32_t)(clock_get_systemtime() / 1000); -} - -/*---------------------------------------------------------------------------*/ -// Routing table management -/*---------------------------------------------------------------------------*/ - -/** - * @brief Extract route information and store them in route table. - * - * @param local_addr Local network address of this node - * @param length Length of address list - * @param list Address list with route information - */ -static void rt_extract_routes(uint16_t local_addr, uint8_t length, uint16_t *list) -{ - DEBUG("call [%u]: rt_extract_routes\n", fk_thread->pid); - uint16_t net_id = NETWORK_ADDR_BC(list[0]); /* BC address of source of RREQ */ - route_table_entry_t *rte = rt_lookup_route(net_id); /* Should exist (preconfigured) */ - - if (rte == NULL) { - DEBUG("exit [%u]: rt_extract_routes\n", fk_thread->pid); - return; /* else exit here */ - } - - int i = 0; - - while (i < length && list[i] != local_addr) { - i++; - } - - if (i == length) { - DEBUG("exit [%u]: rt_extract_routes\n", fk_thread->pid); - return; - } - - int pos = i; - int leftNeighbour = -1; - int rightNeighbour = -1; - - if (pos > 0) { - leftNeighbour = list[pos - 1]; - } - - if (pos + 1 != length) { - rightNeighbour = list[pos + 1]; - } - - i = 0; - - while (i < length) { - uint16_t next = list[i]; - - if (local_addr != next) { - int distance = pos - i; - int router = leftNeighbour; - - if (distance < 0) { - router = rightNeighbour; - distance *= -1; - } - - rt_add_route(next, (uint16_t)router, (uint8_t)distance, rte->interface_id); - } - - i++; - } - - DEBUG("exit [%u]: rt_extract_routes\n", fk_thread->pid); -} - -/*---------------------------------------------------------------------------*/ -// Message queue management -/*---------------------------------------------------------------------------*/ - -/** - * @brief Add a message to the message queue. - * - * @param msg The packet to add to the queue - * - * @return A pointer to a message queue entry or NULL if - * message queue is full. - */ -static message_queue_entry_t *mq_add(net_message_t *msg) -{ - DEBUG("call [%u]: mq_add\n", fk_thread->pid); - - /* Holds eventually first active RREQ to same destination */ - message_queue_entry_t *pFirstFoundDup = NULL; - - /* Find the first active RREQ to this destination */ - int i; - - for (i = 0; i < MESSAGE_QUEUE_SIZE; i++) { - if (message_queue[i].timestamp != 0 && - message_queue[i].message.destination == msg->destination && - message_queue[i].retry_count != RREQ_NONE) { - DEBUG("%s FOUND Duplicated Request to %u.%u in route req queue\n", - __FUNCTION__, (0xFF00 & msg->destination) >> 8, (0xFF & msg->destination)); - - /* Save the first found entry to modify later if insertion was successful */ - pFirstFoundDup = &message_queue[i]; - break; - } - } - - /* If RREQ for same destination found then reset values - * even if the new message will get dropped later on because of - * limited queue space. Route to this destination gets queried - * again for sure so make new RREQ as soon as possible... */ - if (pFirstFoundDup != NULL) { - pFirstFoundDup->retry_count = 0; - pFirstFoundDup->timestamp = 1; - mmr_stats.rreq_duplicated++; - } - - /* Find free position to insert new message */ - for (i = 0; i < MESSAGE_QUEUE_SIZE; i++) { - if (message_queue[i].timestamp == 0) { - /* Free position found, add entry */ - message_queue[i].message = *msg; - - if (pFirstFoundDup != NULL) { - /* There is already a RREQ for this destination, so don't - * generate a new one */ - message_queue[i].retry_count = RREQ_NONE; - } - else { - /* Set initial RREQ retry counter to zero */ - message_queue[i].retry_count = 0; - } - - message_queue[i].timestamp = 1; - DEBUG("exit [%u]: mq_add\n", fk_thread->pid); - return &message_queue[i]; - } - } - - DEBUG("exit [%u]: mq_add\n", fk_thread->pid); - return NULL; -} - -/** - * @brief Count messages for given destination. - * - * @param dst Destination address - * - * @return The number of messages for the destination. - */ -static int mq_msgs_for_destination(uint16_t dst) -{ - DEBUG("call [%u]: mq_msgs_for_destination\n", fk_thread->pid); - int i, dst_count = 0; - - for (i = 0; i < MESSAGE_QUEUE_SIZE; i++) { - if (message_queue[i].timestamp != 0 && - message_queue[i].message.destination == dst) { - dst_count++; - } - } - - DEBUG("exit [%u]: mq_msgs_for_destination\n", fk_thread->pid); - return dst_count; -} - -/** - * @brief Remove all messages for given destination out of message queue. - * - * @param dst Destination address - */ -static void mq_remove_msgs_for_destination(uint16_t dst) -{ - DEBUG("call [%u]: mq_remove_msgs_for_destination\n", fk_thread->pid); - int i; - - for (i = 0; i < MESSAGE_QUEUE_SIZE; i++) { - if (message_queue[i].timestamp != 0 && - message_queue[i].message.destination == dst) { - message_queue[i].timestamp = 0; - } - } - - DEBUG("exit [%u]: mq_remove_msgs_for_destination\n", fk_thread->pid); -} - -/** - * @brief Send all queued messages for given destination. - * - * @param dst Destination address - */ -static void mq_dequeue_and_send(uint16_t dst) -{ - int i; - DEBUG("call [%u]: mq_dequeue_and_send\n", fk_thread->pid); - - /* Stop any pending RREQ-Timeout, it's possibly handled now */ - rreq_to_active = false; - utimer_remove(&ut); - - /* Prioritize packets for given destination, route entry should exist */ - route_table_entry_t *rte = rt_lookup_route(dst); - - if (rte != NULL) { - for (i = 0; i < MESSAGE_QUEUE_SIZE; i++) { - if (message_queue[i].timestamp != 0 && - message_queue[i].message.destination == dst) { - bool res = net_enqueue_for_transmission(&message_queue[i].message, - rte->interface_id, - rte->gateway, true); - - if (res) { - message_queue[i].timestamp = 0; - } - } - } - } - - /* Now all other packets */ - for (i = 0; i < MESSAGE_QUEUE_SIZE; i++) { - if (message_queue[i].timestamp != 0 && - message_queue[i].message.destination != dst) { - route_table_entry_t *rte = rt_lookup_route(message_queue[i].message.destination); - - if (rte != NULL) { - bool res = net_enqueue_for_transmission(&message_queue[i].message, - rte->interface_id, - rte->gateway, true); - - if (res) { - message_queue[i].timestamp = 0; - } - } - } - } - - /* This function was triggered either by RREP packet or RREQ-Timeout. */ - /* So update or set new RREQ-Timeout for other packets in queue. */ - post_next_rreq_timeout(); - DEBUG("exit [%u]: mq_dequeue_and_send\n", fk_thread->pid); -} - -/*---------------------------------------------------------------------------*/ -// Initialization of MMR layer -/*---------------------------------------------------------------------------*/ - -void mmr_init(void) -{ - rt_init(); - memset(message_queue, 0, sizeof(message_queue_entry_t) * MESSAGE_QUEUE_SIZE); - rreq_timeout_process_pid = thread_create(2500, PRIORITY_MMREQ, CREATE_STACKTEST, - rreq_timeout_process, rreq_timeout_process_name); -} - -/*---------------------------------------------------------------------------*/ -// Send & receive functions -/*---------------------------------------------------------------------------*/ - -/** - * @brief Tests if the net message contains a RERR. - * - * @param msg The net message to test - * - * @return true if the net message contains a RERR; false otherwise. - */ -static bool is_route_error(net_message_t *msg) -{ - if (msg->protocol == LAYER_2_PROTOCOL_MMR) { - /* First byte in {RREQ, RREP, RERR} is always type */ - if (msg->payload[0] == MMR_TYPE_RERR) { - return true; - } - } - - return false; -} - -/** - * @brief Generates a route reply message. - * - * @param rreq_msg Corresponding route request message - */ -static void generate_route_reply_message(mmr_rreq_message_t *rreq_msg) -{ - DEBUG("call [%u]: generate_route_reply_message\n", fk_thread->pid); - /* Create RREP message */ - mmr_rrep_message_t rrep_msg; - rrep_msg.type = MMR_TYPE_RREP; - rrep_msg.length = rreq_msg->length; - rrep_msg.destination = rreq_msg->source; - rrep_msg.source = rreq_msg->destination; - memcpy(rrep_msg.address, rreq_msg->address, rreq_msg->length * sizeof(uint16_t)); - - /* Create MMR message containing the RREP message */ - net_message_t net_msg; - net_msg.protocol = LAYER_2_PROTOCOL_MMR; - net_msg.flags_tos = PRIORITY_ALARM; - net_msg.seq_clr_id = 0; - net_msg.ttl = TTL_THRESHOLD; - net_msg.source = rrep_msg.source; - net_msg.destination = rrep_msg.destination; - memcpy(net_msg.payload, (void *)&rrep_msg, sizeof(mmr_rrep_message_t)); - - /* Source address must exist in route table to find correct */ - /* interface id and next hop (should be created by RREQ) */ - route_table_entry_t *rte = rt_lookup_route(net_msg.destination); - - if (rte != NULL) { - /* Send message to next hop */ - mmr_stats.rrep_originated++; - net_enqueue_for_transmission(&net_msg, rte->interface_id, rte->gateway, true); - } - - DEBUG("exit [%u]: generate_route_reply_message\n", fk_thread->pid); -} - -/** - * @brief Generates a route error message. - * - * @param dst Destination address of RERR packet - * @param gateway Next hop network address of RERR packet - * @param intf Interface id of RERR packet - * @param type Error type of RERR packet - * @param type_data Type specific data of RERR packet - */ -static void generate_route_error_message(uint16_t dst, uint16_t gateway, int intf, uint8_t type, uint16_t type_data) -{ - DEBUG("call [%u]: generate_route_error_message\n", fk_thread->pid); - /* Define RERR message */ - mmr_rerr_message_t rerr_msg; - rerr_msg.type = MMR_TYPE_RERR; - rerr_msg.error_type = type; - rerr_msg.type_specific_info = type_data; - - /* Wrap RERR message in net message */ - net_message_t net_msg; - net_msg.protocol = LAYER_2_PROTOCOL_MMR; - net_msg.flags_tos = PRIORITY_DATA; - net_msg.seq_clr_id = 0; - net_msg.ttl = TTL_THRESHOLD; - net_msg.source = net_get_address_in_subnet(dst); - net_msg.destination = dst; - memcpy(net_msg.payload, (void *)&rerr_msg, sizeof(mmr_rerr_message_t)); - - /* Send message to next hop */ - mmr_stats.rerr_originated++; - net_enqueue_for_transmission(&net_msg, intf, gateway, true); - DEBUG("exit [%u]: generate_route_error_message\n", fk_thread->pid); -} - -/** - * @brief Receive a route request message. - * - * @param msg The route request packet - * @param packet_info Additional packet information - */ -static void receive_route_request_message(mmr_rreq_message_t *msg, - packet_info_t *packet_info) -{ - DEBUG("call [%u]: receive_route_request_message\n", fk_thread->pid); - uint16_t my_addr = net_get_address_in_subnet(msg->source); -#if (MMR_INFO_LEVEL >= LEVEL_WARN) - - if (my_addr == 0) { - puts("MMR [WARN]: received RREQ with unknown network part of source address"); - puts("MMR [WARN]: => can't find own net address in sub net!"); - } - -#endif - - /* If address list of RREQ message has enough space */ - if (msg->length < ADDRESS_LIST_SIZE) { - /* append our node id to list */ - msg->address[msg->length++] = my_addr; - /* add routes with overhearing */ - rt_extract_routes(my_addr, msg->length, msg->address); - } - /* Distance between sender and receiver is too long, discard packet */ - else { - /* Drop RREQ packet => set TTL to zero */ - *packet_info->ttl_ptr = 0; - DEBUG("exit [%u]: receive_route_request_message\n", fk_thread->pid); - return; - } - - /* If RREQ message was send to us, then send RREP message */ - if (msg->destination == my_addr) { - /* Don't forward RREQ packet any further => set TTL to zero */ - *packet_info->ttl_ptr = 0; - generate_route_reply_message(msg); - } - - DEBUG("exit [%u]: receive_route_request_message\n", fk_thread->pid); -} - -/** - * @brief Receive a route reply message. - * - * @param msg The route reply packet - * @param packet_info Additional packet information - */ -static void receive_route_reply_message(mmr_rrep_message_t *msg, - packet_info_t *packet_info) -{ - DEBUG("call [%u]: receive_route_reply_message\n", fk_thread->pid); - /* RREP received: Send out queued packets for which routes are now known */ - mq_dequeue_and_send(msg->source); - DEBUG("exit [%u]: receive_route_reply_message\n", fk_thread->pid); -} - -/** - * @brief Receive a route error message. - * - * @param msg The route error packet - * @param packet_info Additional packet information - */ -static void receive_route_error_message(mmr_rerr_message_t *msg, - packet_info_t *packet_info) -{ - DEBUG("call [%u]: receive_route_error_message\n", fk_thread->pid); - - switch(msg->error_type) { - case RERR_NODE_UNREACHABLE: - rt_remove_route(msg->type_specific_info); - break; - - default: -#if (MMR_INFO_LEVEL >= LEVEL_INFO) - puts("MMR [INFO]: RERR error type is unknown"); -#endif - break; - } - - DEBUG("exit [%u]: receive_route_error_message\n", fk_thread->pid); -} - -/** - * @brief Computes the RREQ timeout period, given a - * TTL and destination address value. - * - * @param ttl Time to live - * @param dst Network destination address - * - * @return RREQ timeout period in seconds - */ -static int compute_rreq_timeout(int ttl, uint16_t dst) -{ - int t_hop = net_get_interface_transmission_duration(dst); - - if (t_hop == -1) { - t_hop = RREQ_TIMEOUT_PER_TTL * ttl; - } - else { - t_hop = (t_hop * ttl + 999) / 1000; - } - - return RREQ_TIMEOUT_BASE + 2 * t_hop; -} - -/** - * @brief Broadcast a RREQ message. - * - * A single route request can repeatedly broadcast RREQ messages, - * with increasing TTL value, until a route has been found. - * - * @param mq_entry Pointer to a message queue entry (the packet - * for which to find the route) - */ -static void rreq_broadcast(message_queue_entry_t *mq_entry) -{ - DEBUG("call [%u]: rreq_broadcast\n", fk_thread->pid); - - if (mq_entry->retry_count == RREQ_NONE) { - DEBUG("call [%u]: rreq duplicated do not send\n", fk_thread->pid); - return; - } - - /* Create RREQ message */ - mmr_rreq_message_t rreq_msg; - rreq_msg.type = MMR_TYPE_RREQ; - rreq_msg.length = 1; - rreq_msg.destination = mq_entry->message.destination; - rreq_msg.source = mq_entry->message.source; - rreq_msg.address[0] = mq_entry->message.source; - - /* Wrap RREQ message in net message */ - net_message_t net_msg; - net_msg.protocol = LAYER_2_PROTOCOL_MMR; - net_msg.flags_tos = PRIORITY_DATA; - net_msg.seq_clr_id = 0; - net_msg.ttl = mq_entry->retry_count == 0 ? TTL_START : TTL_THRESHOLD; - net_msg.source = rreq_msg.source; - net_msg.destination = NETWORK_ADDR_BC(rreq_msg.destination); - memcpy(net_msg.payload, (void *)&rreq_msg, sizeof(mmr_rreq_message_t)); - - /* Broadcast the net message */ - mq_entry->retry_count++; - mq_entry->timestamp = rtc_now(); - /* Find the broadcast route table entry */ - route_table_entry_t *rte = rt_lookup_route(net_msg.destination); - - if (rte != NULL) { - /* Next hop address is broadcast address of lower layer */ - net_enqueue_for_transmission(&net_msg, rte->interface_id, - rte->gateway, true); - } - - DEBUG("exit [%u]: rreq_broadcast\n", fk_thread->pid); -} - -/** - * @brief Find next RREQ to time out. Post event immediately or - * with utimer. - */ -static void post_next_rreq_timeout(void) -{ - DEBUG("call [%u]: post_next_rreq_timeout\n", fk_thread->pid); - int i, j = -1; - uint32_t now, next = 0xffffffff; - - for (i = 0; i < MESSAGE_QUEUE_SIZE; i++) { - if ((message_queue[i].timestamp != 0) && (message_queue[i].retry_count != - RREQ_NONE)) { - int ttl = message_queue[i].retry_count == 1 ? TTL_START : TTL_THRESHOLD; - int to = compute_rreq_timeout(ttl, - message_queue[i].message.destination); - - if (message_queue[i].timestamp + to < next) { - next = message_queue[i].timestamp + to; - j = i; - } - } - } - - if (j == -1) { - DEBUG("exit [%u]: post_next_rreq_timeout\n", fk_thread->pid); - return; - } - - /* Stop any utimer */ - rreq_to_active = false; - utimer_remove(&ut); - /* If current time greater than RREQ timeout value */ - now = rtc_now(); - - if (now >= next) { - /* Schedule RREQ-Timeout immediately */ - msg m; - m.type = MSG_TIMER; - m.content.ptr = (char *)&message_queue[j]; - rreq_to_active = true; - - if (msg_send(&m, rreq_timeout_process_pid, false) != 1) { - /* Message could not be send (receiver not waiting), schedule - * timer with minimum delay */ -#if (MMR_INFO_LEVEL >= LEVEL_WARN) - puts("MMR [WARN]: Immediate schedule of RREQ-Timeout failed, process not waiting!"); -#endif - utimer_set_wpid(&ut, 1, rreq_timeout_process_pid, &message_queue[j]); - } - } - else { - /* Set new utimer with time difference */ - rreq_to_active = true; - utimer_set_wpid(&ut, next - now, rreq_timeout_process_pid, - &message_queue[j]); - } - - DEBUG("exit [%u]: post_next_rreq_timeout\n", fk_thread->pid); -} - -/** - * This event is called periodically after a route request is originated, - * until a route has been found. - * - * Each time it is called, it rebroadcasts the route request message with a - * new rreq id and incremented TTL. - */ -static void rreq_timeout(message_queue_entry_t *mqe) -{ - DEBUG("call [%u]: rreq_timeout\n", fk_thread->pid); - - /* Test if valid entry passed */ - if (mqe->timestamp == 0) { -#if (MMR_INFO_LEVEL >= LEVEL_WARN) - puts("MMR [WARN]: invalid message queue entry for RREQ-Timeout"); -#endif - goto post_next_to; - } - - /* See if route to destination was found */ - route_table_entry_t *rte = rt_lookup_route(mqe->message.destination); - - /* If found and no messages in queue for destination: return (queued - * packets are send on reception of RREP); If found but messages in queue: - * trigger send immediately here!*/ - if (rte != NULL) { - int msg_count = mq_msgs_for_destination(mqe->message.destination); - - if (msg_count > 0) { - mq_dequeue_and_send(mqe->message.destination); - DEBUG("exit [%u]: rreq_timeout\n", fk_thread->pid); - return; - } - else { - /* Added just for security but this case should never occur */ -#if (MMR_INFO_LEVEL >= LEVEL_WARN) - puts("MMR [WARN]: RREQ-Timeout occurred, route is available but no messages for destination"); -#endif - /* Anyway: jump to update next RREQ-Timeout */ - goto post_next_to; - } - } - - /* Otherwise send new RREQ if below threshold (means also retry count != - * RREQ_NONE) */ - if (mqe->retry_count < RREQ_THRESHOLD) { - /* Broadcast new RREQ message (with incremented TTL) */ - rreq_broadcast(mqe); - } - else { - /* Remove all messages for this destination */ - mmr_stats.messages_no_route_found++; - mq_remove_msgs_for_destination(mqe->message.destination); - } - - /* Anyway: update or set next RREQ-Timeout */ -post_next_to: - post_next_rreq_timeout(); - DEBUG("exit [%u]: rreq_timeout\n", fk_thread->pid); -} - -static void rreq_timeout_process(void) -{ - msg m; - - do { - msg_receive(&m); - - if (m.type == MSG_TIMER && rreq_to_active) { - rreq_to_active = false; - rreq_timeout((message_queue_entry_t *)m.content.ptr); - } - } - while (m.type != MSG_EXIT); -} - -void mmr_peek(net_message_t *message, packet_info_t *packet_info) -{ - DEBUG("call [%u]: mmr_peek\n", fk_thread->pid); - - /* Only look at micro mesh routing messages */ - if (message->protocol == LAYER_2_PROTOCOL_MMR) { - uint8_t type = message->payload[0]; - uint16_t my_addr = net_get_address_in_subnet(message->source); - - if (type == MMR_TYPE_RREP) { - /* Add routes to route table */ - mmr_rrep_message_t *rrep_msg = (mmr_rrep_message_t *)message->payload; -#if (MMR_INFO_LEVEL >= LEVEL_WARN) - - if (my_addr == 0) { - puts("MMR [WARN]: received RREP with unknown network part of source address"); - puts("MMR [WARN]: => can't find own net address in sub net!"); - } - -#endif - rt_extract_routes(my_addr, rrep_msg->length, rrep_msg->address); - } - else if (type == MMR_TYPE_RERR) { -#if (MMR_INFO_LEVEL >= LEVEL_WARN) - - if (my_addr == 0) { - puts("MMR [WARN]: received RERR with unknown network part of source address"); - puts("MMR [WARN]: => can't find own net address in sub net!"); - } - -#endif - - /* If not destination of RERR, then remove route to unavailable - * node in RERR packet */ - if (message->destination != my_addr) { - mmr_rerr_message_t *rerr_msg = - (mmr_rerr_message_t *)message->payload; - - if (rerr_msg->error_type == RERR_NODE_UNREACHABLE) { - rt_remove_route(rerr_msg->type_specific_info); - } - } - } - } - - DEBUG("exit [%u]: mmr_peek\n", fk_thread->pid); -} - -bool mmr_send(net_message_t *message) -{ - DEBUG("call [%u]: mmr_send\n", fk_thread->pid); - bool enqueue = true; - - if (message->destination == net_get_address_in_subnet(message->destination)) { -#if (MMR_INFO_LEVEL >= LEVEL_WARN) - puts("MMR [WARN]: message is already at destination, why is routing called?"); -#endif - DEBUG("exit [%u]: mmr_send\n", fk_thread->pid); - return false; - } - - if (NETWORK_ADDR_NET(message->destination) == 0) { -#if (MMR_INFO_LEVEL >= LEVEL_WARN) - puts("MMR [WARN]: NET part of address cannot be 0!"); -#endif - DEBUG("exit [%u]: mmr_send\n", fk_thread->pid); - return false; - } - - if (NETWORK_ADDR_HOST(message->destination) == 0) { -#if (MMR_INFO_LEVEL >= LEVEL_INFO) - puts("MMR [INFO]: broadcast destination, why is routing called? A route entry should exist!"); -#endif - enqueue = false; - } - - /* Look up next hop address for this destination in routing table */ - route_table_entry_t *rte = rt_lookup_route(message->destination); - - /* If next hop address found in routing table, forward message */ - if (rte != NULL) { - DEBUG("exit [%u]: mmr_send\n", fk_thread->pid); - return net_enqueue_for_transmission(message, rte->interface_id, rte->gateway, true); - } - /* Otherwise, save message in queue; broadcast RREQ message */ - else { - if (!enqueue) { - /* Don't enqueue broadcast destinations */ - DEBUG("exit [%u]: mmr_send\n", fk_thread->pid); - return false; - } - - message_queue_entry_t *mqe = mq_add(message); - - if (mqe != NULL) { - rreq_broadcast(mqe); - post_next_rreq_timeout(); - mmr_stats.rreq_originated++; - DEBUG("exit [%u]: mmr_send\n", fk_thread->pid); - return true; - } - } - - DEBUG("exit [%u]: mmr_send\n", fk_thread->pid); - return false; -} - -void mmr_packet_dropped(net_message_t *message, uint16_t next_hop, int error) -{ - DEBUG("call [%u]: mmr_packet_dropped\n", fk_thread->pid); - - if (error == ROUTE_ERROR_BROKEN_ROUTE) { - /* Local failure detected - remove all routes through broken link */ - rt_remove_gateway_routes(next_hop); - mmr_stats.messages_broken_link_on_forward++; - } - else if (error == ROUTE_ERROR_MISSING_ROUTE) { - mmr_stats.messages_no_route_avail_on_forward++; - } - - /* If source != net_addr, send RERR to source of message */ - if (message->source != net_get_address_in_subnet(message->source)) { - /* Do not generate RERR if it is already a RERR message */ - if (is_route_error(message)) { - DEBUG("exit [%u]: mmr_packet_dropped\n", fk_thread->pid); - return; - } - - /* Find next hop to source */ - route_table_entry_t *rte = rt_lookup_route(message->source); - - if (rte != NULL) { - generate_route_error_message(message->source, rte->gateway, - rte->interface_id, - RERR_NODE_UNREACHABLE, - message->destination); - } - -#if (MMR_INFO_LEVEL >= LEVEL_WARN) - else { - printf("MMR [WARN]: cannot send RERR to source #%u, no route found!\n", - message->source); - } - -#endif - } - - DEBUG("exit [%u]: mmr_packet_dropped\n", fk_thread->pid); -} - -void mmr_receive(void *msg, int msg_size, packet_info_t *packet_info) -{ - DEBUG("call [%u]: mmr_receive\n", fk_thread->pid); - uint8_t *p = (uint8_t *) msg; - uint8_t type = p[0]; - - if (type == MMR_TYPE_RREQ) { - receive_route_request_message((mmr_rreq_message_t *)msg, packet_info); - mmr_stats.rreq_received++; - } - else if (type == MMR_TYPE_RREP) { - receive_route_reply_message((mmr_rrep_message_t *)msg, packet_info); - mmr_stats.rrep_received++; - } - else if (type == MMR_TYPE_RERR) { - receive_route_error_message((mmr_rerr_message_t *)msg, packet_info); - mmr_stats.rerr_received++; - } - -#if (MMR_INFO_LEVEL >= LEVEL_INFO) - else { - printf("MMR [INFO]: can't handle message of type %u\n", type); - } - -#endif - DEBUG("exit [%u]: mmr_receive\n", fk_thread->pid); -} - -void mmr_print_stats(void) -{ - printf("ROUTING LAYER STATS\r\n"); - printf("-------------------\r\n"); - printf("Route requests originated: %lu\r\n", mmr_stats.rreq_originated); - printf("Route requests duplicated: %lu\r\n", mmr_stats.rreq_duplicated); - printf("Route replies originated: %lu\r\n", mmr_stats.rrep_originated); - printf("Route errors originated: %lu\r\n", mmr_stats.rerr_originated); - printf("Route requests received: %lu\r\n", mmr_stats.rreq_received); - printf("Route replies received: %lu\r\n", mmr_stats.rrep_received); - printf("Route errors received: %lu\r\n", mmr_stats.rerr_received); - printf("\r\n"); - printf("#Messages with no route found: %lu\r\n", mmr_stats.messages_no_route_found); - printf("#Messages with broken link on forward: %lu\r\n", mmr_stats.messages_broken_link_on_forward); - printf("#Messages with no route available on forward: %lu\r\n", mmr_stats.messages_no_route_avail_on_forward); - printf("\r\n"); -} diff --git a/sys/net/mm/mmr.h b/sys/net/mm/mmr.h deleted file mode 100644 index 8ec55c2abbc334ae23b954d1a1c45c76bd6f13ba..0000000000000000000000000000000000000000 --- a/sys/net/mm/mmr.h +++ /dev/null @@ -1,171 +0,0 @@ -/****************************************************************************** -Copyright 2008, Freie Universitaet Berlin (FUB). All rights reserved. - -These sources were developed at the Freie Universitaet Berlin, Computer Systems -and Telematics group (http://cst.mi.fu-berlin.de). -------------------------------------------------------------------------------- -This file is part of RIOT. - -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 3 of the License, or (at your option) any later -version. - -RIOT 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, see http://www.gnu.org/licenses/ . --------------------------------------------------------------------------------- -For further information and questions please use the web site - http://scatterweb.mi.fu-berlin.de -and the mailinglist (subscription via web site) - scatterweb@lists.spline.inf.fu-berlin.de -*******************************************************************************/ - -#ifndef MMR_H_ -#define MMR_H_ - -/** - * @file - * @internal - * @brief Micro Mesh Routing - * - * @author Freie Universität Berlin, Computer Systems & Telematics - * @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de> - * @version $Revision: 3854 $ - * - * @note $Id: mmr.h 3854 2011-12-06 15:27:01Z hwill $ - */ - -#include "net-types.h" - -#define MMR_TYPE_RREQ (1) -#define MMR_TYPE_RREP (2) -#define MMR_TYPE_RERR (3) - -#define ADDRESS_LIST_SIZE (21) - -#define RERR_NODE_UNREACHABLE (1) - -/** - * Represents a Route Request (RREQ) message. - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Type | Length | Destination | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Source | Address[1..n] | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ -typedef struct __attribute__((packed)) { - uint8_t type; ///< Must be first byte in struct for type detection - uint8_t length; - uint16_t destination; - uint16_t source; - uint16_t address[ADDRESS_LIST_SIZE]; -} mmr_rreq_message_t; - -/** - * Represents a Route Reply (RREP) message. - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Type | Length | Destination | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Source | Address[1..n] | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ -typedef struct __attribute__((packed)) { - uint8_t type; ///< Must be first byte in struct for type detection - uint8_t length; - uint16_t destination; - uint16_t source; - uint16_t address[ADDRESS_LIST_SIZE]; -} mmr_rrep_message_t; - -/** - * Represents a Route Error (RERR) message. - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Type | Error Type | Type-Specific Information | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * Valid Error Types are: - * - * 1 = NODE_UNREACHABLE - * - * Node Unreachable Type-Specific Information: - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Unreachable Node Address | | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - */ -typedef struct __attribute__((packed)) { - uint8_t type; ///< Must be first byte in struct for type detection - uint8_t error_type; - uint16_t type_specific_info; -} mmr_rerr_message_t; - -/** - * @brief Initialize MMR layer. - */ -void mmr_init(void); - -/** - * Called by the network layer for every incoming packet. A routing - * implementation may wish to look at these packets for informational - * purposes, but should not change their contents. - * - * @param message incoming packet - * @param packet_info Additional packet information - */ -void mmr_peek(net_message_t *message, packet_info_t *packet_info); - -/** - * Called by the network layer to request transmission of a packet that - * requires routing. It is the responsibility of the routing layer to provide - * a best-effort transmission of this packet to an appropriate next hop by - * calling the networks layer sending routines once this routing information - * becomes available. - * - * @param message outgoing packet - * - * @return true if packet was successfully stored for transmission; false otherwise - * (e.g. message queue full). - */ -bool mmr_send(net_message_t *message); - -/** - * Called by the network layer which forwards notifications of dropped packets - * from the link layer. Not all MAC implementations support this feature! - * - * @param message dropped network packet - * @param next_hop next hop network address of dropped packet (can be undefined) - * @param error Error type which informs about reason - */ -void mmr_packet_dropped(net_message_t *message, uint16_t next_hop, int error); - -/** - * @brief Receive a message from network layer. - * - * @param msg message received - * @param msg_size Size of received message - * @param packet_info Additional packet information - */ -void mmr_receive(void *msg, int msg_size, packet_info_t *packet_info); - -/** - * @brief Print routing layer statistics. - */ -void mmr_print_stats(void); - -#endif /* MMR_H_ */ diff --git a/sys/net/mm/mmstack.c b/sys/net/mm/mmstack.c deleted file mode 100644 index d303bc4411a4b3f133dac9f91f46c25b859a2b97..0000000000000000000000000000000000000000 --- a/sys/net/mm/mmstack.c +++ /dev/null @@ -1,925 +0,0 @@ -/****************************************************************************** -Copyright 2009, Freie Universitaet Berlin (FUB). All rights reserved. - -These sources were developed at the Freie Universitaet Berlin, Computer Systems -and Telematics group (http://cst.mi.fu-berlin.de). -------------------------------------------------------------------------------- -This file is part of RIOT. - -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 3 of the License, or (at your option) any later -version. - -RIOT 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, see http://www.gnu.org/licenses/ . --------------------------------------------------------------------------------- -For further information and questions please use the web site - http://scatterweb.mi.fu-berlin.de -and the mailinglist (subscription via web site) - scatterweb@lists.spline.inf.fu-berlin.de -*******************************************************************************/ - -#include "configure.h" -#include "mmstack.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "utimer.h" -#include "kernel.h" -#include "thread.h" -#include "msg.h" - -#include "net.h" -#include "mmr.h" -#include "trans.h" -#include "clock.h" -#include "cmdengine.h" - -/** - * @file - * @brief - * - * @author Freie Universität Berlin, Computer Systems & Telematics - * @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de> - * @version $Revision: 3854 $ - * - * @note $Id: mmstack.c 3854 2011-12-06 15:27:01Z hwill $ - */ - -/*---------------------------------------------------------------------------*/ -// Data structures for build in ping -/*---------------------------------------------------------------------------*/ - -#define MMS_PING_PACKETS (4) ///< Default number of packets in a ping -#define MMS_PING_ECHO_REQUEST (8) ///< Ping type: echo request -#define MMS_PING_ECHO_REPLY (0) ///< Ping type: echo reply - -/** - * Represents a ping message. - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Type | Identifier | SeqNum | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Timestamp | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ -typedef struct __attribute__((packed)) { - uint8_t type; ///< Type of ping message (request or reply) - uint8_t identifier; ///< Unique identifier for ping process - uint16_t seq_num; ///< Sequence number (increasing number within that process) - uint32_t timestamp; ///< Timestamp of request message -} mms_ping_message_t; - -/** - * @brief Send ping echo request to destination address. - * - * @param destination The destination address. - * @param seq Sequence number of ping message. - * @param prio Priority of ping message. - * @param ttl TTL value for network message. - */ -static void mms_ping(uint16_t destination, uint8_t seq, uint8_t prio, int ttl); - -static uint8_t mms_ping_last_proc_id; ///< Random process id of last ping request -static uint8_t mms_ping_packets; ///< Number of ping replies received -static int mms_ping_dups; ///< Duplicates -static bool ping_bc_mode; ///< If option -b is set and address is BC -static bool ping_silent_mode; ///< If option -s is set -static bool *dups; ///< Helper buffer to check for DUPs -static float rtt_min; ///< Min. RTT -static float rtt_max; ///< Max. RTT -static float rtt_avg; ///< Avg. RTT - -static struct utimer mms_ping_utimer; ///< utimer for ping -static uint16_t mms_ping_pid; ///< Process ID of process ping is running within - -/*---------------------------------------------------------------------------*/ -// Data structures for build in SSH -/*---------------------------------------------------------------------------*/ - -#define MMS_SSH_CON_REQUEST (1) ///< SSH type: connection request -#define MMS_SSH_CON_ACCEPT (2) ///< SSH type: connection accept -#define MMS_SSH_CON_REJECT (3) ///< SSH type: connection reject -#define MMS_SSH_CON_CLOSE (4) ///< SSH type: connection close -#define MMS_SSH_DATA (5) ///< SSH type: data packet - -#define MMS_SSH_DATA_MAX (43) ///< Maximum SSH data packet size - -/** - * Represents a SSH message. - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Type | | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ -typedef struct __attribute__((packed)) { - uint8_t type; ///< Type of SSH message -} mms_ssh_message_t; - -/** - * Represents a SSH data message. - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Type | Data | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ -typedef struct __attribute__((packed)) { - uint8_t type; ///< Type of SSH message - uint8_t data[MMS_SSH_DATA_MAX]; ///< Message information -} mms_ssh_data_message_t; - -/** - * @brief Make SSH connection request with given node. - * - * @param destination The destination address. - */ -static void mms_ssh_connect(uint16_t destination); - -/** - * @brief Accept or reject SSH connection request. - * - * @param destination The destination address. - * @param socket The socket to use or -1. - * @param accept Whether to accept or reject the connection request. - */ -static void mms_ssh_reply_connect(uint16_t destination, int socket, bool accept); - -/** - * @brief Close SSH connection. - * - * @param destination The destination address. - */ -static void mms_ssh_close(uint16_t destination); - -static volatile int ssh_socket = -1; - -/*---------------------------------------------------------------------------*/ -// Interface definitions -/*---------------------------------------------------------------------------*/ - -static route_interface_t r_iface = { - rt_add_route, - rt_add_fix_route, - rt_lookup_route, - mmr_peek, - mmr_send, - mmr_packet_dropped, - mmr_receive, - mmr_print_stats -}; - -/*---------------------------------------------------------------------------*/ -// Build in MMS commands -/*---------------------------------------------------------------------------*/ - -//#if CMD_ISLEVEL(CMD_LEVEL_SYSTEM_DEBUG | CMD_LEVEL_HUMAN_USER | CMD_LEVEL_OPERATION) -ASCCMD(route, CMDFLAG_SERIAL, "[-adfFg] print kernel route table"); -CMD_FUNCTION(route, cmdargs) -{ - if (cmdargs->arg_size > 0) { - char *msg = (char *)cmdargs->args; - - while (*msg == ' ') { - msg++; - } - - if (*msg == '-' && *(msg + 1) == 'f') { - mms_flush_routes(false); - printf("Kernel route table flushed (non-static)!\n"); - return CMD_SUCCESS; - } - else if (*msg == '-' && *(msg + 1) == 'F') { - mms_flush_routes(true); - printf("Kernel route table flushed (static)!\n"); - return CMD_SUCCESS; - } - else if (*msg == '-' && *(msg + 1) == 'd') { - msg++; - msg++; - - while (*msg == ' ') { - msg++; - } - - uint16_t address = net_strtoaddr(msg, &msg); - - if (rt_remove_static_route(address)) { - printf("Static route deleted successfully!\n"); - return CMD_SUCCESS; - } - - return CMD_ERROR; - } - else if (*msg == '-' && *(msg + 1) == 'g') { - msg++; - msg++; - - while (*msg == ' ') { - msg++; - } - - uint16_t address = net_strtoaddr(msg, &msg); - int c = rt_remove_static_gateway_routes(address); - printf("%u static route(s) deleted!\n", c); - return CMD_SUCCESS; - } - else if (*msg == '-' && *(msg + 1) == 'a') { - msg++; - msg++; - - while (*msg == ' ') { - msg++; - } - - uint16_t address = net_strtoaddr(msg, &msg); - uint16_t gateway = net_strtoaddr(msg, &msg); - int metric = (int)strtoul(msg, &msg, 0); - int iface = (int)strtoul(msg, &msg, 0); - - if (address != 0 && gateway != 0) { - if (rt_add_static_route(address, gateway, metric, iface)) { - printf("Static route added successfully!\n"); - return CMD_SUCCESS; - } - } - - return CMD_ERROR; - } - else { - printf("Usage: route [-adfFg] print kernel route table\n\n"); - printf(" -a <DST> <GW> <M> <IFACE>, add static route to kernel route table\n"); - printf(" -d <DST>, delete static route out of kernel route table\n"); - printf(" -f, flush non-static routes out of kernel route table\n"); - printf(" -F, flush static routes out of kernel route table\n"); - printf(" -g <GW>, delete static routes out of kernel route table with a\n" - " specific gateway\n\n"); - printf(" <DST> = destination network address\n"); - printf(" <GW> = gateway network address\n"); - printf(" <M> = metric, e.g. number of hops\n"); - printf(" <IFACE> = network interface number\n\n"); - return CMD_ERROR; - } - } - else { - mms_print_routes(); - return CMD_SUCCESS; - } -} - -ASCCMD(ifconfig, CMDFLAG_SERIAL, "[IFACE]: print interface configuration"); -CMD_FUNCTION(ifconfig, cmdargs) -{ - if (cmdargs->arg_size > 0) { - char *msg; - int iface = (int)strtoul(cmdargs->args, &msg, 0); - - if (cmdargs->arg_size > 1) { - while (*msg == ' ') { - msg++; - } - - if (*msg == '-' && (*(msg + 1) == 'P' || *(msg + 1) == 'p')) { - msg++; - msg++; - uint8_t power = (uint8_t)strtoul(msg, &msg, 0); - - if (*msg != '\0') { - return CMD_ERROR; - } - - if (mms_set_output_power(iface, power)) { - printf("Output power set!\n"); - return CMD_SUCCESS; - } - - return CMD_ERROR; - } - else if (*msg == '-' && (*(msg + 1) == 'A' || *(msg + 1) == 'a')) { - msg++; - msg++; - - while (*msg == ' ') { - msg++; - } - - uint16_t address = net_strtoaddr(msg, &msg); - - if (mms_set_interface_address(iface, address)) { - printf("Interface address set!\n"); - return CMD_SUCCESS; - } - - return CMD_ERROR; - } - else { - printf("Usage: ifconfig [IFACE] [-AP] print interface configuration\n\n"); - printf(" -A <ADDR>, set interface address, e.g. ifconfig 0 -A 1.1\n"); - printf(" -P <POWER>, set output power on interface\n\n"); - return CMD_ERROR; - } - } - else { - mms_print_ifconfig(iface); - } - } - else { - mms_print_ifconfig(-1); - } - - return CMD_SUCCESS; -} - -ASCCMD(ping, CMDFLAG_SERIAL, "ping [-bchpstw] destination"); -CMD_FUNCTION(ping, cmdargs) -{ - if (cmdargs->arg_size > 0) { - int i; - msg m; - uint8_t count = MMS_PING_PACKETS; - uint8_t prio = PRIORITY_DATA; - bool bc = false; - ping_bc_mode = false; - ping_silent_mode = false; - int ttl = 10; - long timeout = 3; - char adrbuf[10]; - const char *msg = cmdargs->args; - read_ping_cmd: - - while (*msg == ' ') { - msg++; - } - - if (*msg == '-' && (*(msg + 1) == 'B' || *(msg + 1) == 'b')) { - bc = true; - msg++; - msg++; - goto read_ping_cmd; - } - else if (*msg == '-' && (*(msg + 1) == 'C' || *(msg + 1) == 'c')) { - msg++; - msg++; - unsigned long tc = strtoul(msg, (char **)&msg, 0); - - if (tc == 0) { - return CMD_ERROR; - } - - if (tc > 255) { - puts("Not more than 255 ping messages allowed!"); - return CMD_ERROR; - } - - count = (uint8_t) tc; - goto read_ping_cmd; - } - else if (*msg == '-' && (*(msg + 1) == 'H' || *(msg + 1) == 'h')) { - printf("Usage: ping [-bchpstw] destination\n\n"); - printf(" -b, do a broadcast ping\n"); - printf(" -c <COUNT>, set number of ping messages\n"); - printf(" -h, print a help synopsis\n"); - printf(" -p <PRIO>, set the ping message priority\n"); - printf(" PRIO = 1: alarm\n"); - printf(" PRIO = 2: warning\n"); - printf(" PRIO = 3: data (default)\n"); - printf(" -s, silent mode (no messages printed out)\n"); - printf(" -t <TTL>, TTL value of ping messages (default: 10)\n"); - printf(" -w <WAIT>, time to wait for a response, in seconds (default: 3)\n\n"); - return CMD_SUCCESS; - } - else if (*msg == '-' && (*(msg + 1) == 'p' || *(msg + 1) == 'P')) { - msg++; - msg++; - unsigned long tp = strtoul(msg, (char **)&msg, 0); - - if (tp == 0) { - return CMD_ERROR; - } - - if (tp == 1) { - prio = 0; - } - else if (tp == 2) { - prio = 1; - } - else { - prio = 2; - } - - goto read_ping_cmd; - } - else if (*msg == '-' && (*(msg + 1) == 's' || *(msg + 1) == 'S')) { - ping_silent_mode = true; - msg++; - msg++; - goto read_ping_cmd; - } - else if (*msg == '-' && (*(msg + 1) == 't' || *(msg + 1) == 'T')) { - msg++; - msg++; - unsigned long to = strtoul(msg, (char **)&msg, 0); - - if (to == 0 || to > 255) { - return CMD_ERROR; - } - - ttl = to; - goto read_ping_cmd; - } - else if (*msg == '-' && (*(msg + 1) == 'w' || *(msg + 1) == 'W')) { - msg++; - msg++; - unsigned long to = strtoul(msg, (char **)&msg, 0); - - if (to == 0) { - return CMD_ERROR; - } - - timeout = to; - goto read_ping_cmd; - } - - uint16_t address = net_strtoaddr((char *)msg, (char **)&msg); - - if (address == 0) { - return CMD_ERROR; - } - - int iface_addr = net_get_address_in_subnet(address); - - /* No ping to unsupported network or own address */ - if (iface_addr == 0 || iface_addr == address) { - return CMD_ERROR; - } - - /* If broadcast destination address, limit TTL to one hop */ - if (address == NETWORK_ADDR_BC(address)) { - if (!bc) { - puts("Do you want to ping broadcast? Then -b"); - return CMD_ERROR; - } - - ttl = 1; - ping_bc_mode = true; - } - - /* Try to malloc duplicate detection buffer */ - dups = (bool *) malloc(count * sizeof(bool)); - - if (dups == NULL) { - puts("Not enough system memory to fulfill your request!"); - return CMD_ERROR; - } - - net_addrtostr(address, adrbuf, sizeof(adrbuf)); - printf("PING %s %lu bytes of data.\n", adrbuf, sizeof(mms_ping_message_t)); - mms_ping_packets = 0; - mms_ping_dups = 0; - mms_ping_last_proc_id = (rand() % 255) + 1; - rtt_min = 0xffffffff; - rtt_max = 0x00000000; - rtt_avg = 0x00000000; - mms_ping_pid = fk_thread->pid; - long ts_start = (uint32_t)clock_get_systemtime(); - - for (i = 1; i <= count; i++) { - /* No duplicate for this sequence number possible */ - dups[i - 1] = false; - /* Send ping echo request to destination */ - mms_ping(address, i, prio, ttl); - /* Set timeout for next ping echo request packet to ::timeout seconds */ - utimer_set_wpid(&mms_ping_utimer, timeout, mms_ping_pid, NULL); - /* Wait for ping echo reply or timeout */ - msg_receive(&m); - /* Remove user timer because maybe woken up by ping response */ - utimer_remove(&mms_ping_utimer); - } - - ts_start = (uint32_t)clock_get_systemtime() - ts_start; - printf("--- %s ping statistics ---\n", adrbuf); - - if (mms_ping_dups == 0) { - printf("%u packets transmitted, %u received, %u%% packet loss, time %lu ms\n", count, - mms_ping_packets, ((count - mms_ping_packets) * 100) / count, ts_start); - } - else { - printf("%u packets transmitted, %u received, +%i duplicates, %u%% packet loss, time %lu ms\n", count, - mms_ping_packets, mms_ping_dups, ((count - mms_ping_packets) * 100) / count, ts_start); - } - - if (mms_ping_packets > 0) { - printf("rtt min/avg/max = %.2f/%.2f/%.2f ms\n", rtt_min, rtt_avg / (mms_ping_packets + mms_ping_dups), rtt_max); - } - - if (!ping_bc_mode && mms_ping_packets == count) { - /* Calculate approximate throughput */ - printf("--- %s throughput statistics ---\n", adrbuf); - float bw = (count * (8 + 4 + 62 + 2) * 1000) / (float)ts_start; /* for CC1100 */ - printf("approximate throughput (air): %.2f byte/sec\n", 2 * bw); - bw = (count * 58 * 1000) / (float)ts_start; /* for CC1100 */ - printf("approximate throughput (dll): %.2f byte/sec\n", 2 * bw); - bw = (count * NET_MESSAGE_PAYLOAD_LENGTH * 1000) / (float)ts_start; - printf("approximate throughput (net): %.2f byte/sec\n", 2 * bw); - bw = (count * UDPL_MESSAGE_LENGTH * 1000) / (float)ts_start; - printf("approximate throughput (trans/UDPL): %.2f byte/sec\n", 2 * bw); - bw = (count * TCPL_MESSAGE_LENGTH * 1000) / (float)ts_start; - printf("approximate throughput (trans/TCPL): %.2f byte/sec\n", bw); - } - - /* Ping is over, clear random ping process id and buffer */ - mms_ping_last_proc_id = 0; - free(dups); - return CMD_SUCCESS; - } - - return CMD_ERROR; -} - -ASCCMD(ssh, CMDFLAG_SERIAL, "Usage: ssh [-q] destination"); -CMD_FUNCTION(ssh, cmdargs) -{ - if (cmdargs->arg_size > 0) { - bool quit = false; - const char *msg = cmdargs->args; - - while (*msg == ' ') { - msg++; - } - - if (*msg == '-' && (*(msg + 1) == 'Q' || *(msg + 1) == 'q')) { - quit = true; - msg++; - msg++; - } - - uint16_t address = net_strtoaddr((char *)msg, (char **)&msg); - - if (address == 0) { - return CMD_ERROR; - } - - int iface_addr = net_get_address_in_subnet(address); - - /* No ssh to unsupported network or own address */ - if (iface_addr == 0 || iface_addr == address) { - return CMD_ERROR; - } - - /* If broadcast destination address, also exit here */ - if (address == NETWORK_ADDR_BC(address)) { - return CMD_ERROR; - } - - if (!quit) { - mms_ssh_connect(address); - } - else { - mms_ssh_close(address); - } - - return CMD_SUCCESS; - } - - return CMD_ERROR; -} -//#endif - -/*---------------------------------------------------------------------------*/ -// Ping message handler and send function -/*---------------------------------------------------------------------------*/ - -static void mms_ping_handler(void *message, int message_size, - packet_info_t *packet_info) -{ - mms_ping_message_t *ping = (mms_ping_message_t *)message; - - if (ping->type == MMS_PING_ECHO_REQUEST) { - ping->type = MMS_PING_ECHO_REPLY; - net_send((void *)ping, sizeof(mms_ping_message_t), packet_info->source, - LAYER_2_PROTOCOL_PING, packet_info->tos, 10); - } - else if (ping->type == MMS_PING_ECHO_REPLY) { - if (ping->identifier == mms_ping_last_proc_id) { - msg m; - bool wasDup = false; - char *msgDup; - char buf[10]; - - if (dups[ping->seq_num - 1]) { - wasDup = true; - mms_ping_dups++; - msgDup = "(DUP!)"; - } - else { - mms_ping_packets++; - dups[ping->seq_num - 1] = true; - msgDup = ""; - } - - if (!ping_bc_mode && !wasDup) { - utimer_remove(&mms_ping_utimer); /* Stop timeout timer */ - } - - float ms = ((uint32_t)clock_get_systemtime() - ping->timestamp); - - if (ms < rtt_min) { - rtt_min = ms; - } - - if (ms > rtt_max) { - rtt_max = ms; - } - - rtt_avg += ms; - - if (!ping_silent_mode) { - net_addrtostr(packet_info->source, buf, sizeof(buf)); - printf("%lu bytes from %s: seq=%u ttl=%u time=%.2f ms %s\n", - sizeof(mms_ping_message_t), buf, - ping->seq_num, *packet_info->ttl_ptr, ms, msgDup); - } - - if (!ping_bc_mode && !wasDup) { - msg_send(&m, mms_ping_pid, false); - } - } - } -} - -static void mms_ping(uint16_t destination, uint8_t seq, uint8_t prio, int ttl) -{ - mms_ping_message_t ping_request; - ping_request.type = MMS_PING_ECHO_REQUEST; - ping_request.identifier = 0; - ping_request.identifier = mms_ping_last_proc_id; - ping_request.seq_num = seq; - ping_request.timestamp = (uint32_t)clock_get_systemtime(); - net_send((void *)&ping_request, sizeof(mms_ping_message_t), - destination, LAYER_2_PROTOCOL_PING, prio, ttl); -} - -/*---------------------------------------------------------------------------*/ -// SSH message handler and send functions -/*---------------------------------------------------------------------------*/ - -static void mms_ssh_connect(uint16_t destination) -{ - mms_ssh_message_t ssh; - ssh.type = MMS_SSH_CON_REQUEST; - mms_send((void *)&ssh, sizeof(mms_ssh_message_t), destination, - LAYER_3_PROTOCOL_SSH, PRIORITY_DATA); -} - -static void mms_ssh_reply_connect(uint16_t destination, int socket, bool accept) -{ - mms_ssh_message_t ssh; - ssh.type = accept ? MMS_SSH_CON_ACCEPT : MMS_SSH_CON_REJECT; - trans_sendto(socket, (void *)&ssh, sizeof(mms_ssh_message_t), - LAYER_3_PROTOCOL_SSH, PRIORITY_DATA, destination); -} - -static void mms_ssh_close(uint16_t destination) -{ - mms_ssh_message_t ssh; - ssh.type = MMS_SSH_CON_CLOSE; - mms_send((void *)&ssh, sizeof(mms_ssh_message_t), destination, - LAYER_3_PROTOCOL_SSH, PRIORITY_DATA); -} - -static void mms_ssh_handler(void *message, int message_size, - packet_info_t *packet_info) -{ - char adrbuf[10]; - mms_ssh_message_t *ssh = (mms_ssh_message_t *)message; - - if (ssh->type == MMS_SSH_CON_REQUEST) { - if (ssh_socket > -1) { - mms_ssh_reply_connect(packet_info->source, -1, false); - return; - } - - ssh_socket = trans_socket(SOCK_TCPL); - - if (ssh_socket < 0) { - mms_ssh_reply_connect(packet_info->source, -1, false); - return; - } - - trans_connect(ssh_socket, packet_info->source); - mms_ssh_reply_connect(packet_info->source, ssh_socket, true); - } - else if (ssh->type == MMS_SSH_CON_ACCEPT) { - net_addrtostr(packet_info->source, adrbuf, sizeof(adrbuf)); - printf("SSH connection accepted by %s\n", adrbuf); - } - else if (ssh->type == MMS_SSH_CON_REJECT) { - net_addrtostr(packet_info->source, adrbuf, sizeof(adrbuf)); - printf("SSH connection rejected by %s\n", adrbuf); - } - else if (ssh->type == MMS_SSH_CON_CLOSE) { - if (ssh_socket > -1) { - uint16_t peer; - trans_getpeername(ssh_socket, &peer); - - if (peer == packet_info->source) { - if (trans_close(ssh_socket, CLOSE_IMMEDIATE) == 1) { - ssh_socket = -1; - } - } - } - } - else if (ssh->type == MMS_SSH_DATA) { - mms_ssh_data_message_t *ssh_data = (mms_ssh_data_message_t *)message; - printf((char *)ssh_data->data); - fflush(stderr); - } -} - -void mms_net_printf(const char *format) -{ - if (ssh_socket > -1) { - mms_ssh_data_message_t ssh_data; - ssh_data.type = MMS_SSH_DATA; - int i = 0; - int len = strlen(format); - - while (i < len) { - int chunk = len - i > (MMS_SSH_DATA_MAX - 1) ? (MMS_SSH_DATA_MAX - 1) : len - i; - memset(ssh_data.data, 0, sizeof(ssh_data.data)); - memcpy(ssh_data.data, format + i, chunk); - - if (trans_send(ssh_socket, (void *)&ssh_data, sizeof(mms_ssh_data_message_t), - LAYER_3_PROTOCOL_SSH, PRIORITY_DATA) < 0) { - break; - } - - i += chunk; - } - } - else { - printf(format); - } -} - -/*---------------------------------------------------------------------------*/ -// Micro Mesh Stack API -/*---------------------------------------------------------------------------*/ - -void mms_init(void) -{ - mms_initp(LAYER_2_PROTOCOL_MMR, &r_iface); -} - -void mms_initp(protocol_t rp, route_interface_t *ri) -{ - /* Initialize routing & network layer */ - mmr_init(); - net_init(ri); - /* Initialize transport layer */ - trans_init(); - /* Add routing as protocol handler for given route messages */ - net_set_protocol_handler(rp, ri->receive); - /* Add transport as protocol handler for UDPL and TCPL messages */ - net_set_protocol_handler(LAYER_2_PROTOCOL_UDPL, trans_receive_udpl); - net_set_protocol_handler(LAYER_2_PROTOCOL_TCPL, trans_receive_tcpl); - /* Add MMS ping handler */ - net_set_protocol_handler(LAYER_2_PROTOCOL_PING, mms_ping_handler); - /* Add SSH handler */ - trans_set_protocol_handler(LAYER_3_PROTOCOL_SSH, mms_ssh_handler); -} - -/*---------------------------------------------------------------------------*/ - -int mms_add_interface(const char *name, uint16_t addr, const radio_t *radio) -{ - return net_add_interface(name, addr, radio); -} - -/*---------------------------------------------------------------------------*/ - -uint16_t mms_get_interface_address(int interface_id) -{ - return net_get_interface_address(interface_id); -} - -/*---------------------------------------------------------------------------*/ - -bool mms_set_interface_address(int interface_id, uint16_t addr) -{ - return net_set_interface_address(interface_id, addr); -} - -/*---------------------------------------------------------------------------*/ - -bool mms_set_output_power(int interface_id, uint8_t pa_idx) -{ - return net_set_output_power(interface_id, pa_idx); -} - -/*---------------------------------------------------------------------------*/ - -int mms_set_protocol_handler(protocol_t protocol, packet_handler_t handler) -{ - return trans_set_protocol_handler(protocol, handler); -} - -/*---------------------------------------------------------------------------*/ - -void mms_receive(void *msg, int msg_size, packet_info_t *packet_info) -{ - net_receive(msg, msg_size, packet_info); -} - -/*---------------------------------------------------------------------------*/ - -int mms_socket(int type) -{ - return trans_socket(type); -} - -/*---------------------------------------------------------------------------*/ - -int mms_connect(int socket, uint16_t dest_addr) -{ - return trans_connect(socket, dest_addr); -} - -/*---------------------------------------------------------------------------*/ - -int mms_sock_send(int socket, void *buffer, int length, protocol_t protocol, - uint8_t priority) -{ - return trans_send(socket, buffer, length, protocol, priority); -} - -/*---------------------------------------------------------------------------*/ - -int mms_sock_sendto(int socket, void *buffer, int length, protocol_t protocol, - uint8_t priority, uint16_t dest_addr) -{ - return trans_sendto(socket, buffer, length, protocol, priority, dest_addr); -} - -/*---------------------------------------------------------------------------*/ - -int mms_send(void *msg, int msg_len, uint16_t dst, protocol_t protocol, - uint8_t priority) -{ - return trans_sendto(-1, msg, msg_len, protocol, priority, dst); -} - -/*---------------------------------------------------------------------------*/ - -int mms_poll(int socket) -{ - return trans_poll(socket); -} - -/*---------------------------------------------------------------------------*/ - -int mms_close(int socket, int how) -{ - return trans_close(socket, how); -} - -/*---------------------------------------------------------------------------*/ - -void mms_flush_routes(bool flush_static) -{ - rt_flush_routes(flush_static); -} - -/*---------------------------------------------------------------------------*/ - -void mms_print_routes(void) -{ - rt_print_routes(); -} - -/*---------------------------------------------------------------------------*/ - -void mms_print_ifconfig(int iface) -{ - net_print_ifconfig(iface); -} - -/*---------------------------------------------------------------------------*/ - -void mms_print_stats(void) -{ - net_print_stats(); - printf("\r\n"); - r_iface.print_stats(); -} diff --git a/sys/net/mm/mmstack.h b/sys/net/mm/mmstack.h deleted file mode 100644 index 927da70b84d4dec02ed1e38d169fa0742a5b81b9..0000000000000000000000000000000000000000 --- a/sys/net/mm/mmstack.h +++ /dev/null @@ -1,214 +0,0 @@ -/****************************************************************************** -Copyright 2009, Freie Universitaet Berlin (FUB). All rights reserved. - -These sources were developed at the Freie Universitaet Berlin, Computer Systems -and Telematics group (http://cst.mi.fu-berlin.de). -------------------------------------------------------------------------------- -This file is part of RIOT. - -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 3 of the License, or (at your option) any later -version. - -RIOT 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, see http://www.gnu.org/licenses/ . --------------------------------------------------------------------------------- -For further information and questions please use the web site - http://scatterweb.mi.fu-berlin.de -and the mailinglist (subscription via web site) - scatterweb@lists.spline.inf.fu-berlin.de -*******************************************************************************/ - -#ifndef MMSTACK_H_ -#define MMSTACK_H_ - -/** - * @defgroup net_mmstack Micro Mesh Stack - * @ingroup net - * - * @{ - */ - -/** - * @file - * @brief - * - * @author Freie Universität Berlin, Computer Systems & Telematics - * @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de> - * @version $Revision: 3854 $ - * - * @note $Id: mmstack.h 3854 2011-12-06 15:27:01Z hwill $ - */ - -#include "radio.h" -#include "net-types.h" - -/** - * @brief Initialize micro mesh stack. - */ -void mms_init(void); - -/** - * @brief Initialize micro mesh stack. - * - * @param rp Routing protocol type identifier. - * @param ri Pointer to route interface. - */ -void mms_initp(protocol_t rp, route_interface_t *ri); - -/** - * @brief Add network interface. - * - * @param name Network layer name on this interface (maximum 5 characters). - * @param addr Network layer address on this interface. - * @param radio Radio layer API access. - * - * @return Interface identifier or -1 if an error occurs. - */ -int mms_add_interface(const char *name, uint16_t addr, const radio_t *radio); - -/** - * @brief Get the address of the network interface with given id. - * - * @param interface_id The network interface id. - * - * @return The address of the network interface with given id - * or 0 if no interface with given id is found. - */ -uint16_t mms_get_interface_address(int interface_id); - -/** - * @brief Set the address of the network interface with the given id. - * - * @param interface_id The network interface id. - * @param addr The new address to set. - * - * @return true if address was successfully set; false otherwise (e.g. - * wrong interface, invalid address etc.) - */ -bool mms_set_interface_address(int interface_id, uint16_t addr); - -/** - * @brief Set the output power of the radio device on the network - * interface with the given id. - * - * @param interface_id The network interface id. - * @param pa_idx Output power value from 0 (lowest output power) to - * X (highest output power). - * - * @return true if output power was successfully set; false otherwise - * (e.g. wrong interface, invalid output power value etc.) - */ -bool mms_set_output_power(int interface_id, uint8_t pa_idx); - -/** - * @brief Set a protocol handler for a given protocol. - * - * @param protocol The protocol identifier (must be unique). - * @param handler The packet handler called if a packet of given protocol is received. - * - * @return -1 if an error occurs (e.g. handler table full) else >= 0. - */ -int mms_set_protocol_handler(protocol_t protocol, packet_handler_t handler); - -/** - * @see ::trans_socket(int) - */ -int mms_socket(int type); - -/** - * @see ::trans_connect(int,uint16_t) - */ -int mms_connect(int socket, uint16_t dest_addr); - -/** - * @see ::trans_send(int,void*,int,protocol_t,uint8_t) - */ -int mms_sock_send(int socket, void *buffer, int length, protocol_t protocol, - uint8_t priority); - -/** - * @see ::trans_sendto(int,void*,int,protocol_t,uint8_t,uint16_t) - */ -int mms_sock_sendto(int socket, void *buffer, int length, protocol_t protocol, - uint8_t priority, uint16_t dest_addr); - -/** - * @brief Convenience function to send a message via UDPL socket. - * - * @param msg packet payload - * @param msg_len the size of the packet payload in bytes (max. 46 bytes). - * @param dst packet destination address - * @param protocol packet protocol identifier - * @param priority packet priority - * - * @return Upon successful completion, mms_send() returns a value greater zero. - * Otherwise, a negative value is returned to indicate the error. - */ -int mms_send(void *msg, int msg_len, uint16_t dst, protocol_t protocol, - uint8_t priority); - -/** - * @see ::trans_poll(int) - */ -int mms_poll(int socket); - -/** - * @see ::trans_close(int,int) - */ -int mms_close(int socket, int how); - -/** - * @brief Receive function for incoming packets. - * - * This function is the protocol handler function for micro mesh messages received - * on the lower layers. - * - * @param msg Incoming packet. - * @param msg_size Size of incoming packet. - * @param packet_info Additional packet information. - */ -void mms_receive(void *msg, int msg_size, packet_info_t *packet_info); - -/** - * @brief Flush kernel route table. - * - * @param flush_static Whether to flush static routes also - */ -void mms_flush_routes(bool flush_static); - -/** - * @brief Writes to the standard output (stdout) a sequence of data formatted as - * the format argument specifies. - * - * If a SSH connection is active, the output is redirected to the node who - * initialized the SSH connection. - * - * @param format String that contains the text to be written to stdout. - */ -void mms_net_printf(const char *format); - -/** - * @brief Print kernel route table. - */ -void mms_print_routes(void); - -/** - * @brief Print interface configuration. - * - * @param iface Optional interface parameter. - */ -void mms_print_ifconfig(int iface); - -/** - * @brief Print Micro Mesh stack statistics. - */ -void mms_print_stats(void); - -/** @} */ -#endif /* MMSTACK_H_ */ diff --git a/sys/syslog/Makefile b/sys/syslog/Makefile deleted file mode 100644 index 54d7db9bcd8d95726c54120cfdaf5b232cb5f7af..0000000000000000000000000000000000000000 --- a/sys/syslog/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -INCLUDES = -I../include -I../drivers/include -I../lib -I$(RIOTCPU)/$(CPU)/include -I../net -I../../core/include -MODULE =syslog - -include $(MAKEBASE)/Makefile.base - - diff --git a/sys/syslog/syslog-api.c b/sys/syslog/syslog-api.c deleted file mode 100644 index 0ff92971cde3b00b65fecee4f10cc1bed8525590..0000000000000000000000000000000000000000 --- a/sys/syslog/syslog-api.c +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Syslog daemon - * - * Copyright (C) 2009-2013 Freie Universitaet Berlin - * - * This file subject to the terms and conditions of the GNU Lesser General - * Public License. See the file LICENSE in the top level directory for more - * details. - * - * @ingroup syslog - * @{ - * @file syslog-api.c - * @author Freie Universitaet Berlin - * @} - */ - -*******************************************************************************/ - -#include <stdarg.h> -#include "syslog.h" -#include "tracelog.h" - -#undef VSYSLOG -#define VSYSLOG(level, strModule, strFmt, argp) vsyslog(level, strModule, strFmt, argp) - -void -syslog(const uint8_t level, const char(*const strModule), const char *strFmt, ...) -{ - va_list argp; - - va_start(argp, strFmt); - VSYSLOG(level, strModule, strFmt, argp); - va_end(argp); -} -/*-----------------------------------------------------------------------------------*/ -#if (SYSLOG_CONF_LEVEL & SL_EMERGENCY) == SL_EMERGENCY -void syslog_emergency(const char(*const mod), const char *strFmt, ...) -{ - va_list argp; - - va_start(argp, strFmt); - VSYSLOG(SL_EMERGENCY, mod, strFmt, argp); - va_end(argp); -} -#endif -/*-----------------------------------------------------------------------------------*/ -#if (SYSLOG_CONF_LEVEL & SL_CRITICAL) == SL_CRITICAL -void syslog_critical(const char(*const mod), const char *strFmt, ...) -{ - va_list argp; - - va_start(argp, strFmt); - VSYSLOG(SL_CRITICAL, mod, strFmt, argp); - va_end(argp); -} -#endif -/*-----------------------------------------------------------------------------------*/ -#if (SYSLOG_CONF_LEVEL & SL_WARN) == SL_WARN -void syslog_warn(const char(*const mod), const char *strFmt, ...) -{ - va_list argp; - - va_start(argp, strFmt); - VSYSLOG(SL_WARN, mod, strFmt, argp); - va_end(argp); -} -#endif -/*-----------------------------------------------------------------------------------*/ -#if (SYSLOG_CONF_LEVEL & SL_NOTICE) == SL_NOTICE -void syslog_notice(const char(*const mod), const char *strFmt, ...) -{ - va_list argp; - - va_start(argp, strFmt); - VSYSLOG(SL_NOTICE, mod, strFmt, argp); - va_end(argp); -} -#endif -/*-----------------------------------------------------------------------------------*/ -#if (SYSLOG_CONF_LEVEL & SL_INFO) == SL_INFO -void syslog_info(const char(*const mod), const char *strFmt, ...) -{ - va_list argp; - - va_start(argp, strFmt); - VSYSLOG(SL_INFO, mod, strFmt, argp); - va_end(argp); -} -#endif -/*-----------------------------------------------------------------------------------*/ -#if SYSLOG_ISLEVEL(SL_DEBUG) -void syslog_debug(const char(*const mod), const char *strFmt, ...) -{ - va_list argp; - - va_start(argp, strFmt); - VSYSLOG(SL_DEBUG, mod, strFmt, argp); - va_end(argp); -} -#endif - diff --git a/sys/syslog/syslog-out.c b/sys/syslog/syslog-out.c deleted file mode 100644 index c353c591a4641c7306aba245e794d7c34d738a05..0000000000000000000000000000000000000000 --- a/sys/syslog/syslog-out.c +++ /dev/null @@ -1,188 +0,0 @@ -/****************************************************************************** -Copyright 2008-2009, Freie Universitaet Berlin (FUB). All rights reserved. - -These sources were developed at the Freie Universitaet Berlin, Computer Systems -and Telematics group (http://cst.mi.fu-berlin.de). -------------------------------------------------------------------------------- -This file is part of RIOT. - -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 3 of the License, or (at your option) any later -version. - -RIOT 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, see http://www.gnu.org/licenses/ . --------------------------------------------------------------------------------- -For further information and questions please use the web site - http://scatterweb.mi.fu-berlin.de -and the mailinglist (subscription via web site) - scatterweb@lists.spline.inf.fu-berlin.de -*******************************************************************************/ - -/** - * @file - * @ingroup syslog - * @brief System Logging Service output implementation - * - * @author Freie Universität Berlin, Computer Systems & Telematics - * @version $Revision: 3854 $ - * - * @note $Id: syslog-out.c 3854 2011-12-06 15:27:01Z hwill $ - */ - -#include <stdio.h> -#include <string.h> -#ifdef MODULE_FAT -#include <unistd.h> -#include <fcntl.h> -#include <sys/errno.h> -#endif -// sys -#include "cfg-feuerware.h" -#include "syslog.h" -#include "clock.h" -#include "device-rs232.h" -#if FEUERWARE_CONF_CORE_SUPPORTS_TIME -#include "timelib.h" -#endif -// net -#include "net-types.h" -#ifdef MODULE_TRACELOG -#include "tracelog.h" -#endif - -/*-----------------------------------------------------------------------------------*/ -void syslog_format_ascii(struct syslog_args *args, struct syslog_chainlink *chainlink) -{ - char buffer[SYSLOG_CONF_BUFSIZE + 25]; - int msglen = 0; - - if (args->message[0] != '\t') { - const char *strlevel = syslog_leveltostring(args->level); - msglen = snprintf(buffer, SYSLOG_CONF_BUFSIZE + 23, - "#[%u.%u:%u=%s] %s:", - NETWORK_ADDR_NET(NET_LOCAL_ADDRESS), NETWORK_ADDR_HOST(NET_LOCAL_ADDRESS), - args->level, strlevel, args->module - ); - } - - msglen += snprintf(buffer + msglen, SYSLOG_CONF_BUFSIZE + 23 - msglen, "%s", args->message); - buffer[msglen++] = '\n'; - buffer[msglen] = '\0'; - - args->message = buffer; - - if (chainlink != NULL && chainlink->fpout != NULL) { - chainlink->fpout(args, chainlink->next); - } -} -/*-----------------------------------------------------------------------------------*/ -void syslog_format_xml(struct syslog_args *args, struct syslog_chainlink *chainlink) -{ - const size_t bufsize = SYSLOG_CONF_BUFSIZE + 80; - char buffer[bufsize]; - char tbuf[20]; - int msglen = 0; - -#if FEUERWARE_CONF_CORE_SUPPORTS_TIME - time_get_string(tbuf, sizeof(tbuf)); -#else - sprintf(tbuf, "%lu", clock_time(NULL)); -#endif - - msglen = snprintf(buffer, bufsize, - "<log lvl=%u src=\"%u.%u\" id=%u ts=\"%s\" mod=\"%s\">%s</log>\n", - args->level, NETWORK_ADDR_NET(NET_LOCAL_ADDRESS), NETWORK_ADDR_HOST(NET_LOCAL_ADDRESS), - args->msgnum, tbuf, args->module, args->message - ); - - args->message = buffer; - - if (chainlink != NULL && chainlink->fpout != NULL) { - chainlink->fpout(args, chainlink->next); - } -} -/*-----------------------------------------------------------------------------------*/ -void syslog_copy_stdout(struct syslog_args *args, struct syslog_chainlink *chainlink) -{ - if (args->message[0] != '\t') { - const char *strlevel = syslog_leveltostring(args->level); - printf("#[%u.%u:%u=%s] %s:", - NETWORK_ADDR_NET(NET_LOCAL_ADDRESS), NETWORK_ADDR_HOST(NET_LOCAL_ADDRESS), - args->level, strlevel, args->module - ); - } - - printf("%s\n", args->message); - - if (chainlink != NULL && chainlink->fpout != NULL) { - chainlink->fpout(args, chainlink->next); - } -} -/*-----------------------------------------------------------------------------------*/ -void syslog_out_stdout(struct syslog_args *args, struct syslog_chainlink *chainlink) -{ - printf(args->message); - - if (chainlink != NULL && chainlink->fpout != NULL) { - chainlink->fpout(args, chainlink->next); - } -} -/*-----------------------------------------------------------------------------------*/ -#ifdef MODULE_FAT -static int syslog_file = -1; - -static int fat_open_logfile(const char *path); -static int fat_open_logfile(const char *path) -{ - char t[20]; - int file; - - file = open(path, O_WRONLY | O_APPEND | O_CREAT); - - time_get_string(t, sizeof(t)); - - if (file >= 0) { - syslog_notice("sys", "%s log %s opened", t, path); - } - else { - syslog_warn("sys", "%s log %s failed", t, path); - } - - return file; -} - -void syslog_out_file(struct syslog_args *args, struct syslog_chainlink *chainlink) -{ - if (syslog_file >= 0) { - size_t length = (size_t)strlen(args->message); - int ret = write(syslog_file, args->message, length); - - if (ret == 1) { -#ifdef MODULE_TRACELOG - trace_string(TRACELOG_EV_MEMORY, "fat"); -#endif - } - } - - if (chainlink != NULL && chainlink->fpout != NULL) { - chainlink->fpout(args, chainlink->next); - } -} - -bool syslog_open_file(void) -{ - syslog_file = fat_open_logfile("SYSLOG.LOG"); - return (syslog_file >= 0); -} -void syslog_close_file(void) -{ - close(syslog_file); - syslog_file = -1; -} -#endif diff --git a/sys/syslog/syslog.c b/sys/syslog/syslog.c deleted file mode 100644 index 18668da0d1a49eb778c1ac15132946bbc95093aa..0000000000000000000000000000000000000000 --- a/sys/syslog/syslog.c +++ /dev/null @@ -1,269 +0,0 @@ -/****************************************************************************** -Copyright 2008-2009, Freie Universitaet Berlin (FUB). All rights reserved. - -These sources were developed at the Freie Universitaet Berlin, Computer Systems -and Telematics group (http://cst.mi.fu-berlin.de). -------------------------------------------------------------------------------- -This file is part of RIOT. - -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 3 of the License, or (at your option) any later -version. - -RIOT 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, see http://www.gnu.org/licenses/ . --------------------------------------------------------------------------------- -For further information and questions please use the web site - http://scatterweb.mi.fu-berlin.de -and the mailinglist (subscription via web site) - scatterweb@lists.spline.inf.fu-berlin.de -*******************************************************************************/ - -/** - * @addtogroup syslog - * @{ - */ - -/** - * @file - * @brief System Logging Service implementation - * - * @author Freie Universität Berlin, Computer Systems & Telematics - * @author Michael Baar <baar@inf.fu-berlin.de> - * @version $Revision: 3854 $ - * - * @note $Id: syslog.c 3854 2011-12-06 15:27:01Z hwill $ - */ - -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "cfg-feuerware.h" -#include "cmdengine.h" -#include "device-rs232.h" -#include "syslog.h" -#include "sysmon.h" -#include "tracelog.h" - -static const char *syslog_level_stringtable = "emergency\0" - "critical\0" - "warn\0" - "notice\0" - "info\0" - "debug\0" - "\3"; - -__attribute__((section(".noinit"))) -static volatile unsigned int syslog_msgnum; - -static unsigned short syslog_flagtolevel(const uint8_t level); -static int find_interface_index_for_name(const char *name); - -extern struct syslog_interface syslog_interfaces[]; - -/*-----------------------------------------------------------------------------------*/ -void syslog_init(void) -{ - if (sysmon_initial_boot()) { - syslog_msgnum = 0; - } -} -/*-----------------------------------------------------------------------------------*/ -static bool testlevel(uint8_t filter_level, const uint8_t level) -{ - return ((filter_level & level) != 0); -} -/*-----------------------------------------------------------------------------------*/ -void vsyslog(const uint8_t level, const char(*const strModule), - const char *strFmt, va_list argp) -{ - int i; - struct syslog_interface *slif; // syslog interface - struct syslog_args args; // output function arguments - char message[SYSLOG_CONF_BUFSIZE]; // message buffer - int msglen = 0; - - args.message = NULL; - - /* check each syslog interface */ - for (i = 0; i < SYSLOG_CONF_NUM_INTERFACES; i++) { - slif = &syslog_interfaces[i]; - - /* run interface filter */ - if (slif->name != NULL && testlevel(cfg_feuerware.level[i], level)) { - /* filter matched, produce output */ - if (args.message == NULL) { - /* initialize structure one time, when actually needed */ - args.msgnum = syslog_msgnum++; - args.level = syslog_flagtolevel(level); - args.module = strModule; - args.message = message; - msglen = vsnprintf(message, SYSLOG_CONF_BUFSIZE - 1, strFmt, argp); - } - - args.interface = (const struct syslog_interface *)slif; - - /* invoke first link of ouput chain */ - if (slif->chain->fpout != NULL) { - slif->chain->fpout(&args, slif->chain->next); - } - } - } -} -/*-----------------------------------------------------------------------------------*/ -void syslog_printlevel(char *buffer, size_t bufsize, uint8_t level) -{ - uint8_t l = level; - int intlevel; - int bufpos; - int len = 0; - - bufpos = snprintf(buffer, bufsize, "%#.2x=", level); - bufsize -= bufpos; - - for (intlevel = 0; intlevel < SYSLOG_LEVELS_COUNT; intlevel++) { - if (l & 0x0001) { - const char *string = string_table_get(syslog_level_stringtable, intlevel); - - if (string) { - if (bufsize < 0) { - bufsize = 0; - } - - len = snprintf(&buffer[bufpos], bufsize, "%s%s", ((len > 0) ? "|" : ""), (char *)string); - bufsize -= len; - bufpos += len; - } - } - - l >>= 1; - } -} -/*-----------------------------------------------------------------------------------*/ -uint8_t syslog_set_level(const char *name, uint8_t level) -{ - uint8_t result; - int index = find_interface_index_for_name(name); - - if (index < 0) { - return 0; - } - - result = cfg_feuerware.level[index]; - cfg_feuerware.level[index] = level; - cfg_feuerware_spec.state->modified = 1; - - return result; -} -/*-----------------------------------------------------------------------------------*/ -const char *syslog_leveltostring(unsigned int level) -{ - return string_table_get(syslog_level_stringtable, level); -} -/*-----------------------------------------------------------------------------------*/ - -#if CMD_ISLEVEL(CMD_LEVEL_HUMAN_USER) -/** - * @brief Syslog-level property: <code>syslog [interface] [newlevel]</code> - * @ingroup commands - * @param[in] interface Name of the syslog interface to change (optional) - * @param[in] newlevel New loglevel value (see uint8_t) - * @return Current level - * - * \p Returns and optionally sets the syslog log-level. For available combinations see - * uint8_t. - * - * \p Usage: - * \li \c syslog Prints syslog configuration - * \li \c syslog \c 0x3f Sets loglevel of syslog node 0 (usually stdout) to 0x3f - * \li \c syslog \c stdout \c 0x3f Sets loglevel of syslog node "stdout" to 0x3f - */ -ASCCMD(syslog, 0, "[interface] [byte val]: syslog-level property"); -CMD_FUNCTION(syslog, cmdargs) -{ - int i; - - if (cmdargs->arg_size > 0) { - unsigned int argc; - const char *arg; - const char *name = NULL; - unsigned int value; - - argc = cmd_split_arguments(cmdargs->args); - arg = cmdargs->args; - - if (*arg >= 'A') { - // first argument is a string - name = arg; - // move to next argument - arg = cmd_get_next_argument(arg); - } - - if (*arg == '\0') { - return CMD_ERROR; - } - - value = strtoul(arg, NULL, 0); - syslog_set_level(name, value); - } - - for (i = 0; i < SYSLOG_CONF_NUM_INTERFACES; i++) { - if (syslog_interfaces[i].name != NULL) { - char buf[SYSLOG_PRINTLEVEL_MAXLEN]; - syslog_printlevel(buf, sizeof(buf), cfg_feuerware.level[i]); - cmdargs->fresponse(cmdargs, - CMD_RESPONSE_MULTILINE, - "%s:%s", - syslog_interfaces[i].name, - buf - ); - } - } - - return CMD_SUCCESS; -} -#endif -/*-----------------------------------------------------------------------------------*/ -/** - * @brief Convert bit flag to bit number - */ -static unsigned short syslog_flagtolevel(const uint8_t level) -{ - uint8_t l = level; - unsigned short intlevel; - - for (intlevel = 0; intlevel < SYSLOG_LEVELS_COUNT; intlevel++) { - if ((l & 1) == 1) { - break; - } - - l >>= 1; - } - - return intlevel; -} -/*-----------------------------------------------------------------------------------*/ -/** - * @brief Find an interface for a given name - */ -static int find_interface_index_for_name(const char *name) -{ - int i; - - for (i = 0; i < SYSLOG_CONF_NUM_INTERFACES; i++) { - if (strcmp(syslog_interfaces[i].name, name) == 0) { - return i; - } - } - - return -1; -} - -/** @} */ diff --git a/sys/tracelog/Makefile b/sys/tracelog/Makefile deleted file mode 100644 index 5b10ef31d805d6d3094105ca193196fdf8a6bc00..0000000000000000000000000000000000000000 --- a/sys/tracelog/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -INCLUDES = -I../include -I../drivers/include -I../lib -I$(RIOTCPU)/$(CPU)/include -I../net -I../../core/include -MODULE =tracelog - -include $(MAKEBASE)/Makefile.base - - diff --git a/sys/tracelog/tracelog.c b/sys/tracelog/tracelog.c deleted file mode 100644 index 137376bf19679f940d9f93dbc616818cacacd260..0000000000000000000000000000000000000000 --- a/sys/tracelog/tracelog.c +++ /dev/null @@ -1,295 +0,0 @@ -/****************************************************************************** -Copyright 2008, Freie Universitaet Berlin (FUB). All rights reserved. - -These sources were developed at the Freie Universitaet Berlin, Computer Systems -and Telematics group (http://cst.mi.fu-berlin.de). -------------------------------------------------------------------------------- -This file is part of RIOT. - -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 3 of the License, or (at your option) any later -version. - -RIOT 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, see http://www.gnu.org/licenses/ . --------------------------------------------------------------------------------- -For further information and questions please use the web site - http://scatterweb.mi.fu-berlin.de -and the mailinglist (subscription via web site) - scatterweb@lists.spline.inf.fu-berlin.de -*******************************************************************************/ - -/** - * @ingroup tracelog - * @{ - */ - -/** - * @file - * @brief Tracelog implementation - * - * @author Freie Universität Berlin, Computer Systems & Telematics - * @author Michael Baar <baar@inf.fu-berlin.de> - * - * @note $Id: tracelog.c 3854 2011-12-06 15:27:01Z hwill $ - */ - -#include <stdbool.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include "configure.h" -// core -#include "sysmon.h" -#include "cmdengine.h" -#include "tracelog.h" -#include "stringlib.h" -#include "syslog.h" - -#if TRACELOG_CONF_NUM_ENTRIES > 0 -__attribute__((section(".noinit"))) -struct tracelog tracelog; - -/// tells if tracelog can accept input -static bool tracelog_initialized = 0; -#endif - -#if defined(SYSLOG_CONF_LEVEL) && ((SYSLOG_CONF_LEVEL & SL_DEBUG) == SL_DEBUG) -static const char symon_event_names[] = - "\0" - "start\0" - "exit\0" - "assert\0" - "event\0" - "timer\0" - "irqdis\0" - "irqen\0" - "irq\0" - "switch\0" - "\0" - "memory\0" - "memaccess\0" - "opfault\0" - "panic\0" - "userdef\0" - "\3"; -#endif - -/*-----------------------------------------------------------------------------------*/ -#if TRACELOG_CONF_NUM_ENTRIES > 0 -static void tracelog_snprint(char *buf, int bufsz, int i) -{ - struct tracelog_entry *trace = &tracelog.traces[i]; - int length = 0; - bufsz -= 1; // save one for zero - -#if (SYSLOG_CONF_LEVEL & SL_DEBUG) == SL_DEBUG - /* when running in debug level, event names are available and can be printed */ - char *name = (char *)string_table_get(symon_event_names, trace->event); - length = snprintf(buf, bufsz, "%#.2x (%s): ", trace->event, name); -#else - length = snprintf(buf, bufsz, "%#.2x: ", trace->event); -#endif - bufsz -= length; - buf += length; - - switch(trace->type) { - case TRACE_NUMBER: { - tracelog_number_t uldata; - memcpy(&uldata, trace->data, sizeof(tracelog_number_t)); - length += snprintf(buf, bufsz, "%#10lx (%lu)", uldata, uldata); - break; - } - - case TRACE_POINTER: { - void *uldata; - memcpy(&uldata, trace->data, sizeof(void *)); - length += snprintf(buf, bufsz, "%p", uldata); - break; - } - - case TRACE_STRING: - length += snprintf(buf, bufsz, "%.*s", TRACELOG_CONF_ENTRY_SIZE, trace->data); - break; - - default: - break; - } - - buf[length] = '\0'; -} -#endif -/*-----------------------------------------------------------------------------------*/ -/** - * @brief Writes a new tracelog entry - * @internal - */ -static void -trace( - enum tracelog_event event, - const enum tracelog_type t, - const void (* const data), - const int size -) -{ -#if TRACELOG_CONF_NUM_ENTRIES > 0 - int length = size; - - if (tracelog_initialized == false) { - return; - } - - struct tracelog_entry *trace = &tracelog.traces[tracelog.tail]; // get current tail element - - /* increase tail */ - if ((tracelog.tail + 1) < TRACELOG_CONF_NUM_ENTRIES) { - tracelog.tail++; - } - else { - tracelog.tail = 0; - } - - /* fill meta data */ - trace->event = event & 0x7F; - trace->type = t; - - /* calculate size */ - if (length == 0) { - if (t == TRACE_STRING) { - length = strlen((char *)data); - } - } - - length = (TRACELOG_CONF_ENTRY_SIZE < length) ? TRACELOG_CONF_ENTRY_SIZE : length; - - memcpy(trace->data, data, length); // copy description -#endif -} -/*-----------------------------------------------------------------------------------*/ -void trace_reset(void) -{ -#if TRACELOG_CONF_NUM_ENTRIES > 0 -#if SYSLOG_ISLEVEL(SL_DEBUG) - char buffer[12]; - sysmon_write_reset_info(buffer, 12, sysmon.reset_code); - trace_string(TRACELOG_EV_START, buffer); -#else - trace_number(TRACELOG_EV_START, sysmon.reset_code); -#endif -#endif -} -/*-----------------------------------------------------------------------------------*/ -void -tracelog_init(void) -{ -#if TRACELOG_CONF_NUM_ENTRIES > 0 - - if (tracelog_initialized != 0) { - return; - } - - if (sysmon_initial_boot()) { - memset(&tracelog, 0, sizeof(struct tracelog)); // clear tracelog buffer on initial boot only - } - - tracelog_initialized = true; // accept traces - - trace_reset(); // trace reason for last reset -#endif -} -void -tracelog_dump(void) -{ - printf("[trace] {\n"); -#if TRACELOG_CONF_NUM_ENTRIES > 0 - char buf[30 + TRACELOG_CONF_ENTRY_SIZE]; - int i = tracelog.tail; // tracelog tail holds next index - - do { - i--; - - if (i < 0) { - i = TRACELOG_CONF_NUM_ENTRIES - 1; - } - - tracelog_snprint(buf, sizeof(buf), i); - printf("\t %.2i: %s\n", i, buf); - } - while (i != tracelog.tail); - -#endif - - printf("}\n"); -} -/*-----------------------------------------------------------------------------------*/ -void -trace_event(enum tracelog_event event) -{ -#if TRACELOG_CONF_NUM_ENTRIES > 0 - trace(event, TRACE_NULL, NULL, 0); -#endif -} -/*-----------------------------------------------------------------------------------*/ -void -trace_number(enum tracelog_event event, tracelog_number_t number) -{ -#if TRACELOG_CONF_NUM_ENTRIES > 0 - trace(event, TRACE_NUMBER, &number, sizeof(tracelog_number_t)); -#endif -} -/*-----------------------------------------------------------------------------------*/ -void -trace_pointer(enum tracelog_event event, void *pointer) -{ -#if TRACELOG_CONF_NUM_ENTRIES > 0 - trace(event, TRACE_POINTER, &pointer, sizeof(void *)); -#endif -} -/*-----------------------------------------------------------------------------------*/ -void -trace_string(enum tracelog_event event, char *string) -{ -#if TRACELOG_CONF_NUM_ENTRIES > 0 - trace(event, TRACE_STRING, string, strlen(string)); -#endif -} -/*-----------------------------------------------------------------------------------*/ -#if CMD_ISLEVEL(CMD_LEVEL_SYSTEM_DEBUG | CMD_LEVEL_HUMAN_USER) -/** - * @brief Trace command: <code>trace [event] [string]</code> - * @ingroup commands - * @param event Event to add to trace (optional) - * @param string String commend to include with event (optional) - * - * If no parameters are given dumps the current system event trace. - */ -ASCCMD(trace, CMDFLAG_SERIAL, "[event] [text]: print tracelog / trace event [num] with [text]"); -CMD_FUNCTION(trace, cmdargs) -{ -#if TRACELOG_CONF_NUM_ENTRIES > 0 - - if (cmdargs->arg_size > 0) { - enum tracelog_event event; - char *c = (char *)cmdargs->args; - event = (enum tracelog_event)strtoul(c, &c, 0); // read event number - - if (event > 0) { - c++; // skip expected whitespace - trace_string(event, c); // generate event with argument as text - return true; - } - } - -#endif - tracelog_dump(); - - return CMD_SUCCESS; -} -#endif -/*-----------------------------------------------------------------------------------*/ -/** @} */