diff --git a/core/net/rime/Makefile.rime b/core/net/rime/Makefile.rime new file mode 100644 index 000000000..d72da77c2 --- /dev/null +++ b/core/net/rime/Makefile.rime @@ -0,0 +1,2 @@ +CONTIKI_SOURCEFILES += rimebuf.c queuebuf.c ctimer.c neighbor.c rime.c \ + abc-udp.c ibc.c uc.c suc.c ruc.c sibc.c sabc.c ccsabc.c diff --git a/core/net/rime/abc-udp.c b/core/net/rime/abc-udp.c new file mode 100644 index 000000000..bcb95bbd1 --- /dev/null +++ b/core/net/rime/abc-udp.c @@ -0,0 +1,88 @@ +/* + * 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: abc-udp.c,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * Implementation of the Rime module Anonymous BroadCast (abc) using UDP local broadcast packets. + * \author + * Adam Dunkels + */ + +#include "net/rime.h" + +#define PORT 8096 + +static u8_t started; +/*---------------------------------------------------------------------------*/ +PROCESS(abc_udp_process, "abc_udp"); +PROCESS_THREAD(abc_udp_process, ev, data) +{ + struct abc_conn *c; + + + PROCESS_BEGIN(); + + while(1) { + PROCESS_WAIT_EVENT_UNTIL(ev == tcpip_event && uip_newdata()); + DEBUGF(0, "%d: abc_udp_process: new data %p\n", node_id, data); + c = data; + rimebuf_copyfrom(uip_appdata, uip_datalen()); + c->u->recv(c); + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +void +abc_setup(struct abc_conn *c, u16_t channel, + const struct abc_ulayer *u) +{ + if(!started) { + process_start(&abc_udp_process, NULL); + started = 1; + } + PROCESS_CONTEXT_BEGIN(&abc_udp_process); + c->c = udp_broadcast_new(HTONS(PORT + channel), c); + PROCESS_CONTEXT_END(&abc_udp_process); + c->u = u; +} +/*---------------------------------------------------------------------------*/ +int +abc_send(struct abc_conn *c) +{ + DEBUGF(0, "%d: abc_send\n", node_id); + uip_len = rimebuf_copyto(uip_buf); + uip_udp_packet_send(c->c, uip_buf, uip_len); + return 1; +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/abc.h b/core/net/rime/abc.h new file mode 100644 index 000000000..a2d2ddfb6 --- /dev/null +++ b/core/net/rime/abc.h @@ -0,0 +1,62 @@ +/* + * 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: abc.h,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * Header file for the Rime module Anonymous BroadCast (abc) + * \author + * Adam Dunkels + */ + +#ifndef __ABC_H__ +#define __ABC_H__ + +#include "contiki-net.h" +#include "net/rime/rimebuf.h" + +struct abc_conn; + +struct abc_ulayer { + void (* recv)(struct abc_conn *ptr); +}; + +struct abc_conn { + struct uip_udp_conn *c; + const struct abc_ulayer *u; +}; + +void abc_setup(struct abc_conn *c, u16_t channel, + const struct abc_ulayer *u); +int abc_send(struct abc_conn *c); + +#endif /* __BC_H__ */ diff --git a/core/net/rime/ccsabc.c b/core/net/rime/ccsabc.c new file mode 100644 index 000000000..242a281d5 --- /dev/null +++ b/core/net/rime/ccsabc.c @@ -0,0 +1,91 @@ +/* + * 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: ccsabc.c,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * Congestion-Controlled Stubborn Anonymous BroadCast (ccsabc) + * \author + * Adam Dunkels + */ + +#include "net/rime/ccsabc.h" + +#define STATE_LISTENPERIOD 0 +#define STATE_SENDINGPERIOD 1 + +/*---------------------------------------------------------------------------*/ +static void +recv_from_sabc(struct sabc_conn *sabc) +{ + struct ccsabc_conn *c = (struct ccsabc_conn *)sabc; + if(c->u->recv != NULL) { + c->u->recv(c); + } +} +/*---------------------------------------------------------------------------*/ +static void +sent_from_sabc(struct sabc_conn *sabc) +{ + struct ccsabc_conn *c = (struct ccsabc_conn *)sabc; + if(c->u->sent != NULL) { + c->u->sent(c); + } +} +/*---------------------------------------------------------------------------*/ +static const struct sabc_ulayer ccsabc = {recv_from_sabc, sent_from_sabc}; +/*---------------------------------------------------------------------------*/ +void +ccsabc_setup(struct ccsabc_conn *c, u16_t channel, + const struct ccsabc_ulayer *u) +{ + sabc_setup(&c->c, channel, &ccsabc); +} +/*---------------------------------------------------------------------------*/ +int +ccsabc_send_stubborn(struct ccsabc_conn *c, clock_time_t t) +{ + return sabc_send_stubborn(&c->c, t); +} +/*---------------------------------------------------------------------------*/ +void +ccsabc_cancel(struct ccsabc_conn *c) +{ + sabc_cancel(&c->c); +} +/*---------------------------------------------------------------------------*/ +void +ccsabc_set_timer(struct ccsabc_conn *c, clock_time_t t) +{ + sabc_set_timer(&c->c, t); +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/ccsabc.h b/core/net/rime/ccsabc.h new file mode 100644 index 000000000..be23968d7 --- /dev/null +++ b/core/net/rime/ccsabc.h @@ -0,0 +1,69 @@ +/* + * 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: ccsabc.h,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * Congestion-Controlled Stubborn Anonymous BroadCast (ccsabc) + * \author + * Adam Dunkels + */ + +#ifndef __CCSABC_H__ +#define __CCSABC_H__ + +#include "net/rime.h" +#include "net/rime/sabc.h" + +struct ccsabc_conn; + +struct ccsabc_ulayer { + void (* recv)(struct ccsabc_conn *c); + void (* sent)(struct ccsabc_conn *c); +}; + +struct ccsabc_conn { + struct sabc_conn conn; + const struct ccsabc_ulayer *u; + unsigned char state; + unsigned char c; +}; + +void ccsabc_setup(struct ccsabc_conn *c, u16_t channel, + const struct ccsabc_ulayer *u); + +int ccsabc_send_stubborn(struct ccsabc_conn *c, clock_time_t t); +void ccsabc_cancel(struct ccsabc_conn *c); + +void ccsabc_set_timer(struct ccsabc_conn *c, clock_time_t t); + +#endif /* __CCSABC_H__ */ diff --git a/core/net/rime/ctimer.c b/core/net/rime/ctimer.c new file mode 100644 index 000000000..aa1ff2038 --- /dev/null +++ b/core/net/rime/ctimer.c @@ -0,0 +1,114 @@ +/* + * 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: ctimer.c,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#include "net/rime/ctimer.h" +#include "contiki.h" +#include "lib/list.h" +#include "net/rime.h" + +LIST(ctimer_list); + +/*---------------------------------------------------------------------------*/ +PROCESS(ctimer_process, "ctimer process"); +PROCESS_THREAD(ctimer_process, ev, data) +{ + struct ctimer *c; + PROCESS_BEGIN(); + + list_init(ctimer_list); + + while(1) { + PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_TIMER); + for(c = list_head(ctimer_list); c != NULL; c = c->next) { + if(&c->etimer == data) { + list_remove(ctimer_list, c); + PROCESS_CONTEXT_BEGIN(c->p); + if(c->f != NULL) { + c->f(c->ptr); + } + PROCESS_CONTEXT_END(c->p); + break; + } + } + } + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +void +ctimer_init(void) +{ + process_start(&ctimer_process, NULL); +} +/*---------------------------------------------------------------------------*/ +void +ctimer_set(struct ctimer *c, clock_time_t t, + void (*f)(void *), void *ptr) +{ + DEBUGF(3, "ctimer_set %p %d\n", c, t); + c->p = PROCESS_CURRENT(); + c->f = f; + c->ptr = ptr; + + PROCESS_CONTEXT_BEGIN(&ctimer_process); + etimer_set(&c->etimer, t); + PROCESS_CONTEXT_END(&ctimer_process); + + list_remove(ctimer_list, c); + list_add(ctimer_list, c); +} +/*---------------------------------------------------------------------------*/ +void +ctimer_reset(struct ctimer *c) +{ + PROCESS_CONTEXT_BEGIN(&ctimer_process); + etimer_reset(&c->etimer); + PROCESS_CONTEXT_END(&ctimer_process); + + list_remove(ctimer_list, c); + list_add(ctimer_list, c); +} +/*---------------------------------------------------------------------------*/ +void +ctimer_stop(struct ctimer *c) +{ + etimer_stop(&c->etimer); + list_remove(ctimer_list, c); +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/ctimer.h b/core/net/rime/ctimer.h new file mode 100644 index 000000000..2ffeed6f2 --- /dev/null +++ b/core/net/rime/ctimer.h @@ -0,0 +1,62 @@ +/* + * 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: ctimer.h,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * Module which calls a function after a time + * \author + * Adam Dunkels + */ + +#ifndef __CTIMER_H__ +#define __CTIMER_H__ + +#include "sys/etimer.h" + +struct ctimer { + struct ctimer *next; + struct etimer etimer; + struct process *p; + void (*f)(void *); + void *ptr; +}; + +void ctimer_reset(struct ctimer *c); + +void ctimer_set(struct ctimer *c, clock_time_t t, + void (*f)(void *), void *ptr); +void ctimer_stop(struct ctimer *c); + +void ctimer_init(void); + +#endif /* __CTIMER_H__ */ diff --git a/core/net/rime/ibc.c b/core/net/rime/ibc.c new file mode 100644 index 000000000..21b3daa8c --- /dev/null +++ b/core/net/rime/ibc.c @@ -0,0 +1,81 @@ +/* + * 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: ibc.c,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#include "net/rime/ibc.h" +#include "net/rime.h" +#include + +struct ibc_hdr { + node_id_t sender_id; +}; + +/*---------------------------------------------------------------------------*/ +static void +recv_from_abc(struct abc_conn *bc) +{ + struct ibc_conn *c = (struct ibc_conn *)bc; + struct ibc_hdr *hdr = rimebuf_dataptr(); + rimebuf_hdrreduce(sizeof(struct ibc_hdr)); + DEBUGF(1, "%d: ibc: recv_from_bc\n", node_id); + c->u->recv(c, hdr->sender_id); +} +/*---------------------------------------------------------------------------*/ +static const struct abc_ulayer ibc = {recv_from_abc}; +/*---------------------------------------------------------------------------*/ +void +ibc_setup(struct ibc_conn *c, u16_t channel, + const struct ibc_ulayer *u) +{ + abc_setup(&c->c, channel, &ibc); + c->u = u; +} +/*---------------------------------------------------------------------------*/ +int +ibc_send(struct ibc_conn *c) +{ + DEBUGF(1, "%d: ibc_send\n", node_id); + if(rimebuf_hdrextend(sizeof(struct ibc_hdr))) { + struct ibc_hdr *hdr = rimebuf_hdrptr(); + hdr->sender_id = node_id; + return abc_send(&c->c); + } + return 0; +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/ibc.h b/core/net/rime/ibc.h new file mode 100644 index 000000000..77bb8b238 --- /dev/null +++ b/core/net/rime/ibc.h @@ -0,0 +1,62 @@ +/* + * 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: ibc.h,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __IBC_H__ +#define __IBC_H__ + +#include "net/rime/abc.h" +#include "net/rime/node-id-t.h" + +struct ibc_conn; + +struct ibc_ulayer { + void (* recv)(struct ibc_conn *ptr, node_id_t sender); +}; + +struct ibc_conn { + struct abc_conn c; + const struct ibc_ulayer *u; +}; + +void ibc_setup(struct ibc_conn *c, u16_t channel, + const struct ibc_ulayer *u); +int ibc_send(struct ibc_conn *c); + +#endif /* __IBC_H__ */ diff --git a/core/net/rime/neighbor.c b/core/net/rime/neighbor.c new file mode 100644 index 000000000..9c545378f --- /dev/null +++ b/core/net/rime/neighbor.c @@ -0,0 +1,207 @@ +/* + * 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: neighbor.c,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * Radio neighborhood management + * \author + * Adam Dunkels + */ + +#include + +#include "contiki.h" +#include "net/rime/neighbor.h" +#include "node-id.h" + +#define MAX_NEIGHBORS 5 + +#define HOPCOUNT_MAX 32 + +static struct neighbor neighbors[MAX_NEIGHBORS]; +/*---------------------------------------------------------------------------*/ +void +neighbor_periodic(int max_time) +{ + int i; + + for(i = 0; i < MAX_NEIGHBORS; ++i) { + if(neighbors[i].nodeid != 0 && + neighbors[i].time < max_time) { + neighbors[i].time++; + if(neighbors[i].time == max_time) { + neighbors[i].hopcount = HOPCOUNT_MAX; + /* printf("%d: removing old neighbor %d\n", node_id, neighbors[i].nodeid);*/ + neighbors[i].nodeid = 0; + } + } + } +} +/*---------------------------------------------------------------------------*/ +void +neighbor_init(void) +{ + int i; + + for(i = 0; i < MAX_NEIGHBORS; ++i) { + neighbors[i].nodeid = 0; + } +} +/*---------------------------------------------------------------------------*/ +struct neighbor * +neighbor_find(node_id_t nodeid) +{ + int i; + + for(i = 0; i < MAX_NEIGHBORS; ++i) { + if(neighbors[i].nodeid == nodeid) { + return &neighbors[i]; + } + } + return NULL; +} +/*---------------------------------------------------------------------------*/ +void +neighbor_update(struct neighbor *n, u8_t hopcount, u16_t signal) +{ + if(n != NULL) { + n->hopcount = hopcount; + n->signal = signal; + n->time = 0; + } +} +/*---------------------------------------------------------------------------*/ +void +neighbor_add(node_id_t nodeid, u8_t nhopcount, u16_t nsignal) +{ + int i, n; + u8_t hopcount; + u16_t signal; + + /* Find the first unused entry or the used entry with the highest + hopcount and lowest signal strength. */ + hopcount = 0; + signal = USHRT_MAX; + + for(i = 0; i < MAX_NEIGHBORS; ++i) { + if(neighbors[i].nodeid == 0 || + neighbors[i].nodeid == nodeid) { + n = i; + break; + } + if(neighbors[i].nodeid != 0) { + if(neighbors[i].hopcount > hopcount) { + hopcount = neighbors[i].hopcount; + signal = neighbors[i].signal; + n = i; + } else if(neighbors[i].hopcount == hopcount) { + if(neighbors[i].signal < signal) { + hopcount = neighbors[i].hopcount; + signal = neighbors[i].signal; + n = i; + /* printf("%d: found worst neighbor %d with hopcount %d, signal %d\n", + node_id, neighbors[n].nodeid, hopcount, signal);*/ + } + } + } + } + + + /* printf("%d: adding neighbor %d with hopcount %d, signal %d at %d\n", + node_id, neighbors[n].nodeid, hopcount, signal, n);*/ + + neighbors[n].time = 0; + neighbors[n].nodeid = nodeid; + neighbors[n].hopcount = nhopcount; + neighbors[n].signal = nsignal; +} +/*---------------------------------------------------------------------------*/ +void +neighbor_remove(node_id_t nodeid) +{ + int i; + + for(i = 0; i < MAX_NEIGHBORS; ++i) { + if(neighbors[i].nodeid == nodeid) { + printf("%d: removing %d @ %d\n", node_id, nodeid, i); + neighbors[i].nodeid = 0; + neighbors[i].hopcount = HOPCOUNT_MAX; + return; + } + } +} +/*---------------------------------------------------------------------------*/ +struct neighbor * +neighbor_best(void) +{ + int i, found; + int lowest, best; + u8_t hopcount; + u16_t signal; + + hopcount = HOPCOUNT_MAX; + lowest = 0; + found = 0; + + /* printf("%d: ", node_id);*/ + + /* Find the lowest hopcount. */ + for(i = 0; i < MAX_NEIGHBORS; ++i) { + /* printf("%d:%d ", neighbors[i].nodeid, neighbors[i].hopcount);*/ + if(neighbors[i].nodeid != 0 && + hopcount > neighbors[i].hopcount) { + hopcount = neighbors[i].hopcount; + lowest = i; + found = 1; + } + } + /* printf("\n");*/ + + /* Find the neighbor with highest signal strength of the ones that + have the lowest hopcount. */ + if(found) { + signal = 0; + best = lowest; + for(i = 0; i < MAX_NEIGHBORS; ++i) { + if(neighbors[i].nodeid != 0 && + hopcount == neighbors[i].hopcount && + neighbors[i].signal > signal) { + signal = neighbors[i].signal; + best = i; + } + } + return &neighbors[best]; + } + return NULL; +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/neighbor.h b/core/net/rime/neighbor.h new file mode 100644 index 000000000..ac5c87b3b --- /dev/null +++ b/core/net/rime/neighbor.h @@ -0,0 +1,67 @@ +/* + * 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: neighbor.h,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * Header file for the Contiki radio neighborhood management + * \author + * Adam Dunkels + */ + +#ifndef __NEIGHBOR_H__ +#define __NEIGHBOR_H__ + +#include "net/rime/node-id-t.h" + +struct neighbor { + u16_t signal; + u16_t time; + node_id_t nodeid; + u8_t hopcount; +}; + +void neighbor_init(void); +void neighbor_periodic(int max_time); + +void neighbor_add(node_id_t nodeid, u8_t hopcount, u16_t signal); +void neighbor_update(struct neighbor *n, u8_t hopcount, u16_t signal); + +void neighbor_remove(node_id_t nodeid); + +struct neighbor *neighbor_find(node_id_t nodeid); +struct neighbor *neighbor_best(void); + +#define NEIGHBOR_NODEID(n) ((n)->nodeid) + + +#endif /* __NEIGHBOR_H__ */ diff --git a/core/net/rime/node-id-t.h b/core/net/rime/node-id-t.h new file mode 100644 index 000000000..b80d51559 --- /dev/null +++ b/core/net/rime/node-id-t.h @@ -0,0 +1,50 @@ +/* + * 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: node-id-t.h,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __NODE_ID_T_H__ +#define __NODE_ID_T_H__ + +#include "contiki-net.h" + +typedef u16_t node_id_t; + +#include "node-id.h" + +#endif /* __NODE-ID_T_H__ */ diff --git a/core/net/rime/queuebuf.c b/core/net/rime/queuebuf.c new file mode 100644 index 000000000..c2b314d19 --- /dev/null +++ b/core/net/rime/queuebuf.c @@ -0,0 +1,116 @@ +/* + * 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: queuebuf.c,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#include "net/rime/queuebuf.h" + +#define QUEUEBUF_NUM 2 +#define QUEUEBUF_REF_NUM 2 + +struct queuebuf { + u16_t len; + u8_t data[NETBUF_SIZE + NETBUF_HDR_SIZE]; +}; + +struct queuebuf_ref { + u16_t len; + u8_t *ref; + u8_t hdr[NETBUF_HDR_SIZE]; + u8_t hdrlen; +}; + +MEMB(bufmem, struct queuebuf, QUEUEBUF_NUM); +MEMB(refbufmem, struct queuebuf_ref, QUEUEBUF_REF_NUM); +/*---------------------------------------------------------------------------*/ +void +queuebuf_init(void) +{ + memb_init(&bufmem); + memb_init(&refbufmem); +} +/*---------------------------------------------------------------------------*/ +struct queuebuf * +queuebuf_new_from_rimebuf(void) +{ + struct queuebuf *buf; + struct queuebuf_ref *rbuf; + + if(rimebuf_is_reference()) { + rbuf = memb_alloc(&refbufmem); + if(rbuf != NULL) { + rbuf->len = rimebuf_len(); + rbuf->ref = rimebuf_reference_ptr(); + rbuf->hdrlen = rimebuf_copyto_hdr(rbuf->hdr); + } + return (struct queuebuf *)rbuf; + } else { + buf = memb_alloc(&bufmem); + if(buf != NULL) { + buf->len = rimebuf_copyto(buf->data); + } + return buf; + } +} +/*---------------------------------------------------------------------------*/ +void +queuebuf_free(struct queuebuf *buf) +{ + if(memb_inmemb(&bufmem, buf)) { + memb_free(&bufmem, buf); + } else if(memb_inmemb(&refbufmem, buf)) { + memb_free(&refbufmem, buf); + } +} +/*---------------------------------------------------------------------------*/ +void +queuebuf_to_rimebuf(struct queuebuf *b) +{ + struct queuebuf_ref *r; + + if(memb_inmemb(&bufmem, b)) { + rimebuf_copyfrom(b->data, b->len); + } else if(memb_inmemb(&refbufmem, b)) { + r = (struct queuebuf_ref *)b; + rimebuf_clear(); + rimebuf_copyfrom(r->ref, r->len); + rimebuf_hdrextend(r->hdrlen); + memcpy(rimebuf_hdrptr(), r->hdr, r->hdrlen); + } +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/queuebuf.h b/core/net/rime/queuebuf.h new file mode 100644 index 000000000..6ac90290a --- /dev/null +++ b/core/net/rime/queuebuf.h @@ -0,0 +1,55 @@ +/* + * 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: queuebuf.h,v 1.1 2007/02/28 16:38:51 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __QUEUEBUF_H__ +#define __QUEUEBUF_H__ + +#include "net/rime/rimebuf.h" + +struct queuebuf; + +void queuebuf_init(void); + +struct queuebuf *queuebuf_new_from_rimebuf(void); +void queuebuf_free(struct queuebuf *b); +void queuebuf_from_rimebuf(struct queuebuf *b); +void queuebuf_to_rimebuf(struct queuebuf *b); + +#endif /* __QUEUEBUF_H__ */ diff --git a/core/net/rime/rbc.c b/core/net/rime/rbc.c new file mode 100644 index 000000000..1200a0352 --- /dev/null +++ b/core/net/rime/rbc.c @@ -0,0 +1,107 @@ +/* + * 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: rbc.c,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#include "net/rime/rbc.h" + +struct rbc_hdr { + u16_t seqno; + u16_t ackno; +}; + +PROCESS(rbc_process, "Reliable local broadcast"); +PROCESS_THREAD(rbc_process, ev, data) +{ + struct rbc_conn *c = (struct rbc_conn *)data; + u8_t *packet; + u16_t packetlen; + + PROCESS_BEGIN(); + + while(1) { + PROCESS_WAIT_UNTIL(ev == PROCESS_EVENT_COM && + llbc_received(&c->c, &packet, &packetlen)); + printf("rbc: received %p %d\n", packet, packetlen); + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +void +rbc_setup(struct rbc_conn *c, u16_t id) +{ + PROCESS_CONTEXT_BEGIN(&rbc_process); + llbc_setup(&c->c, id); + PROCESS_CONTEXT_END(&rbc_process); +} +/*---------------------------------------------------------------------------*/ +static int +send(struct rbc_conn *c, struct lcpbuf *buf) +{ + int r; + PROCESS_CONTEXT_BEGIN(&rbc_process); + r = llbc_send(&c->c, buf); + PROCESS_CONTEXT_END(&rbc_process); + return r; +} +/*---------------------------------------------------------------------------*/ +static int +all_acked(struct rbc_conn *c) +{ + return 0; +} +/*---------------------------------------------------------------------------*/ +int +rbc_send(struct rbc_conn *c, struct lcpbuf *buf) +{ + PT_BEGIN(&c->pt); + + send(c, buf); + + PT_WAIT_UNTIL(&c->pt, all_acked(c)); + + PT_END(&c->pt); +} +/*---------------------------------------------------------------------------*/ +int +rbc_received(struct rbc_conn *c, u8_t **data, u16_t *datalen) +{ + return llbc_received(c, data, datalen); +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/rbc.h b/core/net/rime/rbc.h new file mode 100644 index 000000000..ff8c79f69 --- /dev/null +++ b/core/net/rime/rbc.h @@ -0,0 +1,56 @@ +/* + * 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: rbc.h,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __RBC_H__ +#define __RBC_H__ + +#include "net/rime/abc.h" + +struct rbc_conn { + struct abc_conn c; + struct pt pt; + u16_t num_acked; +}; + +void rbc_setup(struct rbc_conn *c, u16_t channel); +int rbc_send(struct rbc_conn *c, struct lcpbuf *buf); +int rbc_received(struct rbc_conn *c, u8_t **data, u16_t *len); + +#endif /* __RBC_H__ */ diff --git a/core/net/rime/rime-debug.h b/core/net/rime/rime-debug.h new file mode 100644 index 000000000..8465f9282 --- /dev/null +++ b/core/net/rime/rime-debug.h @@ -0,0 +1,54 @@ +/* + * 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: rime-debug.h,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __RIME_DEBUG_H__ +#define __RIME_DEBUG_H__ + +#define DEBUG_LEVEL 0 + +#if DEBUG_LEVEL > 0 +#include +#define DEBUGF(level, ...) if(DEBUG_LEVEL <= level) {printf("%.*s %lu ", 6 - level, " ", clock_time() / CLOCK_SECOND); printf(__VA_ARGS__);} +#else +#define DEBUGF(level, ...) +#endif + + +#endif /* __RINE_DEBUG_H__ */ diff --git a/core/net/rime/rime.c b/core/net/rime/rime.c new file mode 100644 index 000000000..ba80183e8 --- /dev/null +++ b/core/net/rime/rime.c @@ -0,0 +1,50 @@ +/* + * 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: rime.c,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#include "net/rime.h" +/*---------------------------------------------------------------------------*/ +void +rime_init(void) +{ + ctimer_init(); + queuebuf_init(); + rimebuf_clear(); +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/rimebuf.c b/core/net/rime/rimebuf.c new file mode 100644 index 000000000..5961ef513 --- /dev/null +++ b/core/net/rime/rimebuf.c @@ -0,0 +1,193 @@ +/* + * 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: rimebuf.c,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#include + +#include "contiki-net.h" +#include "net/rime/rimebuf.h" +#include "net/rime.h" + + +static u16_t buflen, bufptr; +static u8_t rimebuf[NETBUF_SIZE]; + +static u8_t *rimebufptr; + +static u8_t hdrptr; +static u8_t rimebuf_hdr[NETBUF_HDR_SIZE]; + + +/*---------------------------------------------------------------------------*/ +void +rimebuf_clear(void) +{ + buflen = bufptr = 0; + hdrptr = NETBUF_HDR_SIZE; + + rimebufptr = rimebuf; +} +/*---------------------------------------------------------------------------*/ +int +rimebuf_copyfrom(u8_t *from, u16_t len) +{ + u16_t l; + + rimebuf_clear(); + l = len > NETBUF_SIZE? NETBUF_SIZE: len; + memcpy(rimebufptr, from, l); + buflen = l; + return l; +} +/*---------------------------------------------------------------------------*/ +int +rimebuf_copyto_hdr(u8_t *to) +{ + { + int i; + DEBUGF(0, "rimebuf_write_hdr: header:\n"); + for(i = hdrptr; i < NETBUF_HDR_SIZE; ++i) { + DEBUGF(0, "0x%02x, ", rimebuf_hdr[i]); + } + DEBUGF(0, "\n"); + } + memcpy(to, rimebuf_hdr + hdrptr, NETBUF_HDR_SIZE - hdrptr); + return NETBUF_HDR_SIZE - hdrptr; +} +/*---------------------------------------------------------------------------*/ +int +rimebuf_copyto(u8_t *to) +{ + { + int i; + char buffer[1000]; + char *bufferptr = buffer; + + bufferptr[0] = 0; + for(i = hdrptr; i < NETBUF_HDR_SIZE; ++i) { + bufferptr += sprintf(bufferptr, "0x%02x, ", rimebuf_hdr[i]); + } + DEBUGF(0, "rimebuf_write: header: %s\n", buffer); + bufferptr = buffer; + bufferptr[0] = 0; + for(i = bufptr; i < buflen + bufptr; ++i) { + bufferptr += sprintf(bufferptr, "0x%02x, ", rimebuf[i]); + } + DEBUGF(0, "rimebuf_write: data: %s\n", buffer); + } + memcpy(to, rimebuf_hdr + hdrptr, NETBUF_HDR_SIZE - hdrptr); + memcpy(to + NETBUF_HDR_SIZE - hdrptr, rimebufptr + bufptr, + buflen); + return NETBUF_HDR_SIZE - hdrptr + buflen; +} +/*---------------------------------------------------------------------------*/ +int +rimebuf_hdrextend(int size) +{ + if(hdrptr > size) { + hdrptr -= size; + return 1; + } + hdrptr = 0; + return 0; +} +/*---------------------------------------------------------------------------*/ +int +rimebuf_hdrreduce(int size) +{ + if(buflen < size) { + return 0; + } + + bufptr += size; + buflen -= size; + return 1; +} +/*---------------------------------------------------------------------------*/ +void +rimebuf_set_len(u16_t len) +{ + DEBUGF(0, "rimebuf_set_len: len %d\n", len); + buflen = len; +} +/*---------------------------------------------------------------------------*/ +void * +rimebuf_dataptr(void) +{ + return (void *)(&rimebuf[bufptr]); +} +/*---------------------------------------------------------------------------*/ +void * +rimebuf_hdrptr(void) +{ + return (void *)(&rimebuf_hdr[hdrptr]); +} +/*---------------------------------------------------------------------------*/ +void +rimebuf_reference(void *ptr, u16_t len) +{ + rimebuf_clear(); + rimebufptr = ptr; + buflen = len; +} +/*---------------------------------------------------------------------------*/ +int +rimebuf_is_reference(void) +{ + return rimebufptr != rimebuf; +} +/*---------------------------------------------------------------------------*/ +void * +rimebuf_reference_ptr(void) +{ + return rimebufptr; +} +/*---------------------------------------------------------------------------*/ +u16_t +rimebuf_len(void) +{ + return buflen; +} +/*---------------------------------------------------------------------------*/ +u8_t +rimebuf_hdrlen(void) +{ + return NETBUF_HDR_SIZE - hdrptr; +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/rimebuf.h b/core/net/rime/rimebuf.h new file mode 100644 index 000000000..9e0cc4d6d --- /dev/null +++ b/core/net/rime/rimebuf.h @@ -0,0 +1,74 @@ +/* + * 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: rimebuf.h,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __NETBUF_H__ +#define __NETBUF_H__ + +#include "contiki-net.h" + +#define NETBUF_SIZE 128 +#define NETBUF_HDR_SIZE 16 + +void *rimebuf_dataptr(void); +void *rimebuf_hdrptr(void); + +u8_t rimebuf_hdrlen(void); + +u16_t rimebuf_len(void); +void rimebuf_set_len(u16_t len); + +void rimebuf_reference(void *ptr, u16_t len); +int rimebuf_is_reference(void); +void *rimebuf_reference_ptr(void); + +int rimebuf_copyfrom(u8_t *from, u16_t len); + +int rimebuf_copyto(u8_t *to); +int rimebuf_copyto_hdr(u8_t *to); + + + +int rimebuf_hdrextend(int size); +int rimebuf_hdrreduce(int size); + +void rimebuf_clear(void); + + +#endif /* __NETBUF_H__ */ diff --git a/core/net/rime/ruc.c b/core/net/rime/ruc.c new file mode 100644 index 000000000..b27e57a02 --- /dev/null +++ b/core/net/rime/ruc.c @@ -0,0 +1,134 @@ +/* + * 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: ruc.c,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#include "net/rime/ruc.h" +#include "net/rime/neighbor.h" +#include "net/rime.h" +#include + +#define TYPE_DATA 0 +#define TYPE_ACK 1 + +struct ruc_hdr { + u8_t type; + u8_t seqno; +}; + +enum { + STATE_READY, + STATE_SENDING +}; + +static u8_t seqno; + +/*---------------------------------------------------------------------------*/ +static void +sent_by_suc(struct suc_conn *suc) +{ + +} +/*---------------------------------------------------------------------------*/ +static void +recv_from_suc(struct suc_conn *suc, node_id_t from_id) +{ + struct ruc_conn *c = (struct ruc_conn *)suc; + struct ruc_hdr *hdr = rimebuf_dataptr(); + + DEBUGF(4, "%d: ruc: recv_from_suc type %d seqno %d\n", node_id, + hdr->type, hdr->seqno); + + if(hdr->type == TYPE_ACK) { + if(hdr->seqno == seqno) { + DEBUGF(4, "%d: ruc: ACKed\n", node_id); + ++seqno; + suc_cancel(&c->c); + if(c->u->sent != NULL) { + c->u->sent(c); + } + } + } else if(hdr->type == TYPE_DATA) { + int send_ack = 1; + u16_t packet_seqno; + + packet_seqno = hdr->seqno; + + + rimebuf_hdrreduce(sizeof(struct ruc_hdr)); + if(c->u->recv != NULL) { + send_ack = c->u->recv(c, from_id, packet_seqno); + } + + if(send_ack) { + DEBUGF(4, "%d: ruc: Sending ACK to %d for %d\n", node_id, from_id, + packet_seqno); + rimebuf_clear(); + rimebuf_hdrextend(sizeof(struct ruc_hdr)); + hdr = rimebuf_hdrptr(); + hdr->type = TYPE_ACK; + hdr->seqno = packet_seqno; + suc_send_uc(&c->c, from_id); + } else { + DEBUGF(4, "%d: Not sending ACK\n", node_id); + } + } +} +/*---------------------------------------------------------------------------*/ +static const struct suc_ulayer ruc = {recv_from_suc, sent_by_suc}; +/*---------------------------------------------------------------------------*/ +void +ruc_setup(struct ruc_conn *c, u16_t channel, + const struct ruc_ulayer *u) +{ + suc_setup(&c->c, channel, &ruc); + c->u = u; +} +/*---------------------------------------------------------------------------*/ +int +ruc_send(struct ruc_conn *c, node_id_t receiver_id) +{ + if(rimebuf_hdrextend(sizeof(struct ruc_hdr))) { + struct ruc_hdr *hdr = rimebuf_hdrptr(); + hdr->type = TYPE_DATA; + hdr->seqno = seqno; + return suc_send_stubborn(&c->c, receiver_id); + } + return 0; +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/ruc.h b/core/net/rime/ruc.h new file mode 100644 index 000000000..a70095c82 --- /dev/null +++ b/core/net/rime/ruc.h @@ -0,0 +1,64 @@ +/* + * 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: ruc.h,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __RUC_H__ +#define __RUC_H__ + +#include "net/rime/suc.h" + +struct ruc_conn; + +struct ruc_ulayer { + int (* recv)(struct ruc_conn *c, node_id_t from, u8_t seqno); + void (* sent)(struct ruc_conn *c); +}; + +struct ruc_conn { + struct suc_conn c; + const struct ruc_ulayer *u; + u8_t state; +}; + +void ruc_setup(struct ruc_conn *c, u16_t channel, + const struct ruc_ulayer *u); + +int ruc_send(struct ruc_conn *c, node_id_t receiver_id); + +#endif /* __RRUC_H__ */ diff --git a/core/net/rime/sabc.c b/core/net/rime/sabc.c new file mode 100644 index 000000000..19338924c --- /dev/null +++ b/core/net/rime/sabc.c @@ -0,0 +1,107 @@ +/* + * 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: sabc.c,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * Implementation of the Rime module Stubborn Anonymous + * BroadCast (sabc) + * \author + * Adam Dunkels + */ + +#include "net/rime/sabc.h" +#include "net/rime.h" +#include + +/*---------------------------------------------------------------------------*/ +static void +recv_from_abc(struct abc_conn *abc) +{ + register struct sabc_conn *c = (struct sabc_conn *)abc; + /* DEBUGF(3, "sabc: recv_from_abc from %d\n", from_id);*/ + if(c->u->recv != NULL) { + c->u->recv(c); + } +} +/*---------------------------------------------------------------------------*/ +static const struct abc_ulayer sabc = {recv_from_abc}; +/*---------------------------------------------------------------------------*/ +void +sabc_setup(struct sabc_conn *c, u16_t channel, + const struct sabc_ulayer *u) +{ + abc_setup(&c->c, channel, &sabc); + c->u = u; +} +/*---------------------------------------------------------------------------*/ +static void +send(void *ptr) +{ + struct sabc_conn *c = ptr; + + /* DEBUGF(3, "sabc: send()\n");*/ + queuebuf_to_rimebuf(c->buf); + abc_send(&c->c); + ctimer_reset(&c->t); + if(c->u->sent != NULL) { + c->u->sent(c); + } +} +/*---------------------------------------------------------------------------*/ +void +sabc_set_timer(struct sabc_conn *c, clock_time_t t) +{ + ctimer_set(&c->t, t, send, c); +} +/*---------------------------------------------------------------------------*/ +int +sabc_send_stubborn(struct sabc_conn *c, clock_time_t t) +{ + if(c->buf != NULL) { + queuebuf_free(c->buf); + } + c->buf = queuebuf_new_from_rimebuf(); + if(c->buf == NULL) { + return 0; + } + ctimer_set(&c->t, t, send, c); + return 1; + +} +/*---------------------------------------------------------------------------*/ +void +sabc_cancel(struct sabc_conn *c) +{ + ctimer_stop(&c->t); +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/sabc.h b/core/net/rime/sabc.h new file mode 100644 index 000000000..0a1d0bb89 --- /dev/null +++ b/core/net/rime/sabc.h @@ -0,0 +1,149 @@ +/** + * \addtogroup rime + * @{ +*/ + +/** + * \defgroup rime-sabc Stubborn Anonymous best-effort local area BroadCast + * @{ + * + * The sabc module provides stubborn anonymous best-effort local area + * broadcast. A message sent with the sabc module is repeated until + * either the mssage is canceled or a new message is sent. Messages + * sent with the sabc module are not identified with a sender ID. + * + */ + +/* + * 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: sabc.h,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * Header file for the Rime module Stubborn Anonymous BroadCast (sabc) + * \author + * Adam Dunkels + */ + +#ifndef __SABC_H__ +#define __SABC_H__ + +#include "net/rime/uc.h" +#include "net/rime/ctimer.h" +#include "net/rime/queuebuf.h" + +struct sabc_conn; + +struct sabc_ulayer { + void (* recv)(struct sabc_conn *c); + void (* sent)(struct sabc_conn *c); +}; + +/** + * A sabc connection. This is an opaque structure with no user-visible + * fields. The sabc_setup() function is used for setting up a sabc + * connection. + */ +struct sabc_conn { + struct abc_conn c; + struct ctimer t; + struct queuebuf *buf; + const struct sabc_ulayer *u; +}; + + +/** + * \brief Set up a sabc connection. + * \param c A pointer to a user-supplied struct sabc variable. + * \param channel The Rime channel on which messages should be sent. + * \param u Pointer to the upper layer functions that should be used + * for this connection. + * + * This function sets up a sabc connection on the + * specified channel. No checks are made if the channel is + * currently used by another connection. + * + * This function must be called before any other function + * that operates on the connection is called. + * + */ +void sabc_setup(struct sabc_conn *c, u16_t channel, + const struct sabc_ulayer *u); + + +/** + * \brief Send a stubborn message. + * \param c A sabc connection that must have been previously set up + * with sabc_setup() + * \param t The time between message retransmissions. + * + * This function sends a message from the Rime buffer. The + * message must have been previously constructed in the + * Rime buffer. When this function returns, the message + * has been copied into a queue buffer. + * + * If another message has previously been sent, the old + * message is canceled. + * + */ +int sabc_send_stubborn(struct sabc_conn *c, clock_time_t t); + + +/** + * \brief Cancel the current stubborn message. + * \param c A sabc connection that must have been previously set up + * with sabc_setup() + * + * This function cancels a stubborn message that has + * previously been sent with the sabc_send_stubborn() + * function. + * + */ +void sabc_cancel(struct sabc_conn *c); + + + +/** + * \brief Set the retransmission time of the current stubborn message. + * \param c A sabc connection that must have been previously set up + * with sabc_setup() + * \param t The new time between message retransmissions. + * + * This function sets the retransmission timer for the + * current stubborn message to a new value. + * + */ +void sabc_set_timer(struct sabc_conn *c, clock_time_t t); + +#endif /* __SABC_H__ */ + +/** @} */ diff --git a/core/net/rime/sibc.c b/core/net/rime/sibc.c new file mode 100644 index 000000000..4fa7eab46 --- /dev/null +++ b/core/net/rime/sibc.c @@ -0,0 +1,106 @@ +/* + * 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: sibc.c,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * Implementation of the Rime module Stubborn Identified BroadCast (sibc) + * \author + * Adam Dunkels + */ + +#include "net/rime/sibc.h" +#include "net/rime.h" +#include + +/*---------------------------------------------------------------------------*/ +static void +recv_from_ibc(struct ibc_conn *ibc, node_id_t from_id) +{ + register struct sibc_conn *c = (struct sibc_conn *)ibc; + /* DEBUGF(3, "sibc: recv_from_ibc from %d\n", from_id);*/ + if(c->u->recv != NULL) { + c->u->recv(c, from_id); + } +} +/*---------------------------------------------------------------------------*/ +static const struct ibc_ulayer sibc = {recv_from_ibc}; +/*---------------------------------------------------------------------------*/ +void +sibc_setup(struct sibc_conn *c, u16_t channel, + const struct sibc_ulayer *u) +{ + ibc_setup(&c->c, channel, &sibc); + c->u = u; +} +/*---------------------------------------------------------------------------*/ +static void +send(void *ptr) +{ + struct sibc_conn *c = ptr; + + /* DEBUGF(3, "sibc: send()\n");*/ + queuebuf_to_rimebuf(c->buf); + ibc_send(&c->c); + ctimer_reset(&c->t); + if(c->u->sent != NULL) { + c->u->sent(c); + } +} +/*---------------------------------------------------------------------------*/ +void +sibc_set_timer(struct sibc_conn *c, clock_time_t t) +{ + ctimer_set(&c->t, t, send, c); +} +/*---------------------------------------------------------------------------*/ +int +sibc_send_stubborn(struct sibc_conn *c, clock_time_t t) +{ + if(c->buf != NULL) { + queuebuf_free(c->buf); + } + c->buf = queuebuf_new_from_rimebuf(); + if(c->buf == NULL) { + return 0; + } + ctimer_set(&c->t, t, send, c); + return 1; + +} +/*---------------------------------------------------------------------------*/ +void +sibc_cancel(struct sibc_conn *c) +{ + ctimer_stop(&c->t); +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/sibc.h b/core/net/rime/sibc.h new file mode 100644 index 000000000..e27fc8c73 --- /dev/null +++ b/core/net/rime/sibc.h @@ -0,0 +1,70 @@ +/* + * 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: sibc.h,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * Header file for the Rime module Stubborn Identified BroadCast (sibc) + * \author + * Adam Dunkels + */ + +#ifndef __SIBC_H__ +#define __SIBC_H__ + +#include "net/rime/uc.h" +#include "net/rime/ctimer.h" +#include "net/rime/queuebuf.h" + +struct sibc_conn; + +struct sibc_ulayer { + void (* recv)(struct sibc_conn *c, node_id_t from); + void (* sent)(struct sibc_conn *c); +}; + +struct sibc_conn { + struct ibc_conn c; + struct ctimer t; + struct queuebuf *buf; + const struct sibc_ulayer *u; +}; + +void sibc_setup(struct sibc_conn *c, u16_t channel, + const struct sibc_ulayer *u); + +int sibc_send_stubborn(struct sibc_conn *c, clock_time_t t); +void sibc_cancel(struct sibc_conn *c); + +void sibc_set_timer(struct sibc_conn *c, clock_time_t t); + +#endif /* __SIBC_H__ */ diff --git a/core/net/rime/suc.c b/core/net/rime/suc.c new file mode 100644 index 000000000..f1024b90a --- /dev/null +++ b/core/net/rime/suc.c @@ -0,0 +1,120 @@ +/* + * 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: suc.c,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#include "net/rime/suc.h" +#include "net/rime.h" +#include + +/*---------------------------------------------------------------------------*/ +static void +recv_from_uc(struct uc_conn *uc, node_id_t from_id) +{ + register struct suc_conn *c = (struct suc_conn *)uc; + DEBUGF(3, "%d: suc: recv_from_uc from %d %p\n", node_id, from_id, c); + if(c->u->recv != NULL) { + c->u->recv(c, from_id); + } +} +/*---------------------------------------------------------------------------*/ +static const struct uc_ulayer suc = {recv_from_uc}; +/*---------------------------------------------------------------------------*/ +void +suc_setup(struct suc_conn *c, u16_t channel, + const struct suc_ulayer *u) +{ + uc_setup(&c->c, channel, &suc); + c->u = u; +} +/*---------------------------------------------------------------------------*/ +static void +send(void *ptr) +{ + struct suc_conn *c = ptr; + + DEBUGF(3, "%d: suc: resend to %d\n", node_id, c->receiver_id); + queuebuf_to_rimebuf(c->buf); + uc_send(&c->c, c->receiver_id); + suc_set_timer(c, CLOCK_SECOND); + if(c->u->sent != NULL) { + c->u->sent(c); + } +} +/*---------------------------------------------------------------------------*/ +void +suc_set_timer(struct suc_conn *c, clock_time_t t) +{ + ctimer_set(&c->t, t, send, c); +} +/*---------------------------------------------------------------------------*/ +int +suc_send_stubborn(struct suc_conn *c, node_id_t receiver_id) +{ + if(c->buf != NULL) { + queuebuf_free(c->buf); + } + c->buf = queuebuf_new_from_rimebuf(); + if(c->buf == NULL) { + return 0; + } + c->receiver_id = receiver_id; + ctimer_set(&c->t, CLOCK_SECOND, send, c); + + DEBUGF(3, "%d: suc_send_stubborn to %d\n", node_id, c->receiver_id); + uc_send(&c->c, c->receiver_id); + if(c->u->sent != NULL) { + c->u->sent(c); + } + + return 1; + +} +/*---------------------------------------------------------------------------*/ +int +suc_send_uc(struct suc_conn *c, node_id_t receiver_id) +{ + return uc_send(&c->c, receiver_id); +} +/*---------------------------------------------------------------------------*/ +void +suc_cancel(struct suc_conn *c) +{ + ctimer_stop(&c->t); +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/suc.h b/core/net/rime/suc.h new file mode 100644 index 000000000..64e151a0e --- /dev/null +++ b/core/net/rime/suc.h @@ -0,0 +1,73 @@ +/* + * 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: suc.h,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __SUC_H__ +#define __SUC_H__ + +#include "net/rime/uc.h" +#include "net/rime/ctimer.h" +#include "net/rime/queuebuf.h" + +struct suc_conn; + +struct suc_ulayer { + void (* recv)(struct suc_conn *c, node_id_t from); + void (* sent)(struct suc_conn *c); +}; + +struct suc_conn { + struct uc_conn c; + struct ctimer t; + struct queuebuf *buf; + const struct suc_ulayer *u; + node_id_t receiver_id; +}; + +void suc_setup(struct suc_conn *c, u16_t channel, + const struct suc_ulayer *u); + +int suc_send_stubborn(struct suc_conn *c, node_id_t receiver_id); +void suc_cancel(struct suc_conn *c); + +int suc_send_uc(struct suc_conn *c, node_id_t receiver_id); + +void suc_set_timer(struct suc_conn *c, clock_time_t t); + +#endif /* __SUC_H__ */ diff --git a/core/net/rime/uc.c b/core/net/rime/uc.c new file mode 100644 index 000000000..d9fce6e46 --- /dev/null +++ b/core/net/rime/uc.c @@ -0,0 +1,84 @@ +/* + * 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: uc.c,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#include "net/rime.h" +#include "net/rime/uc.h" +#include + +struct uc_hdr { + node_id_t receiver_id; +}; + +/*---------------------------------------------------------------------------*/ +static void +recv_from_ibc(struct ibc_conn *ibc, node_id_t from_id) +{ + struct uc_conn *c = (struct uc_conn *)ibc; + struct uc_hdr *hdr = rimebuf_dataptr(); + DEBUGF(2, "%d: uc: recv_from_ibc, receiver id %d %p hdr %p\n", + node_id, hdr->receiver_id, c, hdr); + if(hdr->receiver_id == node_id) { + rimebuf_hdrreduce(sizeof(struct uc_hdr)); + c->u->recv(c, from_id); + } +} +/*---------------------------------------------------------------------------*/ +static const struct ibc_ulayer uc = {recv_from_ibc}; +/*---------------------------------------------------------------------------*/ +void +uc_setup(struct uc_conn *c, u16_t channel, + const struct uc_ulayer *u) +{ + ibc_setup(&c->c, channel, &uc); + c->u = u; +} +/*---------------------------------------------------------------------------*/ +int +uc_send(struct uc_conn *c, node_id_t receiver_id) +{ + DEBUGF(2, "%d: uc_send to %d\n", node_id, receiver_id); + if(rimebuf_hdrextend(sizeof(struct uc_hdr))) { + struct uc_hdr *hdr = rimebuf_hdrptr(); + hdr->receiver_id = receiver_id; + return ibc_send(&c->c); + } + return 0; +} +/*---------------------------------------------------------------------------*/ diff --git a/core/net/rime/uc.h b/core/net/rime/uc.h new file mode 100644 index 000000000..8d5ca8e91 --- /dev/null +++ b/core/net/rime/uc.h @@ -0,0 +1,61 @@ +/* + * 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: uc.h,v 1.1 2007/02/28 16:38:52 adamdunkels Exp $ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + */ + +#ifndef __UC_H__ +#define __UC_H__ + +#include "net/rime/ibc.h" + +struct uc_conn; + +struct uc_ulayer { + void (* recv)(struct uc_conn *c, node_id_t from_id); +}; + +struct uc_conn { + struct ibc_conn c; + const struct uc_ulayer *u; +}; + +void uc_setup(struct uc_conn *c, u16_t channel, + const struct uc_ulayer *u); +int uc_send(struct uc_conn *c, node_id_t receiver_id); + +#endif /* __UC_H__ */