[packages] quagga: Fix OLSR recursive nexthop selection
[packages.git] / net / quagga / patches / 120-quagga_manet.patch
1 --- a/lib/log.c
2 +++ b/lib/log.c
3 @@ -929,13 +929,19 @@ proto_redistnum(int afi, const char *s)
4         return ZEBRA_ROUTE_STATIC;
5        else if (strncmp (s, "r", 1) == 0)
6         return ZEBRA_ROUTE_RIP;
7 -      else if (strncmp (s, "o", 1) == 0)
8 +      else if (strncmp (s, "os", 2) == 0)
9         return ZEBRA_ROUTE_OSPF;
10        else if (strncmp (s, "i", 1) == 0)
11         return ZEBRA_ROUTE_ISIS;
12        else if (strncmp (s, "bg", 2) == 0)
13         return ZEBRA_ROUTE_BGP;
14 -      else if (strncmp (s, "ba", 2) == 0)
15 +      else if (strncmp (s, "h", 1) == 0)
16 +       return ZEBRA_ROUTE_HSLS;
17 +      else if (strncmp (s, "ol", 2) == 0)
18 +       return ZEBRA_ROUTE_OLSR;
19 +      else if (strncmp (s, "bat", 3) == 0)
20 +       return ZEBRA_ROUTE_BATMAN;
21 +      else if (strncmp (s, "bab", 3) == 0)
22         return ZEBRA_ROUTE_BABEL;
23      }
24    if (afi == AFI_IP6)
25 @@ -948,13 +954,19 @@ proto_redistnum(int afi, const char *s)
26         return ZEBRA_ROUTE_STATIC;
27        else if (strncmp (s, "r", 1) == 0)
28         return ZEBRA_ROUTE_RIPNG;
29 -      else if (strncmp (s, "o", 1) == 0)
30 +      else if (strncmp (s, "os", 2) == 0)
31         return ZEBRA_ROUTE_OSPF6;
32        else if (strncmp (s, "i", 1) == 0)
33         return ZEBRA_ROUTE_ISIS;
34        else if (strncmp (s, "bg", 2) == 0)
35         return ZEBRA_ROUTE_BGP;
36 -      else if (strncmp (s, "ba", 2) == 0)
37 +      else if (strncmp (s, "h", 1) == 0)
38 +       return ZEBRA_ROUTE_HSLS;
39 +      else if (strncmp (s, "ol", 2) == 0)
40 +       return ZEBRA_ROUTE_OLSR;
41 +      else if (strncmp (s, "bat", 3) == 0)
42 +       return ZEBRA_ROUTE_BATMAN;
43 +      else if (strncmp (s, "bab", 3) == 0)
44         return ZEBRA_ROUTE_BABEL;
45      }
46    return -1;
47 --- a/lib/route_types.txt
48 +++ b/lib/route_types.txt
49 @@ -51,13 +51,9 @@ ZEBRA_ROUTE_OSPF,       ospf,      ospfd
50  ZEBRA_ROUTE_OSPF6,      ospf6,     ospf6d, 'O', 0, 1, "OSPFv6"
51  ZEBRA_ROUTE_ISIS,       isis,      isisd,  'I', 1, 1, "IS-IS"
52  ZEBRA_ROUTE_BGP,        bgp,       bgpd,   'B', 1, 1, "BGP"
53 -# HSLS and OLSR both are AFI independent (so: 1, 1), however
54 -# we want to disable for them for general Quagga distribution.
55 -# This at least makes it trivial for users of these protocols
56 -# to 'switch on' redist support (direct numeric entry remaining
57 -# possible).
58 -ZEBRA_ROUTE_HSLS,       hsls,      hslsd,  'H', 0, 0, "HSLS"
59 -ZEBRA_ROUTE_OLSR,       olsr,      olsrd,  'o', 0, 0, "OLSR"
60 +ZEBRA_ROUTE_HSLS,       hsls,      hslsd,  'H', 1, 1, "HSLS"
61 +ZEBRA_ROUTE_OLSR,       olsr,      olsrd,  'o', 1, 1, "OLSR"
62 +ZEBRA_ROUTE_BATMAN,     batman,    batmand,'b', 1, 1, "BATMAN"
63  ZEBRA_ROUTE_BABEL,      babel,     babeld, 'A', 1, 1, "Babel"
64  
65  ## help strings
66 @@ -72,5 +68,6 @@ ZEBRA_ROUTE_OSPF6,  "Open Shortest Path
67  ZEBRA_ROUTE_ISIS,   "Intermediate System to Intermediate System (IS-IS)"
68  ZEBRA_ROUTE_BGP,    "Border Gateway Protocol (BGP)"
69  ZEBRA_ROUTE_HSLS,   "Hazy-Sighted Link State Protocol (HSLS)"
70 -ZEBRA_ROUTE_OLSR,   "Optimised Link State Routing (OLSR)"
71 +ZEBRA_ROUTE_OLSR,   "Optimized Link State Routing (OLSR)"
72 +ZEBRA_ROUTE_BATMAN, "Better Approach to Mobile Ad-Hoc Networking (BATMAN)"
73  ZEBRA_ROUTE_BABEL,  "Babel routing protocol (Babel)"
74 --- a/ripd/rip_zebra.c
75 +++ b/ripd/rip_zebra.c
76 @@ -206,9 +206,12 @@ static struct {
77    {ZEBRA_ROUTE_KERNEL,  1, "kernel"},
78    {ZEBRA_ROUTE_CONNECT, 1, "connected"},
79    {ZEBRA_ROUTE_STATIC,  1, "static"},
80 -  {ZEBRA_ROUTE_OSPF,    1, "ospf"},
81 +  {ZEBRA_ROUTE_OSPF,    2, "ospf"},
82    {ZEBRA_ROUTE_BGP,     2, "bgp"},
83 -  {ZEBRA_ROUTE_BABEL,   2, "babel"},
84 +  {ZEBRA_ROUTE_HSLS,    1, "hsls"},
85 +  {ZEBRA_ROUTE_OLSR,    2, "olsr"},
86 +  {ZEBRA_ROUTE_BATMAN,  3, "batman"},
87 +  {ZEBRA_ROUTE_BABEL,   3, "babel"},
88    {0, 0, NULL}
89  };
90  
91 --- a/ripngd/ripng_zebra.c
92 +++ b/ripngd/ripng_zebra.c
93 @@ -216,9 +216,12 @@ static struct {
94    {ZEBRA_ROUTE_KERNEL,  1, "kernel"},
95    {ZEBRA_ROUTE_CONNECT, 1, "connected"},
96    {ZEBRA_ROUTE_STATIC,  1, "static"},
97 -  {ZEBRA_ROUTE_OSPF6,   1, "ospf6"},
98 +  {ZEBRA_ROUTE_OSPF6,   2, "ospf6"},
99    {ZEBRA_ROUTE_BGP,     2, "bgp"},
100 -  {ZEBRA_ROUTE_BABEL,   2, "babel"},
101 +  {ZEBRA_ROUTE_HSLS,    1, "hsls"},
102 +  {ZEBRA_ROUTE_OLSR,    2, "olsr"},
103 +  {ZEBRA_ROUTE_BATMAN,  3, "batman"},
104 +  {ZEBRA_ROUTE_BABEL,   3, "babel"},
105    {0, 0, NULL}
106  };
107  
108 --- a/zebra/rt_netlink.c
109 +++ b/zebra/rt_netlink.c
110 @@ -1623,6 +1623,9 @@ netlink_route_multipath (int cmd, struct
111                          addattr_l (&req.n, sizeof req, RTA_PREFSRC,
112                                  &nexthop->src.ipv4, bytelen);
113  
114 +                     if (rib->type == ZEBRA_ROUTE_OLSR)
115 +                       req.r.rtm_scope = RT_SCOPE_LINK;
116 +
117                       if (IS_ZEBRA_DEBUG_KERNEL)
118                         zlog_debug("netlink_route_multipath() (single hop): "
119                                    "nexthop via if %u", nexthop->ifindex);
120 --- a/zebra/zebra_rib.c
121 +++ b/zebra/zebra_rib.c
122 @@ -67,6 +67,9 @@ static const struct
123    [ZEBRA_ROUTE_OSPF6]   = {ZEBRA_ROUTE_OSPF6,   110},
124    [ZEBRA_ROUTE_ISIS]    = {ZEBRA_ROUTE_ISIS,    115},
125    [ZEBRA_ROUTE_BGP]     = {ZEBRA_ROUTE_BGP,      20  /* IBGP is 200. */},
126 +  [ZEBRA_ROUTE_HSLS]    = {ZEBRA_ROUTE_HSLS,      0},
127 +  [ZEBRA_ROUTE_OLSR]    = {ZEBRA_ROUTE_OLSR,      0},
128 +  [ZEBRA_ROUTE_BATMAN]  = {ZEBRA_ROUTE_BATMAN,    0},
129    [ZEBRA_ROUTE_BABEL]   = {ZEBRA_ROUTE_BABEL,    95},
130    /* no entry/default: 150 */
131  };
132 @@ -403,6 +406,18 @@ nexthop_active_ipv4 (struct rib *rib, st
133                   }
134               return 0;
135             }
136 +         else if (match->type == ZEBRA_ROUTE_OLSR)
137 +           {
138 +             for (newhop = match->nexthop; newhop; newhop = newhop->next)
139 +               if (CHECK_FLAG (newhop->flags, NEXTHOP_FLAG_FIB)
140 +                   && newhop->type == NEXTHOP_TYPE_IFINDEX)
141 +                 {
142 +                   if (nexthop->type == NEXTHOP_TYPE_IPV4)
143 +                     nexthop->ifindex = newhop->ifindex;
144 +                   return 1;
145 +                 }
146 +             return 0;
147 +           }
148           else
149             {
150               return 0;
151 @@ -507,6 +522,18 @@ nexthop_active_ipv6 (struct rib *rib, st
152                   }
153               return 0;
154             }
155 +         else if (match->type == ZEBRA_ROUTE_OLSR)
156 +           {
157 +             for (newhop = match->nexthop; newhop; newhop = newhop->next)
158 +               if (CHECK_FLAG (newhop->flags, NEXTHOP_FLAG_FIB)
159 +                   && newhop->type == NEXTHOP_TYPE_IFINDEX)
160 +                 {
161 +                   if (nexthop->type == NEXTHOP_TYPE_IPV6)
162 +                     nexthop->ifindex = newhop->ifindex;
163 +                   return 1;
164 +                 }
165 +             return 0;
166 +           }
167           else
168             {
169               return 0;
170 @@ -1236,6 +1263,8 @@ static const u_char meta_queue_map[ZEBRA
171    [ZEBRA_ROUTE_ISIS]    = 2,
172    [ZEBRA_ROUTE_BGP]     = 3,
173    [ZEBRA_ROUTE_HSLS]    = 4,
174 +  [ZEBRA_ROUTE_OLSR]    = 4,
175 +  [ZEBRA_ROUTE_BATMAN]  = 4,
176    [ZEBRA_ROUTE_BABEL]   = 2,
177  };
178  
179 --- a/zebra/zebra_snmp.c
180 +++ b/zebra/zebra_snmp.c
181 @@ -251,6 +251,12 @@ proto_trans(int type)
182        return 1; /* shouldn't happen */
183      case ZEBRA_ROUTE_BGP:
184        return 14; /* bgp */
185 +    case ZEBRA_ROUTE_HSLS:
186 +      return 1; /* other */
187 +    case ZEBRA_ROUTE_OLSR:
188 +      return 1; /* other */
189 +    case ZEBRA_ROUTE_BATMAN:
190 +      return 1; /* other */
191      default:
192        return 1; /* other */
193      }
194 --- a/zebra/zebra_vty.c
195 +++ b/zebra/zebra_vty.c
196 @@ -558,7 +558,10 @@ vty_show_ip_route_detail (struct vty *vt
197           || rib->type == ZEBRA_ROUTE_OSPF
198           || rib->type == ZEBRA_ROUTE_BABEL
199           || rib->type == ZEBRA_ROUTE_ISIS
200 -         || rib->type == ZEBRA_ROUTE_BGP)
201 +         || rib->type == ZEBRA_ROUTE_BGP
202 +         || rib->type == ZEBRA_ROUTE_HSLS
203 +         || rib->type == ZEBRA_ROUTE_OLSR
204 +         || rib->type == ZEBRA_ROUTE_BATMAN)
205         {
206           time_t uptime;
207           struct tm *tm;
208 @@ -777,7 +780,10 @@ vty_show_ip_route (struct vty *vty, stru
209           || rib->type == ZEBRA_ROUTE_OSPF
210           || rib->type == ZEBRA_ROUTE_BABEL
211           || rib->type == ZEBRA_ROUTE_ISIS
212 -         || rib->type == ZEBRA_ROUTE_BGP)
213 +         || rib->type == ZEBRA_ROUTE_BGP
214 +         || rib->type == ZEBRA_ROUTE_HSLS
215 +         || rib->type == ZEBRA_ROUTE_OLSR
216 +         || rib->type == ZEBRA_ROUTE_BATMAN)
217         {
218           time_t uptime;
219           struct tm *tm;
220 @@ -1536,7 +1542,10 @@ vty_show_ipv6_route_detail (struct vty *
221           || rib->type == ZEBRA_ROUTE_OSPF6
222           || rib->type == ZEBRA_ROUTE_BABEL
223           || rib->type == ZEBRA_ROUTE_ISIS
224 -         || rib->type == ZEBRA_ROUTE_BGP)
225 +         || rib->type == ZEBRA_ROUTE_BGP
226 +         || rib->type == ZEBRA_ROUTE_HSLS
227 +         || rib->type == ZEBRA_ROUTE_OLSR
228 +         || rib->type == ZEBRA_ROUTE_BATMAN)
229         {
230           time_t uptime;
231           struct tm *tm;
232 @@ -1716,7 +1725,10 @@ vty_show_ipv6_route (struct vty *vty, st
233           || rib->type == ZEBRA_ROUTE_OSPF6
234           || rib->type == ZEBRA_ROUTE_BABEL
235           || rib->type == ZEBRA_ROUTE_ISIS
236 -         || rib->type == ZEBRA_ROUTE_BGP)
237 +         || rib->type == ZEBRA_ROUTE_BGP
238 +         || rib->type == ZEBRA_ROUTE_HSLS
239 +         || rib->type == ZEBRA_ROUTE_OLSR
240 +         || rib->type == ZEBRA_ROUTE_BATMAN)
241         {
242           time_t uptime;
243           struct tm *tm;