diff --git a/core/net/rime/Makefile.rime b/core/net/rime/Makefile.rime index e1342a6c6..61536df7b 100644 --- a/core/net/rime/Makefile.rime +++ b/core/net/rime/Makefile.rime @@ -1,6 +1,6 @@ CONTIKI_SOURCEFILES += rimebuf.c queuebuf.c rimeaddr.c ctimer.c rime.c \ rimestats.c ibc.c uc.c suc.c ruc.c sibc.c sabc.c abc.c nf.c \ - mh.c rmh.c rucb.c polite.c ipolite.c \ + mh.c rmh.c rucb.c polite.c ipolite.c nbh.c \ mesh.c route.c route-discovery.c \ tree.c neighbor.c \ trickle.c \ diff --git a/core/net/rime/nbh.c b/core/net/rime/nbh.c new file mode 100644 index 000000000..ede880e5e --- /dev/null +++ b/core/net/rime/nbh.c @@ -0,0 +1,163 @@ +/** + * \addtogroup rimenbh + * @{ + */ + +/* + * Copyright (c) 2006, 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: nbh.c,v 1.1 2007/11/13 21:01:54 adamdunkels Exp $ + */ + +/** + * \file + * Neighborhood discovery + * \author + * Adam Dunkels + */ + +#include "contiki.h" + +#include "net/rime.h" +#include "net/rime/neighbor.h" +#include "net/rime/nf.h" +#include "net/rime/nbh.h" + +#include "dev/radio-sensor.h" + +#if NETSIM +#include "ether.h" +#endif + +#include +#include +#include + +struct adv_msg { + u16_t val; +}; + +#define SINK 0 +#define HOPCOUNT_MAX TREE_MAX_DEPTH + +#define MAX_HOPLIM 10 + +#define MAX_INTERVAL CLOCK_SECOND * 20 +#define MIN_INTERVAL CLOCK_SECOND * 10 + +#define DEBUG 0 +#if DEBUG +#include +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif + +/*---------------------------------------------------------------------------*/ +static void +send_adv(struct nbh_conn *c, clock_time_t interval) +{ + struct adv_msg *hdr; + + rimebuf_clear(); + rimebuf_set_datalen(sizeof(struct adv_msg)); + hdr = rimebuf_dataptr(); + hdr->val = c->val; + ibc_send(&c->c); + if(c->u->sent) { + c->u->sent(c); + } +} +/*---------------------------------------------------------------------------*/ +static void +adv_packet_received(struct ibc_conn *ibc, rimeaddr_t *from) +{ + struct nbh_conn *c = (struct nbh_conn *)ibc; + struct adv_msg *msg = rimebuf_dataptr(); + struct neighbor *n; + + PRINTF("%d.%d: adv_packet_received from %d.%d with val %d\n", + rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], + from->u8[0], from->u8[1], msg->val); + +/* n = neighbor_find(from); */ + +/* if(n == NULL) { */ +/* neighbor_add(from, msg->val, radio_sensor.value(1)); */ +/* } else { */ +/* neighbor_update(n, msg->val, radio_sensor.value(1)); */ +/* PRINTF("%d.%d: updating neighbor %d.%d, radio sensor %d, hops %d\n", */ +/* rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], */ +/* n->addr.u8[0], n->addr.u8[1], */ +/* radio_sensor.value(1), msg->val); */ +/* } */ + + if(c->u->recv) { + c->u->recv(c, from, msg->val); + } +} +/*---------------------------------------------------------------------------*/ +static void +send_timer(void *ptr) +{ + struct nbh_conn *tc = ptr; + + send_adv(tc, MAX_INTERVAL / 2); + ctimer_set(&tc->t, + MIN_INTERVAL + random_rand() % (MAX_INTERVAL - MIN_INTERVAL), + send_timer, tc); +} +/*---------------------------------------------------------------------------*/ +static const struct ibc_callbacks ibc_callbacks = + {adv_packet_received}; +/*---------------------------------------------------------------------------*/ +void +nbh_open(struct nbh_conn *c, u16_t channel, + const struct nbh_callbacks *cb) +{ + ibc_open(&c->c, channel, &ibc_callbacks); + c->u = cb; +} +/*---------------------------------------------------------------------------*/ +void +nbh_close(struct nbh_conn *c) +{ + ibc_close(&c->c); + ctimer_stop(&c->t); +} +/*---------------------------------------------------------------------------*/ +void +nbh_start(struct nbh_conn *c, u16_t val) +{ + c->val = val; + ctimer_set(&c->t, random_rand() % MIN_INTERVAL, send_timer, c); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/core/net/rime/nbh.h b/core/net/rime/nbh.h new file mode 100644 index 000000000..ad6c06d5f --- /dev/null +++ b/core/net/rime/nbh.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2006, 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: nbh.h,v 1.1 2007/11/13 21:01:54 adamdunkels Exp $ + */ + +/** + * \file + * Neighborhood discovery header file + * \author + * Adam Dunkels + */ + +#ifndef __NBH_H__ +#define __NBH_H__ + +#include "net/rime/ibc.h" + +struct nbh_conn; + +struct nbh_callbacks { + int (* recv)(struct nbh_conn *c, rimeaddr_t *from, uint16_t val); + void (* sent)(struct nbh_conn *c); +}; + +struct nbh_conn { + struct ibc_conn c; + const struct nbh_callbacks *u; + struct ctimer t; + uint16_t val; +}; + +void nbh_open(struct nbh_conn *c, uint16_t channel, + const struct nbh_callbacks *u); +void nbh_close(struct nbh_conn *c); + +void nbh_start(struct nbh_conn *c, uint16_t val); + +#endif /* __NBH_H__ */