b2052e26695f5a7d880da0055a0021bbff56c70f
[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.1 2004/11/05 20:58:10 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
39   for(i = 0; i < HASHSIZE; i++)
40     {
41       for (neigh = neighbortable[i].next;
42            neigh != &neighbortable[i];
43            neigh = neigh->next)
44         { 
45           // memorize previous MPR status
46
47           neigh->was_mpr = neigh->is_mpr;
48
49           // clear current MPR status
50
51           neigh->is_mpr = OLSR_FALSE;
52
53           // in this pass we are only interested in WILL_ALWAYS neighbours
54
55           if(neigh->status == NOT_SYM ||
56              neigh->willingness != WILL_ALWAYS)
57             continue;
58
59           neigh->is_mpr = OLSR_TRUE;
60
61           if (neigh->is_mpr != neigh->was_mpr)
62             changes = OLSR_TRUE;
63         }
64     }
65
66   for(i = 0; i < HASHSIZE; i++)
67     {
68       // loop through all 2-hop neighbours
69
70       for (neigh2 = two_hop_neighbortable[i].next;
71            neigh2 != &two_hop_neighbortable[i];
72            neigh2 = neigh2->next)
73         {
74           // find the connecting 1-hop neighbour with the
75           // best total link quality
76
77           neigh = NULL;
78           best = 0.0;
79
80           for (walker = neigh2->neighbor_2_nblist.next;
81                walker != &neigh2->neighbor_2_nblist;
82                walker = walker->next)
83             if (walker->full_link_quality >= best)
84               {
85                 neigh = walker->neighbor;
86                 best = walker->full_link_quality;
87               }
88
89           neigh->is_mpr = OLSR_TRUE;
90
91           if (neigh->is_mpr != neigh->was_mpr)
92             changes = OLSR_TRUE;
93         }
94     }
95 }
96 #endif