From 5243d58ac5861745790e1ab4ee72b5ec0d58c1c5 Mon Sep 17 00:00:00 2001 From: adamdunkels Date: Sun, 9 Nov 2008 12:20:56 +0000 Subject: [PATCH] Added logic for announcing that a network has a gateway to the outside world (with the function uip_over_mesh_make_announced_gateway()). The announced gateway sends a trickle message to the network, containing the address of the gateway. Other nodes will then know that packets destined to the outside world should go through the gateway node. --- core/net/uip-over-mesh.c | 54 +++++++++++++++++++++++++++++++++++++++- core/net/uip-over-mesh.h | 4 ++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/core/net/uip-over-mesh.c b/core/net/uip-over-mesh.c index e3057d533..bc8bb64bc 100644 --- a/core/net/uip-over-mesh.c +++ b/core/net/uip-over-mesh.c @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * $Id: uip-over-mesh.c,v 1.9 2008/06/26 11:19:40 adamdunkels Exp $ + * $Id: uip-over-mesh.c,v 1.10 2008/11/09 12:20:56 adamdunkels Exp $ */ /** @@ -42,16 +42,26 @@ #include "net/hc.h" #include "net/uip-fw.h" +#include "net/uip-over-mesh.h" #include "net/rime/route-discovery.h" #include "net/rime/route.h" +#include "net/rime/trickle.h" #define ROUTE_TIMEOUT CLOCK_SECOND * 4 static struct queuebuf *queued_packet; static rimeaddr_t queued_receiver; + + /* Connection for route discovery: */ static struct route_discovery_conn route_discovery; + +/* Connection for sending data packets to the next hop node: */ static struct unicast_conn dataconn; +/* Connection for sending gateway announcement message to the entire + network: */ +static struct trickle_conn gateway_announce_conn; + #define DEBUG 0 #if DEBUG #include @@ -121,6 +131,45 @@ timedout(struct route_discovery_conn *c) static const struct unicast_callbacks data_callbacks = { recv_data }; static const struct route_discovery_callbacks rdc = { new_route, timedout }; /*---------------------------------------------------------------------------*/ +struct gateway_msg { + rimeaddr_t gateway; +}; + +static uint8_t is_gateway; + +static void +gateway_announce_recv(struct trickle_conn *c) +{ + struct gateway_msg *msg; + msg = rimebuf_dataptr(); + PRINTF("%d.%d: gateway message: %d.%d\n", + rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], + msg->gateway.u8[0], msg->gateway.u8[1]); + + if(!is_gateway) { + uip_over_mesh_set_gateway(&msg->gateway); + } + +} +/*---------------------------------------------------------------------------*/ +void +uip_over_mesh_make_announced_gateway(void) +{ + struct gateway_msg msg; + /* Make this node the gateway node, unless it already is the + gateway. */ + if(!is_gateway) { + PRINTF("%d.%d: making myself the gateway\n", + rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1]); + uip_over_mesh_set_gateway(&rimeaddr_node_addr); + rimeaddr_copy(&(msg.gateway), &rimeaddr_node_addr); + rimebuf_copyfrom(&msg, sizeof(struct gateway_msg)); + trickle_send(&gateway_announce_conn); + is_gateway = 1; + } +} +const static struct trickle_callbacks trickle_call = {gateway_announce_recv}; +/*---------------------------------------------------------------------------*/ void uip_over_mesh_init(u16_t channels) { @@ -133,6 +182,9 @@ uip_over_mesh_init(u16_t channels) unicast_open(&dataconn, channels, &data_callbacks); route_discovery_open(&route_discovery, CLOCK_SECOND / 4, channels + 1, &rdc); + trickle_open(&gateway_announce_conn, CLOCK_SECOND * 4, channels + 3, + &trickle_call); + /* tcpip_set_forwarding(1);*/ } diff --git a/core/net/uip-over-mesh.h b/core/net/uip-over-mesh.h index 436f2adac..fa241387d 100644 --- a/core/net/uip-over-mesh.h +++ b/core/net/uip-over-mesh.h @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * $Id: uip-over-mesh.h,v 1.2 2008/02/03 20:56:07 adamdunkels Exp $ + * $Id: uip-over-mesh.h,v 1.3 2008/11/09 12:20:56 adamdunkels Exp $ */ /** @@ -52,4 +52,6 @@ void uip_over_mesh_set_gateway_netif(struct uip_fw_netif *netif); void uip_over_mesh_set_gateway(rimeaddr_t *gw); void uip_over_mesh_set_net(uip_ipaddr_t *addr, uip_ipaddr_t *mask); +void uip_over_mesh_make_announced_gateway(void); + #endif /* __UIP-OVER-MESH_H__ */