mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-08-11 13:54:16 -04:00
Add FreeRTOS-Plus directory.
This commit is contained in:
parent
7bd5f21ad5
commit
f508a5f653
6798 changed files with 134949 additions and 19 deletions
74
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/Makefile
Normal file
74
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/Makefile
Normal file
|
@ -0,0 +1,74 @@
|
|||
# Copyright (c) 2001, Adam Dunkels.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. All advertising materials mentioning features or use of this software
|
||||
# must display the following acknowledgement:
|
||||
# This product includes software developed by Adam Dunkels.
|
||||
# 4. The name of the author may not be used to endorse or promote
|
||||
# products derived from this software without specific prior
|
||||
# written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# This file is part of the uIP TCP/IP stack.
|
||||
#
|
||||
# $Id: Makefile,v 1.8.2.2 2003/10/04 22:54:17 adam Exp $
|
||||
#
|
||||
|
||||
CC=gcc
|
||||
CFLAGS=-Wall -g -I../uip -I. -I../apps/httpd -I../apps/resolv -I../apps/webclient -I../apps/smtp -I../apps/telnet -fpack-struct
|
||||
|
||||
%.o:
|
||||
$(CC) $(CFLAGS) -c $(<:.o=.c)
|
||||
|
||||
|
||||
uip: uip.o uip_arch.o tapdev.o httpd.o main.o fs.o uip_arp.o cgi.o
|
||||
|
||||
tapdev.o: tapdev.c uipopt.h
|
||||
main.o: main.c ../uip/uip.h uipopt.h ../apps/httpd/httpd.h \
|
||||
tapdev.h
|
||||
uip_arch.o: uip_arch.c ../uip/uip_arch.h ../uip/uip.h uipopt.h \
|
||||
../apps/httpd/httpd.h
|
||||
uip.o: ../uip/uip.c ../uip/uip.h uipopt.h ../apps/httpd/httpd.h
|
||||
|
||||
uip_arp.o: ../uip/uip_arp.c ../uip/uip_arp.h ../uip/uip.h uipopt.h \
|
||||
../apps/httpd/httpd.h
|
||||
$(CC) -o uip_arp.o $(CFLAGS) -fpack-struct -c ../uip/uip_arp.c
|
||||
|
||||
|
||||
cgi.o: ../apps/httpd/cgi.c ../uip/uip.h uipopt.h ../apps/smtp/smtp.h \
|
||||
../apps/httpd/cgi.h ../apps/httpd/httpd.h ../apps/httpd/fs.h
|
||||
fs.o: ../apps/httpd/fs.c ../uip/uip.h uipopt.h ../apps/smtp/smtp.h \
|
||||
../apps/httpd/httpd.h ../apps/httpd/fs.h ../apps/httpd/fsdata.h \
|
||||
../apps/httpd/fsdata.c
|
||||
fsdata.o: ../apps/httpd/fsdata.c
|
||||
httpd.o: ../apps/httpd/httpd.c ../uip/uip.h uipopt.h \
|
||||
../apps/smtp/smtp.h ../apps/httpd/httpd.h ../apps/httpd/fs.h \
|
||||
../apps/httpd/fsdata.h ../apps/httpd/cgi.h
|
||||
|
||||
clean:
|
||||
rm -f *.o *~ *core uip
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
225
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/cgi.c
Normal file
225
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/cgi.c
Normal file
|
@ -0,0 +1,225 @@
|
|||
/**
|
||||
* \addtogroup httpd
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* HTTP server script language C functions file.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*
|
||||
* This file contains functions that are called by the web server
|
||||
* scripts. The functions takes one argument, and the return value is
|
||||
* interpreted as follows. A zero means that the function did not
|
||||
* complete and should be invoked for the next packet as well. A
|
||||
* non-zero value indicates that the function has completed and that
|
||||
* the web server should move along to the next script line.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: cgi.c,v 1.23.2.4 2003/10/07 13:22:27 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#include "uip.h"
|
||||
#include "cgi.h"
|
||||
#include "httpd.h"
|
||||
#include "fs.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
static u8_t print_stats(u8_t next);
|
||||
static u8_t file_stats(u8_t next);
|
||||
static u8_t tcp_stats(u8_t next);
|
||||
static u8_t rtos_stats(u8_t next);
|
||||
|
||||
cgifunction cgitab[] = {
|
||||
print_stats, /* CGI function "a" */
|
||||
file_stats, /* CGI function "b" */
|
||||
tcp_stats, /* CGI function "c" */
|
||||
rtos_stats /* CGI function "d" */
|
||||
};
|
||||
|
||||
static const char closed[] = /* "CLOSED",*/
|
||||
{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0};
|
||||
static const char syn_rcvd[] = /* "SYN-RCVD",*/
|
||||
{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56,
|
||||
0x44, 0};
|
||||
static const char syn_sent[] = /* "SYN-SENT",*/
|
||||
{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e,
|
||||
0x54, 0};
|
||||
static const char established[] = /* "ESTABLISHED",*/
|
||||
{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48,
|
||||
0x45, 0x44, 0};
|
||||
static const char fin_wait_1[] = /* "FIN-WAIT-1",*/
|
||||
{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
|
||||
0x54, 0x2d, 0x31, 0};
|
||||
static const char fin_wait_2[] = /* "FIN-WAIT-2",*/
|
||||
{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
|
||||
0x54, 0x2d, 0x32, 0};
|
||||
static const char closing[] = /* "CLOSING",*/
|
||||
{0x43, 0x4c, 0x4f, 0x53, 0x49,
|
||||
0x4e, 0x47, 0};
|
||||
static const char time_wait[] = /* "TIME-WAIT,"*/
|
||||
{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41,
|
||||
0x49, 0x54, 0};
|
||||
static const char last_ack[] = /* "LAST-ACK"*/
|
||||
{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43,
|
||||
0x4b, 0};
|
||||
|
||||
static const char *states[] = {
|
||||
closed,
|
||||
syn_rcvd,
|
||||
syn_sent,
|
||||
established,
|
||||
fin_wait_1,
|
||||
fin_wait_2,
|
||||
closing,
|
||||
time_wait,
|
||||
last_ack};
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* print_stats:
|
||||
*
|
||||
* Prints out a part of the uIP statistics. The statistics data is
|
||||
* written into the uip_appdata buffer. It overwrites any incoming
|
||||
* packet.
|
||||
*/
|
||||
static u8_t
|
||||
print_stats(u8_t next)
|
||||
{
|
||||
#if UIP_STATISTICS
|
||||
u16_t i, j;
|
||||
u8_t *buf;
|
||||
u16_t *databytes;
|
||||
|
||||
if(next) {
|
||||
/* If our last data has been acknowledged, we move on the next
|
||||
chunk of statistics. */
|
||||
hs->count = hs->count + 4;
|
||||
if(hs->count >= sizeof(struct uip_stats)/sizeof(u16_t)) {
|
||||
/* We have printed out all statistics, so we return 1 to
|
||||
indicate that we are done. */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Write part of the statistics into the uip_appdata buffer. */
|
||||
databytes = (u16_t *)&uip_stat + hs->count;
|
||||
buf = (u8_t *)uip_appdata;
|
||||
|
||||
j = 4 + 1;
|
||||
i = hs->count;
|
||||
while (i < sizeof(struct uip_stats)/sizeof(u16_t) && --j > 0) {
|
||||
sprintf((char *)buf, "%5u\r\n", *databytes);
|
||||
++databytes;
|
||||
buf += 6;
|
||||
++i;
|
||||
}
|
||||
|
||||
/* Send the data. */
|
||||
uip_send(uip_appdata, buf - uip_appdata);
|
||||
|
||||
return 0;
|
||||
#else
|
||||
return 1;
|
||||
#endif /* UIP_STATISTICS */
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static u8_t
|
||||
file_stats(u8_t next)
|
||||
{
|
||||
/* We use sprintf() to print the number of file accesses to a
|
||||
particular file (given as an argument to the function in the
|
||||
script). We then use uip_send() to actually send the data. */
|
||||
if(next) {
|
||||
return 1;
|
||||
}
|
||||
uip_send(uip_appdata, sprintf((char *)uip_appdata, "%5u", fs_count(&hs->script[4])));
|
||||
return 0;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static u8_t
|
||||
tcp_stats(u8_t next)
|
||||
{
|
||||
struct uip_conn *conn;
|
||||
|
||||
if(next) {
|
||||
/* If the previously sent data has been acknowledged, we move
|
||||
forward one connection. */
|
||||
if(++hs->count == UIP_CONNS) {
|
||||
/* If all connections has been printed out, we are done and
|
||||
return 1. */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
conn = &uip_conns[hs->count];
|
||||
if((conn->tcpstateflags & TS_MASK) == CLOSED) {
|
||||
uip_send(uip_appdata, sprintf((char *)uip_appdata,
|
||||
"<tr align=\"center\"><td>-</td><td>-</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n",
|
||||
conn->nrtx,
|
||||
conn->timer,
|
||||
(uip_outstanding(conn))? '*':' ',
|
||||
(uip_stopped(conn))? '!':' '));
|
||||
} else {
|
||||
uip_send(uip_appdata, sprintf((char *)uip_appdata,
|
||||
"<tr align=\"center\"><td>%u.%u.%u.%u:%u</td><td>%s</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n",
|
||||
htons(conn->ripaddr[0]) >> 8,
|
||||
htons(conn->ripaddr[0]) & 0xff,
|
||||
htons(conn->ripaddr[1]) >> 8,
|
||||
htons(conn->ripaddr[1]) & 0xff,
|
||||
htons(conn->rport),
|
||||
states[conn->tcpstateflags & TS_MASK],
|
||||
conn->nrtx,
|
||||
conn->timer,
|
||||
(uip_outstanding(conn))? '*':' ',
|
||||
(uip_stopped(conn))? '!':' '));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
static u8_t
|
||||
rtos_stats(u8_t next)
|
||||
{
|
||||
static char cTraceBuffer[ 1024 ];
|
||||
extern void ( vTaskList )( char * );
|
||||
|
||||
vTaskList( cTraceBuffer );
|
||||
uip_send( ( void * ) cTraceBuffer, strlen( cTraceBuffer ) );
|
||||
|
||||
return 1;
|
||||
}
|
57
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/cgi.h
Normal file
57
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/cgi.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* \addtogroup httpd
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* HTTP script language header file.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: cgi.h,v 1.3.2.4 2003/10/07 13:22:27 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __CGI_H__
|
||||
#define __CGI_H__
|
||||
|
||||
typedef u8_t (* cgifunction)(u8_t next);
|
||||
|
||||
/**
|
||||
* A table containing pointers to C functions that can be called from
|
||||
* a web server script.
|
||||
*/
|
||||
extern cgifunction cgitab[];
|
||||
|
||||
#endif /* __CGI_H__ */
|
66
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/crt0.asm
Normal file
66
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/crt0.asm
Normal file
|
@ -0,0 +1,66 @@
|
|||
// Rowley C Compiler, runtime support.
|
||||
//
|
||||
// Copyright (c) 2001, 2002, 2003 Rowley Associates Limited.
|
||||
//
|
||||
// This file may be distributed under the terms of the License Agreement
|
||||
// provided with this software.
|
||||
//
|
||||
// THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
; Create sections
|
||||
.data
|
||||
.bss
|
||||
|
||||
; Go to code section.
|
||||
.code
|
||||
|
||||
; Executed upon reset
|
||||
__reset proc
|
||||
|
||||
; Turn off watchdog. You can enable it in main() if required.
|
||||
mov.w #0x5a80, &0x120
|
||||
|
||||
; Set up stack.
|
||||
mov.w #RAM_Start_Address+RAM_Size, sp
|
||||
|
||||
; Copy from initialised data section to data section.
|
||||
mov.w #SFB(IDATA0), r15
|
||||
mov.w #data_init_begin, r14
|
||||
mov.w #data_init_end-data_init_begin, r13
|
||||
call #_memcpy
|
||||
|
||||
; Zero the bss. Ensure the stack is not allocated in the bss!
|
||||
mov.w #SFB(UDATA0), r15
|
||||
mov.w #0, r14
|
||||
mov.w #SFE(UDATA0)-SFB(UDATA0), r13
|
||||
call #_memset
|
||||
|
||||
; Call user entry point void main(void).
|
||||
call #_main
|
||||
|
||||
; If main() returns, kick off again.
|
||||
jmp __reset
|
||||
endproc
|
||||
|
||||
; Heap data structures; removed by the linker if the heap isn't used.
|
||||
.break
|
||||
.data
|
||||
align WORD
|
||||
___heap_start__::
|
||||
DW 0
|
||||
DW heap_size
|
||||
DS heap_size-4
|
||||
|
||||
; Reset vector
|
||||
.vectors
|
||||
.keep
|
||||
org 0x1e
|
||||
dw __reset
|
||||
|
||||
; Initialise the IDATA0 section by duplicating the contents into the
|
||||
; CONST section and copying them on startup.
|
||||
.const
|
||||
data_init_begin:
|
||||
.init "IDATA0"
|
||||
data_init_end:
|
156
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs.c
Normal file
156
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs.c
Normal file
|
@ -0,0 +1,156 @@
|
|||
/**
|
||||
* \addtogroup httpd
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* HTTP server read-only file system code.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*
|
||||
* A simple read-only filesystem.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the Institute nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
* $Id: fs.c,v 1.7.2.3 2003/10/07 13:22:27 adam Exp $
|
||||
*/
|
||||
|
||||
#include "uip.h"
|
||||
#include "httpd.h"
|
||||
#include "fs.h"
|
||||
#include "fsdata.h"
|
||||
|
||||
#define NULL (void *)0
|
||||
#include "fsdata.c"
|
||||
|
||||
#ifdef FS_STATISTICS
|
||||
#if FS_STATISTICS == 1
|
||||
static u16_t count[FS_NUMFILES];
|
||||
#endif /* FS_STATISTICS */
|
||||
#endif /* FS_STATISTICS */
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static u8_t
|
||||
fs_strcmp(const char *str1, const char *str2)
|
||||
{
|
||||
u8_t i;
|
||||
i = 0;
|
||||
loop:
|
||||
|
||||
if(str2[i] == 0 ||
|
||||
str1[i] == '\r' ||
|
||||
str1[i] == '\n') {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(str1[i] != str2[i]) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
++i;
|
||||
goto loop;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
int
|
||||
fs_open(const char *name, struct fs_file *file)
|
||||
{
|
||||
#ifdef FS_STATISTICS
|
||||
#if FS_STATISTICS == 1
|
||||
u16_t i = 0;
|
||||
#endif /* FS_STATISTICS */
|
||||
#endif /* FS_STATISTICS */
|
||||
struct fsdata_file_noconst *f;
|
||||
|
||||
for(f = (struct fsdata_file_noconst *)FS_ROOT;
|
||||
f != NULL;
|
||||
f = (struct fsdata_file_noconst *)f->next) {
|
||||
|
||||
if(fs_strcmp(name, f->name) == 0) {
|
||||
file->data = f->data;
|
||||
file->len = f->len;
|
||||
#ifdef FS_STATISTICS
|
||||
#if FS_STATISTICS == 1
|
||||
++count[i];
|
||||
#endif /* FS_STATISTICS */
|
||||
#endif /* FS_STATISTICS */
|
||||
|
||||
return 1;
|
||||
}
|
||||
#ifdef FS_STATISTICS
|
||||
#if FS_STATISTICS == 1
|
||||
++i;
|
||||
#endif /* FS_STATISTICS */
|
||||
#endif /* FS_STATISTICS */
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
fs_init(void)
|
||||
{
|
||||
#ifdef FS_STATISTICS
|
||||
#if FS_STATISTICS == 1
|
||||
u16_t i;
|
||||
for(i = 0; i < FS_NUMFILES; i++) {
|
||||
count[i] = 0;
|
||||
}
|
||||
#endif /* FS_STATISTICS */
|
||||
#endif /* FS_STATISTICS */
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
#ifdef FS_STATISTICS
|
||||
#if FS_STATISTICS == 1
|
||||
u16_t fs_count
|
||||
(char *name)
|
||||
{
|
||||
struct fsdata_file_noconst *f;
|
||||
u16_t i;
|
||||
|
||||
i = 0;
|
||||
for(f = (struct fsdata_file_noconst *)FS_ROOT;
|
||||
f != NULL;
|
||||
f = (struct fsdata_file_noconst *)f->next) {
|
||||
|
||||
if(fs_strcmp(name, f->name) == 0) {
|
||||
return count[i];
|
||||
}
|
||||
++i;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif /* FS_STATISTICS */
|
||||
#endif /* FS_STATISTICS */
|
||||
/*-----------------------------------------------------------------------------------*/
|
80
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs.h
Normal file
80
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs.h
Normal file
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
* \addtogroup httpd
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* HTTP server read-only file system header file.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the Institute nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
* $Id: fs.h,v 1.6.2.3 2003/10/07 13:22:27 adam Exp $
|
||||
*/
|
||||
#ifndef __FS_H__
|
||||
#define __FS_H__
|
||||
|
||||
#include "uip.h"
|
||||
|
||||
/**
|
||||
* An open file in the read-only file system.
|
||||
*/
|
||||
struct fs_file {
|
||||
char *data; /**< The actual file data. */
|
||||
int len; /**< The length of the file data. */
|
||||
};
|
||||
|
||||
/**
|
||||
* Open a file in the read-only file system.
|
||||
*
|
||||
* \param name The name of the file.
|
||||
*
|
||||
* \param file The file pointer, which must be allocated by caller and
|
||||
* will be filled in by the function.
|
||||
*/
|
||||
int fs_open(const char *name, struct fs_file *file);
|
||||
|
||||
#ifdef FS_STATISTICS
|
||||
#if FS_STATISTICS == 1
|
||||
u16_t fs_count(char *name);
|
||||
#endif /* FS_STATISTICS */
|
||||
#endif /* FS_STATISTICS */
|
||||
|
||||
/**
|
||||
* Initialize the read-only file system.
|
||||
*/
|
||||
void fs_init(void);
|
||||
|
||||
#endif /* __FS_H__ */
|
1
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/404.html
Normal file
1
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/404.html
Normal file
|
@ -0,0 +1 @@
|
|||
<html><body bgcolor="white"><center><h1>404 - file not found</h1></center></body></html>
|
26
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/cgi/files
Normal file
26
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/cgi/files
Normal file
|
@ -0,0 +1,26 @@
|
|||
# This script shows the access statistics for different files on the
|
||||
# web server.
|
||||
#
|
||||
# First, we include the HTML header.
|
||||
i /files_header.html
|
||||
# Print out the name of the file, and call the function that prints
|
||||
# the access statistics of that file.
|
||||
t <tr><td><a href="/index.html">/index.html</a></td><td>
|
||||
c b /index.html
|
||||
t </td></tr> <tr><td><a href="/control.html">/control.html</a></td><td>
|
||||
c b /control.html
|
||||
t </td></tr> <tr><td><a href="/img/logo.png">/img/logo.png</a></td><td>
|
||||
c b /img/logo.png
|
||||
t </td></tr> <tr><td><a href="/404.html">/404.html</a></td><td>
|
||||
c b /404.html
|
||||
t </td></tr> <tr><td><a href="/cgi/files">/cgi/files</a></td><td>
|
||||
c b /cgi/files
|
||||
t </td></tr> <tr><td><a href="/cgi/stats">/cgi/stats</a></td><td>
|
||||
c b /cgi/stats
|
||||
t </td></tr> <tr><td><a href="/cgi/tcp">/cgi/tcp</a></td><td>
|
||||
c b /cgi/tcp
|
||||
t </td></tr>
|
||||
# Include the HTML footer.
|
||||
i /files_footer.plain
|
||||
# End of script.
|
||||
.
|
6
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/cgi/rtos
Normal file
6
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/cgi/rtos
Normal file
|
@ -0,0 +1,6 @@
|
|||
t <html><head><title>uIP Open Source Embedded TCP/IP Stack On FreeRTOS Kernel</title></head><body BGCOLOR="#CCCCFF"><font face="arial"><small><b><a href="http://www.freertos.org" target="_top">FreeRTOS Homepage</a></b></small><p><H1>AT91SAM7X Embedded WEB Server Demo<br><small>Using uIP and the FreeRTOS real time kernel</small></h1><p>These pages are being served by an Atmel AT91SAM7X256 microcontroller, using Adam Dunkels open source uIP TCP/IP stack.<p>The uIP stack is executing from a single task under control of the FreeRTOS real time kernel. The table below shows the statistics for all the tasks in the demo applicaiton.<p><pre>Task State Priority Stack #<br>************************************************<br>
|
||||
c d
|
||||
t </pre></font></body></html>
|
||||
.
|
||||
|
||||
|
4
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/cgi/stats
Normal file
4
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/cgi/stats
Normal file
|
@ -0,0 +1,4 @@
|
|||
i /stats_header.html
|
||||
c a
|
||||
i /stats_footer.plain
|
||||
.
|
4
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/cgi/tcp
Normal file
4
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/cgi/tcp
Normal file
|
@ -0,0 +1,4 @@
|
|||
i /tcp_header.html
|
||||
c c
|
||||
i /tcp_footer.plain
|
||||
.
|
20
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/control.html
Normal file
20
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/control.html
Normal file
|
@ -0,0 +1,20 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>AT91SAM7X Embedded WEB Server using uIP and FreeRTOS</title>
|
||||
</head>
|
||||
<body bgcolor="#ccccff">
|
||||
<font face="arial">
|
||||
<img src="/img/logo.png" align="right">
|
||||
<a href="/cgi/rtos" target="main">Tasks</a> |
|
||||
<a href="/cgi/tcp" target="main">Connections</a> |
|
||||
<a href="/cgi/files" target="main">Files</a> |
|
||||
<a href="/cgi/stats" target="main">Statistics</a><br>
|
||||
<br>
|
||||
</font>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
</td></tr></table>
|
||||
</body>
|
||||
</html>
|
4
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/files_header.html
Normal file
4
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/files_header.html
Normal file
|
@ -0,0 +1,4 @@
|
|||
<html>
|
||||
<body bgcolor="#CCCCFF">
|
||||
<center>
|
||||
<table width="600" border="0">
|
BIN
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/img/logo.png
Normal file
BIN
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/img/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.3 KiB |
15
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/index.html
Normal file
15
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/index.html
Normal file
|
@ -0,0 +1,15 @@
|
|||
<html>
|
||||
<head>
|
||||
</head>
|
||||
|
||||
<frameset cols="*" rows="120,*" frameborder="no">
|
||||
<frame src="control.html">
|
||||
<frame src="/cgi/rtos" name="main">
|
||||
</frameset>
|
||||
|
||||
<noframes>
|
||||
<body>
|
||||
Your browser must support frames
|
||||
</body>
|
||||
</noframes>
|
||||
</html>
|
|
@ -0,0 +1,3 @@
|
|||
</td></tr></table>
|
||||
</body>
|
||||
</html>
|
30
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/stats_header.html
Normal file
30
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/stats_header.html
Normal file
|
@ -0,0 +1,30 @@
|
|||
<html>
|
||||
<body bgcolor="#ccccff">
|
||||
<center>
|
||||
<table width="600" border="0">
|
||||
<tr><td>
|
||||
<pre>
|
||||
IP Packets dropped
|
||||
Packets received
|
||||
Packets sent
|
||||
IP errors IP version/header length
|
||||
IP length, high byte
|
||||
IP length, low byte
|
||||
IP fragments
|
||||
Header checksum
|
||||
Wrong protocol
|
||||
ICMP Packets dropped
|
||||
Packets received
|
||||
Packets sent
|
||||
Type errors
|
||||
TCP Packets dropped
|
||||
Packets received
|
||||
Packets sent
|
||||
Checksum errors
|
||||
Data packets without ACKs
|
||||
Resets
|
||||
Retransmissions
|
||||
No connection avaliable
|
||||
Connection attempts to closed ports
|
||||
</pre>
|
||||
</td><td><pre>
|
5
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/tcp_footer.plain
Normal file
5
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/tcp_footer.plain
Normal file
|
@ -0,0 +1,5 @@
|
|||
|
||||
</td></tr></table>
|
||||
</center>
|
||||
</body>
|
||||
</html>
|
6
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/tcp_header.html
Normal file
6
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fs/tcp_header.html
Normal file
|
@ -0,0 +1,6 @@
|
|||
<html>
|
||||
<body bgcolor="#ccccff">
|
||||
<center>
|
||||
<table width="600" border="0">
|
||||
<tr><th>Remote</th><th>State</th><th>Retransmissions</th><th>Timer</th><th>Flags</th></tr>
|
||||
|
968
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fsdata.c
Normal file
968
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fsdata.c
Normal file
|
@ -0,0 +1,968 @@
|
|||
static const char data_404_html[] = {
|
||||
/* /404.html */
|
||||
0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
|
||||
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34,
|
||||
0x30, 0x34, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f,
|
||||
0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53,
|
||||
0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50,
|
||||
0x2f, 0x30, 0x2e, 0x39, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70,
|
||||
0x3a, 0x2f, 0x2f, 0x64, 0x75, 0x6e, 0x6b, 0x65, 0x6c, 0x73,
|
||||
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x61, 0x6d, 0x2f,
|
||||
0x75, 0x69, 0x70, 0x2f, 0x29, 0xd, 0xa, 0x43, 0x6f, 0x6e,
|
||||
0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a,
|
||||
0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c,
|
||||
0xd, 0xa, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e,
|
||||
0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f,
|
||||
0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65,
|
||||
0x22, 0x3e, 0x3c, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e,
|
||||
0x3c, 0x68, 0x31, 0x3e, 0x34, 0x30, 0x34, 0x20, 0x2d, 0x20,
|
||||
0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66,
|
||||
0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x3c,
|
||||
0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x3c, 0x2f,
|
||||
0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d,
|
||||
0x6c, 0x3e, };
|
||||
|
||||
static const char data_control_html[] = {
|
||||
/* /control.html */
|
||||
0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
|
||||
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32,
|
||||
0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72,
|
||||
0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x30,
|
||||
0x2e, 0x39, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
||||
0x2f, 0x64, 0x75, 0x6e, 0x6b, 0x65, 0x6c, 0x73, 0x2e, 0x63,
|
||||
0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69,
|
||||
0x70, 0x2f, 0x29, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, 0x65,
|
||||
0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74,
|
||||
0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa,
|
||||
0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa,
|
||||
0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x3c, 0x74,
|
||||
0x69, 0x74, 0x6c, 0x65, 0x3e, 0x41, 0x54, 0x39, 0x31, 0x53,
|
||||
0x41, 0x4d, 0x37, 0x58, 0x20, 0x45, 0x6d, 0x62, 0x65, 0x64,
|
||||
0x64, 0x65, 0x64, 0x20, 0x57, 0x45, 0x42, 0x20, 0x53, 0x65,
|
||||
0x72, 0x76, 0x65, 0x72, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67,
|
||||
0x20, 0x75, 0x49, 0x50, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x46,
|
||||
0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x3c, 0x2f, 0x74,
|
||||
0x69, 0x74, 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68,
|
||||
0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x6f, 0x64,
|
||||
0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d,
|
||||
0x22, 0x23, 0x63, 0x63, 0x63, 0x63, 0x66, 0x66, 0x22, 0x3e,
|
||||
0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61,
|
||||
0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x22,
|
||||
0x3e, 0xd, 0xa, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72,
|
||||
0x63, 0x3d, 0x22, 0x2f, 0x69, 0x6d, 0x67, 0x2f, 0x6c, 0x6f,
|
||||
0x67, 0x6f, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x61, 0x6c,
|
||||
0x69, 0x67, 0x6e, 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74,
|
||||
0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65,
|
||||
0x66, 0x3d, 0x22, 0x2f, 0x63, 0x67, 0x69, 0x2f, 0x72, 0x74,
|
||||
0x6f, 0x73, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
|
||||
0x3d, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x54, 0x61,
|
||||
0x73, 0x6b, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x7c, 0xd,
|
||||
0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
|
||||
0x2f, 0x63, 0x67, 0x69, 0x2f, 0x74, 0x63, 0x70, 0x22, 0x20,
|
||||
0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x6d, 0x61,
|
||||
0x69, 0x6e, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
|
||||
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20,
|
||||
0x7c, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66,
|
||||
0x3d, 0x22, 0x2f, 0x63, 0x67, 0x69, 0x2f, 0x66, 0x69, 0x6c,
|
||||
0x65, 0x73, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
|
||||
0x3d, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x46, 0x69,
|
||||
0x6c, 0x65, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x7c, 0xd,
|
||||
0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
|
||||
0x2f, 0x63, 0x67, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73,
|
||||
0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22,
|
||||
0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x53, 0x74, 0x61, 0x74,
|
||||
0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x61, 0x3e,
|
||||
0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e,
|
||||
0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd,
|
||||
0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa,
|
||||
0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd,
|
||||
0xa, 0xd, 0xa, 0xd, 0xa, 0xd, 0xa, 0xd, 0xa, };
|
||||
|
||||
static const char data_files_footer_plain[] = {
|
||||
/* /files_footer.plain */
|
||||
0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0,
|
||||
0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e,
|
||||
0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0xd, 0xa,
|
||||
0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c,
|
||||
0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, };
|
||||
|
||||
static const char data_files_header_html[] = {
|
||||
/* /files_header.html */
|
||||
0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
|
||||
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32,
|
||||
0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72,
|
||||
0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x30,
|
||||
0x2e, 0x39, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
||||
0x2f, 0x64, 0x75, 0x6e, 0x6b, 0x65, 0x6c, 0x73, 0x2e, 0x63,
|
||||
0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69,
|
||||
0x70, 0x2f, 0x29, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, 0x65,
|
||||
0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74,
|
||||
0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa,
|
||||
0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa,
|
||||
0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f,
|
||||
0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43,
|
||||
0x46, 0x46, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x63, 0x65, 0x6e,
|
||||
0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x61, 0x62,
|
||||
0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22,
|
||||
0x36, 0x30, 0x30, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65,
|
||||
0x72, 0x3d, 0x22, 0x30, 0x22, 0x3e, 0xd, 0xa, };
|
||||
|
||||
static const char data_stats_footer_plain[] = {
|
||||
/* /stats_footer.plain */
|
||||
0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0,
|
||||
0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e,
|
||||
0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0xd, 0xa,
|
||||
0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c,
|
||||
0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, };
|
||||
|
||||
static const char data_stats_header_html[] = {
|
||||
/* /stats_header.html */
|
||||
0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
|
||||
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32,
|
||||
0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72,
|
||||
0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x30,
|
||||
0x2e, 0x39, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
||||
0x2f, 0x64, 0x75, 0x6e, 0x6b, 0x65, 0x6c, 0x73, 0x2e, 0x63,
|
||||
0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69,
|
||||
0x70, 0x2f, 0x29, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, 0x65,
|
||||
0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74,
|
||||
0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa,
|
||||
0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa,
|
||||
0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f,
|
||||
0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x63, 0x63, 0x63, 0x63,
|
||||
0x66, 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x63, 0x65, 0x6e,
|
||||
0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x61, 0x62,
|
||||
0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22,
|
||||
0x36, 0x30, 0x30, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65,
|
||||
0x72, 0x3d, 0x22, 0x30, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x74,
|
||||
0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0xd, 0xa, 0x3c, 0x70,
|
||||
0x72, 0x65, 0x3e, 0xd, 0xa, 0x49, 0x50, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61,
|
||||
0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70,
|
||||
0x70, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61,
|
||||
0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65,
|
||||
0x69, 0x76, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50,
|
||||
0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e,
|
||||
0x74, 0xd, 0xa, 0x49, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f,
|
||||
0x72, 0x73, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x76,
|
||||
0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x68, 0x65, 0x61,
|
||||
0x64, 0x65, 0x72, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
|
||||
0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x6c, 0x65,
|
||||
0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68,
|
||||
0x20, 0x62, 0x79, 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x49, 0x50, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c,
|
||||
0x20, 0x6c, 0x6f, 0x77, 0x20, 0x62, 0x79, 0x74, 0x65, 0xd,
|
||||
0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x66, 0x72, 0x61,
|
||||
0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0xd, 0xa, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x68,
|
||||
0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0xd, 0xa, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x57, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x63, 0x6f, 0x6c, 0xd, 0xa, 0x49, 0x43, 0x4d,
|
||||
0x50, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63,
|
||||
0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70,
|
||||
0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63,
|
||||
0x6b, 0x65, 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69,
|
||||
0x76, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61,
|
||||
0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74,
|
||||
0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20,
|
||||
0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0xd, 0xa, 0x54, 0x43,
|
||||
0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64,
|
||||
0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x72,
|
||||
0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0xd, 0xa, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20,
|
||||
0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
|
||||
0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x20, 0x65, 0x72,
|
||||
0x72, 0x6f, 0x72, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44,
|
||||
0x61, 0x74, 0x61, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74,
|
||||
0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20,
|
||||
0x41, 0x43, 0x4b, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52,
|
||||
0x65, 0x73, 0x65, 0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x52, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73,
|
||||
0x73, 0x69, 0x6f, 0x6e, 0x73, 0xd, 0xa, 0x9, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e,
|
||||
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61,
|
||||
0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, 0xd, 0xa, 0x9, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
|
||||
0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d,
|
||||
0x70, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f,
|
||||
0x73, 0x65, 0x64, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xd,
|
||||
0xa, 0x3c, 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x9, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0xd, 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e,
|
||||
0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, };
|
||||
|
||||
static const char data_tcp_footer_plain[] = {
|
||||
/* /tcp_footer.plain */
|
||||
0x2f, 0x74, 0x63, 0x70, 0x5f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0,
|
||||
0xd, 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74,
|
||||
0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e,
|
||||
0xd, 0xa, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72,
|
||||
0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e,
|
||||
0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, };
|
||||
|
||||
static const char data_tcp_header_html[] = {
|
||||
/* /tcp_header.html */
|
||||
0x2f, 0x74, 0x63, 0x70, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
|
||||
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32,
|
||||
0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72,
|
||||
0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x30,
|
||||
0x2e, 0x39, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
||||
0x2f, 0x64, 0x75, 0x6e, 0x6b, 0x65, 0x6c, 0x73, 0x2e, 0x63,
|
||||
0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69,
|
||||
0x70, 0x2f, 0x29, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, 0x65,
|
||||
0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74,
|
||||
0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa,
|
||||
0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa,
|
||||
0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f,
|
||||
0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x63, 0x63, 0x63, 0x63,
|
||||
0x66, 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x63, 0x65, 0x6e,
|
||||
0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x61, 0x62,
|
||||
0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22,
|
||||
0x36, 0x30, 0x30, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65,
|
||||
0x72, 0x3d, 0x22, 0x30, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x74,
|
||||
0x72, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x6d, 0x6f,
|
||||
0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68,
|
||||
0x3e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68,
|
||||
0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x74, 0x72, 0x61,
|
||||
0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73,
|
||||
0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54,
|
||||
0x69, 0x6d, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c,
|
||||
0x74, 0x68, 0x3e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3c, 0x2f,
|
||||
0x74, 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xd, 0xa,
|
||||
0xd, 0xa, };
|
||||
|
||||
static const char data_img_logo_png[] = {
|
||||
/* /img/logo.png */
|
||||
0x2f, 0x69, 0x6d, 0x67, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x6e, 0x67, 0,
|
||||
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32,
|
||||
0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72,
|
||||
0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x30,
|
||||
0x2e, 0x39, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
||||
0x2f, 0x64, 0x75, 0x6e, 0x6b, 0x65, 0x6c, 0x73, 0x2e, 0x63,
|
||||
0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69,
|
||||
0x70, 0x2f, 0x29, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, 0x65,
|
||||
0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69,
|
||||
0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa,
|
||||
0xd, 0xa, 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa,
|
||||
00, 00, 00, 0xd, 0x49, 0x48, 0x44, 0x52, 00, 00,
|
||||
00, 0xec, 00, 00, 00, 0x5c, 0x8, 0x3, 00, 00,
|
||||
00, 0x5a, 0xc7, 0xa9, 0x53, 00, 00, 0x3, 00, 0x50,
|
||||
0x4c, 0x54, 0x45, 00, 00, 00, 0x3, 0x3, 0x3, 0x4,
|
||||
0x4, 0x4, 0x6, 0x6, 0x6, 0x8, 0x8, 0x8, 0xa, 0xa,
|
||||
0xa, 0xc, 0xc, 0xc, 0xe, 0xe, 0xe, 0x10, 0x10, 0x10,
|
||||
0x12, 0x12, 0x12, 0x14, 0x14, 0x14, 0x16, 0x16, 0x16, 0x18,
|
||||
0x18, 0x18, 0x1a, 0x1a, 0x1a, 0x1c, 0x1c, 0x1c, 0x21, 0x21,
|
||||
0x21, 0x25, 0x25, 0x25, 0x28, 0x28, 0x28, 0x2c, 0x2c, 0x2c,
|
||||
0x2e, 0x2e, 0x2e, 0x30, 0x30, 0x30, 0x32, 0x32, 0x32, 0x34,
|
||||
0x34, 0x34, 0x36, 0x36, 0x36, 0x38, 0x38, 0x38, 0x3a, 0x3a,
|
||||
0x3a, 0x3e, 0x3e, 0x3e, 0x40, 0x40, 0x40, 0x43, 0x43, 0x43,
|
||||
0x45, 0x45, 0x45, 0x46, 0x46, 0x46, 0x4a, 0x4a, 0x4a, 0x4d,
|
||||
0x4d, 0x4d, 0x50, 0x50, 0x50, 0x52, 0x52, 0x52, 0x55, 0x55,
|
||||
0x55, 0x58, 0x58, 0x58, 0x5c, 0x5c, 0x5c, 0x60, 0x60, 0x60,
|
||||
0x62, 0x62, 0x62, 0x66, 0x66, 0x66, 0x69, 0x69, 0x69, 0x6b,
|
||||
0x6b, 0x6b, 0x6e, 0x6e, 0x6e, 0x71, 0x71, 0x71, 0x73, 0x73,
|
||||
0x73, 0x74, 0x74, 0x74, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78,
|
||||
0x7a, 0x7a, 0x7a, 0x7c, 0x7c, 0x7c, 0x7e, 0x7e, 0x7e, 00,
|
||||
0xd9, 00, 0x4, 0xd8, 0x4, 0x6, 0xda, 0x6, 0x8, 0xda,
|
||||
0x8, 0xc, 0xda, 0xc, 0x15, 0xdc, 0x15, 0x18, 0xdc, 0x18,
|
||||
0x1a, 0xdc, 0x1a, 0x1d, 0xdd, 0x1d, 0x20, 0xde, 0x20, 0x22,
|
||||
0xde, 0x22, 0x24, 0xde, 0x24, 0x28, 0xde, 0x28, 0x2d, 0xe0,
|
||||
0x2d, 0x2f, 0xe0, 0x2f, 0x3b, 0xe2, 0x3b, 0x3d, 0xe2, 0x3d,
|
||||
0x41, 0xe2, 0x41, 0x45, 0xe2, 0x45, 0x49, 0xe3, 0x49, 0x49,
|
||||
0xe4, 0x49, 0x4b, 0xe4, 0x4b, 0x4d, 0xe5, 0x4d, 0x51, 0xe5,
|
||||
0x51, 0x56, 0xe6, 0x56, 0x58, 0xe6, 0x58, 0x60, 0xe6, 0x60,
|
||||
0x64, 0xe8, 0x64, 0x69, 0xe9, 0x69, 0x6a, 0xe9, 0x6a, 0x6c,
|
||||
0xe9, 0x6c, 0x6e, 0xe9, 0x6e, 0x6f, 0xea, 0x6f, 0x66, 0xff,
|
||||
0x66, 0x68, 0xff, 0x68, 0x6a, 0xff, 0x6a, 0x6c, 0xff, 0x6c,
|
||||
0x6e, 0xff, 0x6e, 0x73, 0xea, 0x73, 0x78, 0xeb, 0x78, 0x7a,
|
||||
0xea, 0x7a, 0x70, 0xff, 0x70, 0x72, 0xff, 0x72, 0x74, 0xff,
|
||||
0x74, 0x76, 0xff, 0x76, 0x78, 0xff, 0x78, 0x7a, 0xff, 0x7a,
|
||||
0x7c, 0xff, 0x7c, 0x7e, 0xff, 0x7e, 0x80, 0x80, 0x80, 0x83,
|
||||
0x83, 0x83, 0x86, 0x86, 0x86, 0x89, 0x89, 0x89, 0x8b, 0x8b,
|
||||
0x8b, 0x8e, 0x8e, 0x8e, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93,
|
||||
0x96, 0x96, 0x96, 0x99, 0x99, 0x99, 0x9a, 0x9a, 0x9a, 0x9e,
|
||||
0x9e, 0x9e, 0xa0, 0xa0, 0xa0, 0xa5, 0xa5, 0xa5, 0xa6, 0xa6,
|
||||
0xa6, 0xa9, 0xa9, 0xa9, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac,
|
||||
0xae, 0xae, 0xae, 0xb1, 0xb1, 0xb1, 0xb5, 0xb5, 0xb5, 0xb8,
|
||||
0xb8, 0xb8, 0xba, 0xba, 0xba, 0xbc, 0xbc, 0xbc, 0xbe, 0xbe,
|
||||
0xbe, 0x81, 0xeb, 0x81, 0x80, 0xec, 0x80, 0x85, 0xec, 0x85,
|
||||
0x88, 0xed, 0x88, 0x88, 0xee, 0x88, 0x8d, 0xee, 0x8d, 0x80,
|
||||
0xff, 0x80, 0x82, 0xff, 0x82, 0x84, 0xff, 0x84, 0x86, 0xff,
|
||||
0x86, 0x88, 0xff, 0x88, 0x8a, 0xff, 0x8a, 0x8c, 0xff, 0x8c,
|
||||
0x8e, 0xff, 0x8e, 0x97, 0xf0, 0x97, 0x90, 0xff, 0x90, 0x92,
|
||||
0xff, 0x92, 0x94, 0xff, 0x94, 0x96, 0xff, 0x96, 0x9c, 0xf0,
|
||||
0x9c, 0x98, 0xff, 0x98, 0x9a, 0xff, 0x9a, 0x9c, 0xff, 0x9c,
|
||||
0x9e, 0xff, 0x9e, 0xa2, 0xf1, 0xa2, 0xa2, 0xf2, 0xa2, 0xa4,
|
||||
0xf1, 0xa4, 0xa6, 0xf1, 0xa6, 0xa6, 0xf2, 0xa6, 0xa0, 0xff,
|
||||
0xa0, 0xa2, 0xff, 0xa2, 0xa4, 0xff, 0xa4, 0xa6, 0xff, 0xa6,
|
||||
0xa8, 0xf2, 0xa8, 0xac, 0xf3, 0xac, 0xae, 0xf3, 0xae, 0xa8,
|
||||
0xff, 0xa8, 0xaa, 0xff, 0xaa, 0xac, 0xff, 0xac, 0xae, 0xff,
|
||||
0xae, 0xb3, 0xf4, 0xb3, 0xb4, 0xf4, 0xb4, 0xb6, 0xf4, 0xb6,
|
||||
0xb0, 0xff, 0xb0, 0xb2, 0xff, 0xb2, 0xb4, 0xff, 0xb4, 0xb6,
|
||||
0xff, 0xb6, 0xbb, 0xf5, 0xbb, 0xb8, 0xff, 0xb8, 0xba, 0xff,
|
||||
0xba, 0xbc, 0xff, 0xbc, 0xbe, 0xff, 0xbe, 0xc0, 0xc0, 0xc0,
|
||||
0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc6, 0xc6, 0xc6, 0xc8,
|
||||
0xc8, 0xc8, 0xca, 0xca, 0xca, 0xcc, 0xcc, 0xcc, 0xcf, 0xcf,
|
||||
0xcf, 0xd0, 0xd0, 0xd0, 0xd2, 0xd2, 0xd2, 0xd4, 0xd4, 0xd4,
|
||||
0xd6, 0xd6, 0xd6, 0xd8, 0xd8, 0xd8, 0xda, 0xda, 0xda, 0xdc,
|
||||
0xdc, 0xdc, 0xdf, 0xdf, 0xdf, 0xc0, 0xff, 0xc0, 0xc2, 0xff,
|
||||
0xc2, 0xc4, 0xff, 0xc4, 0xc6, 0xff, 0xc6, 0xc8, 0xff, 0xc8,
|
||||
0xca, 0xff, 0xca, 0xcc, 0xf8, 0xcc, 0xce, 0xf8, 0xce, 0xcc,
|
||||
0xff, 0xcc, 0xce, 0xff, 0xce, 0xd0, 0xf8, 0xd0, 0xd0, 0xff,
|
||||
0xd0, 0xd2, 0xff, 0xd2, 0xd6, 0xf9, 0xd6, 0xd4, 0xff, 0xd4,
|
||||
0xd6, 0xff, 0xd6, 0xd9, 0xf9, 0xd9, 0xd8, 0xff, 0xd8, 0xda,
|
||||
0xff, 0xda, 0xdc, 0xfa, 0xdc, 0xdc, 0xff, 0xdc, 0xde, 0xff,
|
||||
0xde, 0xe0, 0xe0, 0xe0, 0xe2, 0xe2, 0xe2, 0xe4, 0xe4, 0xe4,
|
||||
0xe6, 0xe6, 0xe6, 0xe8, 0xe8, 0xe8, 0xea, 0xea, 0xea, 0xec,
|
||||
0xec, 0xec, 0xee, 0xee, 0xee, 0xe1, 0xfa, 0xe1, 0xe3, 0xfb,
|
||||
0xe3, 0xe0, 0xff, 0xe0, 0xe2, 0xff, 0xe2, 0xe5, 0xfb, 0xe5,
|
||||
0xe4, 0xff, 0xe4, 0xe6, 0xff, 0xe6, 0xe8, 0xfc, 0xe8, 0xe8,
|
||||
0xff, 0xe8, 0xea, 0xfc, 0xea, 0xea, 0xff, 0xea, 0xec, 0xff,
|
||||
0xec, 0xee, 0xfd, 0xee, 0xee, 0xff, 0xee, 0xf0, 0xf0, 0xf0,
|
||||
0xf2, 0xf2, 0xf2, 0xf4, 0xf4, 0xf4, 0xf6, 0xf6, 0xf6, 0xf1,
|
||||
0xfd, 0xf1, 0xf0, 0xff, 0xf0, 0xf3, 0xfd, 0xf3, 0xf2, 0xff,
|
||||
0xf2, 0xf5, 0xfd, 0xf5, 0xf4, 0xfe, 0xf4, 0xf6, 0xfe, 0xf6,
|
||||
0xf8, 0xf8, 0xf8, 0xfa, 0xfa, 0xfa, 0xf8, 0xfe, 0xf8, 0xfa,
|
||||
0xfe, 0xfa, 0xff, 00, 00, 0xfc, 0xfe, 0xfc, 0xfe, 0xfe,
|
||||
0xfe, 0xd7, 0xd6, 0xbe, 0x1c, 00, 00, 00, 0xfe, 0x74,
|
||||
0x52, 0x4e, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 00, 0xd8, 0xd9, 0xc,
|
||||
0x71, 00, 00, 0xc, 0xc6, 0x49, 0x44, 0x41, 0x54, 0x78,
|
||||
0xda, 0xed, 0x9c, 0xf, 0x50, 0x14, 0xd7, 0x19, 0xc0, 0xdf,
|
||||
0xc2, 0x21, 0x2c, 0x77, 0x27, 0xa0, 0x1, 0x3d, 0x15, 0x10,
|
||||
0x4, 0x39, 0x23, 0xe3, 0x14, 0x1, 0xeb, 0x1f, 0xc0, 0x51,
|
||||
0x87, 0x88, 0x81, 0x91, 0x92, 0xa8, 0x41, 0x32, 0x49, 0xac,
|
||||
0xb6, 0x8e, 0xa5, 0xa6, 0x8e, 0x1d, 0x3b, 0x6d, 0x9c, 0xce,
|
||||
0x64, 0x3a, 0xda, 0xd8, 0x4e, 0xda, 0x4e, 0x67, 0x9c, 0x74,
|
||||
0x92, 0x36, 0xa, 0xb6, 0x62, 0xac, 0xa6, 0x15, 0xdb, 0x10,
|
||||
0xe8, 0x58, 0xb4, 0xa, 0x6, 0x14, 0x73, 0x54, 0x73, 0x53,
|
||||
0x8e, 0x62, 0x4c, 0xf8, 0x93, 0x9c, 0x60, 0x10, 0xc9, 0x82,
|
||||
0x87, 0x1c, 0xb0, 0x7d, 0xbb, 0xcb, 0xdd, 0xbd, 0xb7, 0xfb,
|
||||
0xde, 0xde, 0xae, 0x98, 0x94, 0x23, 0x99, 0xdf, 0xcc, 0xed,
|
||||
0xbd, 0xdd, 0xf7, 0xde, 0xed, 0xb7, 0xef, 0xbd, 0xef, 0x7d,
|
||||
0xdf, 0xf7, 0xde, 0x1e, 0x33, 0xa, 00, 0xb8, 0x76, 0xf0,
|
||||
0x36, 0xfc, 0x9c, 0xd2, 0xa4, 0x1c, 0x83, 0x1f, 0x50, 0xd8,
|
||||
0x53, 0x7f, 0xfc, 0x6c, 0x82, 0x35, 0x5, 0x2, 0xec, 0xd6,
|
||||
0x9d, 0x50, 0xd8, 0x3f, 0xbd, 0x36, 0xe1, 0x8a, 0x2, 0x83,
|
||||
0xef, 0x3f, 0xc7, 0x8c, 0xe6, 0x72, 0x13, 0xae, 0x26, 0x30,
|
||||
0x30, 0x9f, 0x33, 0xbc, 0x20, 0xc9, 0x6a, 0x88, 0xc, 0x9e,
|
||||
0x50, 0x4d, 0x93, 0x92, 0xa0, 0x69, 0xd2, 0x71, 0xb0, 0x4f,
|
||||
0xd0, 0x4c, 0xdc, 0x29, 0x26, 0x53, 0x48, 0xb1, 0x31, 0xd9,
|
||||
0x39, 0x33, 0x1e, 0xb2, 0xc6, 0x49, 0x4c, 0x58, 0x8c, 0x74,
|
||||
0xfc, 0xe0, 0x17, 0x1f, 0xbb, 0xe1, 0x61, 0xba, 0x24, 0x6c,
|
||||
0xfc, 0x6b, 0xe3, 0xa7, 0xa7, 0x28, 0x1d, 0x3f, 0xf8, 0x54,
|
||||
0x38, 0x4, 0x9, 0x1f, 0x21, 0xeb, 0xa6, 0xb6, 0xac, 0x20,
|
||||
0x6e, 0xad, 0x41, 0x38, 0x88, 0xc2, 0x1a, 0xd8, 0x9, 0x54,
|
||||
0x14, 0x10, 0x44, 0x84, 0x8, 0x9f, 0xa2, 0xb0, 0x5f, 0x15,
|
||||
0xbe, 0x16, 0x76, 0xaa, 0x22, 0xe, 0x5c, 0x1a, 0xfd, 0x63,
|
||||
0x7d, 0x1f, 0xa7, 0x47, 0x68, 0xab, 0xe8, 0x91, 0xe2, 0xe2,
|
||||
0x84, 0x89, 0x11, 0x12, 0x6c, 0xd6, 0xaa, 0x4e, 0xc4, 0x22,
|
||||
0xfd, 0xc2, 0xcd, 0xd2, 0xcb, 0xd0, 0x85, 0xed, 0x7b, 0xef,
|
||||
0x82, 0xcb, 0xdd, 0x78, 0xaf, 0x7c, 0xad, 0xef, 0x94, 0xb3,
|
||||
0x8b, 0x92, 0xd7, 0xc, 0x40, 0xbc, 0xfc, 0x17, 0xa8, 0x99,
|
||||
0x51, 0x82, 0xe7, 0x29, 0xe6, 0x81, 0x9e, 0xae, 0xd1, 0xa1,
|
||||
0xee, 0xdb, 0x3, 00, 0xb4, 0xa6, 00, 0x60, 0x9a, 0x61,
|
||||
0xb2, 0x4, 0x5b, 0x2c, 0xea, 0x95, 0xb8, 0xda, 0xb9, 0xa1,
|
||||
0xbe, 0xde, 0xde, 0x11, 0xa9, 0x88, 0x61, 0xa6, 0x79, 0x56,
|
||||
0x18, 0x30, 0x2b, 0xee, 0x7, 0x42, 0x13, 0xd6, 0xfd, 0xaf,
|
||||
0xd3, 0x67, 0x7a, 0xe1, 0x91, 0x75, 0xf7, 0xd7, 0xd7, 00,
|
||||
0xb0, 0x1b, 0xd6, 0x2, 0x5c, 0x17, 0x2a, 0x29, 0xb9, 0xcd,
|
||||
0xc9, 0x20, 0xce, 0x14, 0x15, 0x6d, 0x45, 0xcf, 0x5d, 0xae,
|
||||
0x1a, 0xa4, 0xe4, 0x46, 0x30, 0x6e, 0xc7, 0x85, 0x75, 0xd9,
|
||||
0x9d, 0x1d, 0xef, 0x7b, 0xca, 0xd9, 0xc6, 0xf3, 0x2c, 0x89,
|
||||
0x9d, 0x95, 0x42, 0x9f, 0x1b, 0x6d, 0x5d, 0x3, 0xb5, 0x5e,
|
||||
0x8b, 0x77, 0xbc, 0x8, 0x60, 0xd2, 0xe2, 0x62, 0x93, 0x14,
|
||||
0xcf, 0x88, 0x26, 0x6c, 0xed, 0x4e, 0x6f, 0xc3, 0x54, 0xbd,
|
||||
0xe, 0x40, 0xe8, 0x21, 0x51, 0x77, 0xd3, 0xe0, 0x6c, 0xf0,
|
||||
0x67, 0xe0, 0xf, 0x58, 0x97, 0xaa, 0xe5, 0xf2, 0x8b, 0xeb,
|
||||
0xda, 0xcd, 0x4b, 0xca, 0x27, 0x34, 0xd8, 0xd0, 0x60, 0x5c,
|
||||
0xb2, 0x60, 0x39, 0x51, 0x5c, 0x97, 0xbd, 0xad, 0xc3, 0x23,
|
||||
0x20, 0xa, 0x6f, 0xb3, 0x19, 0x4b, 0xb5, 0xa, 0x7b, 0xd1,
|
||||
0x27, 0x6b, 0xc4, 0x74, 0xd6, 0x5, 0xde, 0x2d, 0x4d, 0x24,
|
||||
0x67, 0x44, 0x80, 0x3f, 0xb0, 0xf4, 0x7a, 0xfe, 0x4, 0xcc,
|
||||
0x13, 0xdb, 0x75, 0x82, 0xa8, 0x22, 0x83, 0xd, 0x37, 0x3e,
|
||||
0xcc, 0xc8, 0x50, 0x76, 0x4c, 0x47, 0x43, 0x3d, 0xd5, 0x8d,
|
||||
0x9, 0x9a, 0xa7, 0x38, 0x45, 0x16, 0xd6, 0xfd, 0x77, 0x64,
|
||||
0xc0, 0xad, 0x3f, 0xfd, 0x11, 0xe8, 0x6e, 0xf7, 0x2f, 0x2c,
|
||||
0xc4, 0xc6, 0xf4, 0x3e, 0xeb, 0x67, 0x80, 0xd1, 0xa9, 0x2b,
|
||||
0x1f, 0xe0, 0xa9, 0x17, 0xa1, 0xb8, 0x37, 0x15, 0xf, 0xb2,
|
||||
0xa9, 0xb6, 0x99, 0x5e, 0x82, 00, 0x59, 0xd8, 0xf6, 0xa,
|
||||
0xf8, 0x31, 0xa7, 0x78, 0xec, 0xd, 0x17, 0x3c, 0xc6, 0x42,
|
||||
0xdf, 0xa1, 0x1f, 0x8e, 0x7e, 0x2d, 0xf0, 0x57, 0x5b, 0xe,
|
||||
0x3e, 0x9c, 0xb4, 0xae, 0x2a, 0x3f, 0x63, 0x7c, 0xb0, 0xa6,
|
||||
0xf7, 0x79, 0x5c, 0x5a, 0xdb, 0xef, 0xd4, 0x4a, 0x24, 0x47,
|
||||
0x2a, 0x4e, 0x91, 0xe7, 0xd9, 0x4f, 0xee, 00, 0x90, 0x50,
|
||||
0x76, 0x68, 0xbd, 0xf8, 0x28, 0xe2, 0xb3, 0x1, 0x18, 0xa3,
|
||||
0x55, 0xa9, 0x80, 0xfb, 0xa9, 0xe6, 0xac, 0x28, 0xae, 0x33,
|
||||
0xa7, 0xfd, 0xe9, 0x33, 0xfe, 0xea, 0x4b, 0x3d, 0x68, 0xda,
|
||||
0x79, 0x58, 0xbd, 0x84, 0xb2, 0xd7, 0x93, 0x85, 0x1d, 0x83,
|
||||
0xc2, 0x45, 0xe4, 0x8e, 0xeb, 0xa4, 0xae, 0xf7, 0x28, 0xb5,
|
||||
0x91, 0xe1, 0xca, 0x74, 0x65, 0x97, 0x70, 0x9d, 0x39, 0xab,
|
||||
0xa1, 0x43, 0x72, 0x2f, 0x9, 0x3d, 0x6d, 0x9c, 0x9e, 0xfd,
|
||||
0x1a, 0xb4, 0x3d, 0xe, 0x59, 0x58, 0xe1, 0x87, 0x19, 0x4f,
|
||||
0x62, 0x78, 0x58, 0x4b, 0x45, 0x3e, 0x2e, 0xe9, 0xcb, 0x2e,
|
||||
0x62, 0xaf, 0x54, 0xca, 0xea, 0xbd, 0x1, 0x1f, 0x1c, 0x9c,
|
||||
0x18, 0x3c, 0x10, 0x95, 0x19, 0x52, 0x86, 0x30, 0x40, 0xc9,
|
||||
0x63, 0x56, 0x28, 0xe3, 0x16, 0xcd, 0x11, 0x48, 0x19, 0xc,
|
||||
0x3d, 0x1a, 0x94, 0x71, 0xc, 0x63, 0x50, 0x32, 0x30, 0x8c,
|
||||
0x80, 0xb6, 0xb1, 0xfb, 0xb2, 0xfb, 0xbc, 0xdf, 0x24, 0xfa,
|
||||
0xc8, 0x7a, 0x70, 0xfe, 0x4a, 0x76, 0xc2, 0x98, 0x62, 00,
|
||||
0x33, 0x7b, 0xc1, 0x48, 0xab, 0xac, 0xf2, 0xc6, 0x3a, 0x38,
|
||||
0xa6, 0x44, 0x5c, 0xa7, 0x95, 0x25, 0x80, 0x50, 0x6, 0xc0,
|
||||
0x7b, 0xa2, 0x68, 0x3a, 0xb2, 0xb0, 0x42, 0x7b, 0x3b, 0xf,
|
||||
0xee, 0x17, 0xbe, 0xba, 0xcf, 0x9f, 0x85, 0xd6, 0xcc, 0x9c,
|
||||
0xb9, 0x8a, 0x3c, 0xb9, 0x6b, 00, 0xb0, 0x38, 0x41, 0xbf,
|
||||
0xfd, 0xf6, 0x50, 0x13, 0x56, 0x37, 0x5f, 0x2f, 0x5, 0x4,
|
||||
0xd2, 0x85, 0xe8, 0x80, 0xc4, 0x28, 0x9a, 0x83, 0x59, 0xee,
|
||||
0xfb, 0x1e, 0x69, 0x14, 0xf, 0x7f, 0xc1, 0x6f, 0xce, 0xb8,
|
||||
0x78, 0x61, 0xae, 0x38, 0xe2, 0x5c, 0xf6, 0x2b, 0x5e, 0x13,
|
||||
0x43, 0xaa, 0xbb, 0xdc, 0x63, 0x5e, 0xd8, 0xb1, 0x22, 0x4c,
|
||||
0xe6, 0x42, 0xdf, 0x44, 0xec, 0x6a, 0xb7, 0x77, 0x3e, 0x68,
|
||||
0x26, 0x84, 0x99, 0xc8, 0xc2, 0xce, 0x85, 0x4f, 0xa8, 0xf7,
|
||||
0xe8, 0x79, 0xde, 0xd, 0xdc, 0x3f, 0x1a, 0x6e, 0x87, 0x27,
|
||||
0x36, 0xce, 0x56, 0xe4, 0x31, 0x9, 0x5a, 0xd7, 0x2, 0x2c,
|
||||
0x56, 0xe0, 0x9c, 0x8f, 0x2b, 0xd2, 0x7, 0xe2, 0x67, 0x26,
|
||||
0xd2, 0xbe, 0x8e, 0x26, 0xe4, 0x72, 0xda, 0x5e, 0x79, 0x55,
|
||||
0x8e, 0x3a, 0x2c, 0x69, 0xde, 0x90, 0x33, 0x7e, 0xe3, 0x6c,
|
||||
0x66, 0x66, 0x5d, 0x39, 0x36, 0x93, 0xe, 0xfc, 0xb3, 0x44,
|
||||
0xfa, 0x52, 0x8f, 0x9e, 0x65, 0xf2, 0xd0, 0x69, 0x89, 0xb5,
|
||||
0xc2, 0x7b, 0x4a, 0x8a, 0xc7, 0xea, 0x14, 0x21, 0xb, 0x1b,
|
||||
0x5d, 0x72, 0x18, 0x80, 0xbe, 0x3e, 0xf8, 0x6d, 0xa4, 0x55,
|
||||
0x48, 0x9b, 0x9e, 0x50, 0x73, 0x7, 0x2c, 0x9b, 0x66, 0x1d,
|
||||
0xd5, 0xad, 0x2c, 0x50, 0xaa, 0xb1, 0x56, 0x32, 0x6f, 0xf3,
|
||||
0x74, 0x55, 0x81, 0xec, 0xb0, 0xd7, 0x51, 0x69, 0xf9, 0x8e,
|
||||
0x1e, 0x49, 0xac, 0x1b, 0x68, 0x91, 0xb4, 0x3c, 0xf9, 0x14,
|
||||
0x6c, 0xd9, 0x24, 0x3b, 0x21, 0x40, 0x56, 0x50, 0x11, 0xdf,
|
||||
0x9a, 0x83, 0xa5, 0x13, 0x1e, 0x27, 0x66, 0xf3, 0x92, 0xbd,
|
||||
0x18, 0x4d, 0xb5, 0xa9, 0x67, 0x56, 0xe0, 0xc0, 0x6e, 0xdc,
|
||||
0xb8, 0x1, 0x95, 0x15, 0x80, 0xcc, 0x5d, 0x98, 0xa6, 0x6a,
|
||||
0x25, 0xe9, 0x3f, 0x83, 0xb6, 0xb9, 0x9d, 0xe2, 0xcf, 0x66,
|
||||
0x6d, 0x35, 0x21, 0xa9, 0x84, 0xdf, 0xfa, 0xb3, 0x9f, 0xe6,
|
||||
0x13, 0x54, 0xa7, 0x66, 0x1a, 0xee, 0xa3, 0xa9, 0x94, 0x1c,
|
||||
0xd9, 0xe5, 0xcc, 0x3c, 0x34, 0x35, 0xd8, 0x29, 0x1d, 0xb1,
|
||||
0x32, 0x1a, 0xa1, 0x8, 0x1b, 0xb2, 0x7f, 0x67, 0xb4, 0x37,
|
||||
0xcb, 0x82, 0x3f, 0x40, 0x5d, 0xa4, 0x4e, 0x2a, 0x9a, 0x48,
|
||||
0xf6, 0x97, 0x5b, 0x46, 0x37, 0xda, 0x8b, 0x99, 0x55, 0xa,
|
||||
0xeb, 0x3a, 0x1f, 0x7b, 0x92, 0x76, 0x92, 0xe1, 0xaf, 0xd,
|
||||
0x5a, 0xa4, 0x22, 0xea, 0xd0, 0xa9, 0x5d, 0xd0, 0x4b, 0x85,
|
||||
0xcc, 0xdc, 0xf7, 0xf, 0xc4, 0xa5, 0xa5, 0x60, 0x47, 0xbe,
|
||||
0x33, 0x68, 0xa7, 0xd0, 0x80, 0x13, 0xeb, 0xf6, 0x26, 0xbc,
|
||||
0x13, 0xb, 0xc4, 0x20, 0xea, 0x1b, 0x80, 0x1, 0x87, 0xb2,
|
||||
0x8a, 0xa6, 0xb7, 0x95, 0xe7, 0x8, 0x50, 0x9d, 0xf7, 0x90,
|
||||
0xd5, 0x2b, 0x7f, 0x2e, 0x68, 0x28, 0x66, 0x86, 0x96, 0x50,
|
||||
0x45, 0x27, 0xda, 0x38, 0x2b, 0x35, 0x14, 0x40, 0xb8, 0x8c,
|
||||
0xd9, 0xa2, 0x69, 0x84, 0x1c, 0xc5, 0xd, 0x48, 0x82, 0x97,
|
||||
0x94, 0x3d, 0x6, 0x7f, 0x7a, 0xb8, 0x48, 0x43, 0x48, 0x43,
|
||||
0x25, 0x2c, 0x13, 0x12, 0x15, 0xe5, 0xbf, 0xbc, 0x84, 0x13,
|
||||
0x6d, 0xd9, 0x70, 0x9d, 0x4e, 0x6d, 0x27, 0xaa, 0xc9, 0x99,
|
||||
0x2d, 0x84, 0x1c, 0x91, 0xc, 0xfa, 0x2c, 0xef, 0xb9, 0x4,
|
||||
0xb9, 0x32, 0xaf, 0xa2, 0x39, 0xf8, 0xca, 0x73, 0xf9, 0xab,
|
||||
0x22, 0xfd, 0xc9, 0x2b, 0x76, 0xe3, 0x11, 0xc4, 0xe4, 0xc4,
|
||||
0xe9, 0x17, 0x1a, 0xd7, 0x2f, 0xce, 0xa, 0x74, 0x76, 0x48,
|
||||
0xd7, 0x52, 0x84, 0xa, 0xc9, 0x1f, 0x66, 0xb1, 0x7e, 0x3c,
|
||||
0x7a, 0x4f, 0xf8, 0x5c, 0x2d, 0xcb, 0x33, 0x78, 0x6a, 0xcf,
|
||||
0xee, 0x3a, 0x87, 0x93, 0x2a, 0x89, 0x80, 0xd8, 0xb2, 0x6e,
|
||||
0xd2, 0x2, 0xad, 0xfb, 0xd6, 0x71, 0x37, 0x18, 0x4, 0x7b,
|
||||
0x92, 0x28, 0x25, 0x87, 0xa5, 0x7a, 0xb9, 0xd1, 0xfe, 0x3b,
|
||||
0x97, 0x51, 0x9d, 0x61, 0xde, 0x41, 0x29, 0x40, 0x1, 0xbf,
|
||||
0xbd, 0x70, 0x62, 0x9e, 0xc, 0xb4, 0x1f, 0xb7, 0x74, 0x9,
|
||||
0x13, 0x4d, 0x2a, 0xd6, 0xda, 0x22, 0xdc, 0x61, 0x60, 0x5e,
|
||||
0x97, 0x6c, 0x9e, 0x41, 0x8d, 0x1f, 0x50, 0xbb, 0x71, 0xeb,
|
||||
0x1b, 0x55, 0x5d, 0xf0, 0x3e, 0xd8, 0x82, 0xe8, 0xf7, 0xcf,
|
||||
0x3, 0xb0, 0x23, 0x41, 0x91, 0xe1, 0xe3, 0x33, 0xe2, 0xe1,
|
||||
0x41, 0x77, 0x2b, 0x66, 0x50, 0x18, 0x77, 0xe9, 0x5c, 0x5e,
|
||||
0xf0, 0x4, 0x12, 0x25, 0x96, 0x10, 0xf3, 0x48, 0x46, 0xe5,
|
||||
0x38, 0x3, 0x4e, 0xe1, 0x93, 0xcd, 0xab, 0x26, 0x55, 0x56,
|
||||
0x9, 0x8c, 0x39, 0x49, 0xca, 0xe8, 0x93, 0x4, 0x4d, 0xd8,
|
||||
0xb, 0xbb, 0x3a, 0x87, 0xc6, 0xbf, 0x56, 0x1e, 0x7, 0x80,
|
||||
0x39, 0xa0, 0xc8, 0x81, 0x8d, 0x19, 0x2f, 0xc6, 0x7c, 0xbd,
|
||||
0x5e, 0xc0, 0x28, 0x16, 0x17, 0x50, 0x7a, 0xdc, 0x2, 0xd8,
|
||||
0xcd, 0xf3, 0x92, 0x17, 0x96, 0x4f, 0x89, 0xc8, 0xc, 0x56,
|
||||
0x33, 0xcb, 0x63, 0x57, 0x11, 0xc5, 0xa5, 0x8, 0x7b, 0xb3,
|
||||
0xf4, 0x43, 0x8f, 0x8e, 0x8c, 0x98, 0x36, 0xe8, 0x6, 0xdd,
|
||||
0x7d, 0x9a, 0x94, 0x15, 0xb3, 0x3c, 0x23, 0x43, 0x4b, 0x3e,
|
||||
0x94, 0x2e, 0x6c, 0xe6, 0xa1, 0xd, 0x1a, 0x25, 0x31, 0x85,
|
||||
0x15, 0x14, 0x17, 0x98, 0x6f, 0x68, 0xec, 0x5c, 0xb0, 0x91,
|
||||
0x70, 0x81, 0x32, 0xcf, 0x1e, 0x6b, 0xf7, 0xcd, 0x7, 0xeb,
|
||||
0x67, 0x1, 0xf0, 0x2e, 0x16, 0x23, 0xa0, 0xc0, 0xac, 0xd8,
|
||||
0x5d, 0x9c, 0xad, 0x7b, 0x8d, 0xcc, 0x89, 0xcd, 0x3c, 0x58,
|
||||
0x87, 0x55, 0x27, 0xb7, 0x90, 0x6a, 0xb6, 0xf1, 0xd, 0x15,
|
||||
0x65, 0x4, 0x55, 0x45, 0x6e, 0xd9, 0x5b, 0x27, 0x60, 0x1f,
|
||||
0x36, 0x25, 0x7c, 0xb3, 0x42, 0x28, 0x91, 00, 0xef, 0xff,
|
||||
0xce, 0x27, 0x42, 0xe0, 0x58, 0x9d, 0xa5, 0x4f, 0x28, 0x23,
|
||||
0xde, 0x5f, 0x24, 0x6c, 0x91, 0xe9, 0x2c, 0x35, 0xb6, 0xc8,
|
||||
0xd7, 0xc, 0xee, 0x50, 0x3c, 0x77, 0x72, 0xcb, 0x76, 0x42,
|
||||
0x3, 0x34, 0xba, 0xb4, 0xf2, 0x29, 0xf1, 0x51, 0x44, 0x43,
|
||||
0x8b, 0xc8, 0x8d, 0x69, 0x11, 0x32, 0xcd, 0x17, 0xef, 0xfa,
|
||||
0xcf, 0xf4, 0x28, 0x61, 0x37, 0x1e, 0xcc, 0xa1, 0x37, 0x6e,
|
||||
0x9d, 0xa4, 0x40, 0x51, 0x28, 0x31, 0x28, 0xa8, 0x34, 0x66,
|
||||
0x1f, 0x48, 0x18, 0xaf, 0x49, 0x63, 0xb8, 0x92, 0x6f, 0xac,
|
||||
0x44, 0xdd, 0x56, 0xad, 0xcc, 0xc3, 0x6e, 0x41, 0xc3, 0x43,
|
||||
0x45, 0xb0, 0xec, 0xfe, 0xd9, 0x32, 0x9a, 0xb8, 0x7c, 0x2d,
|
||||
0xee, 0x25, 0x43, 0xe8, 0x31, 0x28, 0x83, 0x67, 0xd, 0xe0,
|
||||
0xb6, 0x56, 0x5f, 0x95, 0xb7, 0xd5, 0x12, 0xec, 0x56, 0x7f,
|
||||
0xcc, 0x5b, 0x84, 0xa6, 0x30, 0x9f, 0x5c, 0x3, 0xd6, 0x7d,
|
||||
0xe5, 0x5b, 0x8c, 0x46, 0xa2, 0xc0, 0xdc, 0x75, 0xf9, 0x19,
|
||||
0x7a, 0xc, 0xca, 0xdb, 0x9e, 0xc7, 0xa1, 0xc9, 0xa1, 0x71,
|
||||
0x65, 0xd3, 0xf6, 0x38, 0xb6, 0xdc, 0xf3, 0x10, 0x90, 0x5b,
|
||||
0x16, 0x5b, 0x23, 0x33, 0x42, 0x85, 0x89, 0xc0, 0x6e, 0xda,
|
||||
0xe4, 0xac, 0xe9, 0x26, 0x85, 0x9d, 0x9a, 0xe5, 0xc1, 0x30,
|
||||
0x95, 0x55, 0x3c, 0xc9, 0xd9, 0xe1, 0x6f, 0xfd, 0xd, 0x9a,
|
||||
0x8c, 0x51, 0xe3, 0x9b, 0x6c, 0x10, 0xcc, 0x82, 0x5b, 0x37,
|
||||
0x3a, 0x82, 0xc7, 0xe4, 0xcf, 0x66, 0xea, 0xe, 0x91, 0x4b,
|
||||
0xbe, 0x95, 0x7, 0xf2, 0x40, 0x10, 0x22, 0x43, 0x5e, 0x82,
|
||||
0xc2, 0xe4, 0x97, 0x2d, 0xdf, 0x6, 0xce, 0xcb, 0x30, 0xec,
|
||||
0x24, 0x93, 0x97, 0x6b, 0xd3, 0x24, 0xec, 0x1c, 0x33, 0x7,
|
||||
0xda, 0x4b, 0xb, 0xdc, 0x23, 0x60, 0xe4, 0xaf, 0x8d, 0xff,
|
||||
0x81, 0x27, 0x8a, 0x94, 0x96, 0x4d, 0xa1, 0x38, 0x93, 0x39,
|
||||
0x67, 0x61, 0x73, 0x3b, 0x27, 0x9a, 0x72, 0xba, 0x60, 0xf1,
|
||||
0xc8, 0x98, 0x68, 0xe5, 0xcb, 0x70, 0x61, 0xc6, 0xd2, 0x22,
|
||||
0xe5, 0x22, 0xe, 0x10, 0xc2, 0x30, 0x8e, 0xb8, 0x4f, 0xc9,
|
||||
0x86, 0x8e, 0x17, 0x72, 0xff, 0x9c, 0xfd, 0xc, 0xfc, 0xf8,
|
||||
0xe8, 0xf0, 0x11, 0x17, 0x70, 0xbf, 0x69, 0x87, 0xf3, 0x60,
|
||||
0x48, 0xc, 0xcd, 0xa6, 0xb0, 0x14, 0x17, 0x62, 0x4d, 0x53,
|
||||
0xaf, 0x6a, 0x89, 0x13, 0x89, 0xc4, 0x7d, 0x73, 0x52, 0x16,
|
||||
0x6c, 0x86, 0x9, 0x23, 0x5b, 0x59, 0xc0, 0x5a, 0x52, 0xb0,
|
||||
0x1, 0x1f, 0xbc, 0x77, 0x65, 0xd6, 0x1, 0x25, 0x6, 0xf5,
|
||||
0xf4, 0x74, 0xe1, 0xe0, 0x8d, 0x85, 0xc6, 0x3f, 0x47, 0xcc,
|
||||
0x26, 0xc0, 0xe6, 0x66, 0xa1, 0xc9, 0x46, 0xd1, 0x25, 0xd1,
|
||||
0x45, 0x12, 0x6a, 0xfc, 0xf3, 0x24, 0xd, 0x85, 0x3f, 00,
|
||||
0x23, 0xd5, 0x6e, 0xb1, 0x16, 0x63, 0x11, 0x1c, 0x30, 0x24,
|
||||
0xd3, 00, 0x14, 0xcd, 0xb3, 0xac, 0x4, 0xbd, 0x10, 0xfd,
|
||||
0x1b, 0x15, 0x93, 0x82, 0x5d, 0xb1, 0xc, 0x49, 0xf1, 0xfa,
|
||||
0x67, 0x9f, 0x24, 0xec, 0x1e, 0x6e, 0x10, 0x6c, 0xb5, 0x5a,
|
||||
0x34, 0xc1, 0xe0, 0x83, 0x1c, 0x83, 0xcd, 0xc3, 0x2c, 0xb0,
|
||||
0x16, 0xd1, 0x65, 0xf0, 0x41, 0x11, 0x36, 0x6a, 0xdf, 0x76,
|
||||
0x5f, 0x70, 0x25, 0x7a, 0xbb, 0x32, 0x54, 0x82, 0x60, 0xc5,
|
||||
0x22, 0x91, 0x67, 0x75, 0xf7, 0x63, 0xb, 0x16, 0xb3, 0xba,
|
||||
0x5f, 0xa5, 0xc8, 0xe0, 0x68, 0x46, 0x53, 0x69, 0xab, 0x54,
|
||||
0xea, 0x8a, 0x94, 0x47, 0xeb, 0x30, 0x68, 0x73, 0x4a, 0xe2,
|
||||
0x2f, 0xf7, 0x24, 0x4a, 0xca, 0x8b, 0xfd, 0xc6, 0xc9, 0x9f,
|
||||
0xa8, 0x47, 0x66, 0x96, 0xa2, 0xa1, 0x9, 0x4e, 0x7f, 0x3f,
|
||||
0x8e, 0x43, 0x47, 0x1a, 0x5f, 0xaf, 0x98, 0xab, 0xf1, 0x75,
|
||||
0xa0, 0x50, 0x35, 0x15, 0xc8, 0xce, 0x44, 0x53, 0x69, 0x32,
|
||||
0x55, 0x46, 0x9d, 0x7a, 0xa2, 0xe, 0xfc, 0xb0, 0xa7, 0xad,
|
||||
0x1e, 0xc6, 0xda, 0x63, 0x67, 0xfa, 0xb, 0x42, 0x59, 0xb1,
|
||||
0x8, 0xdb, 0x49, 0x45, 0xc0, 0xdf, 0x1f, 0x45, 0xe7, 0x50,
|
||||
0xb3, 0x65, 0xa0, 0x5a, 0xb6, 0xf7, 0xe3, 0x4, 0xd6, 0xb0,
|
||||
0xc6, 0x5, 0x6a, 0x55, 0xb9, 0x3a, 0xd4, 0xae, 0x92, 0x85,
|
||||
0xbd, 0xb8, 0x26, 0x24, 0x92, 0x7d, 0xea, 0xe5, 0x94, 0x2,
|
||||
0xb5, 0xa2, 0x3e, 0xe2, 0x8c, 0xc8, 0xdd, 0x36, 0xe8, 0x16,
|
||||
0x96, 0x5d, 0x82, 0x5, 0xd4, 0x1a, 0x23, 0x8b, 0x51, 0x69,
|
||||
0x4f, 0xe0, 0x8b, 0x99, 0x8b, 0x3d, 0xbe, 0x9b, 0xcd, 0x41,
|
||||
0x88, 0xb1, 0xdd, 0xc3, 0x4c, 0x44, 0x79, 0xcc, 0x82, 0xdc,
|
||||
0x8d, 0x47, 0x81, 0xfb, 0x4e, 0xc7, 0x3, 0xcd, 0x3b, 0xa0,
|
||||
0x72, 0xb1, 0x5, 0x1, 0xfd, 0x2a, 0xa, 0x8f, 0xf9, 0xf3,
|
||||
0x35, 0x47, 0x7c, 0x8a, 0xa5, 0x47, 0x26, 0x2b, 0xb3, 0xd0,
|
||||
0xf3, 0xad, 0xab, 0x72, 0x5b, 0x99, 0xa3, 0x7, 0xd7, 0x10,
|
||||
0xce, 0x63, 0x58, 0x8, 0x5a, 0x6e, 0x9, 0xd1, 0xcd, 0x45,
|
||||
0xc0, 0xbb, 0x55, 0x77, 0xc8, 0x20, 0xe0, 0x76, 0x41, 0xad,
|
||||
0xee, 0x15, 0x4b, 0xb6, 0x10, 0xdb, 0x73, 0xc4, 0x5f, 0x6a,
|
||||
0x2e, 0x5c, 0x18, 0x11, 0x6c, 0x6, 0xf7, 0xfa, 0xb9, 0x8b,
|
||||
0x32, 0x3b, 0x21, 0xd3, 0xeb, 0x94, 0xff, 0x17, 0xf0, 0xd5,
|
||||
0xd5, 0xc6, 0x9c, 0xd4, 0xe0, 0xf0, 0x8, 0x31, 0xbe, 0x1,
|
||||
0x83, 0x61, 0x1c, 0xb6, 0x2c, 0x4, 0x4c, 0xf2, 0x75, 0xc,
|
||||
0x8a, 0x5, 0x5, 0x37, 0xc8, 0x80, 0xb, 0xed, 0x9a, 0xc3,
|
||||
0x6, 0x19, 0x37, 0x90, 0x7e, 0xdc, 0x4a, 0x32, 0x82, 0xd4,
|
||||
0x29, 0x92, 0xd9, 0x3e, 0xdc, 0x71, 0x26, 0xcd, 0x30, 0x47,
|
||||
0x1e, 0xde, 0x82, 0x18, 0x7d, 0x3, 0x4b, 0x8c, 0xe6, 0xc,
|
||||
0x56, 0x57, 0xc3, 0x2d, 0x49, 0x70, 0x9f, 0x17, 0x18, 0xee,
|
||||
0x56, 0x98, 0x8b, 0x59, 0xf2, 0x98, 0x2e, 0x59, 0xd8, 0x18,
|
||||
0xeb, 0xf5, 0x31, 0xf0, 0xe9, 0x91, 0x43, 0xc4, 0x8b, 0x4,
|
||||
0x32, 0xca, 0x91, 0xc4, 0xfd, 0x2a, 0xd2, 0xa, 0x9a, 0x2a,
|
||||
0x6c, 0x41, 0x8b, 0xcc, 0xd, 0xe7, 0x89, 0x8b, 0x1c, 0x4c,
|
||||
0xbe, 0xcf, 0xd1, 0xf0, 0x66, 0x20, 0x67, 0x5, 0x92, 0xf1,
|
||||
0x8e, 0x41, 0x1e, 0xb3, 0x51, 0x7f, 0x5e, 0x10, 0x4, 0xb8,
|
||||
0x8a, 0x3d, 0x1f, 0x91, 0xab, 0x51, 0xc0, 0xa2, 0x6e, 0x1a,
|
||||
0x7f, 0x53, 0x63, 0x29, 0x4, 0x6b, 0xa1, 0xa6, 0x78, 0x4c,
|
||||
0x9e, 0x8e, 0xc7, 0xc8, 0x64, 0x29, 0x86, 0x13, 0x65, 0x1f,
|
||||
0xd4, 0xe8, 0xe6, 0xb7, 0x3a, 0x47, 0xba, 0xca, 0xde, 0xf1,
|
||||
0x5c, 0x5e, 0xf3, 0x63, 0x65, 0x2c, 0x15, 0x65, 0x35, 0xba,
|
||||
0xb4, 0xde, 0xe6, 0xd0, 0xef, 0xe8, 0xe5, 0x82, 0x33, 0xfe,
|
||||
0xdd, 0xe6, 0xd, 0xf9, 0x7e, 0xb3, 0x78, 0x61, 0x96, 0xe3,
|
||||
0xa6, 0xa3, 00, 0x59, 0xd8, 0xae, 0xa2, 0xbe, 0x21, 0x68,
|
||||
0xff, 0xf, 0xc0, 0xd, 0x6, 0x12, 0x9f, 0x6f, 0x55, 0x17,
|
||||
0x36, 0x35, 0x1c, 0xb9, 0xd5, 0x81, 0x6, 0xfd, 0xc2, 0xb2,
|
||||
0xb9, 0x51, 0x58, 0xa8, 0x9d, 00, 0xb3, 0x39, 0x1f, 0x51,
|
||||
0x6, 0xfe, 0xc, 0xb5, 0xcc, 0x62, 0xa5, 0xf1, 0x21, 0x9,
|
||||
0x2b, 0x77, 0x99, 0xf9, 0xfe, 0x6e, 0x3f, 0x75, 0xc9, 0x60,
|
||||
0x53, 0x90, 0x3b, 0xe5, 0x7b, 0xf5, 0xab, 0x28, 0xc0, 0x66,
|
||||
0x47, 0x1b, 0x54, 0x3d, 0x34, 0xf3, 0x36, 0x6c, 0x3f, 0x1f,
|
||||
0xe6, 0xe2, 0x2a, 0x59, 0xf1, 0x2c, 0x21, 0xf8, 0xa7, 0xba,
|
||||
0xdf, 0x58, 0x7, 0xeb, 0xd0, 0x66, 0x69, 0xb1, 0xeb, 0x9e,
|
||||
0x7d, 0x20, 0xd6, 0x78, 0xd9, 0xde, 0xc, 0x14, 0x26, 0x7b,
|
||||
0x8b, 0x8e, 0xd0, 0x25, 0xb3, 0x2f, 0x95, 0xf4, 0xb8, 0x1f,
|
||||
0x95, 0xb0, 0x98, 0x74, 0xdc, 0x95, 0x87, 0x11, 0x56, 0x8,
|
||||
0xb0, 0x9c, 0x38, 0x27, 0xdf, 0x68, 0x24, 0xc0, 0x84, 0xa7,
|
||||
0x3f, 0x2d, 0xef, 0x94, 0x36, 0x86, 0x16, 0x8, 0x64, 0xc2,
|
||||
0x8b, 0xa4, 0xbd, 0x36, 0xa, 0x28, 0xc2, 0xb2, 0x26, 0xdc,
|
||||
0xd, 0xe, 0x17, 0x77, 0xcb, 0x98, 0x50, 0xef, 0x4a, 0xe6,
|
||||
0xce, 0x2f, 0x6b, 0x41, 0x53, 0xe3, 0xbb, 0x3c, 0x3c, 0x44,
|
||||
0xa0, 0xd6, 0x73, 0x28, 0x5e, 0x10, 0xa3, 0xa4, 0xa4, 0xe9,
|
||||
0x62, 0xb, 0x40, 0xb6, 0x56, 0x31, 0x20, 0x3c, 0x28, 0x39,
|
||||
0x89, 0xa0, 0x84, 0x4b, 0x8a, 0xec, 0x57, 0xa0, 0xd1, 0xc,
|
||||
0xb5, 0xa, 0xba, 0xeb, 0x28, 0x3c, 0x8, 0xa4, 0xae, 0xa6,
|
||||
0x2e, 0x99, 0x4a, 0x2f, 0x31, 0xe5, 0xbf, 0x2c, 0xa5, 0xfa,
|
||||
0xff, 0xd, 0x47, 0x6f, 0x42, 0x2, 0x70, 0xd7, 0xcb, 0x76,
|
||||
0xb5, 0x4d, 0xcb, 0x12, 0xac, 0x29, 0x17, 0xea, 0xd1, 0xc8,
|
||||
0x56, 0x43, 0x7b, 0xb0, 0x71, 0x2f, 0x5f, 0x2a, 0xc5, 0x1c,
|
||||
0x4b, 0x7f, 0x91, 0x9b, 0x9e, 0xd6, 0xeb, 0x9e, 0x75, 0x26,
|
||||
0x10, 0x36, 0x3b, 0x71, 0x11, 0x5d, 0x1, 0xb8, 0xb8, 0xd6,
|
||||
0xce, 0x6e, 0xdf, 0xf, 0x7, 0xc7, 0x26, 0x52, 0xe2, 0xf4,
|
||||
0xc7, 0x8e, 0xa, 0xa, 0xd, 0x6f, 0xd9, 0xab, 0xa5, 0x9f,
|
||||
0x3, 0xf0, 0xfc, 0x2b, 0x21, 0x21, 0xe4, 0x4d, 0x14, 0xac,
|
||||
0x8a, 0xde, 0x51, 0x1f, 0x51, 0xba, 0x22, 0x53, 0x31, 0x31,
|
||||
0xaa, 0xfe, 0x33, 0x2, 0xcb, 0xea, 0x5a, 0x83, 0xc0, 0x85,
|
||||
0x1d, 0xbe, 0xb, 0x23, 0x89, 0x43, 0xf7, 0xff, 0x1f, 0xef,
|
||||
0x40, 0x7c, 0x19, 0x90, 0x2d, 0xa8, 0xbe, 0xbd, 0xe9, 0xe9,
|
||||
0x2f, 0x5e, 0xd0, 0x55, 0x51, 0x20, 0x40, 0x56, 0x50, 0x7d,
|
||||
0xa7, 0x9c, 0xe0, 0x96, 0xd9, 0xef, 0x86, 0xa0, 0x40, 0xe3,
|
||||
0xab, 0xfe, 0xc6, 0x56, 0xf5, 0x97, 0xbc, 0x18, 0xf7, 0xe5,
|
||||
0x81, 0x77, 0x63, 0x76, 0x3a, 0x54, 0x50, 0x1d, 0x59, 0x2f,
|
||||
0xf0, 0x70, 0xb3, 0xdc, 0xf0, 0x5d, 0xf8, 0x3e, 0x8f, 0x87,
|
||||
0x69, 0xd9, 0x70, 0xea, 0x71, 0xdf, 0xd2, 0xea, 0x5, 0x4d,
|
||||
0x12, 0x82, 0x93, 0x70, 0x8b, 0x1e, 0x17, 0x76, 0xbe, 0xe0,
|
||||
0x68, 0x8d, 0xc0, 0xad, 0xce, 0xd0, 0x33, 0x76, 0xbd, 0x79,
|
||||
0xd4, 0x77, 0x21, 0xa6, 0x16, 0x46, 0x8e, 0xbb, 0x7e, 0x8d,
|
||||
0xba, 0xad, 0x1, 0x80, 0xf9, 0x7b, 0x7, 0xb1, 0x34, 0x2e,
|
||||
0x6c, 0xe2, 0x5a, 0x87, 0xb0, 0xe8, 0x2f, 0x6d, 0xe9, 0x10,
|
||||
0x5e, 0x14, 0xf0, 0x30, 0x7a, 0x5b, 0x8, 0x93, 0x5f, 0xd3,
|
||||
0xf8, 0xe, 0xc8, 0x64, 0x1, 0x95, 0x40, 0x40, 0x36, 0x66,
|
||||
0x9f, 0xc4, 0x97, 0x3, 0xa7, 0x18, 0x32, 0x61, 0xf3, 0x4a,
|
||||
0xa2, 0x1f, 0x95, 0x6b, 0x30, 0x9, 0x91, 0x6b, 0xe3, 0x57,
|
||||
0x8f, 0x2c, 0x4a, 0x8c, 0xa7, 0x2c, 0x93, 0x5, 0x3c, 0x8a,
|
||||
0x76, 0x2c, 0x28, 0xb8, 0xd5, 0x59, 0x53, 0xd5, 0xce, 0x81,
|
||||
0xb0, 0xb9, 0xe2, 0x4a, 0x9e, 0x44, 0x56, 0x1c, 0xfc, 0x98,
|
||||
0x81, 0x6f, 0xfc, 0x9d, 0xfc, 0xac, 0xcc, 0xc5, 0xd3, 0x84,
|
||||
0x4e, 0x9b, 0x98, 0xb8, 0xfa, 0xbb, 0xd9, 0x1c, 0x8, 0xdd,
|
||||
0xfc, 0x8a, 0xec, 0x42, 0xc4, 0x1, 0xe5, 0x3e, 0xb7, 0x80,
|
||||
0xe2, 0xeb, 0xd7, 0xc0, 0x1, 0x13, 0x1, 0xc6, 0x4c, 0x6a,
|
||||
0x4b, 0x83, 0x81, 0x9, 0x59, 0xd8, 0x84, 0x77, 0xdc, 0x20,
|
||||
0x4, 0x5b, 0xfd, 0x9b, 0x12, 0x50, 0x26, 0x1a, 0x4d, 0x6f,
|
||||
0xcb, 0x6, 0x1c, 0x5f, 0x2d, 0xaf, 0x67, 0xa, 0xfe, 0x33,
|
||||
0x12, 0x81, 0x50, 0xb1, 0x51, 0x83, 0xc4, 0xc9, 0xf4, 0xfd,
|
||||
0xf, 0x26, 0x50, 0x51, 0x40, 0x20, 0x9, 0x2b, 0xbe, 0x6b,
|
||||
0xf0, 0xd9, 0xc3, 0xbf, 0x18, 0x14, 0x8, 0xf4, 0x9c, 0x94,
|
||||
0xde, 0xd8, 0x30, 0x14, 0x9, 0xbb, 0xc7, 0x46, 0xde, 0xe,
|
||||
0x5d, 0xec, 0xc2, 0x2, 0xbf, 0x13, 0xc1, 0xf5, 0xe8, 0xfe,
|
||||
00, 0x4f, 0xdf, 0x26, 0x55, 0x1a, 0x76, 0x69, 0x81, 0x3e,
|
||||
0x84, 0x19, 0xcd, 0x16, 0xb7, 0x76, 0x99, 0xc3, 0x87, 0xbd,
|
||||
0xb1, 0xda, 0x89, 0x32, 0xe2, 0x7b, 0x71, 0x76, 0x52, 0xf1,
|
||||
0x8c, 0x1, 0x24, 0x8a, 0x2f, 0x8d, 0x72, 0x53, 0xff, 0x6f,
|
||||
0xeb, 0x1e, 0xdb, 0x1b, 0x4, 0x5e, 0x9c, 0xf2, 0xff, 0x7c,
|
||||
0x25, 0x11, 0xfc, 0x1d, 0xe1, 0x4f, 0x26, 0xaf, 0xbd, 0xea,
|
||||
0x67, 0xf9, 0x6f, 0x2a, 0x60, 0x7e, 0x32, 0x3b, 0x43, 0x10,
|
||||
0x16, 0x80, 0xdf, 0xbf, 0xa5, 0x7f, 0x2f, 0xe9, 0x17, 0xcd,
|
||||
0xf4, 0x47, 0x15, 0x44, 0x8, 0xda, 0xc8, 0x7e, 0x36, 0x50,
|
||||
0x28, 0x6e, 0x21, 0xfe, 0x1f, 0xd2, 0xa8, 0xa2, 0x91, 0xdc,
|
||||
0x83, 0x90, 0x3, 00, 00, 00, 00, 0x49, 0x45, 0x4e,
|
||||
0x44, 0xae, 0x42, 0x60, 0x82, };
|
||||
|
||||
static const char data_cgi_files[] = {
|
||||
/* /cgi/files */
|
||||
0x2f, 0x63, 0x67, 0x69, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0,
|
||||
0x23, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x63, 0x72,
|
||||
0x69, 0x70, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x73, 0x20,
|
||||
0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73,
|
||||
0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63,
|
||||
0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x66, 0x66,
|
||||
0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65,
|
||||
0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0xd, 0xa,
|
||||
0x23, 0x20, 0x77, 0x65, 0x62, 0x20, 0x73, 0x65, 0x72, 0x76,
|
||||
0x65, 0x72, 0x2e, 0xd, 0xa, 0x23, 0xd, 0xa, 0x23, 0x20,
|
||||
0x46, 0x69, 0x72, 0x73, 0x74, 0x2c, 0x20, 0x77, 0x65, 0x20,
|
||||
0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68,
|
||||
0x65, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x68, 0x65, 0x61,
|
||||
0x64, 0x65, 0x72, 0x2e, 0xd, 0xa, 0x69, 0x20, 0x2f, 0x66,
|
||||
0x69, 0x6c, 0x65, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65,
|
||||
0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0x23, 0x20,
|
||||
0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20,
|
||||
0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f,
|
||||
0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65,
|
||||
0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x6c, 0x6c,
|
||||
0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70,
|
||||
0x72, 0x69, 0x6e, 0x74, 0x73, 0xd, 0xa, 0x23, 0x20, 0x74,
|
||||
0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20,
|
||||
0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73,
|
||||
0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x66,
|
||||
0x69, 0x6c, 0x65, 0x2e, 0xd, 0xa, 0x74, 0x20, 0x3c, 0x74,
|
||||
0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68,
|
||||
0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x69, 0x6e, 0x64, 0x65,
|
||||
0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x2f, 0x69,
|
||||
0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3c,
|
||||
0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74,
|
||||
0x64, 0x3e, 0xd, 0xa, 0x63, 0x20, 0x62, 0x20, 0x2f, 0x69,
|
||||
0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xd,
|
||||
0xa, 0x74, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f,
|
||||
0x74, 0x72, 0x3e, 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74,
|
||||
0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
|
||||
0x22, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e,
|
||||
0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x2f, 0x63, 0x6f, 0x6e,
|
||||
0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3c,
|
||||
0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74,
|
||||
0x64, 0x3e, 0xd, 0xa, 0x63, 0x20, 0x62, 0x20, 0x2f, 0x63,
|
||||
0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x68, 0x74, 0x6d,
|
||||
0x6c, 0xd, 0xa, 0x74, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e,
|
||||
0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x20, 0x3c, 0x74, 0x72, 0x3e,
|
||||
0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65,
|
||||
0x66, 0x3d, 0x22, 0x2f, 0x69, 0x6d, 0x67, 0x2f, 0x6c, 0x6f,
|
||||
0x67, 0x6f, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x3e, 0x2f, 0x69,
|
||||
0x6d, 0x67, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x6e,
|
||||
0x67, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e,
|
||||
0x3c, 0x74, 0x64, 0x3e, 0xd, 0xa, 0x63, 0x20, 0x62, 0x20,
|
||||
0x2f, 0x69, 0x6d, 0x67, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x2e,
|
||||
0x70, 0x6e, 0x67, 0xd, 0xa, 0x74, 0x20, 0x3c, 0x2f, 0x74,
|
||||
0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x20, 0x3c, 0x74,
|
||||
0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68,
|
||||
0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x34, 0x30, 0x34, 0x2e,
|
||||
0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x2f, 0x34, 0x30, 0x34,
|
||||
0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3c, 0x2f, 0x61, 0x3e, 0x3c,
|
||||
0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0xd, 0xa,
|
||||
0x63, 0x20, 0x62, 0x20, 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68,
|
||||
0x74, 0x6d, 0x6c, 0xd, 0xa, 0x74, 0x20, 0x3c, 0x2f, 0x74,
|
||||
0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x20, 0x3c, 0x74,
|
||||
0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68,
|
||||
0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x63, 0x67, 0x69, 0x2f,
|
||||
0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x3e, 0x2f, 0x63, 0x67,
|
||||
0x69, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x3c, 0x2f, 0x61,
|
||||
0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e,
|
||||
0xd, 0xa, 0x63, 0x20, 0x62, 0x20, 0x2f, 0x63, 0x67, 0x69,
|
||||
0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0xd, 0xa, 0x74, 0x20,
|
||||
0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e,
|
||||
0x20, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c,
|
||||
0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x63,
|
||||
0x67, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x3e,
|
||||
0x2f, 0x63, 0x67, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73,
|
||||
0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c,
|
||||
0x74, 0x64, 0x3e, 0xd, 0xa, 0x63, 0x20, 0x62, 0x20, 0x2f,
|
||||
0x63, 0x67, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0xd,
|
||||
0xa, 0x74, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f,
|
||||
0x74, 0x72, 0x3e, 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74,
|
||||
0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
|
||||
0x22, 0x2f, 0x63, 0x67, 0x69, 0x2f, 0x74, 0x63, 0x70, 0x22,
|
||||
0x3e, 0x2f, 0x63, 0x67, 0x69, 0x2f, 0x74, 0x63, 0x70, 0x3c,
|
||||
0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74,
|
||||
0x64, 0x3e, 0xd, 0xa, 0x63, 0x20, 0x62, 0x20, 0x2f, 0x63,
|
||||
0x67, 0x69, 0x2f, 0x74, 0x63, 0x70, 0xd, 0xa, 0x74, 0x20,
|
||||
0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e,
|
||||
0xd, 0xa, 0x23, 0x20, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64,
|
||||
0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x54, 0x4d, 0x4c,
|
||||
0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0xd, 0xa,
|
||||
0x69, 0x20, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x66,
|
||||
0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x6c, 0x61, 0x69,
|
||||
0x6e, 0xd, 0xa, 0x23, 0x20, 0x45, 0x6e, 0x64, 0x20, 0x6f,
|
||||
0x66, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0xd,
|
||||
0xa, 0x2e, };
|
||||
|
||||
static const char data_cgi_stats[] = {
|
||||
/* /cgi/stats */
|
||||
0x2f, 0x63, 0x67, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0,
|
||||
0x69, 0x20, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x68,
|
||||
0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c,
|
||||
0xd, 0xa, 0x63, 0x20, 0x61, 0xd, 0xa, 0x69, 0x20, 0x2f,
|
||||
0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x66, 0x6f, 0x6f, 0x74,
|
||||
0x65, 0x72, 0x2e, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa,
|
||||
0x2e, 0xd, 0xa, };
|
||||
|
||||
static const char data_cgi_tcp[] = {
|
||||
/* /cgi/tcp */
|
||||
0x2f, 0x63, 0x67, 0x69, 0x2f, 0x74, 0x63, 0x70, 0,
|
||||
0x69, 0x20, 0x2f, 0x74, 0x63, 0x70, 0x5f, 0x68, 0x65, 0x61,
|
||||
0x64, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa,
|
||||
0x63, 0x20, 0x63, 0xd, 0xa, 0x69, 0x20, 0x2f, 0x74, 0x63,
|
||||
0x70, 0x5f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x70,
|
||||
0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0x2e, };
|
||||
|
||||
static const char data_cgi_rtos[] = {
|
||||
/* /cgi/rtos */
|
||||
0x2f, 0x63, 0x67, 0x69, 0x2f, 0x72, 0x74, 0x6f, 0x73, 0,
|
||||
0x74, 0x20, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c, 0x68,
|
||||
0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65,
|
||||
0x3e, 0x75, 0x49, 0x50, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x20,
|
||||
0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x45, 0x6d, 0x62,
|
||||
0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x54, 0x43, 0x50, 0x2f,
|
||||
0x49, 0x50, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x4f,
|
||||
0x6e, 0x20, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53,
|
||||
0x20, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x3c, 0x2f, 0x74,
|
||||
0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61,
|
||||
0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x42, 0x47,
|
||||
0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x3d, 0x22, 0x23, 0x43, 0x43,
|
||||
0x43, 0x43, 0x46, 0x46, 0x22, 0x3e, 0x3c, 0x66, 0x6f, 0x6e,
|
||||
0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72,
|
||||
0x69, 0x61, 0x6c, 0x22, 0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c,
|
||||
0x6c, 0x3e, 0x3c, 0x62, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72,
|
||||
0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
||||
0x2f, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x72,
|
||||
0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x72, 0x67, 0x22, 0x20, 0x74,
|
||||
0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x74, 0x6f,
|
||||
0x70, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f,
|
||||
0x53, 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65,
|
||||
0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x2f,
|
||||
0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c, 0x70, 0x3e, 0x3c,
|
||||
0x48, 0x31, 0x3e, 0x41, 0x54, 0x39, 0x31, 0x53, 0x41, 0x4d,
|
||||
0x37, 0x58, 0x20, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65,
|
||||
0x64, 0x20, 0x57, 0x45, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76,
|
||||
0x65, 0x72, 0x20, 0x44, 0x65, 0x6d, 0x6f, 0x3c, 0x62, 0x72,
|
||||
0x3e, 0x3c, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x55, 0x73,
|
||||
0x69, 0x6e, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x61, 0x6e,
|
||||
0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65,
|
||||
0x52, 0x54, 0x4f, 0x53, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x20,
|
||||
0x74, 0x69, 0x6d, 0x65, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65,
|
||||
0x6c, 0x3c, 0x2f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x3c,
|
||||
0x2f, 0x68, 0x31, 0x3e, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x65,
|
||||
0x73, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x73, 0x20, 0x61,
|
||||
0x72, 0x65, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x73,
|
||||
0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61,
|
||||
0x6e, 0x20, 0x41, 0x74, 0x6d, 0x65, 0x6c, 0x20, 0x41, 0x54,
|
||||
0x39, 0x31, 0x53, 0x41, 0x4d, 0x37, 0x58, 0x32, 0x35, 0x36,
|
||||
0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x63, 0x6f, 0x6e, 0x74,
|
||||
0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x75, 0x73,
|
||||
0x69, 0x6e, 0x67, 0x20, 0x41, 0x64, 0x61, 0x6d, 0x20, 0x44,
|
||||
0x75, 0x6e, 0x6b, 0x65, 0x6c, 0x73, 0x20, 0x6f, 0x70, 0x65,
|
||||
0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x75,
|
||||
0x49, 0x50, 0x20, 0x54, 0x43, 0x50, 0x2f, 0x49, 0x50, 0x20,
|
||||
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x3c, 0x70, 0x3e, 0x54,
|
||||
0x68, 0x65, 0x20, 0x75, 0x49, 0x50, 0x20, 0x73, 0x74, 0x61,
|
||||
0x63, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x65, 0x63,
|
||||
0x75, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d,
|
||||
0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20,
|
||||
0x74, 0x61, 0x73, 0x6b, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72,
|
||||
0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x6f,
|
||||
0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65,
|
||||
0x52, 0x54, 0x4f, 0x53, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x20,
|
||||
0x74, 0x69, 0x6d, 0x65, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65,
|
||||
0x6c, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x74, 0x61,
|
||||
0x62, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x20,
|
||||
0x73, 0x68, 0x6f, 0x77, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
|
||||
0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73,
|
||||
0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74,
|
||||
0x68, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x69,
|
||||
0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x6d, 0x6f,
|
||||
0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x69, 0x74,
|
||||
0x6f, 0x6e, 0x2e, 0x3c, 0x70, 0x3e, 0x3c, 0x70, 0x72, 0x65,
|
||||
0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65,
|
||||
0x20, 0x20, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79,
|
||||
0x20, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x9, 0x23, 0x3c,
|
||||
0x62, 0x72, 0x3e, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
|
||||
0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
|
||||
0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
|
||||
0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
|
||||
0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a,
|
||||
0x2a, 0x3c, 0x62, 0x72, 0x3e, 0xa, 0x63, 0x20, 0x64, 0xa,
|
||||
0x74, 0x20, 0x3c, 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f,
|
||||
0x66, 0x6f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64,
|
||||
0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa,
|
||||
0x2e, 0xa, 0xa, 0xa, };
|
||||
|
||||
static const char data_index_html[] = {
|
||||
/* /index.html */
|
||||
0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
|
||||
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32,
|
||||
0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72,
|
||||
0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x30,
|
||||
0x2e, 0x39, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
||||
0x2f, 0x64, 0x75, 0x6e, 0x6b, 0x65, 0x6c, 0x73, 0x2e, 0x63,
|
||||
0x6f, 0x6d, 0x2f, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69,
|
||||
0x70, 0x2f, 0x29, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, 0x65,
|
||||
0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74,
|
||||
0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa,
|
||||
0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa,
|
||||
0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x3c, 0x2f,
|
||||
0x68, 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0xd, 0xa, 0x3c,
|
||||
0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x65, 0x74, 0x20, 0x63,
|
||||
0x6f, 0x6c, 0x73, 0x3d, 0x22, 0x2a, 0x22, 0x20, 0x72, 0x6f,
|
||||
0x77, 0x73, 0x3d, 0x22, 0x31, 0x32, 0x30, 0x2c, 0x2a, 0x22,
|
||||
0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x6f, 0x72, 0x64,
|
||||
0x65, 0x72, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x20, 0xd,
|
||||
0xa, 0x20, 0x20, 0x3c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20,
|
||||
0x73, 0x72, 0x63, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72,
|
||||
0x6f, 0x6c, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0xd,
|
||||
0xa, 0x20, 0x20, 0x3c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20,
|
||||
0x73, 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x63, 0x67, 0x69, 0x2f,
|
||||
0x72, 0x74, 0x6f, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65,
|
||||
0x3d, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3e, 0xd, 0xa,
|
||||
0x3c, 0x2f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x65, 0x74,
|
||||
0x3e, 0xd, 0xa, 0xd, 0xa, 0x3c, 0x6e, 0x6f, 0x66, 0x72,
|
||||
0x61, 0x6d, 0x65, 0x73, 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x6f,
|
||||
0x64, 0x79, 0x3e, 0xd, 0xa, 0x59, 0x6f, 0x75, 0x72, 0x20,
|
||||
0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x20, 0x6d, 0x75,
|
||||
0x73, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74,
|
||||
0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0xd, 0xa, 0x3c,
|
||||
0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f,
|
||||
0x6e, 0x6f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x3e, 0xd,
|
||||
0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, };
|
||||
|
||||
const struct fsdata_file file_404_html[] = {{NULL, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}};
|
||||
|
||||
const struct fsdata_file file_control_html[] = {{file_404_html, data_control_html, data_control_html + 14, sizeof(data_control_html) - 14}};
|
||||
|
||||
const struct fsdata_file file_files_footer_plain[] = {{file_control_html, data_files_footer_plain, data_files_footer_plain + 20, sizeof(data_files_footer_plain) - 20}};
|
||||
|
||||
const struct fsdata_file file_files_header_html[] = {{file_files_footer_plain, data_files_header_html, data_files_header_html + 19, sizeof(data_files_header_html) - 19}};
|
||||
|
||||
const struct fsdata_file file_stats_footer_plain[] = {{file_files_header_html, data_stats_footer_plain, data_stats_footer_plain + 20, sizeof(data_stats_footer_plain) - 20}};
|
||||
|
||||
const struct fsdata_file file_stats_header_html[] = {{file_stats_footer_plain, data_stats_header_html, data_stats_header_html + 19, sizeof(data_stats_header_html) - 19}};
|
||||
|
||||
const struct fsdata_file file_tcp_footer_plain[] = {{file_stats_header_html, data_tcp_footer_plain, data_tcp_footer_plain + 18, sizeof(data_tcp_footer_plain) - 18}};
|
||||
|
||||
const struct fsdata_file file_tcp_header_html[] = {{file_tcp_footer_plain, data_tcp_header_html, data_tcp_header_html + 17, sizeof(data_tcp_header_html) - 17}};
|
||||
|
||||
const struct fsdata_file file_img_logo_png[] = {{file_tcp_header_html, data_img_logo_png, data_img_logo_png + 14, sizeof(data_img_logo_png) - 14}};
|
||||
|
||||
const struct fsdata_file file_cgi_files[] = {{file_img_logo_png, data_cgi_files, data_cgi_files + 11, sizeof(data_cgi_files) - 11}};
|
||||
|
||||
const struct fsdata_file file_cgi_stats[] = {{file_cgi_files, data_cgi_stats, data_cgi_stats + 11, sizeof(data_cgi_stats) - 11}};
|
||||
|
||||
const struct fsdata_file file_cgi_tcp[] = {{file_cgi_stats, data_cgi_tcp, data_cgi_tcp + 9, sizeof(data_cgi_tcp) - 9}};
|
||||
|
||||
const struct fsdata_file file_cgi_rtos[] = {{file_cgi_tcp, data_cgi_rtos, data_cgi_rtos + 10, sizeof(data_cgi_rtos) - 10}};
|
||||
|
||||
const struct fsdata_file file_index_html[] = {{file_cgi_rtos, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}};
|
||||
|
||||
#define FS_ROOT file_index_html
|
||||
|
||||
#define FS_NUMFILES 14
|
64
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fsdata.h
Normal file
64
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/fsdata.h
Normal file
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the Institute nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
* $Id: fsdata.h,v 1.4.2.1 2003/10/04 22:54:06 adam Exp $
|
||||
*/
|
||||
#ifndef __FSDATA_H__
|
||||
#define __FSDATA_H__
|
||||
|
||||
#include "uipopt.h"
|
||||
|
||||
struct fsdata_file {
|
||||
const struct fsdata_file *next;
|
||||
const char *name;
|
||||
const char *data;
|
||||
const int len;
|
||||
#ifdef FS_STATISTICS
|
||||
#if FS_STATISTICS == 1
|
||||
u16_t count;
|
||||
#endif /* FS_STATISTICS */
|
||||
#endif /* FS_STATISTICS */
|
||||
};
|
||||
|
||||
struct fsdata_file_noconst {
|
||||
struct fsdata_file *next;
|
||||
char *name;
|
||||
char *data;
|
||||
int len;
|
||||
#ifdef FS_STATISTICS
|
||||
#if FS_STATISTICS == 1
|
||||
u16_t count;
|
||||
#endif /* FS_STATISTICS */
|
||||
#endif /* FS_STATISTICS */
|
||||
};
|
||||
|
||||
#endif /* __FSDATA_H__ */
|
372
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/httpd.c
Normal file
372
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/httpd.c
Normal file
|
@ -0,0 +1,372 @@
|
|||
/**
|
||||
* \addtogroup exampleapps
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \defgroup httpd Web server
|
||||
* @{
|
||||
*
|
||||
* The uIP web server is a very simplistic implementation of an HTTP
|
||||
* server. It can serve web pages and files from a read-only ROM
|
||||
* filesystem, and provides a very small scripting language.
|
||||
*
|
||||
* The script language is very simple and works as follows. Each
|
||||
* script line starts with a command character, either "i", "t", "c",
|
||||
* "#" or ".". The "i" command tells the script interpreter to
|
||||
* "include" a file from the virtual file system and output it to the
|
||||
* web browser. The "t" command should be followed by a line of text
|
||||
* that is to be output to the browser. The "c" command is used to
|
||||
* call one of the C functions from the httpd-cgi.c file. A line that
|
||||
* starts with a "#" is ignored (i.e., the "#" denotes a comment), and
|
||||
* the "." denotes the last script line.
|
||||
*
|
||||
* The script that produces the file statistics page looks somewhat
|
||||
* like this:
|
||||
*
|
||||
\code
|
||||
i /header.html
|
||||
t <h1>File statistics</h1><br><table width="100%">
|
||||
t <tr><td><a href="/index.html">/index.html</a></td><td>
|
||||
c a /index.html
|
||||
t </td></tr> <tr><td><a href="/cgi/files">/cgi/files</a></td><td>
|
||||
c a /cgi/files
|
||||
t </td></tr> <tr><td><a href="/cgi/tcp">/cgi/tcp</a></td><td>
|
||||
c a /cgi/tcp
|
||||
t </td></tr> <tr><td><a href="/404.html">/404.html</a></td><td>
|
||||
c a /404.html
|
||||
t </td></tr></table>
|
||||
i /footer.plain
|
||||
.
|
||||
\endcode
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* \file
|
||||
* HTTP server.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: httpd.c,v 1.28.2.6 2003/10/07 13:22:27 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "uip.h"
|
||||
#include "httpd.h"
|
||||
#include "fs.h"
|
||||
#include "fsdata.h"
|
||||
#include "cgi.h"
|
||||
|
||||
#define NULL (void *)0
|
||||
|
||||
/* The HTTP server states: */
|
||||
#define HTTP_NOGET 0
|
||||
#define HTTP_FILE 1
|
||||
#define HTTP_TEXT 2
|
||||
#define HTTP_FUNC 3
|
||||
#define HTTP_END 4
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <stdio.h>
|
||||
#define PRINT(x)
|
||||
#define PRINTLN(x)
|
||||
#else /* DEBUG */
|
||||
#define PRINT(x)
|
||||
#define PRINTLN(x)
|
||||
#endif /* DEBUG */
|
||||
|
||||
struct httpd_state *hs;
|
||||
|
||||
extern const struct fsdata_file file_index_html;
|
||||
extern const struct fsdata_file file_404_html;
|
||||
|
||||
static void next_scriptline(void);
|
||||
static void next_scriptstate(void);
|
||||
|
||||
#define ISO_G 0x47
|
||||
#define ISO_E 0x45
|
||||
#define ISO_T 0x54
|
||||
#define ISO_slash 0x2f
|
||||
#define ISO_c 0x63
|
||||
#define ISO_g 0x67
|
||||
#define ISO_i 0x69
|
||||
#define ISO_space 0x20
|
||||
#define ISO_nl 0x0a
|
||||
#define ISO_cr 0x0d
|
||||
#define ISO_a 0x61
|
||||
#define ISO_t 0x74
|
||||
#define ISO_hash 0x23
|
||||
#define ISO_period 0x2e
|
||||
|
||||
#define httpPORT 80
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Initialize the web server.
|
||||
*
|
||||
* Starts to listen for incoming connection requests on TCP port 80.
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
httpd_init(void)
|
||||
{
|
||||
fs_init();
|
||||
|
||||
/* Listen to port 80. */
|
||||
uip_listen(HTONS(httpPORT));
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
httpd_appcall(void)
|
||||
{
|
||||
struct fs_file fsfile;
|
||||
|
||||
u8_t i;
|
||||
|
||||
switch(uip_conn->lport) {
|
||||
/* This is the web server: */
|
||||
case HTONS(httpPORT):
|
||||
/* Pick out the application state from the uip_conn structure. */
|
||||
hs = (struct httpd_state *)(uip_conn->appstate);
|
||||
|
||||
/* We use the uip_ test functions to deduce why we were
|
||||
called. If uip_connected() is non-zero, we were called
|
||||
because a remote host has connected to us. If
|
||||
uip_newdata() is non-zero, we were called because the
|
||||
remote host has sent us new data, and if uip_acked() is
|
||||
non-zero, the remote host has acknowledged the data we
|
||||
previously sent to it. */
|
||||
if(uip_connected()) {
|
||||
/* Since we have just been connected with the remote host, we
|
||||
reset the state for this connection. The ->count variable
|
||||
contains the amount of data that is yet to be sent to the
|
||||
remote host, and the ->state is set to HTTP_NOGET to signal
|
||||
that we haven't received any HTTP GET request for this
|
||||
connection yet. */
|
||||
|
||||
hs->state = HTTP_NOGET;
|
||||
hs->count = 0;
|
||||
return;
|
||||
|
||||
} else if(uip_poll()) {
|
||||
/* If we are polled ten times, we abort the connection. This is
|
||||
because we don't want connections lingering indefinately in
|
||||
the system. */
|
||||
if(hs->count++ >= 10) {
|
||||
uip_abort();
|
||||
}
|
||||
return;
|
||||
} else if(uip_newdata() && hs->state == HTTP_NOGET) {
|
||||
/* This is the first data we receive, and it should contain a
|
||||
GET. */
|
||||
|
||||
/* Check for GET. */
|
||||
if(uip_appdata[0] != ISO_G ||
|
||||
uip_appdata[1] != ISO_E ||
|
||||
uip_appdata[2] != ISO_T ||
|
||||
uip_appdata[3] != ISO_space) {
|
||||
/* If it isn't a GET, we abort the connection. */
|
||||
uip_abort();
|
||||
return;
|
||||
}
|
||||
|
||||
/* Find the file we are looking for. */
|
||||
for(i = 4; i < 40; ++i) {
|
||||
if(uip_appdata[i] == ISO_space ||
|
||||
uip_appdata[i] == ISO_cr ||
|
||||
uip_appdata[i] == ISO_nl) {
|
||||
uip_appdata[i] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
PRINT("request for file ");
|
||||
PRINTLN(&uip_appdata[4]);
|
||||
|
||||
/* Check for a request for "/". */
|
||||
if(uip_appdata[4] == ISO_slash &&
|
||||
uip_appdata[5] == 0) {
|
||||
fs_open(file_index_html.name, &fsfile);
|
||||
} else {
|
||||
if(!fs_open((const char *)&uip_appdata[4], &fsfile)) {
|
||||
PRINTLN("couldn't open file");
|
||||
fs_open(file_404_html.name, &fsfile);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(uip_appdata[4] == ISO_slash &&
|
||||
uip_appdata[5] == ISO_c &&
|
||||
uip_appdata[6] == ISO_g &&
|
||||
uip_appdata[7] == ISO_i &&
|
||||
uip_appdata[8] == ISO_slash) {
|
||||
/* If the request is for a file that starts with "/cgi/", we
|
||||
prepare for invoking a script. */
|
||||
hs->script = fsfile.data;
|
||||
next_scriptstate();
|
||||
} else {
|
||||
hs->script = NULL;
|
||||
/* The web server is now no longer in the HTTP_NOGET state, but
|
||||
in the HTTP_FILE state since is has now got the GET from
|
||||
the client and will start transmitting the file. */
|
||||
hs->state = HTTP_FILE;
|
||||
|
||||
/* Point the file pointers in the connection state to point to
|
||||
the first byte of the file. */
|
||||
hs->dataptr = fsfile.data;
|
||||
hs->count = fsfile.len;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(hs->state != HTTP_FUNC) {
|
||||
/* Check if the client (remote end) has acknowledged any data that
|
||||
we've previously sent. If so, we move the file pointer further
|
||||
into the file and send back more data. If we are out of data to
|
||||
send, we close the connection. */
|
||||
if(uip_acked()) {
|
||||
if(hs->count >= uip_conn->len) {
|
||||
hs->count -= uip_conn->len;
|
||||
hs->dataptr += uip_conn->len;
|
||||
} else {
|
||||
hs->count = 0;
|
||||
}
|
||||
|
||||
if(hs->count == 0) {
|
||||
if(hs->script != NULL) {
|
||||
next_scriptline();
|
||||
next_scriptstate();
|
||||
} else {
|
||||
uip_close();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Call the CGI function. */
|
||||
if(cgitab[hs->script[2] - ISO_a](uip_acked())) {
|
||||
/* If the function returns non-zero, we jump to the next line
|
||||
in the script. */
|
||||
next_scriptline();
|
||||
next_scriptstate();
|
||||
}
|
||||
}
|
||||
|
||||
if(hs->state != HTTP_FUNC && !uip_poll()) {
|
||||
/* Send a piece of data, but not more than the MSS of the
|
||||
connection. */
|
||||
uip_send(( void * ) hs->dataptr, hs->count);
|
||||
}
|
||||
|
||||
/* Finally, return to uIP. Our outgoing packet will soon be on its
|
||||
way... */
|
||||
return;
|
||||
|
||||
default:
|
||||
/* Should never happen. */
|
||||
uip_abort();
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* next_scriptline():
|
||||
*
|
||||
* Reads the script until it finds a newline. */
|
||||
static void
|
||||
next_scriptline(void)
|
||||
{
|
||||
/* Loop until we find a newline character. */
|
||||
do {
|
||||
++(hs->script);
|
||||
} while(hs->script[0] != ISO_nl);
|
||||
|
||||
/* Eat up the newline as well. */
|
||||
++(hs->script);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* next_sciptstate:
|
||||
*
|
||||
* Reads one line of script and decides what to do next.
|
||||
*/
|
||||
static void
|
||||
next_scriptstate(void)
|
||||
{
|
||||
struct fs_file fsfile;
|
||||
long i;
|
||||
|
||||
again:
|
||||
switch(hs->script[0]) {
|
||||
case ISO_t:
|
||||
/* Send a text string. */
|
||||
hs->state = HTTP_TEXT;
|
||||
hs->dataptr = &hs->script[2];
|
||||
|
||||
/* Calculate length of string. */
|
||||
for(i = 0; hs->dataptr[i] != ISO_nl; ++i);
|
||||
hs->count = i;
|
||||
break;
|
||||
case ISO_c:
|
||||
/* Call a function. */
|
||||
hs->state = HTTP_FUNC;
|
||||
hs->dataptr = NULL;
|
||||
hs->count = 0;
|
||||
cgitab[hs->script[2] - ISO_a](0);
|
||||
break;
|
||||
case ISO_i:
|
||||
/* Include a file. */
|
||||
hs->state = HTTP_FILE;
|
||||
if(!fs_open(&hs->script[2], &fsfile)) {
|
||||
uip_abort();
|
||||
}
|
||||
hs->dataptr = fsfile.data;
|
||||
hs->count = fsfile.len;
|
||||
break;
|
||||
case ISO_hash:
|
||||
/* Comment line. */
|
||||
next_scriptline();
|
||||
goto again;
|
||||
case ISO_period:
|
||||
/* End of script. */
|
||||
hs->state = HTTP_END;
|
||||
uip_close();
|
||||
break;
|
||||
default:
|
||||
uip_abort();
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/** @} */
|
||||
/** @} */
|
380
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/httpd.c_
Normal file
380
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/httpd.c_
Normal file
|
@ -0,0 +1,380 @@
|
|||
/*$T httpd.c GC 1.138 07/23/05 13:10:49 */
|
||||
|
||||
/*
|
||||
* \addtogroup exampleapps @{ £
|
||||
* \defgroup httpd Web server @{ The uIP web server is a very simplistic
|
||||
* implementation of an HTTP server. It can serve web pages and files from a
|
||||
* read-only ROM filesystem, and provides a very small scripting language. The
|
||||
* script language is very simple and works as follows. Each script line starts
|
||||
* with a command character, either "i", "t", "c", "#" or ".". The "i" command
|
||||
* tells the script interpreter to "include" a file from the virtual file system
|
||||
* and output it to the web browser. The "t" command should be followed by a line
|
||||
* of text that is to be output to the browser. The "c" command is used to call
|
||||
* one of the C functions from the httpd-cgi.c file. A line that starts with a "#"
|
||||
* is ignored (i.e., the "#" denotes a comment), and the "." denotes the last
|
||||
* script line. The script that produces the file statistics page looks somewhat
|
||||
* like this: \code i /header.html t <h1>File statistics</h1><br><table
|
||||
* width="100%"> t <tr><td><a href="/index.html">/index.html</a></td><td> c a
|
||||
* /index.html t </td></tr> <tr><td><a href="/cgi/files">/cgi/files</a></td><td> c
|
||||
* a /cgi/files t </td></tr> <tr><td><a href="/cgi/tcp">/cgi/tcp</a></td><td> c a
|
||||
* /cgi/tcp t </td></tr> <tr><td><a href="/404.html">/404.html</a></td><td> c a
|
||||
* /404.html t </td></tr></table> i /footer.plain . \endcode £
|
||||
* \file HTTP server. \author Adam Dunkels <adam@dunkels.com> £
|
||||
* Copyright (c) 2001, Adam Dunkels. All rights reserved. Redistribution and use
|
||||
* in source and binary forms, with or without modification, are permitted
|
||||
* provided that the following conditions are met: 1. Redistributions of source
|
||||
* code must retain the above copyright notice, this list of conditions and the
|
||||
* following disclaimer. 2. Redistributions in binary form must reproduce the
|
||||
* above copyright notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the distribution. 3. The
|
||||
* name of the author may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission. THIS SOFTWARE IS
|
||||
* PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* This file is part of the uIP TCP/IP stack. $Id: httpd.c,v 1.28.2.6 2003/10/07
|
||||
* 13:22:27 adam Exp $
|
||||
*/
|
||||
#include "uip.h"
|
||||
#include "httpd.h"
|
||||
#include "fs.h"
|
||||
#include "fsdata.h"
|
||||
#include "cgi.h"
|
||||
|
||||
#define NULL ( void * ) 0
|
||||
|
||||
/* The HTTP server states: */
|
||||
#define HTTP_NOGET 0
|
||||
#define HTTP_FILE 1
|
||||
#define HTTP_TEXT 2
|
||||
#define HTTP_FUNC 3
|
||||
#define HTTP_END 4
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <stdio.h>
|
||||
#define PRINT( x )
|
||||
#define PRINTLN( x )
|
||||
#else /* DEBUG */
|
||||
#define PRINT( x )
|
||||
#define PRINTLN( x )
|
||||
#endif /* DEBUG */
|
||||
|
||||
struct httpd_state *hs;
|
||||
|
||||
extern const struct fsdata_file file_index_html;
|
||||
extern const struct fsdata_file file_404_html;
|
||||
|
||||
static void next_scriptline( void );
|
||||
static void next_scriptstate( void );
|
||||
|
||||
#define ISO_G 0x47
|
||||
#define ISO_E 0x45
|
||||
#define ISO_T 0x54
|
||||
#define ISO_slash 0x2f
|
||||
#define ISO_c 0x63
|
||||
#define ISO_g 0x67
|
||||
#define ISO_i 0x69
|
||||
#define ISO_space 0x20
|
||||
#define ISO_nl 0x0a
|
||||
#define ISO_cr 0x0d
|
||||
#define ISO_a 0x61
|
||||
#define ISO_t 0x74
|
||||
#define ISO_hash 0x23
|
||||
#define ISO_period 0x2e
|
||||
|
||||
#define httpPORT 80
|
||||
|
||||
/*
|
||||
=======================================================================================================================
|
||||
Initialize the web server. Starts to listen for incoming connection requests on TCP port 80.
|
||||
=======================================================================================================================
|
||||
*/
|
||||
void httpd_init( void )
|
||||
{
|
||||
fs_init();
|
||||
|
||||
/* Listen to port 80. */
|
||||
uip_listen( HTONS( httpPORT ) );
|
||||
}
|
||||
|
||||
/*
|
||||
=======================================================================================================================
|
||||
=======================================================================================================================
|
||||
*/
|
||||
void httpd_appcall( void )
|
||||
{
|
||||
/*~~~~~~~~~~~~~~~~~~~*/
|
||||
struct fs_file fsfile;
|
||||
u8_t i;
|
||||
/*~~~~~~~~~~~~~~~~~~~*/
|
||||
|
||||
switch( uip_conn->lport )
|
||||
{
|
||||
/* This is the web server: */
|
||||
case HTONS( httpPORT ):
|
||||
/* Pick out the application state from the uip_conn structure. */
|
||||
hs = ( struct httpd_state * ) ( uip_conn->appstate );
|
||||
|
||||
/*
|
||||
* We use the uip_ test functions to deduce why we were called. If uip_connected()
|
||||
* is non-zero, we were called because a remote host has connected to us. If
|
||||
* uip_newdata() is non-zero, we were called because the remote host has sent us
|
||||
* new data, and if uip_acked() is non-zero, the remote host has acknowledged the
|
||||
* data we previously sent to it.
|
||||
*/
|
||||
if( uip_connected() )
|
||||
{
|
||||
/*
|
||||
* Since we have just been connected with the remote host, we reset the state for
|
||||
* this connection. The ->count variable contains the amount of data that is yet
|
||||
* to be sent to the remote host, and the ->state is set to HTTP_NOGET to signal
|
||||
* that we haven't received any HTTP GET request for this connection yet.
|
||||
*/
|
||||
hs->state = HTTP_NOGET;
|
||||
hs->count = 0;
|
||||
return;
|
||||
}
|
||||
else if( uip_poll() )
|
||||
{
|
||||
/*
|
||||
* If we are polled ten times, we abort the connection. This is because we don't
|
||||
* want connections lingering indefinately in the system.
|
||||
*/
|
||||
if( hs->count++ >= 10 )
|
||||
{
|
||||
uip_abort();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else if( uip_newdata() && hs->state == HTTP_NOGET )
|
||||
{
|
||||
/*
|
||||
* This is the first data we receive, and it should contain a GET. £
|
||||
* Check for GET.
|
||||
*/
|
||||
if
|
||||
(
|
||||
uip_appdata[0] != ISO_G
|
||||
|| uip_appdata[1] != ISO_E
|
||||
|| uip_appdata[2] != ISO_T
|
||||
|| uip_appdata[3] != ISO_space
|
||||
)
|
||||
{
|
||||
/* If it isn't a GET, we abort the connection. */
|
||||
uip_abort();
|
||||
return;
|
||||
}
|
||||
|
||||
/* Find the file we are looking for. */
|
||||
for( i = 4; i < 40; ++i )
|
||||
{
|
||||
if( uip_appdata[i] == ISO_space || uip_appdata[i] == ISO_cr || uip_appdata[i] == ISO_nl )
|
||||
{
|
||||
uip_appdata[i] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
PRINT( "request for file " );
|
||||
PRINTLN( &uip_appdata[4] );
|
||||
|
||||
/* Check for a request for "/". */
|
||||
if( uip_appdata[4] == ISO_slash && uip_appdata[5] == 0 )
|
||||
{
|
||||
fs_open( file_index_html.name, &fsfile );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( !fs_open( ( const char * ) &uip_appdata[4], &fsfile ) )
|
||||
{
|
||||
PRINTLN( "couldn't open file" );
|
||||
fs_open( file_404_html.name, &fsfile );
|
||||
}
|
||||
}
|
||||
|
||||
if
|
||||
(
|
||||
uip_appdata[4] == ISO_slash
|
||||
&& uip_appdata[5] == ISO_c
|
||||
&& uip_appdata[6] == ISO_g
|
||||
&& uip_appdata[7] == ISO_i
|
||||
&& uip_appdata[8] == ISO_slash
|
||||
)
|
||||
{
|
||||
/*
|
||||
* If the request is for a file that starts with "/cgi/", we prepare for invoking
|
||||
* a script.
|
||||
*/
|
||||
hs->script = fsfile.data;
|
||||
next_scriptstate();
|
||||
}
|
||||
else
|
||||
{
|
||||
hs->script = NULL;
|
||||
|
||||
/*
|
||||
* The web server is now no longer in the HTTP_NOGET state, but in the HTTP_FILE
|
||||
* state since is has now got the GET from the client and will start transmitting
|
||||
* the file.
|
||||
*/
|
||||
hs->state = HTTP_FILE;
|
||||
|
||||
/*
|
||||
* Point the file pointers in the connection state to point to the first byte of
|
||||
* the file.
|
||||
*/
|
||||
hs->dataptr = fsfile.data;
|
||||
hs->count = fsfile.len;
|
||||
}
|
||||
}
|
||||
|
||||
if( hs->state != HTTP_FUNC )
|
||||
{
|
||||
/*
|
||||
* Check if the client (remote end) has acknowledged any data that we've
|
||||
* previously sent. If so, we move the file pointer further into the file and send
|
||||
* back more data. If we are out of data to send, we close the connection.
|
||||
*/
|
||||
if( uip_acked() )
|
||||
{
|
||||
if( hs->count >= uip_conn->len )
|
||||
{
|
||||
hs->count -= uip_conn->len;
|
||||
hs->dataptr += uip_conn->len;
|
||||
}
|
||||
else
|
||||
{
|
||||
hs->count = 0;
|
||||
}
|
||||
|
||||
if( hs->count == 0 )
|
||||
{
|
||||
if( hs->script != NULL )
|
||||
{
|
||||
next_scriptline();
|
||||
next_scriptstate();
|
||||
}
|
||||
else
|
||||
{
|
||||
uip_close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Call the CGI function. */
|
||||
if( cgitab[hs->script[2] - ISO_a](uip_acked()) )
|
||||
{
|
||||
/* If the function returns non-zero, we jump to the next line in the script. */
|
||||
next_scriptline();
|
||||
next_scriptstate();
|
||||
}
|
||||
}
|
||||
|
||||
if( hs->state != HTTP_FUNC && !uip_poll() )
|
||||
{
|
||||
/* Send a piece of data, but not more than the MSS of the connection. */
|
||||
uip_send( ( void * ) hs->dataptr, hs->count );
|
||||
}
|
||||
|
||||
/* Finally, return to uIP. Our outgoing packet will soon be on its way... */
|
||||
return;
|
||||
|
||||
default:
|
||||
/* Should never happen. */
|
||||
uip_abort();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=======================================================================================================================
|
||||
next_scriptline(): Reads the script until it finds a newline.
|
||||
=======================================================================================================================
|
||||
*/
|
||||
static void next_scriptline( void )
|
||||
{
|
||||
/* Loop until we find a newline character. */
|
||||
do
|
||||
{
|
||||
++( hs->script );
|
||||
} while( hs->script[0] != ISO_nl );
|
||||
|
||||
/* Eat up the newline as well. */
|
||||
++( hs->script );
|
||||
}
|
||||
|
||||
/*
|
||||
=======================================================================================================================
|
||||
next_sciptstate: Reads one line of script and decides what to do next.
|
||||
=======================================================================================================================
|
||||
*/
|
||||
static void next_scriptstate( void )
|
||||
{
|
||||
/*~~~~~~~~~~~~~~~~~~~*/
|
||||
struct fs_file fsfile;
|
||||
u8_t i;
|
||||
/*~~~~~~~~~~~~~~~~~~~*/
|
||||
|
||||
again:
|
||||
switch( hs->script[0] )
|
||||
{
|
||||
case ISO_t:
|
||||
/* Send a text string. */
|
||||
hs->state = HTTP_TEXT;
|
||||
hs->dataptr = &hs->script[2];
|
||||
|
||||
/* Calculate length of string. */
|
||||
for( i = 0; hs->dataptr[i] != ISO_nl; ++i );
|
||||
hs->count = i;
|
||||
break;
|
||||
|
||||
case ISO_c:
|
||||
/* Call a function. */
|
||||
hs->state = HTTP_FUNC;
|
||||
hs->dataptr = NULL;
|
||||
hs->count = 0;
|
||||
cgitab[hs->script[2] - ISO_a]( 0 );
|
||||
break;
|
||||
|
||||
case ISO_i:
|
||||
/* Include a file. */
|
||||
hs->state = HTTP_FILE;
|
||||
if( !fs_open( &hs->script[2], &fsfile ) )
|
||||
{
|
||||
uip_abort();
|
||||
}
|
||||
|
||||
hs->dataptr = fsfile.data;
|
||||
hs->count = fsfile.len;
|
||||
break;
|
||||
|
||||
case ISO_hash:
|
||||
/* Comment line. */
|
||||
next_scriptline();
|
||||
goto again;
|
||||
|
||||
case ISO_period:
|
||||
/* End of script. */
|
||||
hs->state = HTTP_END;
|
||||
uip_close();
|
||||
break;
|
||||
|
||||
default:
|
||||
uip_abort();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @} £
|
||||
* @}
|
||||
*/
|
77
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/httpd.h
Normal file
77
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/httpd.h
Normal file
|
@ -0,0 +1,77 @@
|
|||
/**
|
||||
* \addtogroup httpd
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* HTTP server header file.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: httpd.h,v 1.4.2.3 2003/10/06 22:56:44 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __HTTPD_H__
|
||||
#define __HTTPD_H__
|
||||
|
||||
void httpd_init(void);
|
||||
void httpd_appcall(void);
|
||||
|
||||
/* UIP_APPCALL: the name of the application function. This function
|
||||
must return void and take no arguments (i.e., C type "void
|
||||
appfunc(void)"). */
|
||||
#ifndef UIP_APPCALL
|
||||
#define UIP_APPCALL httpd_appcall
|
||||
#endif
|
||||
|
||||
struct httpd_state {
|
||||
u8_t state;
|
||||
u16_t count;
|
||||
char *dataptr;
|
||||
char *script;
|
||||
};
|
||||
|
||||
|
||||
/* UIP_APPSTATE_SIZE: The size of the application-specific state
|
||||
stored in the uip_conn structure. */
|
||||
#ifndef UIP_APPSTATE_SIZE
|
||||
#define UIP_APPSTATE_SIZE (sizeof(struct httpd_state))
|
||||
#endif
|
||||
|
||||
#define FS_STATISTICS 1
|
||||
|
||||
extern struct httpd_state *hs;
|
||||
|
||||
#endif /* __HTTPD_H__ */
|
67
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/main_led
Normal file
67
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/main_led
Normal file
|
@ -0,0 +1,67 @@
|
|||
// Copyright (c) 2001-2004 Rowley Associates Limited.
|
||||
//
|
||||
// This file may be distributed under the terms of the License Agreement
|
||||
// provided with this software.
|
||||
//
|
||||
// THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Olimex LPC-P1 LED Example
|
||||
//
|
||||
// Description
|
||||
// -----------
|
||||
// This example demonstrates writing to the programmable peripheral interface.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <targets/LPC210x.h>
|
||||
|
||||
#define LED_RED (1<<8)
|
||||
#define LED_GREEN (1<<10)
|
||||
#define LED_YELLOW (1<<11)
|
||||
|
||||
#define LED1 LED_YELLOW
|
||||
|
||||
static void
|
||||
ledInit()
|
||||
{
|
||||
IODIR |= LED1;
|
||||
IOSET = LED1;
|
||||
}
|
||||
|
||||
static void
|
||||
ledOn(void)
|
||||
{
|
||||
IOCLR = LED1;
|
||||
}
|
||||
|
||||
static void
|
||||
ledOff(void)
|
||||
{
|
||||
IOSET = LED1;
|
||||
}
|
||||
|
||||
void
|
||||
delay(int d)
|
||||
{
|
||||
for(; d; --d);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
MAMCR = 2;
|
||||
ledInit();
|
||||
while (1)
|
||||
{
|
||||
ledOn();
|
||||
delay(100000);
|
||||
ledOff();
|
||||
delay(100000);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
93
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/makefsdata
Normal file
93
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/makefsdata
Normal file
|
@ -0,0 +1,93 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
open(OUTPUT, "> fsdata.c");
|
||||
|
||||
chdir("fs");
|
||||
open(FILES, "find . -type f |");
|
||||
|
||||
while($file = <FILES>) {
|
||||
|
||||
# Do not include files in CVS directories nor backup files.
|
||||
if($file =~ /(CVS|~)/) {
|
||||
next;
|
||||
}
|
||||
|
||||
chop($file);
|
||||
|
||||
open(HEADER, "> /tmp/header") || die $!;
|
||||
if($file =~ /404.html/) {
|
||||
print(HEADER "HTTP/1.0 404 File not found\r\n");
|
||||
} else {
|
||||
print(HEADER "HTTP/1.0 200 OK\r\n");
|
||||
}
|
||||
print(HEADER "Server: uIP/0.9 (http://dunkels.com/adam/uip/)\r\n");
|
||||
if($file =~ /\.html$/) {
|
||||
print(HEADER "Content-type: text/html\r\n");
|
||||
} elsif($file =~ /\.gif$/) {
|
||||
print(HEADER "Content-type: image/gif\r\n");
|
||||
} elsif($file =~ /\.png$/) {
|
||||
print(HEADER "Content-type: image/png\r\n");
|
||||
} elsif($file =~ /\.jpg$/) {
|
||||
print(HEADER "Content-type: image/jpeg\r\n");
|
||||
} else {
|
||||
print(HEADER "Content-type: text/plain\r\n");
|
||||
}
|
||||
print(HEADER "\r\n");
|
||||
close(HEADER);
|
||||
|
||||
unless($file =~ /\.plain$/ || $file =~ /cgi/) {
|
||||
system("cat /tmp/header $file > /tmp/file");
|
||||
} else {
|
||||
system("cp $file /tmp/file");
|
||||
}
|
||||
|
||||
open(FILE, "/tmp/file");
|
||||
unlink("/tmp/file");
|
||||
unlink("/tmp/header");
|
||||
|
||||
$file =~ s/\.//;
|
||||
$fvar = $file;
|
||||
$fvar =~ s-/-_-g;
|
||||
$fvar =~ s-\.-_-g;
|
||||
print(OUTPUT "static const char data".$fvar."[] = {\n");
|
||||
print(OUTPUT "\t/* $file */\n\t");
|
||||
for($j = 0; $j < length($file); $j++) {
|
||||
printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1)));
|
||||
}
|
||||
printf(OUTPUT "0,\n");
|
||||
|
||||
|
||||
$i = 0;
|
||||
while(read(FILE, $data, 1)) {
|
||||
if($i == 0) {
|
||||
print(OUTPUT "\t");
|
||||
}
|
||||
printf(OUTPUT "%#02x, ", unpack("C", $data));
|
||||
$i++;
|
||||
if($i == 10) {
|
||||
print(OUTPUT "\n");
|
||||
$i = 0;
|
||||
}
|
||||
}
|
||||
print(OUTPUT "};\n\n");
|
||||
close(FILE);
|
||||
push(@fvars, $fvar);
|
||||
push(@files, $file);
|
||||
}
|
||||
|
||||
for($i = 0; $i < @fvars; $i++) {
|
||||
$file = $files[$i];
|
||||
$fvar = $fvars[$i];
|
||||
|
||||
if($i == 0) {
|
||||
$prevfile = "NULL";
|
||||
} else {
|
||||
$prevfile = "file" . $fvars[$i - 1];
|
||||
}
|
||||
print(OUTPUT "const struct fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, ");
|
||||
print(OUTPUT "data$fvar + ". (length($file) + 1) .", ");
|
||||
print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n");
|
||||
}
|
||||
|
||||
print(OUTPUT "#define FS_ROOT file$fvars[$i - 1]\n\n");
|
||||
print(OUTPUT "#define FS_NUMFILES $i");
|
152
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/memb.c
Normal file
152
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/memb.c
Normal file
|
@ -0,0 +1,152 @@
|
|||
/**
|
||||
* \addtogroup exampleapps
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Memory block allocation routines.
|
||||
* \author Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
* The memory block allocation routines provide a simple yet powerful
|
||||
* set of functions for managing a set of memory blocks of fixed
|
||||
* size. A set of memory blocks is statically declared with the
|
||||
* MEMB() macro. Memory blocks are allocated from the declared
|
||||
* memory by the memb_alloc() function, and are deallocated with the
|
||||
* memb_free() function.
|
||||
*
|
||||
* \note Because of namespace clashes only one MEMB() can be
|
||||
* declared per C module, and the name scope of a MEMB() memory
|
||||
* block is local to each C module.
|
||||
*
|
||||
* The following example shows how to declare and use a memory block
|
||||
* called "cmem" which has 8 chunks of memory with each memory chunk
|
||||
* being 20 bytes large.
|
||||
*
|
||||
\code
|
||||
MEMB(cmem, 20, 8);
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
char *ptr;
|
||||
|
||||
memb_init(&cmem);
|
||||
|
||||
ptr = memb_alloc(&cmem);
|
||||
|
||||
if(ptr != NULL) {
|
||||
do_something(ptr);
|
||||
} else {
|
||||
printf("Could not allocate memory.\n");
|
||||
}
|
||||
|
||||
if(memb_free(ptr) == 0) {
|
||||
printf("Deallocation succeeded.\n");
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "memb.h"
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Initialize a memory block that was declared with MEMB().
|
||||
*
|
||||
* \param m A memory block previosly declared with MEMB().
|
||||
*/
|
||||
/*------------------------------------------------------------------------------*/
|
||||
void
|
||||
memb_init(struct memb_blocks *m)
|
||||
{
|
||||
memset(m->mem, (m->size + 1) * m->num, 0);
|
||||
}
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Allocate a memory block from a block of memory declared with MEMB().
|
||||
*
|
||||
* \param m A memory block previosly declared with MEMB().
|
||||
*/
|
||||
/*------------------------------------------------------------------------------*/
|
||||
char *
|
||||
memb_alloc(struct memb_blocks *m)
|
||||
{
|
||||
int i;
|
||||
char *ptr;
|
||||
|
||||
ptr = m->mem;
|
||||
for(i = 0; i < m->num; ++i) {
|
||||
if(*ptr == 0) {
|
||||
/* If this block was unused, we increase the reference count to
|
||||
indicate that it now is used and return a pointer to the
|
||||
first byte following the reference counter. */
|
||||
++*ptr;
|
||||
return ptr + 1;
|
||||
}
|
||||
ptr += m->size + 1;
|
||||
}
|
||||
|
||||
/* No free block was found, so we return NULL to indicate failure to
|
||||
allocate block. */
|
||||
return NULL;
|
||||
}
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Deallocate a memory block from a memory block previously declared
|
||||
* with MEMB().
|
||||
*
|
||||
* \param m m A memory block previosly declared with MEMB().
|
||||
*
|
||||
* \param ptr A pointer to the memory block that is to be deallocated.
|
||||
*
|
||||
* \return The new reference count for the memory block (should be 0
|
||||
* if successfully deallocated) or -1 if the pointer "ptr" did not
|
||||
* point to a legal memory block.
|
||||
*/
|
||||
/*------------------------------------------------------------------------------*/
|
||||
char
|
||||
memb_free(struct memb_blocks *m, char *ptr)
|
||||
{
|
||||
int i;
|
||||
char *ptr2;
|
||||
|
||||
/* Walk through the list of blocks and try to find the block to
|
||||
which the pointer "ptr" points to. */
|
||||
ptr2 = m->mem;
|
||||
for(i = 0; i < m->num; ++i) {
|
||||
|
||||
if(ptr2 == ptr - 1) {
|
||||
/* We've found to block to which "ptr" points so we decrease the
|
||||
reference count and return the new value of it. */
|
||||
return --*ptr2;
|
||||
}
|
||||
ptr2 += m->size + 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Increase the reference count for a memory chunk.
|
||||
*
|
||||
* \note No sanity checks are currently made.
|
||||
*
|
||||
* \param m m A memory block previosly declared with MEMB().
|
||||
*
|
||||
* \param ptr A pointer to the memory chunk for which the reference
|
||||
* count should be increased.
|
||||
*
|
||||
* \return The new reference count.
|
||||
*/
|
||||
/*------------------------------------------------------------------------------*/
|
||||
char
|
||||
memb_ref(struct memb_blocks *m, char *ptr)
|
||||
{
|
||||
return ++*(ptr - 1);
|
||||
}
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
|
43
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/memb.h
Normal file
43
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/memb.h
Normal file
|
@ -0,0 +1,43 @@
|
|||
/**
|
||||
* \addtogroup exampleapps
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Memory block allocation routines.
|
||||
* \author Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __MEMB_H__
|
||||
#define __MEMB_H__
|
||||
|
||||
/**
|
||||
* Declare a memory block.
|
||||
*
|
||||
* \param name The name of the memory block (later used with
|
||||
* memb_init(), memb_alloc() and memb_free()).
|
||||
*
|
||||
* \param size The size of each memory chunk, in bytes.
|
||||
*
|
||||
* \param num The total number of memory chunks in the block.
|
||||
*
|
||||
*/
|
||||
#define MEMB(name, size, num) \
|
||||
static char memb_mem[(size + 1) * num]; \
|
||||
static struct memb_blocks name = {size, num, memb_mem}
|
||||
|
||||
struct memb_blocks {
|
||||
unsigned short size;
|
||||
unsigned short num;
|
||||
char *mem;
|
||||
};
|
||||
|
||||
void memb_init(struct memb_blocks *m);
|
||||
char *memb_alloc(struct memb_blocks *m);
|
||||
char memb_ref(struct memb_blocks *m, char *ptr);
|
||||
char memb_free(struct memb_blocks *m, char *ptr);
|
||||
|
||||
|
||||
#endif /* __MEMB_H__ */
|
1
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/setarp.bat
Normal file
1
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/setarp.bat
Normal file
|
@ -0,0 +1 @@
|
|||
arp -s 172.25.218.210 00-bd-3b-33-05-72
|
202
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/slipdev.c
Normal file
202
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/slipdev.c
Normal file
|
@ -0,0 +1,202 @@
|
|||
/**
|
||||
* \addtogroup uip
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \defgroup slip Serial Line IP (SLIP) protocol
|
||||
* @{
|
||||
*
|
||||
* The SLIP protocol is a very simple way to transmit IP packets over
|
||||
* a serial line. It does not provide any framing or error control,
|
||||
* and is therefore not very widely used today.
|
||||
*
|
||||
* This SLIP implementation requires two functions for accessing the
|
||||
* serial device: slipdev_char_poll() and slipdev_char_put(). These
|
||||
* must be implemented specifically for the system on which the SLIP
|
||||
* protocol is to be run.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* SLIP protocol implementation
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: slipdev.c,v 1.1.2.3 2003/10/07 13:23:01 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is a generic implementation of the SLIP protocol over an RS232
|
||||
* (serial) device.
|
||||
*
|
||||
* Huge thanks to Ullrich von Bassewitz <uz@cc65.org> of cc65 fame for
|
||||
* and endless supply of bugfixes, insightsful comments and
|
||||
* suggestions, and improvements to this code!
|
||||
*/
|
||||
|
||||
#include "uip.h"
|
||||
|
||||
#define SLIP_END 0300
|
||||
#define SLIP_ESC 0333
|
||||
#define SLIP_ESC_END 0334
|
||||
#define SLIP_ESC_ESC 0335
|
||||
|
||||
static u8_t slip_buf[UIP_BUFSIZE];
|
||||
|
||||
static u16_t len, tmplen;
|
||||
static u8_t lastc;
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Send the packet in the uip_buf and uip_appdata buffers using the
|
||||
* SLIP protocol.
|
||||
*
|
||||
* The first 40 bytes of the packet (the IP and TCP headers) are read
|
||||
* from the uip_buf buffer, and the following bytes (the application
|
||||
* data) are read from the uip_appdata buffer.
|
||||
*
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
slipdev_send(void)
|
||||
{
|
||||
u16_t i;
|
||||
u8_t *ptr;
|
||||
u8_t c;
|
||||
|
||||
slipdev_char_put(SLIP_END);
|
||||
|
||||
ptr = uip_buf;
|
||||
for(i = 0; i < uip_len; ++i) {
|
||||
if(i == 40) {
|
||||
ptr = (u8_t *)uip_appdata;
|
||||
}
|
||||
c = *ptr++;
|
||||
switch(c) {
|
||||
case SLIP_END:
|
||||
slipdev_char_put(SLIP_ESC);
|
||||
slipdev_char_put(SLIP_ESC_END);
|
||||
break;
|
||||
case SLIP_ESC:
|
||||
slipdev_char_put(SLIP_ESC);
|
||||
slipdev_char_put(SLIP_ESC_ESC);
|
||||
break;
|
||||
default:
|
||||
slipdev_char_put(c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
slipdev_char_put(SLIP_END);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Poll the SLIP device for an available packet.
|
||||
*
|
||||
* This function will poll the SLIP device to see if a packet is
|
||||
* available. It uses a buffer in which all avaliable bytes from the
|
||||
* RS232 interface are read into. When a full packet has been read
|
||||
* into the buffer, the packet is copied into the uip_buf buffer and
|
||||
* the length of the packet is returned.
|
||||
*
|
||||
* \return The length of the packet placed in the uip_buf buffer, or
|
||||
* zero if no packet is available.
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
u16_t
|
||||
slipdev_poll(void)
|
||||
{
|
||||
u8_t c;
|
||||
|
||||
while(slipdev_char_poll(c)) {
|
||||
switch(c) {
|
||||
case SLIP_ESC:
|
||||
lastc = c;
|
||||
break;
|
||||
|
||||
case SLIP_END:
|
||||
lastc = c;
|
||||
/* End marker found, we copy our input buffer to the uip_buf
|
||||
buffer and return the size of the packet we copied. */
|
||||
memcpy(uip_buf, slip_buf, len);
|
||||
tmplen = len;
|
||||
len = 0;
|
||||
return tmplen;
|
||||
|
||||
default:
|
||||
if(lastc == SLIP_ESC) {
|
||||
lastc = c;
|
||||
/* Previous read byte was an escape byte, so this byte will be
|
||||
interpreted differently from others. */
|
||||
switch(c) {
|
||||
case SLIP_ESC_END:
|
||||
c = SLIP_END;
|
||||
break;
|
||||
case SLIP_ESC_ESC:
|
||||
c = SLIP_ESC;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
lastc = c;
|
||||
}
|
||||
|
||||
slip_buf[len] = c;
|
||||
++len;
|
||||
|
||||
if(len > UIP_BUFSIZE) {
|
||||
len = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Initialize the SLIP module.
|
||||
*
|
||||
* This function does not initialize the underlying RS232 device, but
|
||||
* only the SLIP part.
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
slipdev_init(void)
|
||||
{
|
||||
lastc = len = 0;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
/** @} */
|
||||
/** @} */
|
88
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/slipdev.h
Normal file
88
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/slipdev.h
Normal file
|
@ -0,0 +1,88 @@
|
|||
/**
|
||||
* \addtogroup slip
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* SLIP header file.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: slipdev.h,v 1.1.2.3 2003/10/06 22:42:51 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SLIPDEV_H__
|
||||
#define __SLIPDEV_H__
|
||||
|
||||
#include "uip.h"
|
||||
|
||||
/**
|
||||
* Put a character on the serial device.
|
||||
*
|
||||
* This function is used by the SLIP implementation to put a character
|
||||
* on the serial device. It must be implemented specifically for the
|
||||
* system on which the SLIP implementation is to be run.
|
||||
*
|
||||
* \param c The character to be put on the serial device.
|
||||
*/
|
||||
void slipdev_char_put(u8_t c);
|
||||
|
||||
/**
|
||||
* Poll the serial device for a character.
|
||||
*
|
||||
* This function is used by the SLIP implementation to poll the serial
|
||||
* device for a character. It must be implemented specifically for the
|
||||
* system on which the SLIP implementation is to be run.
|
||||
*
|
||||
* The function should return immediately regardless if a character is
|
||||
* available or not. If a character is available it should be placed
|
||||
* at the memory location pointed to by the pointer supplied by the
|
||||
* arguement c.
|
||||
*
|
||||
* \param c A pointer to a byte that is filled in by the function with
|
||||
* the received character, if available.
|
||||
*
|
||||
* \retval 0 If no character is available.
|
||||
* \retval Non-zero If a character is available.
|
||||
*/
|
||||
u8_t slipdev_char_poll(u8_t *c);
|
||||
|
||||
void slipdev_init(void);
|
||||
void slipdev_send(void);
|
||||
u16_t slipdev_poll(void);
|
||||
|
||||
#endif /* __SLIPDEV_H__ */
|
||||
|
||||
/** @} */
|
171
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/tapdev.c
Normal file
171
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/tapdev.c
Normal file
|
@ -0,0 +1,171 @@
|
|||
/*
|
||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the Institute nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
* $Id: tapdev.c,v 1.7.2.1 2003/10/07 13:23:19 adam Exp $
|
||||
*/
|
||||
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#ifdef linux
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_tun.h>
|
||||
#define DEVTAP "/dev/net/tun"
|
||||
#else /* linux */
|
||||
#define DEVTAP "/dev/tap0"
|
||||
#endif /* linux */
|
||||
|
||||
#include "uip.h"
|
||||
|
||||
static int fd;
|
||||
|
||||
static unsigned long lasttime;
|
||||
static struct timezone tz;
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
tapdev_init(void)
|
||||
{
|
||||
char buf[1024];
|
||||
|
||||
fd = open(DEVTAP, O_RDWR);
|
||||
if(fd == -1) {
|
||||
perror("tapdev: tapdev_init: open");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
#ifdef linux
|
||||
{
|
||||
struct ifreq ifr;
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
|
||||
if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) {
|
||||
perror(buf);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#endif /* Linux */
|
||||
|
||||
snprintf(buf, sizeof(buf), "ifconfig tap0 inet %d.%d.%d.%d",
|
||||
UIP_DRIPADDR0, UIP_DRIPADDR1, UIP_DRIPADDR2, UIP_DRIPADDR3);
|
||||
system(buf);
|
||||
|
||||
lasttime = 0;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
unsigned int
|
||||
tapdev_read(void)
|
||||
{
|
||||
fd_set fdset;
|
||||
struct timeval tv, now;
|
||||
int ret;
|
||||
|
||||
if(lasttime >= 500000) {
|
||||
lasttime = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 500000 - lasttime;
|
||||
|
||||
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(fd, &fdset);
|
||||
|
||||
gettimeofday(&now, &tz);
|
||||
ret = select(fd + 1, &fdset, NULL, NULL, &tv);
|
||||
if(ret == 0) {
|
||||
lasttime = 0;
|
||||
return 0;
|
||||
}
|
||||
ret = read(fd, uip_buf, UIP_BUFSIZE);
|
||||
if(ret == -1) {
|
||||
perror("tap_dev: tapdev_read: read");
|
||||
}
|
||||
gettimeofday(&tv, &tz);
|
||||
lasttime += (tv.tv_sec - now.tv_sec) * 1000000 + (tv.tv_usec - now.tv_usec);
|
||||
|
||||
return ret;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
tapdev_send(void)
|
||||
{
|
||||
int ret;
|
||||
struct iovec iov[2];
|
||||
|
||||
#ifdef linux
|
||||
{
|
||||
char tmpbuf[UIP_BUFSIZE];
|
||||
int i;
|
||||
|
||||
for(i = 0; i < 40 + UIP_LLH_LEN; i++) {
|
||||
tmpbuf[i] = uip_buf[i];
|
||||
}
|
||||
|
||||
for(; i < uip_len; i++) {
|
||||
tmpbuf[i] = uip_appdata[i - 40 - UIP_LLH_LEN];
|
||||
}
|
||||
|
||||
ret = write(fd, tmpbuf, uip_len);
|
||||
}
|
||||
#else
|
||||
|
||||
if(uip_len < 40 + UIP_LLH_LEN) {
|
||||
ret = write(fd, uip_buf, uip_len + UIP_LLH_LEN);
|
||||
} else {
|
||||
iov[0].iov_base = uip_buf;
|
||||
iov[0].iov_len = 40 + UIP_LLH_LEN;
|
||||
iov[1].iov_base = (char *)uip_appdata;
|
||||
iov[1].iov_len = uip_len - (40 + UIP_LLH_LEN);
|
||||
|
||||
ret = writev(fd, iov, 2);
|
||||
}
|
||||
#endif
|
||||
if(ret == -1) {
|
||||
perror("tap_dev: tapdev_send: writev");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
42
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/tapdev.h
Normal file
42
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/tapdev.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright (c) 2001, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: tapdev.h,v 1.1.2.1 2003/10/04 22:54:17 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __TAPDEV_H__
|
||||
#define __TAPDEV_H__
|
||||
|
||||
void tapdev_init(void);
|
||||
unsigned int tapdev_read(void);
|
||||
void tapdev_send(void);
|
||||
|
||||
#endif /* __TAPDEV_H__ */
|
181
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/telnetd-shell.c
Normal file
181
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/telnetd-shell.c
Normal file
|
@ -0,0 +1,181 @@
|
|||
/**
|
||||
* \addtogroup telnetd
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* An example telnet server shell
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the Contiki desktop OS.
|
||||
*
|
||||
* $Id: telnetd-shell.c,v 1.1.2.1 2003/10/06 22:56:22 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#include "uip.h"
|
||||
#include "telnetd.h"
|
||||
#include <string.h>
|
||||
|
||||
struct ptentry {
|
||||
char c;
|
||||
void (* pfunc)(struct telnetd_state *s, char *str);
|
||||
};
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
parse(struct telnetd_state *s, register char *str, struct ptentry *t)
|
||||
{
|
||||
register struct ptentry *p;
|
||||
char *sstr;
|
||||
|
||||
sstr = str;
|
||||
|
||||
/* Loop over the parse table entries in t in order to find one that
|
||||
matches the first character in str. */
|
||||
for(p = t; p->c != 0; ++p) {
|
||||
if(*str == p->c) {
|
||||
/* Skip rest of the characters up to the first space. */
|
||||
while(*str != ' ') {
|
||||
++str;
|
||||
}
|
||||
|
||||
/* Skip all spaces.*/
|
||||
while(*str == ' ') {
|
||||
++str;
|
||||
}
|
||||
|
||||
/* Call parse table entry function and return. */
|
||||
p->pfunc(s, str);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Did not find matching entry in parse table. We just call the
|
||||
default handler supplied by the caller and return. */
|
||||
p->pfunc(s, str);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
exitt(struct telnetd_state *s, char *str)
|
||||
{
|
||||
telnetd_close(s);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
inttostr(register char *str, unsigned int i)
|
||||
{
|
||||
str[0] = '0' + i / 100;
|
||||
if(str[0] == '0') {
|
||||
str[0] = ' ';
|
||||
}
|
||||
str[1] = '0' + (i / 10) % 10;
|
||||
if(str[1] == '0') {
|
||||
str[1] = ' ';
|
||||
}
|
||||
str[2] = '0' + i % 10;
|
||||
str[3] = ' ';
|
||||
str[4] = 0;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
stats(struct telnetd_state *s, char *strr)
|
||||
{
|
||||
char str[10];
|
||||
|
||||
inttostr(str, uip_stat.ip.recv);
|
||||
telnetd_output(s, "IP packets received ", str);
|
||||
inttostr(str, uip_stat.ip.sent);
|
||||
telnetd_output(s, "IP packets sent ", str);
|
||||
inttostr(str, uip_stat.ip.drop);
|
||||
telnetd_output(s, "IP packets dropped ", str);
|
||||
|
||||
inttostr(str, uip_stat.icmp.recv);
|
||||
telnetd_output(s, "ICMP packets received ", str);
|
||||
inttostr(str, uip_stat.icmp.sent);
|
||||
telnetd_output(s, "ICMP packets sent ", str);
|
||||
inttostr(str, uip_stat.icmp.drop);
|
||||
telnetd_output(s, "ICMP packets dropped ", str);
|
||||
|
||||
inttostr(str, uip_stat.tcp.recv);
|
||||
telnetd_output(s, "TCP packets received ", str);
|
||||
inttostr(str, uip_stat.tcp.sent);
|
||||
telnetd_output(s, "TCP packets sent ", str);
|
||||
inttostr(str, uip_stat.tcp.drop);
|
||||
telnetd_output(s, "TCP packets dropped ", str);
|
||||
inttostr(str, uip_stat.tcp.rexmit);
|
||||
telnetd_output(s, "TCP packets retransmitted ", str);
|
||||
inttostr(str, uip_stat.tcp.synrst);
|
||||
telnetd_output(s, "TCP connection attempts ", str);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
help(struct telnetd_state *s, char *str)
|
||||
{
|
||||
telnetd_output(s, "Available commands:", "");
|
||||
telnetd_output(s, "stats - show uIP statistics", "");
|
||||
telnetd_output(s, "exit - exit shell", "");
|
||||
telnetd_output(s, "? - show this help", "");
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
none(struct telnetd_state *s, char *str)
|
||||
{
|
||||
if(strlen(str) > 0) {
|
||||
telnetd_output(s, "Unknown command", "");
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static struct ptentry configparsetab[] =
|
||||
{{'s', stats},
|
||||
{'e', exitt},
|
||||
{'?', help},
|
||||
|
||||
/* Default action */
|
||||
{0, none}};
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
telnetd_connected(struct telnetd_state *s)
|
||||
{
|
||||
telnetd_output(s, "uIP command shell", "");
|
||||
telnetd_output(s, "Type '?' for help", "");
|
||||
telnetd_prompt(s, "uIP-0.9> ");
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
telnetd_input(struct telnetd_state *s, char *cmd)
|
||||
{
|
||||
parse(s, cmd, configparsetab);
|
||||
telnetd_prompt(s, "uIP-0.9> ");
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
392
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/telnetd.c
Normal file
392
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/telnetd.c
Normal file
|
@ -0,0 +1,392 @@
|
|||
/**
|
||||
* \addtogroup exampleapps
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \defgroup telnetd Telnet server
|
||||
* @{
|
||||
*
|
||||
* The uIP telnet server provides a command based interface to uIP. It
|
||||
* allows using the "telnet" application to access uIP, and implements
|
||||
* the required telnet option negotiation.
|
||||
*
|
||||
* The code is structured in a way which makes it possible to add
|
||||
* commands without having to rewrite the main telnet code. The main
|
||||
* telnet code calls two callback functions, telnetd_connected() and
|
||||
* telnetd_input(), when a telnet connection has been established and
|
||||
* when a line of text arrives on a telnet connection. These two
|
||||
* functions can be implemented in a way which suits the particular
|
||||
* application or environment in which the uIP system is intended to
|
||||
* be run.
|
||||
*
|
||||
* The uIP distribution contains an example telnet shell
|
||||
* implementation that provides a basic set of commands.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Implementation of the Telnet server.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: telnetd.c,v 1.1.2.2 2003/10/07 13:47:50 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#include "uip.h"
|
||||
#include "memb.h"
|
||||
#include "telnetd.h"
|
||||
#include <string.h>
|
||||
|
||||
#define ISO_nl 0x0a
|
||||
#define ISO_cr 0x0d
|
||||
|
||||
MEMB(linemem, TELNETD_LINELEN, TELNETD_NUMLINES);
|
||||
|
||||
static u8_t i;
|
||||
|
||||
#define STATE_NORMAL 0
|
||||
#define STATE_IAC 1
|
||||
#define STATE_WILL 2
|
||||
#define STATE_WONT 3
|
||||
#define STATE_DO 4
|
||||
#define STATE_DONT 5
|
||||
#define STATE_CLOSE 6
|
||||
|
||||
#define TELNET_IAC 255
|
||||
#define TELNET_WILL 251
|
||||
#define TELNET_WONT 252
|
||||
#define TELNET_DO 253
|
||||
#define TELNET_DONT 254
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static char *
|
||||
alloc_line(void)
|
||||
{
|
||||
return memb_alloc(&linemem);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
dealloc_line(char *line)
|
||||
{
|
||||
memb_free(&linemem, line);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
sendline(struct telnetd_state *s, char *line)
|
||||
{
|
||||
static unsigned int i;
|
||||
for(i = 0; i < TELNETD_NUMLINES; ++i) {
|
||||
if(s->lines[i] == NULL) {
|
||||
s->lines[i] = line;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(i == TELNETD_NUMLINES) {
|
||||
dealloc_line(line);
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Close a telnet session.
|
||||
*
|
||||
* This function can be called from a telnet command in order to close
|
||||
* the connection.
|
||||
*
|
||||
* \param s The connection which is to be closed.
|
||||
*
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
telnetd_close(struct telnetd_state *s)
|
||||
{
|
||||
s->state = STATE_CLOSE;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Print a prompt on a telnet connection.
|
||||
*
|
||||
* This function can be called by the telnet command shell in order to
|
||||
* print out a command prompt.
|
||||
*
|
||||
* \param s A telnet connection.
|
||||
*
|
||||
* \param str The command prompt.
|
||||
*
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
telnetd_prompt(struct telnetd_state *s, char *str)
|
||||
{
|
||||
char *line;
|
||||
line = alloc_line();
|
||||
if(line != NULL) {
|
||||
strncpy(line, str, TELNETD_LINELEN);
|
||||
sendline(s, line);
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Print out a string on a telnet connection.
|
||||
*
|
||||
* This function can be called from a telnet command parser in order
|
||||
* to print out a string of text on the connection. The two strings
|
||||
* given as arguments to the function will be concatenated, a carrige
|
||||
* return and a new line character will be added, and the line is
|
||||
* sent.
|
||||
*
|
||||
* \param s The telnet connection.
|
||||
*
|
||||
* \param str1 The first string.
|
||||
*
|
||||
* \param str2 The second string.
|
||||
*
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
telnetd_output(struct telnetd_state *s, char *str1, char *str2)
|
||||
{
|
||||
static unsigned len;
|
||||
char *line;
|
||||
|
||||
line = alloc_line();
|
||||
if(line != NULL) {
|
||||
len = strlen(str1);
|
||||
strncpy(line, str1, TELNETD_LINELEN);
|
||||
if(len < TELNETD_LINELEN) {
|
||||
strncpy(line + len, str2, TELNETD_LINELEN - len);
|
||||
}
|
||||
len = strlen(line);
|
||||
if(len < TELNETD_LINELEN - 2) {
|
||||
line[len] = ISO_cr;
|
||||
line[len+1] = ISO_nl;
|
||||
line[len+2] = 0;
|
||||
}
|
||||
sendline(s, line);
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Initialize the telnet server.
|
||||
*
|
||||
* This function will perform the necessary initializations and start
|
||||
* listening on TCP port 23.
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
telnetd_init(void)
|
||||
{
|
||||
memb_init(&linemem);
|
||||
uip_listen(HTONS(23));
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
acked(struct telnetd_state *s)
|
||||
{
|
||||
dealloc_line(s->lines[0]);
|
||||
for(i = 1; i < TELNETD_NUMLINES; ++i) {
|
||||
s->lines[i - 1] = s->lines[i];
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
senddata(struct telnetd_state *s)
|
||||
{
|
||||
if(s->lines[0] != NULL) {
|
||||
uip_send(s->lines[0], strlen(s->lines[0]));
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
getchar(struct telnetd_state *s, u8_t c)
|
||||
{
|
||||
if(c == ISO_cr) {
|
||||
return;
|
||||
}
|
||||
|
||||
s->buf[(int)s->bufptr] = c;
|
||||
if(s->buf[(int)s->bufptr] == ISO_nl ||
|
||||
s->bufptr == sizeof(s->buf) - 1) {
|
||||
if(s->bufptr > 0) {
|
||||
s->buf[(int)s->bufptr] = 0;
|
||||
}
|
||||
telnetd_input(s, s->buf);
|
||||
s->bufptr = 0;
|
||||
} else {
|
||||
++s->bufptr;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
sendopt(struct telnetd_state *s, u8_t option, u8_t value)
|
||||
{
|
||||
char *line;
|
||||
line = alloc_line();
|
||||
if(line != NULL) {
|
||||
line[0] = TELNET_IAC;
|
||||
line[1] = option;
|
||||
line[2] = value;
|
||||
line[3] = 0;
|
||||
sendline(s, line);
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
newdata(struct telnetd_state *s)
|
||||
{
|
||||
u16_t len;
|
||||
u8_t c;
|
||||
|
||||
|
||||
len = uip_datalen();
|
||||
|
||||
while(len > 0 && s->bufptr < sizeof(s->buf)) {
|
||||
c = *uip_appdata;
|
||||
++uip_appdata;
|
||||
--len;
|
||||
switch(s->state) {
|
||||
case STATE_IAC:
|
||||
if(c == TELNET_IAC) {
|
||||
getchar(s, c);
|
||||
s->state = STATE_NORMAL;
|
||||
} else {
|
||||
switch(c) {
|
||||
case TELNET_WILL:
|
||||
s->state = STATE_WILL;
|
||||
break;
|
||||
case TELNET_WONT:
|
||||
s->state = STATE_WONT;
|
||||
break;
|
||||
case TELNET_DO:
|
||||
s->state = STATE_DO;
|
||||
break;
|
||||
case TELNET_DONT:
|
||||
s->state = STATE_DONT;
|
||||
break;
|
||||
default:
|
||||
s->state = STATE_NORMAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case STATE_WILL:
|
||||
/* Reply with a DONT */
|
||||
sendopt(s, TELNET_DONT, c);
|
||||
s->state = STATE_NORMAL;
|
||||
break;
|
||||
|
||||
case STATE_WONT:
|
||||
/* Reply with a DONT */
|
||||
sendopt(s, TELNET_DONT, c);
|
||||
s->state = STATE_NORMAL;
|
||||
break;
|
||||
case STATE_DO:
|
||||
/* Reply with a WONT */
|
||||
sendopt(s, TELNET_WONT, c);
|
||||
s->state = STATE_NORMAL;
|
||||
break;
|
||||
case STATE_DONT:
|
||||
/* Reply with a WONT */
|
||||
sendopt(s, TELNET_WONT, c);
|
||||
s->state = STATE_NORMAL;
|
||||
break;
|
||||
case STATE_NORMAL:
|
||||
if(c == TELNET_IAC) {
|
||||
s->state = STATE_IAC;
|
||||
} else {
|
||||
getchar(s, c);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
telnetd_app(void)
|
||||
{
|
||||
struct telnetd_state *s;
|
||||
|
||||
s = (struct telnetd_state *)uip_conn->appstate;
|
||||
|
||||
if(uip_connected()) {
|
||||
|
||||
for(i = 0; i < TELNETD_NUMLINES; ++i) {
|
||||
s->lines[i] = NULL;
|
||||
}
|
||||
s->bufptr = 0;
|
||||
s->state = STATE_NORMAL;
|
||||
|
||||
telnetd_connected(s);
|
||||
senddata(s);
|
||||
return;
|
||||
}
|
||||
|
||||
if(s->state == STATE_CLOSE) {
|
||||
s->state = STATE_NORMAL;
|
||||
uip_close();
|
||||
return;
|
||||
}
|
||||
|
||||
if(uip_closed()) {
|
||||
telnetd_output(s, "Connection closed", "");
|
||||
}
|
||||
|
||||
|
||||
if(uip_aborted()) {
|
||||
telnetd_output(s, "Connection reset", "");
|
||||
}
|
||||
|
||||
if(uip_timedout()) {
|
||||
telnetd_output(s, "Connection timed out", "");
|
||||
}
|
||||
|
||||
if(uip_acked()) {
|
||||
acked(s);
|
||||
}
|
||||
|
||||
if(uip_newdata()) {
|
||||
newdata(s);
|
||||
}
|
||||
|
||||
if(uip_rexmit() ||
|
||||
uip_newdata() ||
|
||||
uip_acked()) {
|
||||
senddata(s);
|
||||
} else if(uip_poll()) {
|
||||
senddata(s);
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
114
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/telnetd.h
Normal file
114
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/telnetd.h
Normal file
|
@ -0,0 +1,114 @@
|
|||
/**
|
||||
* \addtogroup telnetd
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Header file for the telnet server.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2002, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: telnetd.h,v 1.1.2.2 2003/10/07 13:22:27 adam Exp $
|
||||
*
|
||||
*/
|
||||
#ifndef __TELNETD_H__
|
||||
#define __TELNETD_H__
|
||||
|
||||
#include "uip.h"
|
||||
|
||||
/**
|
||||
* The maximum length of a telnet line.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define TELNETD_LINELEN 36
|
||||
|
||||
/**
|
||||
* The number of output lines being buffered for all telnet
|
||||
* connections.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define TELNETD_NUMLINES 2
|
||||
|
||||
/**
|
||||
* A telnet connection structure.
|
||||
*/
|
||||
struct telnetd_state {
|
||||
char *lines[TELNETD_NUMLINES];
|
||||
char buf[TELNETD_LINELEN];
|
||||
char bufptr;
|
||||
u8_t state;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Callback function that is called when a telnet connection has been
|
||||
* established.
|
||||
*
|
||||
* \param s The telnet connection.
|
||||
*/
|
||||
void telnetd_connected(struct telnetd_state *s);
|
||||
|
||||
/**
|
||||
* Callback function that is called when a line of text has arrived on
|
||||
* a telnet connection.
|
||||
*
|
||||
* \param s The telnet connection.
|
||||
*
|
||||
* \param cmd The line of text.
|
||||
*/
|
||||
void telnetd_input(struct telnetd_state *s, char *cmd);
|
||||
|
||||
|
||||
void telnetd_close(struct telnetd_state *s);
|
||||
void telnetd_output(struct telnetd_state *s, char *s1, char *s2);
|
||||
void telnetd_prompt(struct telnetd_state *s, char *str);
|
||||
|
||||
void telnetd_app(void);
|
||||
|
||||
#ifndef UIP_APPCALL
|
||||
#define UIP_APPCALL telnetd_app
|
||||
#endif
|
||||
|
||||
#ifndef UIP_APPSTATE_SIZE
|
||||
#define UIP_APPSTATE_SIZE (sizeof(struct telnetd_state))
|
||||
#endif
|
||||
|
||||
void telnetd_init(void);
|
||||
|
||||
|
||||
#endif /* __TELNET_H__ */
|
||||
|
||||
/** @} */
|
1514
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip.c
Normal file
1514
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip.c
Normal file
File diff suppressed because it is too large
Load diff
1060
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip.h
Normal file
1060
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip.h
Normal file
File diff suppressed because it is too large
Load diff
145
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip_arch.c
Normal file
145
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip_arch.c
Normal file
|
@ -0,0 +1,145 @@
|
|||
/*
|
||||
* Copyright (c) 2001, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: uip_arch.c,v 1.2.2.1 2003/10/04 22:54:17 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "uip.h"
|
||||
#include "uip_arch.h"
|
||||
|
||||
#define BUF ((uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
|
||||
#define IP_PROTO_TCP 6
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
uip_add32(u8_t *op32, u16_t op16)
|
||||
{
|
||||
|
||||
uip_acc32[3] = op32[3] + (op16 & 0xff);
|
||||
uip_acc32[2] = op32[2] + (op16 >> 8);
|
||||
uip_acc32[1] = op32[1];
|
||||
uip_acc32[0] = op32[0];
|
||||
|
||||
if(uip_acc32[2] < (op16 >> 8)) {
|
||||
++uip_acc32[1];
|
||||
if(uip_acc32[1] == 0) {
|
||||
++uip_acc32[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(uip_acc32[3] < (op16 & 0xff)) {
|
||||
++uip_acc32[2];
|
||||
if(uip_acc32[2] == 0) {
|
||||
++uip_acc32[1];
|
||||
if(uip_acc32[1] == 0) {
|
||||
++uip_acc32[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
u16_t
|
||||
uip_chksum(u16_t *sdata, u16_t len)
|
||||
{
|
||||
u16_t acc;
|
||||
|
||||
for (acc = 0; len > 1; len -= 2) {
|
||||
u16_t u = ((unsigned char *)sdata)[0] + (((unsigned char *)sdata)[1] << 8);
|
||||
if ((acc += u) < u) {
|
||||
/* Overflow, so we add the carry to acc (i.e., increase by
|
||||
one). */
|
||||
++acc;
|
||||
}
|
||||
++sdata;
|
||||
}
|
||||
|
||||
/* add up any odd byte */
|
||||
if(len == 1) {
|
||||
acc += htons(((u16_t)(*(u8_t *)sdata)) << 8);
|
||||
if(acc < htons(((u16_t)(*(u8_t *)sdata)) << 8)) {
|
||||
++acc;
|
||||
}
|
||||
}
|
||||
|
||||
return acc;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
u16_t
|
||||
uip_ipchksum(void)
|
||||
{
|
||||
return uip_chksum((u16_t *)&uip_buf[UIP_LLH_LEN], 20);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
u16_t
|
||||
uip_tcpchksum(void)
|
||||
{
|
||||
u16_t hsum, sum;
|
||||
|
||||
|
||||
/* Compute the checksum of the TCP header. */
|
||||
hsum = uip_chksum((u16_t *)&uip_buf[20 + UIP_LLH_LEN], 20);
|
||||
|
||||
/* Compute the checksum of the data in the TCP packet and add it to
|
||||
the TCP header checksum. */
|
||||
sum = uip_chksum((u16_t *)uip_appdata,
|
||||
(u16_t)(((((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - 40)));
|
||||
|
||||
if((sum += hsum) < hsum) {
|
||||
++sum;
|
||||
}
|
||||
|
||||
if((sum += BUF->srcipaddr[0]) < BUF->srcipaddr[0]) {
|
||||
++sum;
|
||||
}
|
||||
if((sum += BUF->srcipaddr[1]) < BUF->srcipaddr[1]) {
|
||||
++sum;
|
||||
}
|
||||
if((sum += BUF->destipaddr[0]) < BUF->destipaddr[0]) {
|
||||
++sum;
|
||||
}
|
||||
if((sum += BUF->destipaddr[1]) < BUF->destipaddr[1]) {
|
||||
++sum;
|
||||
}
|
||||
if((sum += (u16_t)htons((u16_t)IP_PROTO_TCP)) < (u16_t)htons((u16_t)IP_PROTO_TCP)) {
|
||||
++sum;
|
||||
}
|
||||
|
||||
hsum = (u16_t)htons((((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - 20);
|
||||
|
||||
if((sum += hsum) < hsum) {
|
||||
++sum;
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
130
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip_arch.h
Normal file
130
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip_arch.h
Normal file
|
@ -0,0 +1,130 @@
|
|||
/**
|
||||
* \defgroup uiparch Architecture specific uIP functions
|
||||
* @{
|
||||
*
|
||||
* The functions in the architecture specific module implement the IP
|
||||
* check sum and 32-bit additions.
|
||||
*
|
||||
* The IP checksum calculation is the most computationally expensive
|
||||
* operation in the TCP/IP stack and it therefore pays off to
|
||||
* implement this in efficient assembler. The purpose of the uip-arch
|
||||
* module is to let the checksum functions to be implemented in
|
||||
* architecture specific assembler.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Declarations of architecture specific functions.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: uip_arch.h,v 1.1.2.2 2003/10/06 15:10:22 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __UIP_ARCH_H__
|
||||
#define __UIP_ARCH_H__
|
||||
|
||||
#include "uip.h"
|
||||
|
||||
/**
|
||||
* Carry out a 32-bit addition.
|
||||
*
|
||||
* Because not all architectures for which uIP is intended has native
|
||||
* 32-bit arithmetic, uIP uses an external C function for doing the
|
||||
* required 32-bit additions in the TCP protocol processing. This
|
||||
* function should add the two arguments and place the result in the
|
||||
* global variable uip_acc32.
|
||||
*
|
||||
* \note The 32-bit integer pointed to by the op32 parameter and the
|
||||
* result in the uip_acc32 variable are in network byte order (big
|
||||
* endian).
|
||||
*
|
||||
* \param op32 A pointer to a 4-byte array representing a 32-bit
|
||||
* integer in network byte order (big endian).
|
||||
*
|
||||
* \param op16 A 16-bit integer in host byte order.
|
||||
*/
|
||||
void uip_add32(u8_t *op32, u16_t op16);
|
||||
|
||||
/**
|
||||
* Calculate the Internet checksum over a buffer.
|
||||
*
|
||||
* The Internet checksum is the one's complement of the one's
|
||||
* complement sum of all 16-bit words in the buffer.
|
||||
*
|
||||
* See RFC1071.
|
||||
*
|
||||
* \note This function is not called in the current version of uIP,
|
||||
* but future versions might make use of it.
|
||||
*
|
||||
* \param buf A pointer to the buffer over which the checksum is to be
|
||||
* computed.
|
||||
*
|
||||
* \param len The length of the buffer over which the checksum is to
|
||||
* be computed.
|
||||
*
|
||||
* \return The Internet checksum of the buffer.
|
||||
*/
|
||||
u16_t uip_chksum(u16_t *buf, u16_t len);
|
||||
|
||||
/**
|
||||
* Calculate the IP header checksum of the packet header in uip_buf.
|
||||
*
|
||||
* The IP header checksum is the Internet checksum of the 20 bytes of
|
||||
* the IP header.
|
||||
*
|
||||
* \return The IP header checksum of the IP header in the uip_buf
|
||||
* buffer.
|
||||
*/
|
||||
u16_t uip_ipchksum(void);
|
||||
|
||||
/**
|
||||
* Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
|
||||
*
|
||||
* The TCP checksum is the Internet checksum of data contents of the
|
||||
* TCP segment, and a pseudo-header as defined in RFC793.
|
||||
*
|
||||
* \note The uip_appdata pointer that points to the packet data may
|
||||
* point anywhere in memory, so it is not possible to simply calculate
|
||||
* the Internet checksum of the contents of the uip_buf buffer.
|
||||
*
|
||||
* \return The TCP checksum of the TCP segment in uip_buf and pointed
|
||||
* to by uip_appdata.
|
||||
*/
|
||||
u16_t uip_tcpchksum(void);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* __UIP_ARCH_H__ */
|
429
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip_arp.c
Normal file
429
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip_arp.c
Normal file
|
@ -0,0 +1,429 @@
|
|||
/**
|
||||
* \addtogroup uip
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \defgroup uiparp uIP Address Resolution Protocol
|
||||
* @{
|
||||
*
|
||||
* The Address Resolution Protocol ARP is used for mapping between IP
|
||||
* addresses and link level addresses such as the Ethernet MAC
|
||||
* addresses. ARP uses broadcast queries to ask for the link level
|
||||
* address of a known IP address and the host which is configured with
|
||||
* the IP address for which the query was meant, will respond with its
|
||||
* link level address.
|
||||
*
|
||||
* \note This ARP implementation only supports Ethernet.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Implementation of the ARP Address Resolution Protocol.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001-2003, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: uip_arp.c,v 1.7.2.3 2003/10/06 22:42:30 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "uip_arp.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
struct arp_hdr {
|
||||
struct uip_eth_hdr ethhdr;
|
||||
u16_t hwtype;
|
||||
u16_t protocol;
|
||||
u8_t hwlen;
|
||||
u8_t protolen;
|
||||
u16_t opcode;
|
||||
struct uip_eth_addr shwaddr;
|
||||
u16_t sipaddr[2];
|
||||
struct uip_eth_addr dhwaddr;
|
||||
u16_t dipaddr[2];
|
||||
};
|
||||
|
||||
struct ethip_hdr {
|
||||
struct uip_eth_hdr ethhdr;
|
||||
/* IP header. */
|
||||
u8_t vhl,
|
||||
tos,
|
||||
len[2],
|
||||
ipid[2],
|
||||
ipoffset[2],
|
||||
ttl,
|
||||
proto;
|
||||
u16_t ipchksum;
|
||||
u16_t srcipaddr[2],
|
||||
destipaddr[2];
|
||||
};
|
||||
|
||||
#define ARP_REQUEST 1
|
||||
#define ARP_REPLY 2
|
||||
|
||||
#define ARP_HWTYPE_ETH 1
|
||||
|
||||
struct arp_entry {
|
||||
u16_t ipaddr[2];
|
||||
struct uip_eth_addr ethaddr;
|
||||
u8_t time;
|
||||
};
|
||||
|
||||
struct uip_eth_addr uip_ethaddr = {{UIP_ETHADDR0,
|
||||
UIP_ETHADDR1,
|
||||
UIP_ETHADDR2,
|
||||
UIP_ETHADDR3,
|
||||
UIP_ETHADDR4,
|
||||
UIP_ETHADDR5}};
|
||||
|
||||
static struct arp_entry arp_table[UIP_ARPTAB_SIZE];
|
||||
static u16_t ipaddr[2];
|
||||
static u8_t i, c;
|
||||
|
||||
static u8_t arptime;
|
||||
static u8_t tmpage;
|
||||
|
||||
#define BUF ((struct arp_hdr *)&uip_buf[0])
|
||||
#define IPBUF ((struct ethip_hdr *)&uip_buf[0])
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Initialize the ARP module.
|
||||
*
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
uip_arp_init(void)
|
||||
{
|
||||
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
|
||||
memset(arp_table[i].ipaddr, 0, 4);
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Periodic ARP processing function.
|
||||
*
|
||||
* This function performs periodic timer processing in the ARP module
|
||||
* and should be called at regular intervals. The recommended interval
|
||||
* is 10 seconds between the calls.
|
||||
*
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
uip_arp_timer(void)
|
||||
{
|
||||
struct arp_entry *tabptr;
|
||||
|
||||
++arptime;
|
||||
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
|
||||
tabptr = &arp_table[i];
|
||||
if((tabptr->ipaddr[0] | tabptr->ipaddr[1]) != 0 &&
|
||||
arptime - tabptr->time >= UIP_ARP_MAXAGE) {
|
||||
memset(tabptr->ipaddr, 0, 4);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
static void
|
||||
uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr)
|
||||
{
|
||||
register struct arp_entry *tabptr;
|
||||
/* Walk through the ARP mapping table and try to find an entry to
|
||||
update. If none is found, the IP -> MAC address mapping is
|
||||
inserted in the ARP table. */
|
||||
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
|
||||
|
||||
tabptr = &arp_table[i];
|
||||
/* Only check those entries that are actually in use. */
|
||||
if(tabptr->ipaddr[0] != 0 &&
|
||||
tabptr->ipaddr[1] != 0) {
|
||||
|
||||
/* Check if the source IP address of the incoming packet matches
|
||||
the IP address in this ARP table entry. */
|
||||
if(ipaddr[0] == tabptr->ipaddr[0] &&
|
||||
ipaddr[1] == tabptr->ipaddr[1]) {
|
||||
|
||||
/* An old entry found, update this and return. */
|
||||
memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
|
||||
tabptr->time = arptime;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If we get here, no existing ARP table entry was found, so we
|
||||
create one. */
|
||||
|
||||
/* First, we try to find an unused entry in the ARP table. */
|
||||
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
|
||||
tabptr = &arp_table[i];
|
||||
if(tabptr->ipaddr[0] == 0 &&
|
||||
tabptr->ipaddr[1] == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If no unused entry is found, we try to find the oldest entry and
|
||||
throw it away. */
|
||||
if(i == UIP_ARPTAB_SIZE) {
|
||||
tmpage = 0;
|
||||
c = 0;
|
||||
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
|
||||
tabptr = &arp_table[i];
|
||||
if(arptime - tabptr->time > tmpage) {
|
||||
tmpage = arptime - tabptr->time;
|
||||
c = i;
|
||||
}
|
||||
}
|
||||
i = c;
|
||||
}
|
||||
|
||||
/* Now, i is the ARP table entry which we will fill with the new
|
||||
information. */
|
||||
memcpy(tabptr->ipaddr, ipaddr, 4);
|
||||
memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
|
||||
tabptr->time = arptime;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* ARP processing for incoming IP packets
|
||||
*
|
||||
* This function should be called by the device driver when an IP
|
||||
* packet has been received. The function will check if the address is
|
||||
* in the ARP cache, and if so the ARP cache entry will be
|
||||
* refreshed. If no ARP cache entry was found, a new one is created.
|
||||
*
|
||||
* This function expects an IP packet with a prepended Ethernet header
|
||||
* in the uip_buf[] buffer, and the length of the packet in the global
|
||||
* variable uip_len.
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
uip_arp_ipin(void)
|
||||
{
|
||||
uip_len -= sizeof(struct uip_eth_hdr);
|
||||
|
||||
/* Only insert/update an entry if the source IP address of the
|
||||
incoming IP packet comes from a host on the local network. */
|
||||
if((IPBUF->srcipaddr[0] & uip_arp_netmask[0]) !=
|
||||
(uip_hostaddr[0] & uip_arp_netmask[0])) {
|
||||
return;
|
||||
}
|
||||
if((IPBUF->srcipaddr[1] & uip_arp_netmask[1]) !=
|
||||
(uip_hostaddr[1] & uip_arp_netmask[1])) {
|
||||
return;
|
||||
}
|
||||
uip_arp_update(IPBUF->srcipaddr, &(IPBUF->ethhdr.src));
|
||||
|
||||
return;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* ARP processing for incoming ARP packets.
|
||||
*
|
||||
* This function should be called by the device driver when an ARP
|
||||
* packet has been received. The function will act differently
|
||||
* depending on the ARP packet type: if it is a reply for a request
|
||||
* that we previously sent out, the ARP cache will be filled in with
|
||||
* the values from the ARP reply. If the incoming ARP packet is an ARP
|
||||
* request for our IP address, an ARP reply packet is created and put
|
||||
* into the uip_buf[] buffer.
|
||||
*
|
||||
* When the function returns, the value of the global variable uip_len
|
||||
* indicates whether the device driver should send out a packet or
|
||||
* not. If uip_len is zero, no packet should be sent. If uip_len is
|
||||
* non-zero, it contains the length of the outbound packet that is
|
||||
* present in the uip_buf[] buffer.
|
||||
*
|
||||
* This function expects an ARP packet with a prepended Ethernet
|
||||
* header in the uip_buf[] buffer, and the length of the packet in the
|
||||
* global variable uip_len.
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
typedef struct arp_hdr aht;
|
||||
|
||||
void
|
||||
uip_arp_arpin(void)
|
||||
{
|
||||
int ul;
|
||||
|
||||
if(uip_len < sizeof(struct arp_hdr)) {
|
||||
uip_len = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
uip_len = 0;
|
||||
|
||||
switch(BUF->opcode) {
|
||||
case HTONS(ARP_REQUEST):
|
||||
/* ARP request. If it asked for our address, we send out a
|
||||
reply. */
|
||||
if(BUF->dipaddr[0] == uip_hostaddr[0] &&
|
||||
BUF->dipaddr[1] == uip_hostaddr[1]) {
|
||||
/* The reply opcode is 2. */
|
||||
BUF->opcode = HTONS(2);
|
||||
|
||||
memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6);
|
||||
memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);
|
||||
memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
|
||||
memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6);
|
||||
|
||||
BUF->dipaddr[0] = BUF->sipaddr[0];
|
||||
BUF->dipaddr[1] = BUF->sipaddr[1];
|
||||
BUF->sipaddr[0] = uip_hostaddr[0];
|
||||
BUF->sipaddr[1] = uip_hostaddr[1];
|
||||
|
||||
ul = BUF->hwlen;
|
||||
BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);
|
||||
uip_len = sizeof(struct arp_hdr);
|
||||
}
|
||||
break;
|
||||
case HTONS(ARP_REPLY):
|
||||
/* ARP reply. We insert or update the ARP table if it was meant
|
||||
for us. */
|
||||
if(BUF->dipaddr[0] == uip_hostaddr[0] &&
|
||||
BUF->dipaddr[1] == uip_hostaddr[1]) {
|
||||
|
||||
uip_arp_update(BUF->sipaddr, &BUF->shwaddr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
( void ) ul;
|
||||
|
||||
return;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Prepend Ethernet header to an outbound IP packet and see if we need
|
||||
* to send out an ARP request.
|
||||
*
|
||||
* This function should be called before sending out an IP packet. The
|
||||
* function checks the destination IP address of the IP packet to see
|
||||
* what Ethernet MAC address that should be used as a destination MAC
|
||||
* address on the Ethernet.
|
||||
*
|
||||
* If the destination IP address is in the local network (determined
|
||||
* by logical ANDing of netmask and our IP address), the function
|
||||
* checks the ARP cache to see if an entry for the destination IP
|
||||
* address is found. If so, an Ethernet header is prepended and the
|
||||
* function returns. If no ARP cache entry is found for the
|
||||
* destination IP address, the packet in the uip_buf[] is replaced by
|
||||
* an ARP request packet for the IP address. The IP packet is dropped
|
||||
* and it is assumed that they higher level protocols (e.g., TCP)
|
||||
* eventually will retransmit the dropped packet.
|
||||
*
|
||||
* If the destination IP address is not on the local network, the IP
|
||||
* address of the default router is used instead.
|
||||
*
|
||||
* When the function returns, a packet is present in the uip_buf[]
|
||||
* buffer, and the length of the packet is in the global variable
|
||||
* uip_len.
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
uip_arp_out(void)
|
||||
{
|
||||
struct arp_entry *tabptr;
|
||||
/* Find the destination IP address in the ARP table and construct
|
||||
the Ethernet header. If the destination IP addres isn't on the
|
||||
local network, we use the default router's IP address instead.
|
||||
|
||||
If not ARP table entry is found, we overwrite the original IP
|
||||
packet with an ARP request for the IP address. */
|
||||
|
||||
/* Check if the destination address is on the local network. */
|
||||
if((IPBUF->destipaddr[0] & uip_arp_netmask[0]) !=
|
||||
(uip_hostaddr[0] & uip_arp_netmask[0]) ||
|
||||
(IPBUF->destipaddr[1] & uip_arp_netmask[1]) !=
|
||||
(uip_hostaddr[1] & uip_arp_netmask[1])) {
|
||||
/* Destination address was not on the local network, so we need to
|
||||
use the default router's IP address instead of the destination
|
||||
address when determining the MAC address. */
|
||||
ipaddr[0] = uip_arp_draddr[0];
|
||||
ipaddr[1] = uip_arp_draddr[1];
|
||||
} else {
|
||||
/* Else, we use the destination IP address. */
|
||||
ipaddr[0] = IPBUF->destipaddr[0];
|
||||
ipaddr[1] = IPBUF->destipaddr[1];
|
||||
}
|
||||
|
||||
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
|
||||
tabptr = &arp_table[i];
|
||||
if(ipaddr[0] == tabptr->ipaddr[0] &&
|
||||
ipaddr[1] == tabptr->ipaddr[1])
|
||||
break;
|
||||
}
|
||||
|
||||
if(i == UIP_ARPTAB_SIZE) {
|
||||
/* The destination address was not in our ARP table, so we
|
||||
overwrite the IP packet with an ARP request. */
|
||||
|
||||
memset(BUF->ethhdr.dest.addr, 0xff, 6);
|
||||
memset(BUF->dhwaddr.addr, 0x00, 6);
|
||||
memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
|
||||
memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);
|
||||
|
||||
BUF->dipaddr[0] = ipaddr[0];
|
||||
BUF->dipaddr[1] = ipaddr[1];
|
||||
BUF->sipaddr[0] = uip_hostaddr[0];
|
||||
BUF->sipaddr[1] = uip_hostaddr[1];
|
||||
BUF->opcode = HTONS(ARP_REQUEST); /* ARP request. */
|
||||
BUF->hwtype = HTONS(ARP_HWTYPE_ETH);
|
||||
BUF->protocol = HTONS(UIP_ETHTYPE_IP);
|
||||
BUF->hwlen = 6;
|
||||
BUF->protolen = 4;
|
||||
BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);
|
||||
|
||||
uip_appdata = &uip_buf[40 + UIP_LLH_LEN];
|
||||
|
||||
uip_len = sizeof(struct arp_hdr);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Build an ethernet header. */
|
||||
memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6);
|
||||
memcpy(IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
|
||||
|
||||
IPBUF->ethhdr.type = HTONS(UIP_ETHTYPE_IP);
|
||||
|
||||
uip_len += sizeof(struct uip_eth_hdr);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
/** @} */
|
||||
/** @} */
|
201
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip_arp.h
Normal file
201
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uip_arp.h
Normal file
|
@ -0,0 +1,201 @@
|
|||
/**
|
||||
* \addtogroup uip
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \addtogroup uiparp
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Macros and definitions for the ARP module.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001-2003, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: uip_arp.h,v 1.3.2.2 2003/10/06 15:10:22 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __UIP_ARP_H__
|
||||
#define __UIP_ARP_H__
|
||||
|
||||
#include "uip.h"
|
||||
|
||||
|
||||
/**
|
||||
* Representation of a 48-bit Ethernet address.
|
||||
*/
|
||||
struct uip_eth_addr {
|
||||
u8_t addr[6];
|
||||
} /*_RB_ __attribute__ ((packed, aligned (1))) */;
|
||||
|
||||
extern struct uip_eth_addr uip_ethaddr;
|
||||
|
||||
/**
|
||||
* The Ethernet header.
|
||||
*/
|
||||
struct uip_eth_hdr {
|
||||
struct uip_eth_addr dest;
|
||||
struct uip_eth_addr src;
|
||||
u16_t type;
|
||||
} /*_RB_ __attribute__ ((packed)) */;
|
||||
|
||||
#define UIP_ETHTYPE_ARP 0x0806
|
||||
#define UIP_ETHTYPE_IP 0x0800
|
||||
#define UIP_ETHTYPE_IP6 0x86dd
|
||||
|
||||
|
||||
/* The uip_arp_init() function must be called before any of the other
|
||||
ARP functions. */
|
||||
void uip_arp_init(void);
|
||||
|
||||
/* The uip_arp_ipin() function should be called whenever an IP packet
|
||||
arrives from the Ethernet. This function refreshes the ARP table or
|
||||
inserts a new mapping if none exists. The function assumes that an
|
||||
IP packet with an Ethernet header is present in the uip_buf buffer
|
||||
and that the length of the packet is in the uip_len variable. */
|
||||
void uip_arp_ipin(void);
|
||||
|
||||
/* The uip_arp_arpin() should be called when an ARP packet is received
|
||||
by the Ethernet driver. This function also assumes that the
|
||||
Ethernet frame is present in the uip_buf buffer. When the
|
||||
uip_arp_arpin() function returns, the contents of the uip_buf
|
||||
buffer should be sent out on the Ethernet if the uip_len variable
|
||||
is > 0. */
|
||||
void uip_arp_arpin(void);
|
||||
|
||||
/* The uip_arp_out() function should be called when an IP packet
|
||||
should be sent out on the Ethernet. This function creates an
|
||||
Ethernet header before the IP header in the uip_buf buffer. The
|
||||
Ethernet header will have the correct Ethernet MAC destination
|
||||
address filled in if an ARP table entry for the destination IP
|
||||
address (or the IP address of the default router) is present. If no
|
||||
such table entry is found, the IP packet is overwritten with an ARP
|
||||
request and we rely on TCP to retransmit the packet that was
|
||||
overwritten. In any case, the uip_len variable holds the length of
|
||||
the Ethernet frame that should be transmitted. */
|
||||
void uip_arp_out(void);
|
||||
|
||||
/* The uip_arp_timer() function should be called every ten seconds. It
|
||||
is responsible for flushing old entries in the ARP table. */
|
||||
void uip_arp_timer(void);
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* \addtogroup uipconffunc
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set the default router's IP address.
|
||||
*
|
||||
* \param addr A pointer to a 4-byte array containing the IP address
|
||||
* of the default router.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define uip_setdraddr(addr) do { uip_arp_draddr[0] = addr[0]; \
|
||||
uip_arp_draddr[1] = addr[1]; } while(0)
|
||||
|
||||
/**
|
||||
* Set the netmask.
|
||||
*
|
||||
* \param addr A pointer to a 4-byte array containing the IP address
|
||||
* of the netmask.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define uip_setnetmask(addr) do { uip_arp_netmask[0] = addr[0]; \
|
||||
uip_arp_netmask[1] = addr[1]; } while(0)
|
||||
|
||||
|
||||
/**
|
||||
* Get the default router's IP address.
|
||||
*
|
||||
* \param addr A pointer to a 4-byte array that will be filled in with
|
||||
* the IP address of the default router.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define uip_getdraddr(addr) do { addr[0] = uip_arp_draddr[0]; \
|
||||
addr[1] = uip_arp_draddr[1]; } while(0)
|
||||
|
||||
/**
|
||||
* Get the netmask.
|
||||
*
|
||||
* \param addr A pointer to a 4-byte array that will be filled in with
|
||||
* the value of the netmask.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define uip_getnetmask(addr) do { addr[0] = uip_arp_netmask[0]; \
|
||||
addr[1] = uip_arp_netmask[1]; } while(0)
|
||||
|
||||
|
||||
/**
|
||||
* Specifiy the Ethernet MAC address.
|
||||
*
|
||||
* The ARP code needs to know the MAC address of the Ethernet card in
|
||||
* order to be able to respond to ARP queries and to generate working
|
||||
* Ethernet headers.
|
||||
*
|
||||
* \note This macro only specifies the Ethernet MAC address to the ARP
|
||||
* code. It cannot be used to change the MAC address of the Ethernet
|
||||
* card.
|
||||
*
|
||||
* \param eaddr A pointer to a struct uip_eth_addr containing the
|
||||
* Ethernet MAC address of the Ethernet card.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define uip_setethaddr(eaddr) do {uip_ethaddr.addr[0] = eaddr.addr[0]; \
|
||||
uip_ethaddr.addr[1] = eaddr.addr[1];\
|
||||
uip_ethaddr.addr[2] = eaddr.addr[2];\
|
||||
uip_ethaddr.addr[3] = eaddr.addr[3];\
|
||||
uip_ethaddr.addr[4] = eaddr.addr[4];\
|
||||
uip_ethaddr.addr[5] = eaddr.addr[5];} while(0)
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* \internal Internal variables that are set using the macros
|
||||
* uip_setdraddr and uip_setnetmask.
|
||||
*/
|
||||
extern u16_t uip_arp_draddr[2], uip_arp_netmask[2];
|
||||
#endif /* __UIP_ARP_H__ */
|
||||
|
||||
|
560
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uipopt.h
Normal file
560
FreeRTOS/Demo/uIP_Demo_IAR_ARM7/uip/uipopt.h
Normal file
|
@ -0,0 +1,560 @@
|
|||
/**
|
||||
* \defgroup uipopt Configuration options for uIP
|
||||
* @{
|
||||
*
|
||||
* uIP is configured using the per-project configuration file
|
||||
* "uipopt.h". This file contains all compile-time options for uIP and
|
||||
* should be tweaked to match each specific project. The uIP
|
||||
* distribution contains a documented example "uipopt.h" that can be
|
||||
* copied and modified for each project.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Configuration options for uIP.
|
||||
* \author Adam Dunkels <adam@dunkels.com>
|
||||
*
|
||||
* This file is used for tweaking various configuration options for
|
||||
* uIP. You should make a copy of this file into one of your project's
|
||||
* directories instead of editing this example "uipopt.h" file that
|
||||
* comes with the uIP distribution.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001-2003, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the uIP TCP/IP stack.
|
||||
*
|
||||
* $Id: uipopt.h,v 1.16.2.5 2003/10/07 13:22:51 adam Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __UIPOPT_H__
|
||||
#define __UIPOPT_H__
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \defgroup uipopttypedef uIP type definitions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* The 8-bit unsigned data type.
|
||||
*
|
||||
* This may have to be tweaked for your particular compiler. "unsigned
|
||||
* char" works for most compilers.
|
||||
*/
|
||||
typedef unsigned char u8_t;
|
||||
|
||||
/**
|
||||
* The 16-bit unsigned data type.
|
||||
*
|
||||
* This may have to be tweaked for your particular compiler. "unsigned
|
||||
* short" works for most compilers.
|
||||
*/
|
||||
typedef unsigned short u16_t;
|
||||
|
||||
/**
|
||||
* The statistics data type.
|
||||
*
|
||||
* This datatype determines how high the statistics counters are able
|
||||
* to count.
|
||||
*/
|
||||
typedef unsigned short uip_stats_t;
|
||||
|
||||
/** @} */
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \defgroup uipoptstaticconf Static configuration options
|
||||
* @{
|
||||
*
|
||||
* These configuration options can be used for setting the IP address
|
||||
* settings statically, but only if UIP_FIXEDADDR is set to 1. The
|
||||
* configuration options for a specific node includes IP address,
|
||||
* netmask and default router as well as the Ethernet address. The
|
||||
* netmask, default router and Ethernet address are appliciable only
|
||||
* if uIP should be run over Ethernet.
|
||||
*
|
||||
* All of these should be changed to suit your project.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Determines if uIP should use a fixed IP address or not.
|
||||
*
|
||||
* If uIP should use a fixed IP address, the settings are set in the
|
||||
* uipopt.h file. If not, the macros uip_sethostaddr(),
|
||||
* uip_setdraddr() and uip_setnetmask() should be used instead.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_FIXEDADDR 1
|
||||
|
||||
/**
|
||||
* Ping IP address asignment.
|
||||
*
|
||||
* uIP uses a "ping" packets for setting its own IP address if this
|
||||
* option is set. If so, uIP will start with an empty IP address and
|
||||
* the destination IP address of the first incoming "ping" (ICMP echo)
|
||||
* packet will be used for setting the hosts IP address.
|
||||
*
|
||||
* \note This works only if UIP_FIXEDADDR is 0.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_PINGADDRCONF 0
|
||||
|
||||
|
||||
#define UIP_IPADDR0 172U /**< The first octet of the IP address of
|
||||
this uIP node, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_IPADDR1 25U /**< The second octet of the IP address of
|
||||
this uIP node, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_IPADDR2 218U /**< The third octet of the IP address of
|
||||
this uIP node, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_IPADDR3 11U /**< The fourth octet of the IP address of
|
||||
this uIP node, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
|
||||
#define UIP_NETMASK0 255 /**< The first octet of the netmask of
|
||||
this uIP node, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_NETMASK1 255 /**< The second octet of the netmask of
|
||||
this uIP node, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_NETMASK2 0 /**< The third octet of the netmask of
|
||||
this uIP node, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_NETMASK3 0 /**< The fourth octet of the netmask of
|
||||
this uIP node, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
|
||||
#define UIP_DRIPADDR0 172 /**< The first octet of the IP address of
|
||||
the default router, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_DRIPADDR1 25 /**< The second octet of the IP address of
|
||||
the default router, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_DRIPADDR2 218 /**< The third octet of the IP address of
|
||||
the default router, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_DRIPADDR3 3 /**< The fourth octet of the IP address of
|
||||
the default router, if UIP_FIXEDADDR is
|
||||
1. \hideinitializer */
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Specifies if the uIP ARP module should be compiled with a fixed
|
||||
* Ethernet MAC address or not.
|
||||
*
|
||||
* If this configuration option is 0, the macro uip_setethaddr() can
|
||||
* be used to specify the Ethernet address at run-time.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_FIXEDETHADDR 0
|
||||
|
||||
#define UIP_ETHADDR0 0x00 /**< The first octet of the Ethernet
|
||||
address if UIP_FIXEDETHADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_ETHADDR1 0xbd /**< The second octet of the Ethernet
|
||||
address if UIP_FIXEDETHADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_ETHADDR2 0x3b /**< The third octet of the Ethernet
|
||||
address if UIP_FIXEDETHADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_ETHADDR3 0x33 /**< The fourth octet of the Ethernet
|
||||
address if UIP_FIXEDETHADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_ETHADDR4 0x06 /**< The fifth octet of the Ethernet
|
||||
address if UIP_FIXEDETHADDR is
|
||||
1. \hideinitializer */
|
||||
#define UIP_ETHADDR5 0x65 /**< The sixth octet of the Ethernet
|
||||
address if UIP_FIXEDETHADDR is
|
||||
1. \hideinitializer */
|
||||
|
||||
/** @} */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \defgroup uipoptip IP configuration options
|
||||
* @{
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* The IP TTL (time to live) of IP packets sent by uIP.
|
||||
*
|
||||
* This should normally not be changed.
|
||||
*/
|
||||
#define UIP_TTL 255
|
||||
|
||||
/**
|
||||
* Turn on support for IP packet reassembly.
|
||||
*
|
||||
* uIP supports reassembly of fragmented IP packets. This features
|
||||
* requires an additonal amount of RAM to hold the reassembly buffer
|
||||
* and the reassembly code size is approximately 700 bytes. The
|
||||
* reassembly buffer is of the same size as the uip_buf buffer
|
||||
* (configured by UIP_BUFSIZE).
|
||||
*
|
||||
* \note IP packet reassembly is not heavily tested.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_REASSEMBLY 0
|
||||
|
||||
/**
|
||||
* The maximum time an IP fragment should wait in the reassembly
|
||||
* buffer before it is dropped.
|
||||
*
|
||||
*/
|
||||
#define UIP_REASS_MAXAGE 40
|
||||
|
||||
/** @} */
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \defgroup uipoptudp UDP configuration options
|
||||
* @{
|
||||
*
|
||||
* \note The UDP support in uIP is still not entirely complete; there
|
||||
* is no support for sending or receiving broadcast or multicast
|
||||
* packets, but it works well enough to support a number of vital
|
||||
* applications such as DNS queries, though
|
||||
*/
|
||||
|
||||
/**
|
||||
* Toggles wether UDP support should be compiled in or not.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_UDP 0
|
||||
|
||||
/**
|
||||
* Toggles if UDP checksums should be used or not.
|
||||
*
|
||||
* \note Support for UDP checksums is currently not included in uIP,
|
||||
* so this option has no function.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_UDP_CHECKSUMS 0
|
||||
|
||||
/**
|
||||
* The maximum amount of concurrent UDP connections.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_UDP_CONNS 2
|
||||
|
||||
/**
|
||||
* The name of the function that should be called when UDP datagrams arrive.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_UDP_APPCALL udp_appcall
|
||||
|
||||
/** @} */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \defgroup uipopttcp TCP configuration options
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Determines if support for opening connections from uIP should be
|
||||
* compiled in.
|
||||
*
|
||||
* If the applications that are running on top of uIP for this project
|
||||
* do not need to open outgoing TCP connections, this configration
|
||||
* option can be turned off to reduce the code size of uIP.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_ACTIVE_OPEN 0
|
||||
|
||||
/**
|
||||
* The maximum number of simultaneously open TCP connections.
|
||||
*
|
||||
* Since the TCP connections are statically allocated, turning this
|
||||
* configuration knob down results in less RAM used. Each TCP
|
||||
* connection requires approximatly 30 bytes of memory.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_CONNS 25
|
||||
|
||||
/**
|
||||
* The maximum number of simultaneously listening TCP ports.
|
||||
*
|
||||
* Each listening TCP port requires 2 bytes of memory.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_LISTENPORTS 10
|
||||
|
||||
/**
|
||||
* The size of the advertised receiver's window.
|
||||
*
|
||||
* Should be set low (i.e., to the size of the uip_buf buffer) is the
|
||||
* application is slow to process incoming data, or high (32768 bytes)
|
||||
* if the application processes data quickly.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_RECEIVE_WINDOW 32768
|
||||
|
||||
/**
|
||||
* Determines if support for TCP urgent data notification should be
|
||||
* compiled in.
|
||||
*
|
||||
* Urgent data (out-of-band data) is a rarely used TCP feature that
|
||||
* very seldom would be required.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_URGDATA 1
|
||||
|
||||
/**
|
||||
* The initial retransmission timeout counted in timer pulses.
|
||||
*
|
||||
* This should not be changed.
|
||||
*/
|
||||
#define UIP_RTO 3
|
||||
|
||||
/**
|
||||
* The maximum number of times a segment should be retransmitted
|
||||
* before the connection should be aborted.
|
||||
*
|
||||
* This should not be changed.
|
||||
*/
|
||||
#define UIP_MAXRTX 8
|
||||
|
||||
/**
|
||||
* The maximum number of times a SYN segment should be retransmitted
|
||||
* before a connection request should be deemed to have been
|
||||
* unsuccessful.
|
||||
*
|
||||
* This should not need to be changed.
|
||||
*/
|
||||
#define UIP_MAXSYNRTX 3
|
||||
|
||||
/**
|
||||
* The TCP maximum segment size.
|
||||
*
|
||||
* This is should not be to set to more than UIP_BUFSIZE - UIP_LLH_LEN - 40.
|
||||
*/
|
||||
#define UIP_TCP_MSS (UIP_BUFSIZE - UIP_LLH_LEN - 40)
|
||||
|
||||
/**
|
||||
* How long a connection should stay in the TIME_WAIT state.
|
||||
*
|
||||
* This configiration option has no real implication, and it should be
|
||||
* left untouched.
|
||||
*/
|
||||
#define UIP_TIME_WAIT_TIMEOUT 120
|
||||
|
||||
|
||||
/** @} */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \defgroup uipoptarp ARP configuration options
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* The size of the ARP table.
|
||||
*
|
||||
* This option should be set to a larger value if this uIP node will
|
||||
* have many connections from the local network.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_ARPTAB_SIZE 8
|
||||
|
||||
/**
|
||||
* The maxium age of ARP table entries measured in 10ths of seconds.
|
||||
*
|
||||
* An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD
|
||||
* default).
|
||||
*/
|
||||
#define UIP_ARP_MAXAGE 120
|
||||
|
||||
/** @} */
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \defgroup uipoptgeneral General configuration options
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* The size of the uIP packet buffer.
|
||||
*
|
||||
* The uIP packet buffer should not be smaller than 60 bytes, and does
|
||||
* not need to be larger than 1500 bytes. Lower size results in lower
|
||||
* TCP throughput, larger size results in higher TCP throughput.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_BUFSIZE 1480
|
||||
|
||||
|
||||
/**
|
||||
* Determines if statistics support should be compiled in.
|
||||
*
|
||||
* The statistics is useful for debugging and to show the user.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_STATISTICS 1
|
||||
|
||||
/**
|
||||
* Determines if logging of certain events should be compiled in.
|
||||
*
|
||||
* This is useful mostly for debugging. The function uip_log()
|
||||
* must be implemented to suit the architecture of the project, if
|
||||
* logging is turned on.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_LOGGING 0
|
||||
|
||||
/**
|
||||
* Print out a uIP log message.
|
||||
*
|
||||
* This function must be implemented by the module that uses uIP, and
|
||||
* is called by uIP whenever a log message is generated.
|
||||
*/
|
||||
void uip_log(char *msg);
|
||||
|
||||
/**
|
||||
* The link level header length.
|
||||
*
|
||||
* This is the offset into the uip_buf where the IP header can be
|
||||
* found. For Ethernet, this should be set to 14. For SLIP, this
|
||||
* should be set to 0.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define UIP_LLH_LEN 14
|
||||
|
||||
|
||||
/** @} */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \defgroup uipoptcpu CPU architecture configuration
|
||||
* @{
|
||||
*
|
||||
* The CPU architecture configuration is where the endianess of the
|
||||
* CPU on which uIP is to be run is specified. Most CPUs today are
|
||||
* little endian, and the most notable exception are the Motorolas
|
||||
* which are big endian. The BYTE_ORDER macro should be changed to
|
||||
* reflect the CPU architecture on which uIP is to be run.
|
||||
*/
|
||||
#ifndef LITTLE_ENDIAN
|
||||
#define LITTLE_ENDIAN 3412
|
||||
#endif /* LITTLE_ENDIAN */
|
||||
#ifndef BIG_ENDIAN
|
||||
#define BIG_ENDIAN 1234
|
||||
#endif /* BIGE_ENDIAN */
|
||||
|
||||
/**
|
||||
* The byte order of the CPU architecture on which uIP is to be run.
|
||||
*
|
||||
* This option can be either BIG_ENDIAN (Motorola byte order) or
|
||||
* LITTLE_ENDIAN (Intel byte order).
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#ifndef BYTE_ORDER
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif /* BYTE_ORDER */
|
||||
|
||||
/** @} */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \defgroup uipoptapp Appication specific configurations
|
||||
* @{
|
||||
*
|
||||
* An uIP application is implemented using a single application
|
||||
* function that is called by uIP whenever a TCP/IP event occurs. The
|
||||
* name of this function must be registered with uIP at compile time
|
||||
* using the UIP_APPCALL definition.
|
||||
*
|
||||
* uIP applications can store the application state within the
|
||||
* uip_conn structure by specifying the size of the application
|
||||
* structure with the UIP_APPSTATE_SIZE macro.
|
||||
*
|
||||
* The file containing the definitions must be included in the
|
||||
* uipopt.h file.
|
||||
*
|
||||
* The following example illustrates how this can look.
|
||||
\code
|
||||
|
||||
void httpd_appcall(void);
|
||||
#define UIP_APPCALL httpd_appcall
|
||||
|
||||
struct httpd_state {
|
||||
u8_t state;
|
||||
u16_t count;
|
||||
char *dataptr;
|
||||
char *script;
|
||||
};
|
||||
#define UIP_APPSTATE_SIZE (sizeof(struct httpd_state))
|
||||
\endcode
|
||||
*/
|
||||
|
||||
/**
|
||||
* \var #define UIP_APPCALL
|
||||
*
|
||||
* The name of the application function that uIP should call in
|
||||
* response to TCP/IP events.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* \var #define UIP_APPSTATE_SIZE
|
||||
*
|
||||
* The size of the application state that is to be stored in the
|
||||
* uip_conn structure.
|
||||
*/
|
||||
/** @} */
|
||||
|
||||
/* Include the header file for the application program that should be
|
||||
used. If you don't use the example web server, you should change
|
||||
this. */
|
||||
#include "httpd.h"
|
||||
|
||||
|
||||
#endif /* __UIPOPT_H__ */
|
Loading…
Add table
Add a link
Reference in a new issue