From 1b762247fac425abc8c418c7142ee6ad179f0a85 Mon Sep 17 00:00:00 2001 From: adamdunkels Date: Thu, 22 Mar 2007 18:59:34 +0000 Subject: [PATCH] Added uip-over-mesh, bugfixes, printing of statistics, renamed init() function to netsim_init() --- platform/netsim/contiki-main.c | 89 ++++------------------------ platform/netsim/ether.c | 58 ++++++++++++++---- platform/netsim/ether.h | 9 +-- platform/netsim/main.c | 12 ++-- platform/netsim/net/ethernode-rime.c | 4 +- platform/netsim/net/ethernode-uip.c | 4 +- platform/netsim/net/ethernode-uip.h | 4 +- platform/netsim/net/ethernode.c | 6 +- platform/netsim/net/tapdev-drv.c | 2 +- platform/netsim/net/tapdev.c | 66 +++++++++++---------- platform/netsim/netsim-init.c | 4 +- platform/netsim/node.c | 18 +++++- 12 files changed, 128 insertions(+), 148 deletions(-) diff --git a/platform/netsim/contiki-main.c b/platform/netsim/contiki-main.c index df0f3ca25..f3ed73601 100644 --- a/platform/netsim/contiki-main.c +++ b/platform/netsim/contiki-main.c @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $Id: contiki-main.c,v 1.7 2007/03/15 21:58:13 adamdunkels Exp $ + * $Id: contiki-main.c,v 1.8 2007/03/22 18:59:34 adamdunkels Exp $ */ #include "contiki.h" @@ -44,6 +44,7 @@ #include "net/ethernode-uip.h" #include "net/ethernode-rime.h" #include "net/ethernode.h" +#include "net/uip-over-mesh.h" #include "ether.h" @@ -59,14 +60,13 @@ static struct uip_fw_netif tapif = {UIP_FW_NETIF(0,0,0,0, 0,0,0,0, tapdev_send)}; +static struct uip_fw_netif meshif = + {UIP_FW_NETIF(172,16,0,0, 255,255,0,0, uip_over_mesh_send)}; /*static struct uip_fw_netif ethernodeif = {UIP_FW_NETIF(172,16,0,0, 255,255,0,0, ethernode_drv_send)};*/ static const struct uip_eth_addr ethaddr = {{0x00,0x06,0x98,0x01,0x02,0x12}}; -/*PROCESS(test_send_process, "Test send stuff"); - PROCESS(test_tcp_process, "Test TCP");*/ - SENSORS(&button_sensor, &pir_sensor, &vib_sensor, &radio_sensor); PROCINIT(&sensors_process, &etimer_process, &tcpip_process, @@ -74,79 +74,6 @@ PROCINIT(&sensors_process, &etimer_process, &tcpip_process, ðernode_rime_process, &uip_fw_process); -#if 0 -static -PT_THREAD(send_packet(struct pt *pt, - struct uip_udp_conn *c, process_event_t ev, - process_data_t data)) -{ - PT_BEGIN(pt); - - tcpip_poll_udp(c); - - PT_YIELD_UNTIL(pt, ev == tcpip_event); - - uip_send("hej", 3); - - PT_END(pt); -} - -PROCESS_THREAD(test_send_process, ev, data) -{ - static struct uip_udp_conn *conn; - static struct etimer etimer; - static struct pt send_pt; - - PROCESS_BEGIN(); - - conn = udp_broadcast_new(HTONS(3737), NULL); - - etimer_set(&etimer, CLOCK_SECOND * 2); - while(1) { - PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&etimer) || uip_newdata()); - - if(uip_newdata()) { - /* printf("Got a packet!\n");*/ - } - - if(etimer_expired(&etimer)) { - PROCESS_SPAWN(&send_pt, send_packet(&send_pt, conn, ev, data)); - etimer_set(&etimer, CLOCK_SECOND * 2); - } - - } - - PROCESS_END(); -} - -PROCESS_THREAD(test_tcp_process, ev, data) -{ - uip_ipaddr_t server; - - PROCESS_BEGIN(); - - uip_ipaddr(server, 255,255,255,255); - tcp_connect(server, HTONS(1000), NULL); - - while(1) { - PROCESS_WAIT_EVENT(); - printf("test_tcp_process: event %d\n", ev); - } - - PROCESS_END(); -} - -#endif /* 0 */ -/*---------------------------------------------------------------------------*/ -/*static void -idle(void) -{ - ether_server_poll(); - display_tick(); - display_redraw(); - ether_tick(); - ek_run(); -}*/ /*---------------------------------------------------------------------------*/ void contiki_main(int flag) @@ -160,16 +87,20 @@ contiki_main(int flag) procinit_init(); + uip_init(); + rime_init(); + uip_over_mesh_init(0); if(flag == 1) { process_start(&tapdev_drv_process, NULL); - /* uip_fw_register(ðernodeif);*/ + uip_fw_register(&meshif); uip_fw_default(&tapif); printf("uip_hostaddr %02x%02x\n", uip_hostaddr.u16[0], uip_hostaddr.u16[1]); } else { - /* uip_fw_default(ðernodeif);*/ + uip_fw_default(&meshif); } + leds_green(LEDS_ON); autostart_start(autostart_processes); diff --git a/platform/netsim/ether.c b/platform/netsim/ether.c index 395db801f..14b76c8b8 100644 --- a/platform/netsim/ether.c +++ b/platform/netsim/ether.c @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $Id: ether.c,v 1.5 2007/03/13 13:07:47 adamdunkels Exp $ + * $Id: ether.c,v 1.6 2007/03/22 18:59:34 adamdunkels Exp $ */ /** * \file @@ -107,13 +107,16 @@ static int strength; static int collisions = 1; static int num_collisions = 0; -static int num_packets = 0; +static int num_sent = 0; +static int num_received = 0; +static int drop_probability = 0; +static int num_drops = 0; #include static struct timeval t1; /*-----------------------------------------------------------------------------------*/ -void +int ether_print_stats(void) { unsigned long time; @@ -122,7 +125,20 @@ ether_print_stats(void) time = (t2.tv_sec * 1000 + t2.tv_usec / 1000) - (t1.tv_sec * 1000 + t1.tv_usec / 1000); - printf("%d, %d, %f\n", num_packets, num_collisions, time/1000.0); + /* printf("%d, %d, %f\n", num_packets, num_collisions, time/1000.0);*/ + printf("Time: %f\n", time/1000.0); + printf("Total packets sent: %d\n", num_sent); + printf("Total collisions: %d\n", num_collisions); + printf("Total packets receptions: %d\n", num_received); + printf("Total randomly dropped packets: %d\n", num_drops); + + return 0; +} +/*-----------------------------------------------------------------------------------*/ +void +ether_set_drop_probability(double p) +{ + drop_probability = p * 65536; } /*-----------------------------------------------------------------------------------*/ void @@ -204,8 +220,8 @@ ether_client_init(int port) } } /*-----------------------------------------------------------------------------------*/ -u16_t -ether_client_poll(u8_t *buf, int bufsize) +int +ether_client_poll(void) { int ret, len; fd_set fdset; @@ -216,7 +232,24 @@ ether_client_poll(u8_t *buf, int bufsize) FD_SET(sc, &fdset); tv.tv_sec = 0; - tv.tv_usec = 5000; + tv.tv_usec = 10000; + + return select(sc + 1, &fdset, NULL, NULL, &tv); +} +/*-----------------------------------------------------------------------------------*/ +u16_t +ether_client_read(u8_t *buf, int bufsize) +{ + int ret, len; + fd_set fdset; + struct timeval tv; + struct ether_hdr *hdr = (struct ether_hdr *)rxbuffer; + + FD_ZERO(&fdset); + FD_SET(sc, &fdset); + + tv.tv_sec = 0; + tv.tv_usec = 10000; ret = select(sc + 1, &fdset, NULL, NULL, &tv); @@ -365,7 +398,7 @@ ether_tick(void) range of this node. */ for(p = list_head(active_packets); p != NULL; p = p->next) { - num_packets++; + num_sent++; /* Update the node type. */ hdr = (struct ether_hdr *)p->data; @@ -402,13 +435,18 @@ ether_tick(void) if(interference) { num_collisions++; - printf("Collisions %d\n", num_collisions); + /* printf("Collisions %d\n", num_collisions);*/ } if(!interference) { /* printf("ether: delivering packet from %d to %d\n", hdr->srcid, port);*/ - send_packet(p->data, p->len, port); + if((unsigned int)((rand() * 17) % 65536) >= drop_probability) { + send_packet(p->data, p->len, port); + num_received++; + } else { + num_drops++; + } } } diff --git a/platform/netsim/ether.h b/platform/netsim/ether.h index 2be3a15e9..d2a2956ba 100644 --- a/platform/netsim/ether.h +++ b/platform/netsim/ether.h @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $Id: ether.h,v 1.4 2007/03/13 13:07:48 adamdunkels Exp $ + * $Id: ether.h,v 1.5 2007/03/22 18:59:34 adamdunkels Exp $ */ #ifndef __ETHER_H__ #define __ETHER_H__ @@ -59,7 +59,7 @@ void ether_client_init(int port); void ether_tick(void); -u16_t ether_client_poll(u8_t *buf, int len); +u16_t ether_client_read(u8_t *buf, int len); void ether_server_poll(void); void ether_put(char *packet, int len, int src_x, int src_y); @@ -75,8 +75,9 @@ clock_time_t ether_time(void); /*#define ETHER_STRENGTH 24*/ int ether_strength(void); void ether_set_strength(int s); - - void ether_set_collisions(int c); +void ether_set_drop_probability(double p); + +int ether_print_stats(void); #endif /* __ETHER_H__ */ diff --git a/platform/netsim/main.c b/platform/netsim/main.c index 74018bca8..087cb3873 100644 --- a/platform/netsim/main.c +++ b/platform/netsim/main.c @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $Id: main.c,v 1.4 2006/10/23 09:01:06 adamdunkels Exp $ + * $Id: main.c,v 1.5 2007/03/22 18:59:34 adamdunkels Exp $ */ /** @@ -111,7 +111,6 @@ start_node(int x, int y, int b) pid_t pid; static unsigned short port = NODES_PORTBASE; - pid = fork(); if(pid == 0) { @@ -121,18 +120,16 @@ start_node(int x, int y, int b) srandom(getpid()); - usleep(1000 * ((random() & 0x0f) << 6) ); + usleep(1000 * (rand() % 1000)); node_init(port - NODES_PORTBASE + 2, x, y, b); ethernode_init(port); - - contiki_main(b); /* NOTREACHED */ } - /* printf("Adding sensor %d at (%d,%d)\n", pid, x, y);*/ + /* printf("Adding sensor %d at (%d,%d)\n", pid, x, y);*/ main_process = 1; nodes_add(pid, x, y, port, port - NODES_PORTBASE + 2); @@ -163,8 +160,9 @@ main(int argc, char **argv) nodes_init(); atexit(nodes_kill); + atexit(ether_print_stats); - init(); + netsim_init(); ether_server_init(); diff --git a/platform/netsim/net/ethernode-rime.c b/platform/netsim/net/ethernode-rime.c index c8b8b091b..ea4baa3ad 100644 --- a/platform/netsim/net/ethernode-rime.c +++ b/platform/netsim/net/ethernode-rime.c @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $Id: ethernode-rime.c,v 1.3 2007/03/15 21:58:37 adamdunkels Exp $ + * $Id: ethernode-rime.c,v 1.4 2007/03/22 18:59:34 adamdunkels Exp $ */ #include "contiki.h" @@ -58,7 +58,7 @@ PROCESS_THREAD(ethernode_rime_process, ev, data) rimebuf_clear(); - len = ethernode_poll(rimebuf_dataptr(), RIMEBUF_SIZE); + len = ethernode_read(rimebuf_dataptr(), RIMEBUF_SIZE); if(len > 0) { diff --git a/platform/netsim/net/ethernode-uip.c b/platform/netsim/net/ethernode-uip.c index 38c974c24..80596d4cb 100644 --- a/platform/netsim/net/ethernode-uip.c +++ b/platform/netsim/net/ethernode-uip.c @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $Id: ethernode-uip.c,v 1.2 2007/03/15 21:59:10 adamdunkels Exp $ + * $Id: ethernode-uip.c,v 1.3 2007/03/22 18:59:34 adamdunkels Exp $ */ #include "contiki.h" @@ -65,7 +65,7 @@ PROCESS_THREAD(ethernode_uip_process, ev, data) PROCESS_WAIT_EVENT(); /* Poll Ethernet device to see if there is a frame avaliable. */ - uip_len = ethernode_poll(uip_buf, UIP_BUFSIZE); + uip_len = ethernode_read(uip_buf, UIP_BUFSIZE); if(uip_len > 0) { /* printf("%d: new packet len %d\n", node_id, uip_len);*/ diff --git a/platform/netsim/net/ethernode-uip.h b/platform/netsim/net/ethernode-uip.h index c3ea5b203..1663f0f46 100644 --- a/platform/netsim/net/ethernode-uip.h +++ b/platform/netsim/net/ethernode-uip.h @@ -29,7 +29,7 @@ * * Author: Adam Dunkels * - * $Id: ethernode-uip.h,v 1.1 2007/03/14 00:32:30 adamdunkels Exp $ + * $Id: ethernode-uip.h,v 1.2 2007/03/22 18:59:34 adamdunkels Exp $ */ #ifndef __ETHERNODE_UIP_H__ #define __ETHERNODE_UIP_H__ @@ -40,6 +40,4 @@ PROCESS_NAME(ethernode_uip_process); u8_t ethernode_uip_send(void); -u8_t ethernode_uip_send(void); - #endif /* __ETHERNODE_UIP_H__ */ diff --git a/platform/netsim/net/ethernode.c b/platform/netsim/net/ethernode.c index cf028eb55..c49b22c88 100644 --- a/platform/netsim/net/ethernode.c +++ b/platform/netsim/net/ethernode.c @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $Id: ethernode.c,v 1.5 2007/03/14 00:32:30 adamdunkels Exp $ + * $Id: ethernode.c,v 1.6 2007/03/22 18:59:34 adamdunkels Exp $ */ /** * \file @@ -122,13 +122,13 @@ ethernode_init(int port) */ /*-------------------------------------------------------------------------------*/ int -ethernode_poll(u8_t *buf, int bufsize) +ethernode_read(u8_t *buf, int bufsize) { int len; u8_t tmpbuf[UIP_BUFSIZE]; struct hdr *hdr = (struct hdr *)tmpbuf; - len = ether_client_poll(tmpbuf, UIP_BUFSIZE); + len = ether_client_read(tmpbuf, UIP_BUFSIZE); if(len == 0) { return 0; } diff --git a/platform/netsim/net/tapdev-drv.c b/platform/netsim/net/tapdev-drv.c index a83a51be0..e19f6a32c 100644 --- a/platform/netsim/net/tapdev-drv.c +++ b/platform/netsim/net/tapdev-drv.c @@ -40,7 +40,7 @@ PROCESS_THREAD(tapdev_drv_process, ev, data) uip_arp_arpin(); /* If the above function invocation resulted in data that should be sent out on the network, the global variable - uip_len is set to a value > 0. */ + uip_len is set to a value > 0. */ if(uip_len > 0) { tapdev_send_raw(); } diff --git a/platform/netsim/net/tapdev.c b/platform/netsim/net/tapdev.c index c0ddd9a08..b43df512c 100644 --- a/platform/netsim/net/tapdev.c +++ b/platform/netsim/net/tapdev.c @@ -1,37 +1,37 @@ /* * Copyright (c) 2001, Swedish Institute of Computer Science. - * All rights reserved. + * All rights reserved. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: + * 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. + * 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. + * 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. + * 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 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 * - * $Id: tapdev.c,v 1.1 2006/06/17 22:41:36 adamdunkels Exp $ + * $Id: tapdev.c,v 1.2 2007/03/22 18:59:34 adamdunkels Exp $ */ @@ -94,12 +94,12 @@ tapdev_poll(void) ret = select(fd + 1, &fdset, NULL, NULL, &tv); if(ret == 0) { return 0; - } - ret = read(fd, uip_buf, UIP_BUFSIZE); + } + ret = read(fd, uip_buf, UIP_BUFSIZE); if(ret == -1) { perror("tapdev_poll: read"); } - return ret; + return ret; } /*---------------------------------------------------------------------------*/ void @@ -125,9 +125,11 @@ tapdev_init(void) } #endif /* Linux */ - snprintf(buf, sizeof(buf), "ifconfig tap0 inet 192.168.2.1"); + snprintf(buf, sizeof(buf), "ifconfig tap0 inet 192.168.1.1"); system(buf); - printf("%s\n", buf); + snprintf(buf, sizeof(buf), "route add -net 172.16.0.0 192.168.1.2"); + system(buf); + printf("%s\n", buf); lasttime = 0; @@ -136,8 +138,8 @@ tapdev_init(void) } /*---------------------------------------------------------------------------*/ -static void -do_send(void) +static void +do_send(void) { int ret; char tmpbuf[UIP_BUFSIZE]; @@ -172,7 +174,7 @@ do_send(void) perror("tap_dev: tapdev_send: writev"); exit(1); } -} +} /*---------------------------------------------------------------------------*/ u8_t tapdev_send(void) diff --git a/platform/netsim/netsim-init.c b/platform/netsim/netsim-init.c index e8c399404..083b7415a 100644 --- a/platform/netsim/netsim-init.c +++ b/platform/netsim/netsim-init.c @@ -28,13 +28,13 @@ * * This file is part of the Contiki operating system. * - * @(#)$Id: netsim-init.c,v 1.1 2007/03/21 09:07:15 adamdunkels Exp $ + * @(#)$Id: netsim-init.c,v 1.2 2007/03/22 18:59:34 adamdunkels Exp $ */ #include "init.h" #include "random.h" void -init(void) +netsim_init(void) { int x, y; diff --git a/platform/netsim/node.c b/platform/netsim/node.c index a89871cff..d67580553 100644 --- a/platform/netsim/node.c +++ b/platform/netsim/node.c @@ -30,11 +30,12 @@ * * Author: Adam Dunkels * - * $Id: node.c,v 1.4 2007/03/13 13:07:48 adamdunkels Exp $ + * $Id: node.c,v 1.5 2007/03/22 18:59:34 adamdunkels Exp $ */ #include "node.h" #include "contiki.h" #include "net/uip.h" +#include "net/rime.h" #include #include @@ -58,11 +59,22 @@ node_init(int id, int posx, int posy, int b) /* node.type = NODE_TYPE_NORMAL;*/ if(b) { - uip_ipaddr(&addr, 192,168,250,2); + uip_ipaddr(&addr, 192,168,1,2); } else { - uip_ipaddr(&addr, 10,10,posx,posy); + uip_ipaddr(&addr, 172,16,posx,posy); + } uip_sethostaddr(&addr); + + { + rimeaddr_t nodeaddr; + + nodeaddr.u8[0] = posx; + nodeaddr.u8[1] = posy; + rimeaddr_set_node_addr(&nodeaddr); + } + + drift = random() % 95726272;