9d6fa1b18e92d310d2be7fca25255111a8b07c5e
[olsrd.git] / src / lq_mpr.c
1 /* 
2  * OLSR ad-hoc routing table management protocol
3  * Copyright (C) 2004 Thomas Lopatic (thomas@lopatic.de)
4  *
5  * This file is part of the olsr.org OLSR daemon.
6  *
7  * olsr.org is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * olsr.org is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with olsr.org; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  * $Id: lq_mpr.c,v 1.4 2004/11/08 23:25:57 tlopatic Exp $
22  *
23  */
24
25 #if defined USE_LINK_QUALITY
26 #include "defs.h"
27 #include "neighbor_table.h"
28 #include "two_hop_neighbor_table.h"
29 #include "lq_mpr.h"
30
31 void olsr_calculate_lq_mpr(void)
32 {
33   struct neighbor_2_entry *neigh2;
34   struct neighbor_list_entry *walker;
35   int i;
36   struct neighbor_entry *neigh;
37   double best;
38   olsr_bool mpr_changes = OLSR_FALSE;
39
40   for(i = 0; i < HASHSIZE; i++)
41     {
42       for (neigh = neighbortable[i].next;
43            neigh != &neighbortable[i];
44            neigh = neigh->next)
45         { 
46           // memorize previous MPR status
47
48           neigh->was_mpr = neigh->is_mpr;
49
50           // clear current MPR status
51
52           neigh->is_mpr = OLSR_FALSE;
53
54           // in this pass we are only interested in WILL_ALWAYS neighbours
55
56           if(neigh->status == NOT_SYM ||
57              neigh->willingness != WILL_ALWAYS)
58             continue;
59
60           neigh->is_mpr = OLSR_TRUE;
61
62           if (neigh->is_mpr != neigh->was_mpr)
63             mpr_changes = OLSR_TRUE;
64         }
65     }
66
67   for(i = 0; i < HASHSIZE; i++)
68     {
69       // loop through all 2-hop neighbours
70
71       for (neigh2 = two_hop_neighbortable[i].next;
72            neigh2 != &two_hop_neighbortable[i];
73            neigh2 = neigh2->next)
74         {
75           // check whether this 2-hop neighbour is also a neighbour
76
77           neigh = olsr_lookup_neighbor_table(&neigh2->neighbor_2_addr);
78
79           // it it's a neighbour and also symmetric, then skip it
80           
81           if (neigh != NULL && neigh->status == SYM)
82             continue;
83
84           // find the connecting 1-hop neighbour with the
85           // best total link quality
86
87           neigh = NULL;
88           best = -1.0;
89
90           for (walker = neigh2->neighbor_2_nblist.next;
91                walker != &neigh2->neighbor_2_nblist;
92                walker = walker->next)
93             if (walker->neighbor->status == SYM &&
94                 walker->full_link_quality > best)
95               {
96                 neigh = walker->neighbor;
97                 best = walker->full_link_quality;
98               }
99
100           if (neigh != NULL)
101             {
102               neigh->is_mpr = OLSR_TRUE;
103           
104               if (neigh->is_mpr != neigh->was_mpr)
105                 mpr_changes = OLSR_TRUE;
106             }
107         }
108     }
109
110   if (mpr_changes && olsr_cnf->tc_redundancy > 0)
111     changes = OLSR_TRUE;
112 }
113 #endif