]> git.ipfire.org Git - thirdparty/bird.git/blob - proto/ospf/topology.c
Merged multipath and single-path data structures.
[thirdparty/bird.git] / proto / ospf / topology.c
1 /*
2 * BIRD -- OSPF Topological Database
3 *
4 * (c) 1999 Martin Mares <mj@ucw.cz>
5 * (c) 1999--2004 Ondrej Filip <feela@network.cz>
6 * (c) 2009--2014 Ondrej Zajicek <santiago@crfreenet.org>
7 * (c) 2009--2014 CZ.NIC z.s.p.o.
8 *
9 * Can be freely distributed and used under the terms of the GNU GPL.
10 */
11
12 #include "nest/bird.h"
13 #include "lib/string.h"
14
15 #include "ospf.h"
16
17
18 #define HASH_DEF_ORDER 6
19 #define HASH_HI_MARK *4
20 #define HASH_HI_STEP 2
21 #define HASH_HI_MAX 16
22 #define HASH_LO_MARK /5
23 #define HASH_LO_STEP 2
24 #define HASH_LO_MIN 8
25
26 static inline void * lsab_flush(struct ospf_proto *p);
27 static inline void lsab_reset(struct ospf_proto *p);
28
29
30 /**
31 * ospf_install_lsa - install new LSA into database
32 * @p: OSPF protocol instance
33 * @lsa: LSA header
34 * @type: type of LSA
35 * @domain: domain of LSA
36 * @body: pointer to LSA body
37 *
38 * This function ensures installing new LSA received in LS update into LSA
39 * database. Old instance is replaced. Several actions are taken to detect if
40 * new routing table calculation is necessary. This is described in 13.2 of RFC
41 * 2328. This function is for received LSA only, locally originated LSAs are
42 * installed by ospf_originate_lsa().
43 *
44 * The LSA body in @body is expected to be mb_allocated by the caller and its
45 * ownership is transferred to the LSA entry structure.
46 */
47 struct top_hash_entry *
48 ospf_install_lsa(struct ospf_proto *p, struct ospf_lsa_header *lsa, u32 type, u32 domain, void *body)
49 {
50 struct top_hash_entry *en;
51 int change = 0;
52
53 en = ospf_hash_get(p->gr, domain, lsa->id, lsa->rt, type);
54
55 if (!SNODE_VALID(en))
56 s_add_tail(&p->lsal, SNODE en);
57
58 if ((en->lsa_body == NULL) || /* No old LSA */
59 (en->lsa.length != lsa->length) ||
60 (en->lsa.type_raw != lsa->type_raw) || /* Check for OSPFv2 options */
61 (en->lsa.age == LSA_MAXAGE) ||
62 (lsa->age == LSA_MAXAGE) ||
63 memcmp(en->lsa_body, body, lsa->length - sizeof(struct ospf_lsa_header)))
64 change = 1;
65
66 if ((en->lsa.age == LSA_MAXAGE) && (lsa->age == LSA_MAXAGE))
67 change = 0;
68
69 mb_free(en->lsa_body);
70 en->lsa_body = body;
71 en->lsa = *lsa;
72 en->init_age = en->lsa.age;
73 en->inst_time = now;
74
75 /*
76 * We do not set en->mode. It is either default LSA_M_BASIC, or in a special
77 * case when en is local but flushed, there is postponed LSA, self-originated
78 * LSA is received and ospf_install_lsa() is called from ospf_advance_lse(),
79 * then we have en->mode from the postponed LSA origination.
80 */
81
82 OSPF_TRACE(D_EVENTS, "Installing LSA: Type: %04x, Id: %R, Rt: %R, Seq: %08x, Age: %u",
83 en->lsa_type, en->lsa.id, en->lsa.rt, en->lsa.sn, en->lsa.age);
84
85 if (change)
86 ospf_schedule_rtcalc(p);
87
88 return en;
89 }
90
91 /**
92 * ospf_advance_lsa - handle received unexpected self-originated LSA
93 * @p: OSPF protocol instance
94 * @en: current LSA entry or NULL
95 * @lsa: new LSA header
96 * @type: type of LSA
97 * @domain: domain of LSA
98 * @body: pointer to LSA body
99 *
100 * This function handles received unexpected self-originated LSA (@lsa, @body)
101 * by either advancing sequence number of the local LSA instance (@en) and
102 * propagating it, or installing the received LSA and immediately flushing it
103 * (if there is no local LSA; i.e., @en is NULL or MaxAge).
104 *
105 * The LSA body in @body is expected to be mb_allocated by the caller and its
106 * ownership is transferred to the LSA entry structure or it is freed.
107 */
108 void
109 ospf_advance_lsa(struct ospf_proto *p, struct top_hash_entry *en, struct ospf_lsa_header *lsa, u32 type, u32 domain, void *body)
110 {
111 /* RFC 2328 13.4 */
112
113 if (en && (en->lsa.age < LSA_MAXAGE))
114 {
115 if (lsa->sn != LSA_MAXSEQNO)
116 {
117 /*
118 * We simply advance current LSA to have higher seqnum than received LSA.
119 * The received LSA is ignored and the advanced LSA is propagated instead.
120 *
121 * Although this is an origination of distinct LSA instance and therefore
122 * should be limited by MinLSInterval, we do not enforce it here. Fast
123 * reaction is needed and we are already limited by MinLSArrival.
124 */
125
126 mb_free(body);
127
128 en->lsa.sn = lsa->sn + 1;
129 en->lsa.age = 0;
130 en->init_age = 0;
131 en->inst_time = now;
132 lsa_generate_checksum(&en->lsa, en->lsa_body);
133
134 OSPF_TRACE(D_EVENTS, "Advancing LSA: Type: %04x, Id: %R, Rt: %R, Seq: %08x",
135 en->lsa_type, en->lsa.id, en->lsa.rt, en->lsa.sn);
136 }
137 else
138 {
139 /*
140 * Received LSA has maximal sequence number, so we cannot simply override
141 * it. We have to install it to the database, immediately flush it to
142 * implement sequence number wrapping, and schedule our current LSA to be
143 * originated after the received instance is flushed.
144 */
145
146 if (en->next_lsa_body == NULL)
147 {
148 /* Schedule current LSA */
149 en->next_lsa_blen = en->lsa.length - sizeof(struct ospf_lsa_header);
150 en->next_lsa_body = en->lsa_body;
151 en->next_lsa_opts = ospf_is_v2(p) ? lsa_get_options(&en->lsa) : 0;
152 }
153 else
154 {
155 /* There is already scheduled LSA, so we just free current one */
156 mb_free(en->lsa_body);
157 }
158
159 en->lsa_body = body;
160 en->lsa = *lsa;
161 en->lsa.age = LSA_MAXAGE;
162 en->init_age = lsa->age;
163 en->inst_time = now;
164
165 OSPF_TRACE(D_EVENTS, "Resetting LSA: Type: %04x, Id: %R, Rt: %R, Seq: %08x",
166 en->lsa_type, en->lsa.id, en->lsa.rt, en->lsa.sn);
167 OSPF_TRACE(D_EVENTS, "Postponing LSA: Type: %04x, Id: %R, Rt: %R",
168 en->lsa_type, en->lsa.id, en->lsa.rt);
169 }
170 }
171 else
172 {
173 /*
174 * We do not have received LSA in the database. We have to flush the
175 * received LSA. It has to be installed in the database to secure
176 * retransmissions. Note that the received LSA may already be MaxAge.
177 * Also note that en->next_lsa_* may be defined.
178 */
179
180 lsa->age = LSA_MAXAGE;
181 en = ospf_install_lsa(p, lsa, type, domain, body);
182 }
183
184 /*
185 * We flood the updated LSA. Although in some cases the to-be-flooded LSA is
186 * the same as the received LSA, and therefore we should propagate it as
187 * regular received LSA (send the acknowledgement instead of the update to
188 * the neighbor we received it from), we cheat a bit here.
189 */
190
191 ospf_flood_lsa(p, en, NULL);
192 }
193
194
195 static int
196 ospf_do_originate_lsa(struct ospf_proto *p, struct top_hash_entry *en, void *lsa_body, u16 lsa_blen, u16 lsa_opts)
197 {
198 /* Enforce MinLSInterval */
199 if ((en->init_age == 0) && en->inst_time && ((en->inst_time + MINLSINTERVAL) > now))
200 return 0;
201
202 /* Handle wrapping sequence number */
203 if (en->lsa.sn == LSA_MAXSEQNO)
204 {
205 /* Prepare to flush old LSA */
206 if (en->lsa.age != LSA_MAXAGE)
207 {
208 OSPF_TRACE(D_EVENTS, "Resetting LSA: Type: %04x, Id: %R, Rt: %R, Seq: %08x",
209 en->lsa_type, en->lsa.id, en->lsa.rt, en->lsa.sn);
210
211 en->lsa.age = LSA_MAXAGE;
212 ospf_flood_lsa(p, en, NULL);
213 return 0;
214 }
215
216 /* Already flushing */
217 if ((p->padj != 0) || (en->ret_count != 0))
218 return 0;
219
220 /* Flush done, just clean up seqnum, lsa_body is freed below */
221 en->lsa.sn = LSA_ZEROSEQNO;
222 }
223
224 /*
225 * lsa.type_raw is initialized by ospf_hash_get() to OSPFv3 LSA type.
226 * lsa_set_options() implicitly converts it to OSPFv2 LSA type, assuming that
227 * old type is just new type masked by 0xff. That is not universally true,
228 * but it holds for all OSPFv2 types currently supported by BIRD.
229 */
230
231 if (ospf_is_v2(p))
232 lsa_set_options(&en->lsa, lsa_opts);
233
234 mb_free(en->lsa_body);
235 en->lsa_body = lsa_body;
236 en->lsa.length = sizeof(struct ospf_lsa_header) + lsa_blen;
237 en->lsa.sn++;
238 en->lsa.age = 0;
239 en->init_age = 0;
240 en->inst_time = now;
241 lsa_generate_checksum(&en->lsa, en->lsa_body);
242
243 OSPF_TRACE(D_EVENTS, "Originating LSA: Type: %04x, Id: %R, Rt: %R, Seq: %08x",
244 en->lsa_type, en->lsa.id, en->lsa.rt, en->lsa.sn);
245
246 ospf_flood_lsa(p, en, NULL);
247
248 if (en->mode == LSA_M_BASIC)
249 ospf_schedule_rtcalc(p);
250
251 return 1;
252 }
253
254 /**
255 * ospf_originate_lsa - originate new LSA
256 * @p: OSPF protocol instance
257 * @lsa: New LSA specification
258 *
259 * This function prepares a new LSA, installs it into the LSA database and
260 * floods it. If the new LSA cannot be originated now (because the old instance
261 * was originated within MinLSInterval, or because the LSA seqnum is currently
262 * wrapping), the origination is instead scheduled for later. If the new LSA is
263 * equivalent to the current LSA, the origination is skipped. In all cases, the
264 * corresponding LSA entry is returned. The new LSA is based on the LSA
265 * specification (@lsa) and the LSA body from lsab buffer of @p, which is
266 * emptied after the call. The opposite of this function is ospf_flush_lsa().
267 */
268 struct top_hash_entry *
269 ospf_originate_lsa(struct ospf_proto *p, struct ospf_new_lsa *lsa)
270 {
271 struct top_hash_entry *en;
272 void *lsa_body = p->lsab;
273 u16 lsa_blen = p->lsab_used;
274 u16 lsa_length = sizeof(struct ospf_lsa_header) + lsa_blen;
275
276 en = ospf_hash_get(p->gr, lsa->dom, lsa->id, p->router_id, lsa->type);
277
278 if (!SNODE_VALID(en))
279 s_add_tail(&p->lsal, SNODE en);
280
281 if (!en->nf || !en->lsa_body)
282 en->nf = lsa->nf;
283
284 if (en->nf != lsa->nf)
285 {
286 log(L_ERR "%s: LSA ID collision for %N",
287 p->p.name, lsa->nf->fn.addr);
288
289 en = NULL;
290 goto drop;
291 }
292
293 if (en->mode != lsa->mode)
294 en->mode = lsa->mode;
295
296 if (en->next_lsa_body)
297 {
298 /* Ignore the new LSA if it is the same as the scheduled one */
299 if ((lsa_blen == en->next_lsa_blen) &&
300 !memcmp(lsa_body, en->next_lsa_body, lsa_blen) &&
301 (!ospf_is_v2(p) || (lsa->opts == en->next_lsa_opts)))
302 goto drop;
303
304 /* Free scheduled LSA */
305 mb_free(en->next_lsa_body);
306 en->next_lsa_body = NULL;
307 en->next_lsa_blen = 0;
308 en->next_lsa_opts = 0;
309 }
310
311 /* Ignore the the new LSA if is the same as the current one */
312 if ((en->lsa.age < LSA_MAXAGE) &&
313 (lsa_length == en->lsa.length) &&
314 !memcmp(lsa_body, en->lsa_body, lsa_blen) &&
315 (!ospf_is_v2(p) || (lsa->opts == lsa_get_options(&en->lsa))))
316 goto drop;
317
318 lsa_body = lsab_flush(p);
319
320 if (! ospf_do_originate_lsa(p, en, lsa_body, lsa_blen, lsa->opts))
321 {
322 OSPF_TRACE(D_EVENTS, "Postponing LSA: Type: %04x, Id: %R, Rt: %R",
323 en->lsa_type, en->lsa.id, en->lsa.rt);
324
325 en->next_lsa_body = lsa_body;
326 en->next_lsa_blen = lsa_blen;
327 en->next_lsa_opts = lsa->opts;
328 }
329
330 return en;
331
332 drop:
333 lsab_reset(p);
334 return en;
335 }
336
337 static void
338 ospf_originate_next_lsa(struct ospf_proto *p, struct top_hash_entry *en)
339 {
340 /* Called by ospf_update_lsadb() to handle scheduled origination */
341
342 if (! ospf_do_originate_lsa(p, en, en->next_lsa_body, en->next_lsa_blen, en->next_lsa_opts))
343 return;
344
345 en->next_lsa_body = NULL;
346 en->next_lsa_blen = 0;
347 en->next_lsa_opts = 0;
348 }
349
350 static void
351 ospf_refresh_lsa(struct ospf_proto *p, struct top_hash_entry *en)
352 {
353 /*
354 * Called by ospf_update_lsadb() for periodic LSA refresh.
355 *
356 * We know that lsa.age < LSA_MAXAGE and lsa.rt is our router ID. We can also
357 * assume that there is no scheduled LSA, because inst_time is deep in past,
358 * therefore ospf_originate_next_lsa() called before would either succeed or
359 * switched lsa.age to LSA_MAXAGE.
360 */
361
362 OSPF_TRACE(D_EVENTS, "Refreshing LSA: Type: %04x, Id: %R, Rt: %R, Seq: %08x",
363 en->lsa_type, en->lsa.id, en->lsa.rt, en->lsa.sn);
364
365 ASSERT(en->next_lsa_body == NULL);
366
367 /* Handle wrapping sequence number */
368 if (en->lsa.sn == LSA_MAXSEQNO)
369 {
370 /* Copy LSA body as next LSA to get automatic origination after flush is finished */
371 en->next_lsa_blen = en->lsa.length - sizeof(struct ospf_lsa_header);
372 en->next_lsa_body = mb_alloc(p->p.pool, en->next_lsa_blen);
373 memcpy(en->next_lsa_body, en->lsa_body, en->next_lsa_blen);
374 en->next_lsa_opts = ospf_is_v2(p) ? lsa_get_options(&en->lsa) : 0;
375
376 en->lsa.age = LSA_MAXAGE;
377 ospf_flood_lsa(p, en, NULL);
378 return;
379 }
380
381 en->lsa.sn++;
382 en->lsa.age = 0;
383 en->init_age = 0;
384 en->inst_time = now;
385 lsa_generate_checksum(&en->lsa, en->lsa_body);
386 ospf_flood_lsa(p, en, NULL);
387 }
388
389 /**
390 * ospf_flush_lsa - flush LSA from OSPF domain
391 * @p: OSPF protocol instance
392 * @en: LSA entry to flush
393 *
394 * This function flushes @en from the OSPF domain by setting its age to
395 * %LSA_MAXAGE and flooding it. That also triggers subsequent events in LSA
396 * lifecycle leading to removal of the LSA from the LSA database (e.g. the LSA
397 * content is freed when flushing is acknowledged by neighbors). The function
398 * does nothing if the LSA is already being flushed. LSA entries are not
399 * immediately removed when being flushed, the caller may assume that @en still
400 * exists after the call. The function is the opposite of ospf_originate_lsa()
401 * and is supposed to do the right thing even in cases of postponed
402 * origination.
403 */
404 void
405 ospf_flush_lsa(struct ospf_proto *p, struct top_hash_entry *en)
406 {
407 if (en->next_lsa_body)
408 {
409 mb_free(en->next_lsa_body);
410 en->next_lsa_body = NULL;
411 en->next_lsa_blen = 0;
412 en->next_lsa_opts = 0;
413 }
414
415 if (en->lsa.age == LSA_MAXAGE)
416 return;
417
418 OSPF_TRACE(D_EVENTS, "Flushing LSA: Type: %04x, Id: %R, Rt: %R, Seq: %08x",
419 en->lsa_type, en->lsa.id, en->lsa.rt, en->lsa.sn);
420
421 en->lsa.age = LSA_MAXAGE;
422 ospf_flood_lsa(p, en, NULL);
423
424 if (en->mode == LSA_M_BASIC)
425 ospf_schedule_rtcalc(p);
426
427 en->mode = LSA_M_BASIC;
428 }
429
430 static void
431 ospf_clear_lsa(struct ospf_proto *p, struct top_hash_entry *en)
432 {
433 /*
434 * Called by ospf_update_lsadb() as part of LSA flushing process.
435 * Flushed LSA was acknowledged by neighbors and we can free its content.
436 * The log message is for 'remove' - we hide empty LSAs from users.
437 */
438
439 OSPF_TRACE(D_EVENTS, "Removing LSA: Type: %04x, Id: %R, Rt: %R, Seq: %08x",
440 en->lsa_type, en->lsa.id, en->lsa.rt, en->lsa.sn);
441
442 if (en->lsa.sn == LSA_MAXSEQNO)
443 en->lsa.sn = LSA_ZEROSEQNO;
444
445 mb_free(en->lsa_body);
446 en->lsa_body = NULL;
447 }
448
449 static void
450 ospf_remove_lsa(struct ospf_proto *p, struct top_hash_entry *en)
451 {
452 /*
453 * Called by ospf_update_lsadb() as part of LSA flushing process.
454 * Both lsa_body and next_lsa_body are NULL.
455 */
456
457 s_rem_node(SNODE en);
458 ospf_hash_delete(p->gr, en);
459 }
460
461 /**
462 * ospf_update_lsadb - update LSA database
463 * @p: OSPF protocol instance
464 *
465 * This function is periodicaly invoked from ospf_disp(). It does some periodic
466 * or postponed processing related to LSA entries. It originates postponed LSAs
467 * scheduled by ospf_originate_lsa(), It continues in flushing processes started
468 * by ospf_flush_lsa(). It also periodically refreshs locally originated LSAs --
469 * when the current instance is older %LSREFRESHTIME, a new instance is originated.
470 * Finally, it also ages stored LSAs and flushes ones that reached %LSA_MAXAGE.
471 *
472 * The RFC 2328 says that a router should periodically check checksums of all
473 * stored LSAs to detect hardware problems. This is not implemented.
474 */
475 void
476 ospf_update_lsadb(struct ospf_proto *p)
477 {
478 struct top_hash_entry *en, *nxt;
479 bird_clock_t real_age;
480
481 WALK_SLIST_DELSAFE(en, nxt, p->lsal)
482 {
483 if (en->next_lsa_body)
484 ospf_originate_next_lsa(p, en);
485
486 real_age = en->init_age + (now - en->inst_time);
487
488 if (en->lsa.age == LSA_MAXAGE)
489 {
490 if (en->lsa_body && (p->padj == 0) && (en->ret_count == 0))
491 ospf_clear_lsa(p, en);
492
493 if ((en->lsa_body == NULL) && (en->next_lsa_body == NULL) &&
494 ((en->lsa.rt != p->router_id) || (real_age >= LSA_MAXAGE)))
495 ospf_remove_lsa(p, en);
496
497 continue;
498 }
499
500 if ((en->lsa.rt == p->router_id) && (real_age >= LSREFRESHTIME))
501 {
502 ospf_refresh_lsa(p, en);
503 continue;
504 }
505
506 if (real_age >= LSA_MAXAGE)
507 {
508 ospf_flush_lsa(p, en);
509 continue;
510 }
511
512 en->lsa.age = real_age;
513 }
514 }
515
516
517 static u32
518 ort_to_lsaid(struct ospf_proto *p, ort *nf)
519 {
520 /*
521 * In OSPFv2, We have to map IP prefixes to u32 in such manner that resulting
522 * u32 interpreted as IP address is a member of given prefix. Therefore, /32
523 * prefix has to be mapped on itself. All received prefixes have to be mapped
524 * on different u32s.
525 *
526 * We have an assumption that if there is nontrivial (non-/32) network prefix,
527 * then there is not /32 prefix for the first and the last IP address of the
528 * network (these are usually reserved, therefore it is not an important
529 * restriction). The network prefix is mapped to the first or the last IP
530 * address in the manner that disallow collisions - we use the IP address that
531 * cannot be used by the parent prefix.
532 *
533 * For example:
534 * 192.168.0.0/24 maps to 192.168.0.255
535 * 192.168.1.0/24 maps to 192.168.1.0
536 * because 192.168.0.0 and 192.168.1.255 might be used by 192.168.0.0/23 .
537 *
538 * Appendig E of RFC 2328 suggests different algorithm, that tries to maximize
539 * both compatibility and subnetting. But as it is not possible to have both
540 * reliably and the suggested algorithm was unnecessary complicated and it
541 * does crazy things like changing LSA ID for a network because different
542 * network appeared, we choose a different way.
543 *
544 * In OSPFv3, it is simpler. There is not a requirement for membership of the
545 * result in the input network, so we just allocate a unique ID from ID map
546 * and store it in nf->lsa_id for further reference.
547 */
548
549 if (ospf_is_v3(p))
550 {
551 if (!nf->lsa_id)
552 nf->lsa_id = idm_alloc(&p->idm);
553
554 return nf->lsa_id;
555 }
556
557 net_addr_ip4 *net = (void *) nf->fn.addr;
558 u32 id = ip4_to_u32(net->prefix);
559 int pxlen = net->pxlen;
560
561 if ((pxlen == 0) || (pxlen == 32))
562 return id;
563
564 if (id & (1 << (32 - pxlen)))
565 return id;
566 else
567 return id | ~u32_mkmask(pxlen);
568 }
569
570
571 static void *
572 lsab_alloc(struct ospf_proto *p, uint size)
573 {
574 uint offset = p->lsab_used;
575 p->lsab_used += size;
576 if (p->lsab_used > p->lsab_size)
577 {
578 p->lsab_size = MAX(p->lsab_used, 2 * p->lsab_size);
579 p->lsab = p->lsab ? mb_realloc(p->lsab, p->lsab_size):
580 mb_alloc(p->p.pool, p->lsab_size);
581 }
582 return ((byte *) p->lsab) + offset;
583 }
584
585 static inline void *
586 lsab_allocz(struct ospf_proto *p, uint size)
587 {
588 void *r = lsab_alloc(p, size);
589 bzero(r, size);
590 return r;
591 }
592
593 static inline void *
594 lsab_flush(struct ospf_proto *p)
595 {
596 void *r = mb_alloc(p->p.pool, p->lsab_used);
597 memcpy(r, p->lsab, p->lsab_used);
598 p->lsab_used = 0;
599 return r;
600 }
601
602 static inline void
603 lsab_reset(struct ospf_proto *p)
604 {
605 p->lsab_used = 0;
606 }
607
608 static inline void *
609 lsab_offset(struct ospf_proto *p, uint offset)
610 {
611 return ((byte *) p->lsab) + offset;
612 }
613
614 static inline void * UNUSED
615 lsab_end(struct ospf_proto *p)
616 {
617 return ((byte *) p->lsab) + p->lsab_used;
618 }
619
620
621 /*
622 * Router-LSA handling
623 * Type = LSA_T_RT
624 */
625
626 static int
627 configured_stubnet(struct ospf_area *oa, struct ifa *a)
628 {
629 /* Does not work for IA_PEER addresses, but it is not called on these */
630 struct ospf_stubnet_config *sn;
631 WALK_LIST(sn, oa->ac->stubnet_list)
632 {
633 if (sn->summary)
634 {
635 if (net_in_netX(&a->prefix, &sn->prefix))
636 return 1;
637 }
638 else
639 {
640 if (net_equal(&a->prefix, &sn->prefix))
641 return 1;
642 }
643 }
644
645 return 0;
646 }
647
648 static int
649 bcast_net_active(struct ospf_iface *ifa)
650 {
651 struct ospf_neighbor *neigh;
652
653 if (ifa->state == OSPF_IS_WAITING)
654 return 0;
655
656 WALK_LIST(neigh, ifa->neigh_list)
657 {
658 if (neigh->state == NEIGHBOR_FULL)
659 {
660 if (neigh->rid == ifa->drid)
661 return 1;
662
663 if (ifa->state == OSPF_IS_DR)
664 return 1;
665 }
666 }
667
668 return 0;
669 }
670
671 static inline u32
672 get_rt_options(struct ospf_proto *p, struct ospf_area *oa, int bitv)
673 {
674 u32 opts = 0;
675
676 if (p->areano > 1)
677 opts |= OPT_RT_B;
678
679 if ((p->areano > 1) && oa_is_nssa(oa) && oa->ac->translator)
680 opts |= OPT_RT_NT;
681
682 if (p->asbr && !oa_is_stub(oa))
683 opts |= OPT_RT_E;
684
685 if (bitv)
686 opts |= OPT_RT_V;
687
688 return opts;
689 }
690
691 static inline void
692 add_rt2_lsa_link(struct ospf_proto *p, u8 type, u32 id, u32 data, u16 metric)
693 {
694 struct ospf_lsa_rt2_link *ln = lsab_alloc(p, sizeof(struct ospf_lsa_rt2_link));
695 ln->type = type;
696 ln->id = id;
697 ln->data = data;
698 ln->metric = metric;
699 ln->no_tos = 0;
700 }
701
702 static void
703 prepare_rt2_lsa_body(struct ospf_proto *p, struct ospf_area *oa)
704 {
705 struct ospf_iface *ifa;
706 int i = 0, bitv = 0;
707 struct ospf_neighbor *neigh;
708
709 ASSERT(p->lsab_used == 0);
710 lsab_allocz(p, sizeof(struct ospf_lsa_rt));
711 /* ospf_lsa_rt header will be filled later */
712
713 WALK_LIST(ifa, p->iface_list)
714 {
715 int net_lsa = 0;
716 u32 link_cost = p->stub_router ? 0xffff : ifa->cost;
717
718 if ((ifa->type == OSPF_IT_VLINK) && (ifa->voa == oa) &&
719 (!EMPTY_LIST(ifa->neigh_list)))
720 {
721 neigh = (struct ospf_neighbor *) HEAD(ifa->neigh_list);
722 if ((neigh->state == NEIGHBOR_FULL) && (ifa->cost <= 0xffff))
723 bitv = 1;
724 }
725
726 if ((ifa->oa != oa) || (ifa->state == OSPF_IS_DOWN))
727 continue;
728
729 ifa->rt_pos_beg = i;
730
731 /* RFC 2328 - 12.4.1.1-4 */
732 switch (ifa->type)
733 {
734 case OSPF_IT_PTP:
735 case OSPF_IT_PTMP:
736 WALK_LIST(neigh, ifa->neigh_list)
737 if (neigh->state == NEIGHBOR_FULL)
738 {
739 /*
740 * ln->data should be ifa->iface_id in case of no/ptp
741 * address (ifa->addr->flags & IA_PEER) on PTP link (see
742 * RFC 2328 12.4.1.1.), but the iface ID value has no use,
743 * while using IP address even in this case is here for
744 * compatibility with some broken implementations that use
745 * this address as a next-hop.
746 */
747 add_rt2_lsa_link(p, LSART_PTP, neigh->rid, ipa_to_u32(ifa->addr->ip), link_cost);
748 i++;
749 }
750 break;
751
752 case OSPF_IT_BCAST:
753 case OSPF_IT_NBMA:
754 if (bcast_net_active(ifa))
755 {
756 add_rt2_lsa_link(p, LSART_NET, ipa_to_u32(ifa->drip), ipa_to_u32(ifa->addr->ip), link_cost);
757 i++;
758 net_lsa = 1;
759 }
760 break;
761
762 case OSPF_IT_VLINK:
763 neigh = (struct ospf_neighbor *) HEAD(ifa->neigh_list);
764 if ((!EMPTY_LIST(ifa->neigh_list)) && (neigh->state == NEIGHBOR_FULL) && (ifa->cost <= 0xffff))
765 add_rt2_lsa_link(p, LSART_VLNK, neigh->rid, ipa_to_u32(ifa->addr->ip), link_cost), i++;
766 break;
767
768 default:
769 log(L_BUG "OSPF: Unknown interface type");
770 break;
771 }
772
773 ifa->rt_pos_end = i;
774
775 /* Now we will originate stub area if there is no primary */
776 if (net_lsa ||
777 (ifa->type == OSPF_IT_VLINK) ||
778 ((ifa->addr->flags & IA_PEER) && ! ifa->cf->stub) ||
779 configured_stubnet(oa, ifa->addr))
780 continue;
781
782 /* Host or network stub entry */
783 if ((ifa->addr->flags & IA_HOST) ||
784 (ifa->state == OSPF_IS_LOOP) ||
785 (ifa->type == OSPF_IT_PTMP))
786 add_rt2_lsa_link(p, LSART_STUB, ipa_to_u32(ifa->addr->ip), 0xffffffff, 0);
787 else
788 add_rt2_lsa_link(p, LSART_STUB, ip4_to_u32(net4_prefix(&ifa->addr->prefix)),
789 u32_mkmask(net4_pxlen(&ifa->addr->prefix)), ifa->cost);
790 i++;
791
792 ifa->rt_pos_end = i;
793 }
794
795 struct ospf_stubnet_config *sn;
796 WALK_LIST(sn, oa->ac->stubnet_list)
797 if (!sn->hidden)
798 add_rt2_lsa_link(p, LSART_STUB, ip4_to_u32(net4_prefix(&sn->prefix)),
799 u32_mkmask(net4_pxlen(&sn->prefix)), sn->cost), i++;
800
801 struct ospf_lsa_rt *rt = p->lsab;
802 /* Store number of links in lower half of options */
803 rt->options = get_rt_options(p, oa, bitv) | (u16) i;
804 }
805
806 static inline void
807 add_rt3_lsa_link(struct ospf_proto *p, u8 type, struct ospf_iface *ifa, u32 nif, u32 id)
808 {
809 struct ospf_lsa_rt3_link *ln = lsab_alloc(p, sizeof(struct ospf_lsa_rt3_link));
810 ln->type = type;
811 ln->padding = 0;
812 ln->metric = ifa->cost;
813 ln->lif = ifa->iface_id;
814 ln->nif = nif;
815 ln->id = id;
816 }
817
818 static void
819 prepare_rt3_lsa_body(struct ospf_proto *p, struct ospf_area *oa)
820 {
821 struct ospf_iface *ifa;
822 struct ospf_neighbor *neigh;
823 int bitv = 0;
824 int i = 0;
825
826 ASSERT(p->lsab_used == 0);
827 lsab_allocz(p, sizeof(struct ospf_lsa_rt));
828 /* ospf_lsa_rt header will be filled later */
829
830 WALK_LIST(ifa, p->iface_list)
831 {
832 if ((ifa->type == OSPF_IT_VLINK) && (ifa->voa == oa) &&
833 (!EMPTY_LIST(ifa->neigh_list)))
834 {
835 neigh = (struct ospf_neighbor *) HEAD(ifa->neigh_list);
836 if ((neigh->state == NEIGHBOR_FULL) && (ifa->cost <= 0xffff))
837 bitv = 1;
838 }
839
840 if ((ifa->oa != oa) || (ifa->state == OSPF_IS_DOWN))
841 continue;
842
843 ifa->rt_pos_beg = i;
844
845 /* RFC 5340 - 4.4.3.2 */
846 switch (ifa->type)
847 {
848 case OSPF_IT_PTP:
849 case OSPF_IT_PTMP:
850 WALK_LIST(neigh, ifa->neigh_list)
851 if (neigh->state == NEIGHBOR_FULL)
852 add_rt3_lsa_link(p, LSART_PTP, ifa, neigh->iface_id, neigh->rid), i++;
853 break;
854
855 case OSPF_IT_BCAST:
856 case OSPF_IT_NBMA:
857 if (bcast_net_active(ifa))
858 add_rt3_lsa_link(p, LSART_NET, ifa, ifa->dr_iface_id, ifa->drid), i++;
859 break;
860
861 case OSPF_IT_VLINK:
862 neigh = (struct ospf_neighbor *) HEAD(ifa->neigh_list);
863 if ((!EMPTY_LIST(ifa->neigh_list)) && (neigh->state == NEIGHBOR_FULL) && (ifa->cost <= 0xffff))
864 add_rt3_lsa_link(p, LSART_VLNK, ifa, neigh->iface_id, neigh->rid), i++;
865 break;
866
867 default:
868 log(L_BUG "OSPF: Unknown interface type");
869 break;
870 }
871
872 ifa->rt_pos_end = i;
873 }
874
875 struct ospf_lsa_rt *rt = p->lsab;
876 rt->options = get_rt_options(p, oa, bitv) | (oa->options & LSA_OPTIONS_MASK);
877 }
878
879 static void
880 ospf_originate_rt_lsa(struct ospf_proto *p, struct ospf_area *oa)
881 {
882 struct ospf_new_lsa lsa = {
883 .type = LSA_T_RT,
884 .dom = oa->areaid,
885 .id = ospf_is_v2(p) ? p->router_id : 0,
886 .opts = oa->options
887 };
888
889 OSPF_TRACE(D_EVENTS, "Updating router state for area %R", oa->areaid);
890
891 if (ospf_is_v2(p))
892 prepare_rt2_lsa_body(p, oa);
893 else
894 prepare_rt3_lsa_body(p, oa);
895
896 oa->rt = ospf_originate_lsa(p, &lsa);
897 }
898
899
900 /*
901 * Net-LSA handling
902 * Type = LSA_T_NET
903 */
904
905 static void
906 prepare_net2_lsa_body(struct ospf_proto *p, struct ospf_iface *ifa)
907 {
908 struct ospf_lsa_net *net;
909 struct ospf_neighbor *n;
910 int nodes = ifa->fadj + 1;
911 u16 i = 1;
912
913 ASSERT(p->lsab_used == 0);
914 net = lsab_alloc(p, sizeof(struct ospf_lsa_net) + 4 * nodes);
915
916 net->optx = u32_mkmask(ifa->addr->prefix.pxlen);
917 net->routers[0] = p->router_id;
918
919 WALK_LIST(n, ifa->neigh_list)
920 {
921 if (n->state == NEIGHBOR_FULL)
922 {
923 net->routers[i] = n->rid;
924 i++;
925 }
926 }
927 ASSERT(i == nodes);
928 }
929
930 static void
931 prepare_net3_lsa_body(struct ospf_proto *p, struct ospf_iface *ifa)
932 {
933 struct ospf_lsa_net *net;
934 int nodes = ifa->fadj + 1;
935 u32 options = 0;
936 u16 i = 1;
937
938 ASSERT(p->lsab_used == 0);
939 net = lsab_alloc(p, sizeof(struct ospf_lsa_net) + 4 * nodes);
940
941 net->routers[0] = p->router_id;
942
943 struct ospf_neighbor *n;
944 WALK_LIST(n, ifa->neigh_list)
945 {
946 if (n->state == NEIGHBOR_FULL)
947 {
948 /* In OSPFv3, we would like to merge options from Link LSAs of added neighbors */
949
950 struct top_hash_entry *en =
951 ospf_hash_find(p->gr, ifa->iface_id, n->iface_id, n->rid, LSA_T_LINK);
952
953 if (en)
954 options |= ((struct ospf_lsa_link *) en->lsa_body)->options;
955
956 net->routers[i] = n->rid;
957 i++;
958 }
959 }
960 ASSERT(i == nodes);
961
962 net->optx = options & LSA_OPTIONS_MASK;
963 }
964
965 static void
966 ospf_originate_net_lsa(struct ospf_proto *p, struct ospf_iface *ifa)
967 {
968 struct ospf_new_lsa lsa = {
969 .type = LSA_T_NET,
970 .dom = ifa->oa->areaid,
971 .id = ospf_is_v2(p) ? ipa_to_u32(ifa->addr->ip) : ifa->iface_id,
972 .opts = ifa->oa->options,
973 .ifa = ifa
974 };
975
976 OSPF_TRACE(D_EVENTS, "Updating network state for %s (Id: %R)", ifa->ifname, lsa.id);
977
978 if (ospf_is_v2(p))
979 prepare_net2_lsa_body(p, ifa);
980 else
981 prepare_net3_lsa_body(p, ifa);
982
983 ifa->net_lsa = ospf_originate_lsa(p, &lsa);
984 }
985
986
987 /*
988 * (Net|Rt)-summary-LSA handling
989 * (a.k.a. Inter-Area-(Prefix|Router)-LSA)
990 * Type = LSA_T_SUM_NET, LSA_T_SUM_RT
991 */
992
993 static inline void
994 prepare_sum2_lsa_body(struct ospf_proto *p, uint pxlen, u32 metric)
995 {
996 struct ospf_lsa_sum2 *sum;
997
998 sum = lsab_allocz(p, sizeof(struct ospf_lsa_sum2));
999 sum->netmask = u32_mkmask(pxlen);
1000 sum->metric = metric;
1001 }
1002
1003 static inline void
1004 prepare_sum3_net_lsa_body(struct ospf_proto *p, ort *nf, u32 metric)
1005 {
1006 struct ospf_lsa_sum3_net *sum;
1007
1008 sum = lsab_allocz(p, sizeof(struct ospf_lsa_sum3_net) +
1009 IPV6_PREFIX_SPACE(nf->fn.addr->pxlen));
1010 sum->metric = metric;
1011 ospf_put_ipv6_prefix(sum->prefix, nf->fn.addr, 0, 0);
1012 }
1013
1014 static inline void
1015 prepare_sum3_rt_lsa_body(struct ospf_proto *p, u32 drid, u32 metric, u32 options)
1016 {
1017 struct ospf_lsa_sum3_rt *sum;
1018
1019 sum = lsab_allocz(p, sizeof(struct ospf_lsa_sum3_rt));
1020 sum->options = options;
1021 sum->metric = metric;
1022 sum->drid = drid;
1023 }
1024
1025 void
1026 ospf_originate_sum_net_lsa(struct ospf_proto *p, struct ospf_area *oa, ort *nf, int metric)
1027 {
1028 struct ospf_new_lsa lsa = {
1029 .type = LSA_T_SUM_NET,
1030 .mode = LSA_M_RTCALC,
1031 .dom = oa->areaid,
1032 .id = ort_to_lsaid(p, nf),
1033 .opts = oa->options,
1034 .nf = nf
1035 };
1036
1037 if (ospf_is_v2(p))
1038 prepare_sum2_lsa_body(p, nf->fn.addr->pxlen, metric);
1039 else
1040 prepare_sum3_net_lsa_body(p, nf, metric);
1041
1042 ospf_originate_lsa(p, &lsa);
1043 }
1044
1045 void
1046 ospf_originate_sum_rt_lsa(struct ospf_proto *p, struct ospf_area *oa, u32 drid, int metric, u32 options)
1047 {
1048 struct ospf_new_lsa lsa = {
1049 .type = LSA_T_SUM_RT,
1050 .mode = LSA_M_RTCALC,
1051 .dom = oa->areaid,
1052 .id = drid, /* Router ID of ASBR, irrelevant for OSPFv3 */
1053 .opts = oa->options
1054 };
1055
1056 if (ospf_is_v2(p))
1057 prepare_sum2_lsa_body(p, 0, metric);
1058 else
1059 prepare_sum3_rt_lsa_body(p, drid, metric, options & LSA_OPTIONS_MASK);
1060
1061 ospf_originate_lsa(p, &lsa);
1062 }
1063
1064
1065 /*
1066 * AS-external-LSA and NSSA-LSA handling
1067 * Type = LSA_T_EXT, LSA_T_NSSA
1068 */
1069
1070 static inline void
1071 prepare_ext2_lsa_body(struct ospf_proto *p, uint pxlen,
1072 u32 metric, u32 ebit, ip_addr fwaddr, u32 tag)
1073 {
1074 struct ospf_lsa_ext2 *ext;
1075
1076 ext = lsab_allocz(p, sizeof(struct ospf_lsa_ext2));
1077 ext->metric = metric & LSA_METRIC_MASK;
1078 ext->netmask = u32_mkmask(pxlen);
1079 ext->fwaddr = ipa_to_u32(fwaddr);
1080 ext->tag = tag;
1081
1082 if (ebit)
1083 ext->metric |= LSA_EXT2_EBIT;
1084 }
1085
1086 static inline void
1087 prepare_ext3_lsa_body(struct ospf_proto *p, ort *nf,
1088 u32 metric, u32 ebit, ip_addr fwaddr, u32 tag, int pbit)
1089 {
1090 struct ospf_lsa_ext3 *ext;
1091 int bsize = sizeof(struct ospf_lsa_ext3)
1092 + IPV6_PREFIX_SPACE(nf->fn.addr->pxlen)
1093 + (ipa_nonzero(fwaddr) ? 16 : 0)
1094 + (tag ? 4 : 0);
1095
1096 ext = lsab_allocz(p, bsize);
1097 ext->metric = metric & LSA_METRIC_MASK;
1098 u32 *buf = ext->rest;
1099
1100 buf = ospf_put_ipv6_prefix(buf, nf->fn.addr, pbit ? OPT_PX_P : 0, 0);
1101
1102 if (ebit)
1103 ext->metric |= LSA_EXT3_EBIT;
1104
1105 if (ipa_nonzero(fwaddr))
1106 {
1107 ext->metric |= LSA_EXT3_FBIT;
1108 buf = ospf_put_ipv6_addr(buf, fwaddr);
1109 }
1110
1111 if (tag)
1112 {
1113 ext->metric |= LSA_EXT3_TBIT;
1114 *buf++ = tag;
1115 }
1116 }
1117
1118 /**
1119 * originate_ext_lsa - new route received from nest and filters
1120 * @p: OSPF protocol instance
1121 * @oa: ospf_area for which LSA is originated
1122 * @nf: network prefix and mask
1123 * @mode: the mode of the LSA (LSA_M_EXPORT or LSA_M_RTCALC)
1124 * @metric: the metric of a route
1125 * @ebit: E-bit for route metric (bool)
1126 * @fwaddr: the forwarding address
1127 * @tag: the route tag
1128 * @pbit: P-bit for NSSA LSAs (bool), ignored for external LSAs
1129 *
1130 * If I receive a message that new route is installed, I try to originate an
1131 * external LSA. If @oa is an NSSA area, NSSA-LSA is originated instead.
1132 * @oa should not be a stub area. @src does not specify whether the LSA
1133 * is external or NSSA, but it specifies the source of origination -
1134 * the export from ospf_rt_notify(), or the NSSA-EXT translation.
1135 */
1136 void
1137 ospf_originate_ext_lsa(struct ospf_proto *p, struct ospf_area *oa, ort *nf, u8 mode,
1138 u32 metric, u32 ebit, ip_addr fwaddr, u32 tag, int pbit)
1139 {
1140 struct ospf_new_lsa lsa = {
1141 .type = oa ? LSA_T_NSSA : LSA_T_EXT,
1142 .mode = mode, /* LSA_M_EXPORT or LSA_M_RTCALC */
1143 .dom = oa ? oa->areaid : 0,
1144 .id = ort_to_lsaid(p, nf),
1145 .opts = oa ? (pbit ? OPT_P : 0) : OPT_E,
1146 .nf = nf
1147 };
1148
1149 if (ospf_is_v2(p))
1150 prepare_ext2_lsa_body(p, nf->fn.addr->pxlen, metric, ebit, fwaddr, tag);
1151 else
1152 prepare_ext3_lsa_body(p, nf, metric, ebit, fwaddr, tag, oa && pbit);
1153
1154 ospf_originate_lsa(p, &lsa);
1155 }
1156
1157 static struct top_hash_entry *
1158 ospf_hash_find_(struct top_graph *f, u32 domain, u32 lsa, u32 rtr, u32 type);
1159
1160 static void
1161 ospf_flush_ext_lsa(struct ospf_proto *p, struct ospf_area *oa, ort *nf)
1162 {
1163 struct top_hash_entry *en;
1164
1165 u32 type = oa ? LSA_T_NSSA : LSA_T_EXT;
1166 u32 dom = oa ? oa->areaid : 0;
1167 u32 id = ort_to_lsaid(p, nf);
1168
1169 en = ospf_hash_find_(p->gr, dom, id, p->router_id, type);
1170
1171 if (!en || (en->nf != nf))
1172 return;
1173
1174 ospf_flush_lsa(p, en);
1175 }
1176
1177 static inline int
1178 use_gw_for_fwaddr(struct ospf_proto *p, ip_addr gw, struct iface *iface)
1179 {
1180 struct ospf_iface *ifa;
1181
1182 if (ipa_zero(gw) || ipa_is_link_local(gw))
1183 return 0;
1184
1185 WALK_LIST(ifa, p->iface_list)
1186 if ((ifa->iface == iface) &&
1187 (!ospf_is_v2(p) || ipa_in_netX(gw, &ifa->addr->prefix)))
1188 return 1;
1189
1190 return 0;
1191 }
1192
1193 static inline ip_addr
1194 find_surrogate_fwaddr(struct ospf_proto *p, struct ospf_area *oa)
1195 {
1196 struct ospf_iface *ifa;
1197 struct ifa *a, *cur_addr = NULL;
1198 int np, cur_np = 0;
1199
1200 /* RFC 3101 2.3 - surrogate forwarding address selection */
1201
1202 WALK_LIST(ifa, p->iface_list)
1203 {
1204 if ((ifa->oa != oa) ||
1205 (ifa->type == OSPF_IT_VLINK))
1206 continue;
1207
1208 if (ospf_is_v2(p))
1209 {
1210 a = ifa->addr;
1211 if (a->flags & IA_PEER)
1212 continue;
1213
1214 np = (a->flags & IA_HOST) ? 3 : (ifa->stub ? 2 : 1);
1215 if (np > cur_np)
1216 {
1217 cur_addr = a;
1218 cur_np = np;
1219 }
1220 }
1221 else /* OSPFv3 */
1222 {
1223 WALK_LIST(a, ifa->iface->addrs)
1224 {
1225 if ((a->prefix.type != NET_IP6) ||
1226 (a->flags & IA_SECONDARY) ||
1227 (a->flags & IA_PEER) ||
1228 (a->scope <= SCOPE_LINK))
1229 continue;
1230
1231 np = (a->flags & IA_HOST) ? 3 : (ifa->stub ? 2 : 1);
1232 if (np > cur_np)
1233 {
1234 cur_addr = a;
1235 cur_np = np;
1236 }
1237 }
1238 }
1239 }
1240
1241 return cur_addr ? cur_addr->ip : IPA_NONE;
1242 }
1243
1244 void
1245 ospf_rt_notify(struct proto *P, struct channel *ch UNUSED, net *n, rte *new, rte *old UNUSED, ea_list *ea)
1246 {
1247 struct ospf_proto *p = (struct ospf_proto *) P;
1248 struct ospf_area *oa = NULL; /* non-NULL for NSSA-LSA */
1249 ort *nf;
1250
1251 /*
1252 * There are several posibilities:
1253 * 1) router in regular area - originate external LSA with global scope
1254 * 2) router in NSSA area - originate area-specific NSSA-LSA
1255 * 3) router in stub area - cannot export routes
1256 * 4) area border router - same as (1), it is attached to backbone
1257 */
1258
1259 if ((p->areano == 1) && oa_is_nssa(HEAD(p->area_list)))
1260 oa = HEAD(p->area_list);
1261
1262 if (!new)
1263 {
1264 nf = fib_find(&p->rtf, n->n.addr);
1265
1266 if (!nf || !nf->external_rte)
1267 return;
1268
1269 ospf_flush_ext_lsa(p, oa, nf);
1270 nf->external_rte = 0;
1271
1272 /* Old external route might blocked some NSSA translation */
1273 if ((p->areano > 1) && rt_is_nssa(nf) && nf->n.oa->translate)
1274 ospf_schedule_rtcalc(p);
1275
1276 return;
1277 }
1278
1279 ASSERT(p->asbr);
1280
1281 /* Get route attributes */
1282 rta *a = new->attrs;
1283 u32 m1 = ea_get_int(ea, EA_OSPF_METRIC1, LSINFINITY);
1284 u32 m2 = ea_get_int(ea, EA_OSPF_METRIC2, 10000);
1285 int ebit = (m1 == LSINFINITY);
1286 u32 metric = ebit ? m2 : m1;
1287 u32 tag = ea_get_int(ea, EA_OSPF_TAG, 0);
1288 ip_addr fwd = IPA_NONE;
1289
1290
1291 if ((a->dest == RTD_UNICAST) && use_gw_for_fwaddr(p, a->nh.gw, a->nh.iface))
1292 fwd = a->nh.gw;
1293
1294 /* NSSA-LSA with P-bit set must have non-zero forwarding address */
1295 if (oa && ipa_zero(fwd))
1296 {
1297 fwd = find_surrogate_fwaddr(p, oa);
1298
1299 if (ipa_zero(fwd))
1300 {
1301 log(L_ERR "%s: Cannot find forwarding address for NSSA-LSA %N",
1302 p->p.name, n->n.addr);
1303 return;
1304 }
1305 }
1306
1307 nf = fib_get(&p->rtf, n->n.addr);
1308 ospf_originate_ext_lsa(p, oa, nf, LSA_M_EXPORT, metric, ebit, fwd, tag, 1);
1309 nf->external_rte = 1;
1310 }
1311
1312
1313 /*
1314 * Link-LSA handling (assume OSPFv3)
1315 * Type = LSA_T_LINK
1316 */
1317
1318 static inline void
1319 lsab_put_prefix(struct ospf_proto *p, net_addr *net, u32 cost)
1320 {
1321 void *buf = lsab_alloc(p, IPV6_PREFIX_SPACE(net6_pxlen(net)));
1322 u8 flags = (net6_pxlen(net) < IP6_MAX_PREFIX_LENGTH) ? 0 : OPT_PX_LA;
1323 ospf_put_ipv6_prefix(buf, net, flags, cost);
1324 }
1325
1326 static void
1327 prepare_link_lsa_body(struct ospf_proto *p, struct ospf_iface *ifa)
1328 {
1329 struct ospf_lsa_link *ll;
1330 int i = 0;
1331
1332 ASSERT(p->lsab_used == 0);
1333 ll = lsab_allocz(p, sizeof(struct ospf_lsa_link));
1334 ll->options = ifa->oa->options | (ifa->priority << 24);
1335 ll->lladdr = ipa_to_ip6(ifa->addr->ip);
1336 ll = NULL; /* buffer might be reallocated later */
1337
1338 struct ifa *a;
1339 WALK_LIST(a, ifa->iface->addrs)
1340 {
1341 if ((a->prefix.type != NET_IP6) ||
1342 (a->flags & IA_SECONDARY) ||
1343 (a->scope <= SCOPE_LINK))
1344 continue;
1345
1346 lsab_put_prefix(p, &a->prefix, 0);
1347 i++;
1348 }
1349
1350 ll = p->lsab;
1351 ll->pxcount = i;
1352 }
1353
1354 static void
1355 ospf_originate_link_lsa(struct ospf_proto *p, struct ospf_iface *ifa)
1356 {
1357 if (ospf_is_v2(p))
1358 return;
1359
1360 struct ospf_new_lsa lsa = {
1361 .type = LSA_T_LINK,
1362 .dom = ifa->iface_id,
1363 .id = ifa->iface_id,
1364 .ifa = ifa
1365 };
1366
1367 OSPF_TRACE(D_EVENTS, "Updating link state for %s (Id: %R)", ifa->ifname, lsa.id);
1368
1369 prepare_link_lsa_body(p, ifa);
1370
1371 ifa->link_lsa = ospf_originate_lsa(p, &lsa);
1372 }
1373
1374
1375 /*
1376 * Prefix-Rt-LSA handling (assume OSPFv3)
1377 * Type = LSA_T_PREFIX, referred type = LSA_T_RT
1378 */
1379
1380 static void
1381 prepare_prefix_rt_lsa_body(struct ospf_proto *p, struct ospf_area *oa)
1382 {
1383 struct ospf_config *cf = (struct ospf_config *) (p->p.cf);
1384 struct ospf_iface *ifa;
1385 struct ospf_lsa_prefix *lp;
1386 int host_addr = 0;
1387 int net_lsa;
1388 int i = 0;
1389
1390 ASSERT(p->lsab_used == 0);
1391 lp = lsab_allocz(p, sizeof(struct ospf_lsa_prefix));
1392 lp->ref_type = LSA_T_RT;
1393 lp->ref_id = 0;
1394 lp->ref_rt = p->router_id;
1395 lp = NULL; /* buffer might be reallocated later */
1396
1397 WALK_LIST(ifa, p->iface_list)
1398 {
1399 if ((ifa->oa != oa) || (ifa->type == OSPF_IT_VLINK) || (ifa->state == OSPF_IS_DOWN))
1400 continue;
1401
1402 ifa->px_pos_beg = i;
1403
1404 if ((ifa->type == OSPF_IT_BCAST) ||
1405 (ifa->type == OSPF_IT_NBMA))
1406 net_lsa = bcast_net_active(ifa);
1407 else
1408 net_lsa = 0;
1409
1410 struct ifa *a;
1411 WALK_LIST(a, ifa->iface->addrs)
1412 {
1413 if ((a->prefix.type != NET_IP6) ||
1414 (a->flags & IA_SECONDARY) ||
1415 (a->flags & IA_PEER) ||
1416 (a->scope <= SCOPE_LINK))
1417 continue;
1418
1419 if (((a->prefix.pxlen < IP6_MAX_PREFIX_LENGTH) && net_lsa) ||
1420 configured_stubnet(oa, a))
1421 continue;
1422
1423 if ((a->flags & IA_HOST) ||
1424 (ifa->state == OSPF_IS_LOOP) ||
1425 (ifa->type == OSPF_IT_PTMP))
1426 {
1427 net_addr_ip6 net = NET_ADDR_IP6(a->ip, IP6_MAX_PREFIX_LENGTH);
1428 lsab_put_prefix(p, (net_addr *) &net, 0);
1429 host_addr = 1;
1430 }
1431 else
1432 lsab_put_prefix(p, &a->prefix, ifa->cost);
1433 i++;
1434 }
1435
1436 ifa->px_pos_end = i;
1437 }
1438
1439 struct ospf_stubnet_config *sn;
1440 WALK_LIST(sn, oa->ac->stubnet_list)
1441 if (!sn->hidden)
1442 {
1443 lsab_put_prefix(p, &sn->prefix, sn->cost);
1444 if (sn->prefix.pxlen == IP6_MAX_PREFIX_LENGTH)
1445 host_addr = 1;
1446 i++;
1447 }
1448
1449 /* If there are some configured vlinks, find some global address
1450 (even from another area), which will be used as a vlink endpoint. */
1451 if (!EMPTY_LIST(cf->vlink_list) && !host_addr)
1452 {
1453 WALK_LIST(ifa, p->iface_list)
1454 {
1455 if ((ifa->type == OSPF_IT_VLINK) || (ifa->state == OSPF_IS_DOWN))
1456 continue;
1457
1458 struct ifa *a;
1459 WALK_LIST(a, ifa->iface->addrs)
1460 {
1461 if ((a->prefix.type != NET_IP6) ||
1462 (a->flags & IA_SECONDARY) ||
1463 (a->scope <= SCOPE_LINK))
1464 continue;
1465
1466 /* Found some IP */
1467 net_addr_ip6 net = NET_ADDR_IP6(a->ip, IP6_MAX_PREFIX_LENGTH);
1468 lsab_put_prefix(p, (net_addr *) &net, 0);
1469 i++;
1470 goto done;
1471 }
1472 }
1473 }
1474
1475 done:
1476 lp = p->lsab;
1477 lp->pxcount = i;
1478 }
1479
1480 static void
1481 ospf_originate_prefix_rt_lsa(struct ospf_proto *p, struct ospf_area *oa)
1482 {
1483 if (ospf_is_v2(p))
1484 return;
1485
1486 struct ospf_new_lsa lsa = {
1487 .type = LSA_T_PREFIX,
1488 .dom = oa->areaid,
1489 .id = 0
1490 };
1491
1492 prepare_prefix_rt_lsa_body(p, oa);
1493
1494 ospf_originate_lsa(p, &lsa);
1495 }
1496
1497
1498 /*
1499 * Prefix-Net-LSA handling (assume OSPFv3)
1500 * Type = LSA_T_PREFIX, referred type = LSA_T_NET
1501 */
1502
1503 static inline int
1504 prefix_space(u32 *buf)
1505 {
1506 int pxl = *buf >> 24;
1507 return IPV6_PREFIX_SPACE(pxl);
1508 }
1509
1510 static inline int
1511 prefix_same(u32 *b1, u32 *b2)
1512 {
1513 int pxl1 = *b1 >> 24;
1514 int pxl2 = *b2 >> 24;
1515 int pxs, i;
1516
1517 if (pxl1 != pxl2)
1518 return 0;
1519
1520 pxs = IPV6_PREFIX_WORDS(pxl1);
1521 for (i = 1; i < pxs; i++)
1522 if (b1[i] != b2[i])
1523 return 0;
1524
1525 return 1;
1526 }
1527
1528 static inline u32 *
1529 prefix_advance(u32 *buf)
1530 {
1531 int pxl = *buf >> 24;
1532 return buf + IPV6_PREFIX_WORDS(pxl);
1533 }
1534
1535 /* FIXME eliminate items with LA bit set? see 4.4.3.9 */
1536 static void
1537 add_prefix(struct ospf_proto *p, u32 *px, int offset, int *pxc)
1538 {
1539 u32 *pxl = lsab_offset(p, offset);
1540 int i;
1541 for (i = 0; i < *pxc; pxl = prefix_advance(pxl), i++)
1542 if (prefix_same(px, pxl))
1543 {
1544 /* Options should be logically OR'ed together */
1545 *pxl |= (*px & 0x00FF0000);
1546 return;
1547 }
1548
1549 ASSERT(pxl == lsab_end(p));
1550
1551 int pxspace = prefix_space(px);
1552 pxl = lsab_alloc(p, pxspace);
1553 memcpy(pxl, px, pxspace);
1554 *pxl &= 0xFFFF0000; /* Set metric to zero */
1555 (*pxc)++;
1556 }
1557
1558 static void
1559 add_link_lsa(struct ospf_proto *p, struct ospf_lsa_link *ll, int offset, int *pxc)
1560 {
1561 u32 *pxb = ll->rest;
1562 uint j;
1563
1564 for (j = 0; j < ll->pxcount; pxb = prefix_advance(pxb), j++)
1565 {
1566 u8 pxlen = (pxb[0] >> 24);
1567 u8 pxopts = (pxb[0] >> 16);
1568
1569 /* Skip NU or LA prefixes */
1570 if (pxopts & (OPT_PX_NU | OPT_PX_LA))
1571 continue;
1572
1573 /* Skip link-local prefixes */
1574 if ((pxlen >= 10) && ((pxb[1] & 0xffc00000) == 0xfe800000))
1575 continue;
1576
1577 add_prefix(p, pxb, offset, pxc);
1578 }
1579 }
1580
1581 static void
1582 prepare_prefix_net_lsa_body(struct ospf_proto *p, struct ospf_iface *ifa)
1583 {
1584 struct ospf_lsa_prefix *lp;
1585 struct ospf_neighbor *n;
1586 struct top_hash_entry *en;
1587 int pxc, offset;
1588
1589 ASSERT(p->lsab_used == 0);
1590 lp = lsab_allocz(p, sizeof(struct ospf_lsa_prefix));
1591 lp->ref_type = LSA_T_NET;
1592 lp->ref_id = ifa->net_lsa->lsa.id;
1593 lp->ref_rt = p->router_id;
1594 lp = NULL; /* buffer might be reallocated later */
1595
1596 pxc = 0;
1597 offset = p->lsab_used;
1598
1599 /* Find all Link LSAs associated with the link and merge their prefixes */
1600 if (en = ifa->link_lsa)
1601 add_link_lsa(p, en->next_lsa_body ?: en->lsa_body, offset, &pxc);
1602
1603 WALK_LIST(n, ifa->neigh_list)
1604 if ((n->state == NEIGHBOR_FULL) &&
1605 (en = ospf_hash_find(p->gr, ifa->iface_id, n->iface_id, n->rid, LSA_T_LINK)))
1606 add_link_lsa(p, en->lsa_body, offset, &pxc);
1607
1608 lp = p->lsab;
1609 lp->pxcount = pxc;
1610 }
1611
1612 static void
1613 ospf_originate_prefix_net_lsa(struct ospf_proto *p, struct ospf_iface *ifa)
1614 {
1615 if (ospf_is_v2(p))
1616 return;
1617
1618 struct ospf_new_lsa lsa = {
1619 .type = LSA_T_PREFIX,
1620 .dom = ifa->oa->areaid,
1621 .id = ifa->iface_id,
1622 .ifa = ifa
1623 };
1624
1625 prepare_prefix_net_lsa_body(p, ifa);
1626
1627 ifa->pxn_lsa = ospf_originate_lsa(p, &lsa);
1628 }
1629
1630 static inline int breaks_minlsinterval(struct top_hash_entry *en)
1631 { return en && (en->lsa.age < LSA_MAXAGE) && ((en->inst_time + MINLSINTERVAL) > now); }
1632
1633 void
1634 ospf_update_topology(struct ospf_proto *p)
1635 {
1636 struct ospf_area *oa;
1637 struct ospf_iface *ifa;
1638
1639 WALK_LIST(oa, p->area_list)
1640 {
1641 if (oa->update_rt_lsa)
1642 {
1643 /*
1644 * Generally, MinLSInterval is enforced in ospf_do_originate_lsa(), but
1645 * origination of (prefix) router LSA is a special case. We do not want to
1646 * prepare a new router LSA body and then postpone it in en->next_lsa_body
1647 * for later origination, because there are side effects (updates of
1648 * rt_pos_* and px_pos_* in ospf_iface structures) during that, which may
1649 * confuse routing table calculation if executed after LSA body
1650 * preparation but before final LSA origination (as rtcalc would use
1651 * current rt_pos_* indexes but the old router LSA body).
1652 *
1653 * Here, we ensure that MinLSInterval is observed and we do not even try
1654 * to originate these LSAs if it is not. Therefore, origination, when
1655 * requested, will succeed unless there is also a seqnum wrapping, which
1656 * is not a problem because in that case rtcalc is blocked by MaxAge.
1657 */
1658
1659 if (breaks_minlsinterval(oa->rt) || breaks_minlsinterval(oa->pxr_lsa))
1660 continue;
1661
1662 ospf_originate_rt_lsa(p, oa);
1663 ospf_originate_prefix_rt_lsa(p, oa);
1664 oa->update_rt_lsa = 0;
1665 }
1666 }
1667
1668 WALK_LIST(ifa, p->iface_list)
1669 {
1670 if (ifa->type == OSPF_IT_VLINK)
1671 continue;
1672
1673 if (ifa->update_link_lsa)
1674 {
1675 if ((ifa->state > OSPF_IS_LOOP) && !ifa->link_lsa_suppression)
1676 ospf_originate_link_lsa(p, ifa);
1677 else
1678 ospf_flush2_lsa(p, &ifa->link_lsa);
1679
1680 ifa->update_link_lsa = 0;
1681 }
1682
1683 if (ifa->update_net_lsa)
1684 {
1685 if ((ifa->state == OSPF_IS_DR) && (ifa->fadj > 0))
1686 {
1687 ospf_originate_net_lsa(p, ifa);
1688 ospf_originate_prefix_net_lsa(p, ifa);
1689 }
1690 else
1691 {
1692 ospf_flush2_lsa(p, &ifa->net_lsa);
1693 ospf_flush2_lsa(p, &ifa->pxn_lsa);
1694 }
1695
1696 ifa->update_net_lsa = 0;
1697 }
1698 }
1699 }
1700
1701
1702 static void
1703 ospf_top_ht_alloc(struct top_graph *f)
1704 {
1705 f->hash_size = 1 << f->hash_order;
1706 f->hash_mask = f->hash_size - 1;
1707 if (f->hash_order > HASH_HI_MAX - HASH_HI_STEP)
1708 f->hash_entries_max = ~0;
1709 else
1710 f->hash_entries_max = f->hash_size HASH_HI_MARK;
1711 if (f->hash_order < HASH_LO_MIN + HASH_LO_STEP)
1712 f->hash_entries_min = 0;
1713 else
1714 f->hash_entries_min = f->hash_size HASH_LO_MARK;
1715 DBG("Allocating OSPF hash of order %d: %d hash_entries, %d low, %d high\n",
1716 f->hash_order, f->hash_size, f->hash_entries_min, f->hash_entries_max);
1717 f->hash_table =
1718 mb_alloc(f->pool, f->hash_size * sizeof(struct top_hash_entry *));
1719 bzero(f->hash_table, f->hash_size * sizeof(struct top_hash_entry *));
1720 }
1721
1722 static inline void
1723 ospf_top_ht_free(struct top_hash_entry **h)
1724 {
1725 mb_free(h);
1726 }
1727
1728 static inline u32
1729 ospf_top_hash_u32(u32 a)
1730 {
1731 /* Shamelessly stolen from IP address hashing in ipv4.h */
1732 a ^= a >> 16;
1733 a ^= a << 10;
1734 return a;
1735 }
1736
1737 static uint
1738 ospf_top_hash(struct top_graph *f, u32 domain, u32 lsaid, u32 rtrid, u32 type)
1739 {
1740 /* In OSPFv2, we don't know Router ID when looking for network LSAs.
1741 In OSPFv3, we don't know LSA ID when looking for router LSAs.
1742 In both cases, there is (usually) just one (or small number)
1743 appropriate LSA, so we just clear unknown part of key. */
1744
1745 return (((f->ospf2 && (type == LSA_T_NET)) ? 0 : ospf_top_hash_u32(rtrid)) +
1746 ((!f->ospf2 && (type == LSA_T_RT)) ? 0 : ospf_top_hash_u32(lsaid)) +
1747 type + domain) & f->hash_mask;
1748
1749 /*
1750 return (ospf_top_hash_u32(lsaid) + ospf_top_hash_u32(rtrid) +
1751 type + areaid) & f->hash_mask;
1752 */
1753 }
1754
1755 /**
1756 * ospf_top_new - allocated new topology database
1757 * @p: OSPF protocol instance
1758 * @pool: pool for allocation
1759 *
1760 * This dynamically hashed structure is used for keeping LSAs. Mainly it is used
1761 * for the LSA database of the OSPF protocol, but also for LSA retransmission
1762 * and request lists of OSPF neighbors.
1763 */
1764 struct top_graph *
1765 ospf_top_new(struct ospf_proto *p, pool *pool)
1766 {
1767 struct top_graph *f;
1768
1769 f = mb_allocz(pool, sizeof(struct top_graph));
1770 f->pool = pool;
1771 f->hash_slab = sl_new(f->pool, sizeof(struct top_hash_entry));
1772 f->hash_order = HASH_DEF_ORDER;
1773 ospf_top_ht_alloc(f);
1774 f->hash_entries = 0;
1775 f->hash_entries_min = 0;
1776 f->ospf2 = ospf_is_v2(p);
1777 return f;
1778 }
1779
1780 void
1781 ospf_top_free(struct top_graph *f)
1782 {
1783 rfree(f->hash_slab);
1784 ospf_top_ht_free(f->hash_table);
1785 mb_free(f);
1786 }
1787
1788 static void
1789 ospf_top_rehash(struct top_graph *f, int step)
1790 {
1791 struct top_hash_entry **n, **oldt, **newt, *e, *x;
1792 uint oldn, oldh;
1793
1794 oldn = f->hash_size;
1795 oldt = f->hash_table;
1796 DBG("re-hashing topology hash from order %d to %d\n", f->hash_order,
1797 f->hash_order + step);
1798 f->hash_order += step;
1799 ospf_top_ht_alloc(f);
1800 newt = f->hash_table;
1801
1802 for (oldh = 0; oldh < oldn; oldh++)
1803 {
1804 e = oldt[oldh];
1805 while (e)
1806 {
1807 x = e->next;
1808 n = newt + ospf_top_hash(f, e->domain, e->lsa.id, e->lsa.rt, e->lsa_type);
1809 e->next = *n;
1810 *n = e;
1811 e = x;
1812 }
1813 }
1814 ospf_top_ht_free(oldt);
1815 }
1816
1817 static struct top_hash_entry *
1818 ospf_hash_find_(struct top_graph *f, u32 domain, u32 lsa, u32 rtr, u32 type)
1819 {
1820 struct top_hash_entry *e;
1821 e = f->hash_table[ospf_top_hash(f, domain, lsa, rtr, type)];
1822
1823 while (e && (e->lsa.id != lsa || e->lsa.rt != rtr ||
1824 e->lsa_type != type || e->domain != domain))
1825 e = e->next;
1826
1827 return e;
1828 }
1829
1830 struct top_hash_entry *
1831 ospf_hash_find(struct top_graph *f, u32 domain, u32 lsa, u32 rtr, u32 type)
1832 {
1833 struct top_hash_entry *e = ospf_hash_find_(f, domain, lsa, rtr, type);
1834
1835 /* Hide hash entry with empty lsa_body */
1836 return (e && e->lsa_body) ? e : NULL;
1837 }
1838
1839 /* In OSPFv2, lsa.id is the same as lsa.rt for router LSA. In OSPFv3, we don't know
1840 lsa.id when looking for router LSAs. We return matching LSA with smallest lsa.id. */
1841 struct top_hash_entry *
1842 ospf_hash_find_rt(struct top_graph *f, u32 domain, u32 rtr)
1843 {
1844 struct top_hash_entry *rv = NULL;
1845 struct top_hash_entry *e;
1846 /* We can put rtr for lsa.id to hash fn, it is ignored in OSPFv3 */
1847 e = f->hash_table[ospf_top_hash(f, domain, rtr, rtr, LSA_T_RT)];
1848
1849 while (e)
1850 {
1851 if (e->lsa.rt == rtr && e->lsa_type == LSA_T_RT && e->domain == domain && e->lsa_body)
1852 {
1853 if (f->ospf2 && (e->lsa.id == rtr))
1854 return e;
1855 if (!f->ospf2 && (!rv || e->lsa.id < rv->lsa.id))
1856 rv = e;
1857 }
1858 e = e->next;
1859 }
1860
1861 return rv;
1862 }
1863
1864 /*
1865 * ospf_hash_find_rt3_first() and ospf_hash_find_rt3_next() are used exclusively
1866 * for lsa_walk_rt_init(), lsa_walk_rt(), therefore they skip MaxAge entries.
1867 */
1868 static inline struct top_hash_entry *
1869 find_matching_rt3(struct top_hash_entry *e, u32 domain, u32 rtr)
1870 {
1871 while (e && (e->lsa.rt != rtr || e->lsa_type != LSA_T_RT ||
1872 e->domain != domain || e->lsa.age == LSA_MAXAGE))
1873 e = e->next;
1874 return e;
1875 }
1876
1877 struct top_hash_entry *
1878 ospf_hash_find_rt3_first(struct top_graph *f, u32 domain, u32 rtr)
1879 {
1880 struct top_hash_entry *e;
1881 e = f->hash_table[ospf_top_hash(f, domain, 0, rtr, LSA_T_RT)];
1882 return find_matching_rt3(e, domain, rtr);
1883 }
1884
1885 struct top_hash_entry *
1886 ospf_hash_find_rt3_next(struct top_hash_entry *e)
1887 {
1888 return find_matching_rt3(e->next, e->domain, e->lsa.rt);
1889 }
1890
1891 /* In OSPFv2, we don't know Router ID when looking for network LSAs.
1892 There should be just one, so we find any match. */
1893 struct top_hash_entry *
1894 ospf_hash_find_net2(struct top_graph *f, u32 domain, u32 id)
1895 {
1896 struct top_hash_entry *e;
1897 e = f->hash_table[ospf_top_hash(f, domain, id, 0, LSA_T_NET)];
1898
1899 while (e && (e->lsa.id != id || e->lsa_type != LSA_T_NET ||
1900 e->domain != domain || e->lsa_body == NULL))
1901 e = e->next;
1902
1903 return e;
1904 }
1905
1906
1907 struct top_hash_entry *
1908 ospf_hash_get(struct top_graph *f, u32 domain, u32 lsa, u32 rtr, u32 type)
1909 {
1910 struct top_hash_entry **ee;
1911 struct top_hash_entry *e;
1912
1913 ee = f->hash_table + ospf_top_hash(f, domain, lsa, rtr, type);
1914 e = *ee;
1915
1916 while (e && (e->lsa.id != lsa || e->lsa.rt != rtr ||
1917 e->lsa_type != type || e->domain != domain))
1918 e = e->next;
1919
1920 if (e)
1921 return e;
1922
1923 e = sl_alloc(f->hash_slab);
1924 bzero(e, sizeof(struct top_hash_entry));
1925
1926 e->color = OUTSPF;
1927 e->dist = LSINFINITY;
1928 e->lsa.type_raw = type;
1929 e->lsa.id = lsa;
1930 e->lsa.rt = rtr;
1931 e->lsa.sn = LSA_ZEROSEQNO;
1932 e->lsa_type = type;
1933 e->domain = domain;
1934 e->next = *ee;
1935 *ee = e;
1936 if (f->hash_entries++ > f->hash_entries_max)
1937 ospf_top_rehash(f, HASH_HI_STEP);
1938 return e;
1939 }
1940
1941 void
1942 ospf_hash_delete(struct top_graph *f, struct top_hash_entry *e)
1943 {
1944 struct top_hash_entry **ee = f->hash_table +
1945 ospf_top_hash(f, e->domain, e->lsa.id, e->lsa.rt, e->lsa_type);
1946
1947 while (*ee)
1948 {
1949 if (*ee == e)
1950 {
1951 *ee = e->next;
1952 sl_free(f->hash_slab, e);
1953 if (f->hash_entries-- < f->hash_entries_min)
1954 ospf_top_rehash(f, -HASH_LO_STEP);
1955 return;
1956 }
1957 ee = &((*ee)->next);
1958 }
1959 bug("ospf_hash_delete() called for invalid node");
1960 }
1961
1962 /*
1963 static void
1964 ospf_dump_lsa(struct top_hash_entry *he, struct proto *p)
1965 {
1966
1967 struct ospf_lsa_rt *rt = NULL;
1968 struct ospf_lsa_rt_link *rr = NULL;
1969 struct ospf_lsa_net *ln = NULL;
1970 u32 *rts = NULL;
1971 u32 i, max;
1972
1973 OSPF_TRACE(D_EVENTS, "- %1x %-1R %-1R %4u 0x%08x 0x%04x %-1R",
1974 he->lsa.type, he->lsa.id, he->lsa.rt, he->lsa.age, he->lsa.sn,
1975 he->lsa.checksum, he->domain);
1976
1977
1978 switch (he->lsa.type)
1979 {
1980 case LSA_T_RT:
1981 rt = he->lsa_body;
1982 rr = (struct ospf_lsa_rt_link *) (rt + 1);
1983
1984 for (i = 0; i < lsa_rt_items(&he->lsa); i++)
1985 OSPF_TRACE(D_EVENTS, " - %1x %-1R %-1R %5u",
1986 rr[i].type, rr[i].id, rr[i].data, rr[i].metric);
1987 break;
1988
1989 case LSA_T_NET:
1990 ln = he->lsa_body;
1991 rts = (u32 *) (ln + 1);
1992
1993 for (i = 0; i < lsa_net_items(&he->lsa); i++)
1994 OSPF_TRACE(D_EVENTS, " - %-1R", rts[i]);
1995 break;
1996
1997 default:
1998 break;
1999 }
2000 }
2001
2002 void
2003 ospf_top_dump(struct top_graph *f, struct proto *p)
2004 {
2005 uint i;
2006 OSPF_TRACE(D_EVENTS, "Hash entries: %d", f->hash_entries);
2007
2008 for (i = 0; i < f->hash_size; i++)
2009 {
2010 struct top_hash_entry *e;
2011 for (e = f->hash_table[i]; e != NULL; e = e->next)
2012 ospf_dump_lsa(e, p);
2013 }
2014 }
2015 */