From eea7f463d737df423a7fd486732702d0e8332636 Mon Sep 17 00:00:00 2001 From: adamdunkels Date: Thu, 22 Mar 2007 18:58:40 +0000 Subject: [PATCH] Transmission of IP packets over mesh routing, implemented with Rime --- core/net/uip-over-mesh.c | 151 +++++++++++++++++++++++++++++++++++++++ core/net/uip-over-mesh.h | 47 ++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 core/net/uip-over-mesh.c create mode 100644 core/net/uip-over-mesh.h diff --git a/core/net/uip-over-mesh.c b/core/net/uip-over-mesh.c new file mode 100644 index 000000000..e34169e2f --- /dev/null +++ b/core/net/uip-over-mesh.c @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2007, 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 Contiki operating system. + * + * $Id: uip-over-mesh.c,v 1.1 2007/03/22 18:58:40 adamdunkels Exp $ + */ + +/** + * \file + * Code for tunnelling uIP packets over the mesh routing module + * \author + * Adam Dunkels + */ + +#include "net/hc.h" +#include "net/uip-fw.h" +#include "net/rime/route-discovery.h" +#include "net/rime/route.h" + +#define ROUTE_TIMEOUT CLOCK_SECOND * 4 + +static struct queuebuf *queued_packet; +static rimeaddr_t queued_receiver; +static struct route_discovery_conn route_discovery;; +static struct uc_conn dataconn; + +/*---------------------------------------------------------------------------*/ +static void +recv_data(struct uc_conn *c, rimeaddr_t *from) +{ + uip_len = rimebuf_copyto(&uip_buf[UIP_LLH_LEN]); + + /* uip_len = hc_inflate(&uip_buf[UIP_LLH_LEN], uip_len);*/ + + printf("%d.%d:recv_data\n", + rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1]); + tcpip_input(); +} +/*---------------------------------------------------------------------------*/ +static void +send_data(rimeaddr_t *next) +{ + printf("%d.%d:send_data\n", + rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1]); + uc_send(&dataconn, next); +} +/*---------------------------------------------------------------------------*/ +static void +new_route(struct route_discovery_conn *c, rimeaddr_t *to) +{ + struct route_entry *rt; + + if(queued_packet) { + queuebuf_to_rimebuf(queued_packet); + queuebuf_free(queued_packet); + queued_packet = NULL; + + rt = route_lookup(&queued_receiver); + if(rt) { + send_data(&queued_receiver); + } + } +} +/*---------------------------------------------------------------------------*/ +static void +timedout(struct route_discovery_conn *c) +{ + if(queued_packet) { + queuebuf_free(queued_packet); + } +} +/*---------------------------------------------------------------------------*/ +static const struct uc_callbacks data_callbacks = { recv_data }; +static const struct route_discovery_callbacks rdc = { new_route, timedout }; +/*---------------------------------------------------------------------------*/ +void +uip_over_mesh_init(u16_t channels) +{ + + /* printf("Our address is %d.%d (%d.%d.%d.%d)\n", + rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], + uip_hostaddr.u8[0], uip_hostaddr.u8[1], + uip_hostaddr.u8[2], uip_hostaddr.u8[3]); */ + + uc_open(&dataconn, channels, &data_callbacks); + route_discovery_open(&route_discovery, channels + 1, &rdc); + tcpip_set_forwarding(1); + +} +/*---------------------------------------------------------------------------*/ +u8_t +uip_over_mesh_send(void) +{ + rimeaddr_t receiver; + struct route_entry *rt; + + /* This function is called by the uip-fw module to send out an IP + packet. We try to send the IP packet to the next hop route, or we + queue the packet and send out a route request for the final + receiver of the packet. */ + + receiver.u16[0] = ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN])->destipaddr.u16[1]; + + printf("uIP over mesh send to %d.%d\n", receiver.u8[0], receiver.u8[1]); + + /* uip_len = hc_compress(&uip_buf[UIP_LLH_LEN], uip_len);*/ + + rimebuf_copyfrom(&uip_buf[UIP_LLH_LEN], uip_len); + + rt = route_lookup(&receiver); + if(rt == NULL) { + printf("uIP over mesh no route to %d.%d\n", receiver.u8[0], receiver.u8[1]); + if(queued_packet == NULL) { + queued_packet = queuebuf_new_from_rimebuf(); + rimeaddr_copy(&queued_receiver, &receiver); + route_discovery_discover(&route_discovery, &receiver, ROUTE_TIMEOUT); + } else if(!rimeaddr_cmp(&queued_receiver, &receiver)) { + route_discovery_discover(&route_discovery, &receiver, ROUTE_TIMEOUT); + } + } else { + send_data(&rt->nexthop); + } + return UIP_FW_OK; +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/uip-over-mesh.h b/core/net/uip-over-mesh.h new file mode 100644 index 000000000..6a2584448 --- /dev/null +++ b/core/net/uip-over-mesh.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2007, 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 Contiki operating system. + * + * $Id: uip-over-mesh.h,v 1.1 2007/03/22 18:58:40 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __UIP_OVER_MESH_H__ +#define __UIP_OVER_MESH_H__ + +void uip_over_mesh_init(u16_t channels); +u8_t uip_over_mesh_send(void); + +#endif /* __UIP-OVER-MESH_H__ */