Contiki 2.6

uaodv-rt.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2006, Swedish Institute of Computer Science.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the Institute nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  *
00029  * This file is part of the Contiki operating system.
00030  *
00031  * $Id: uaodv-rt.c,v 1.8 2010/10/19 18:29:04 adamdunkels Exp $
00032  */
00033 
00034 /**
00035  * \file
00036  *         Routing tables for the micro implementation of the AODV ad hoc routing protocol
00037  * \author
00038  *         Adam Dunkels <adam@sics.se>
00039  */
00040 
00041 
00042 #include "net/uaodv-rt.h"
00043 #include "contiki-net.h"
00044 
00045 #ifndef UAODV_NUM_RT_ENTRIES
00046 #define UAODV_NUM_RT_ENTRIES 8
00047 #endif
00048 
00049 /*
00050  * LRU (with respect to insertion time) list of route entries.
00051  */
00052 LIST(route_table);
00053 MEMB(route_mem, struct uaodv_rt_entry, UAODV_NUM_RT_ENTRIES);
00054 
00055 /*---------------------------------------------------------------------------*/
00056 void
00057 uaodv_rt_init(void)
00058 {
00059   list_init(route_table);
00060   memb_init(&route_mem);
00061 }
00062 /*---------------------------------------------------------------------------*/
00063 struct uaodv_rt_entry *
00064 uaodv_rt_add(uip_ipaddr_t *dest, uip_ipaddr_t *nexthop,
00065              unsigned hop_count, const uint32_t *seqno)
00066 {
00067   struct uaodv_rt_entry *e;
00068 
00069   /* Avoid inserting duplicate entries. */
00070   e = uaodv_rt_lookup_any(dest);
00071   if(e != NULL) {
00072     list_remove(route_table, e);    
00073   } else {
00074     /* Allocate a new entry or reuse the oldest. */
00075     e = memb_alloc(&route_mem);
00076     if(e == NULL) {
00077       e = list_chop(route_table); /* Remove oldest entry. */
00078     }
00079   }
00080 
00081   uip_ipaddr_copy(&e->dest, dest);
00082   uip_ipaddr_copy(&e->nexthop, nexthop);
00083   e->hop_count = hop_count;
00084   e->hseqno = uip_ntohl(*seqno);
00085   e->is_bad = 0;
00086 
00087   /* New entry goes first. */
00088   list_push(route_table, e);
00089 
00090   return e;
00091 }
00092 /*---------------------------------------------------------------------------*/
00093 struct uaodv_rt_entry *
00094 uaodv_rt_lookup_any(uip_ipaddr_t *dest)
00095 {
00096   struct uaodv_rt_entry *e;
00097 
00098   for(e = list_head(route_table); e != NULL; e = e->next) {
00099     if(uip_ipaddr_cmp(dest, &e->dest)) {
00100       return e;
00101     }
00102   }
00103   return NULL;
00104 }
00105 
00106 struct uaodv_rt_entry *
00107 uaodv_rt_lookup(uip_ipaddr_t *dest)
00108 {
00109   struct uaodv_rt_entry *e;
00110 
00111   e = uaodv_rt_lookup_any(dest);
00112   if(e != NULL && e->is_bad)
00113     return NULL;
00114   return e;
00115 }
00116 /*---------------------------------------------------------------------------*/
00117 #if 0
00118 void
00119 uaodv_rt_remove(struct uaodv_rt_entry *e)
00120 {
00121   list_remove(route_table, e);
00122   memb_free(&route_mem, e);
00123 }
00124 #endif
00125 
00126 void
00127 uaodv_rt_lru(struct uaodv_rt_entry *e)
00128 {
00129   if(e != list_head(route_table)) {
00130     list_remove(route_table, e);
00131     list_push(route_table, e);
00132   }
00133 }
00134 /*---------------------------------------------------------------------------*/
00135 void
00136 uaodv_rt_flush_all(void)
00137 {
00138   struct uaodv_rt_entry *e;
00139 
00140   while (1) {
00141     e = list_pop(route_table);
00142     if(e != NULL)
00143       memb_free(&route_mem, e);
00144     else
00145       break;
00146   }
00147 }