]> git.ipfire.org Git - thirdparty/bird.git/blob - proto/ospf/topology.c
03b773499d9383ea75873d9f26ced2a5012ea530
[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 = current_time();
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 = current_time();
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 = current_time();
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 && en->inst_time && (lsa_inst_age(en) < MINLSINTERVAL))
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 = current_time();
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 = current_time();
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 btime now_ = current_time();
480 int real_age;
481
482 WALK_SLIST_DELSAFE(en, nxt, p->lsal)
483 {
484 if (en->next_lsa_body)
485 ospf_originate_next_lsa(p, en);
486
487 real_age = en->init_age + (now_ - en->inst_time) TO_S;
488
489 if (en->lsa.age == LSA_MAXAGE)
490 {
491 if (en->lsa_body && (p->padj == 0) && (en->ret_count == 0))
492 ospf_clear_lsa(p, en);
493
494 if ((en->lsa_body == NULL) && (en->next_lsa_body == NULL) &&
495 ((en->lsa.rt != p->router_id) || (real_age >= LSA_MAXAGE)))
496 ospf_remove_lsa(p, en);
497
498 continue;
499 }
500
501 if ((en->lsa.rt == p->router_id) && (real_age >= LSREFRESHTIME))
502 {
503 ospf_refresh_lsa(p, en);
504 continue;
505 }
506
507 if (real_age >= LSA_MAXAGE)
508 {
509 ospf_flush_lsa(p, en);
510 continue;
511 }
512
513 en->lsa.age = real_age;
514 }
515 }
516
517
518 static u32
519 ort_to_lsaid(struct ospf_proto *p, ort *nf)
520 {
521 /*
522 * In OSPFv2, We have to map IP prefixes to u32 in such manner that resulting
523 * u32 interpreted as IP address is a member of given prefix. Therefore, /32
524 * prefix has to be mapped on itself. All received prefixes have to be mapped
525 * on different u32s.
526 *
527 * We have an assumption that if there is nontrivial (non-/32) network prefix,
528 * then there is not /32 prefix for the first and the last IP address of the
529 * network (these are usually reserved, therefore it is not an important
530 * restriction). The network prefix is mapped to the first or the last IP
531 * address in the manner that disallow collisions - we use the IP address that
532 * cannot be used by the parent prefix.
533 *
534 * For example:
535 * 192.168.0.0/24 maps to 192.168.0.255
536 * 192.168.1.0/24 maps to 192.168.1.0
537 * because 192.168.0.0 and 192.168.1.255 might be used by 192.168.0.0/23 .
538 *
539 * Appendig E of RFC 2328 suggests different algorithm, that tries to maximize
540 * both compatibility and subnetting. But as it is not possible to have both
541 * reliably and the suggested algorithm was unnecessary complicated and it
542 * does crazy things like changing LSA ID for a network because different
543 * network appeared, we choose a different way.
544 *
545 * In OSPFv3, it is simpler. There is not a requirement for membership of the
546 * result in the input network, so we just allocate a unique ID from ID map
547 * and store it in nf->lsa_id for further reference.
548 */
549
550 if (ospf_is_v3(p))
551 {
552 if (!nf->lsa_id)
553 nf->lsa_id = idm_alloc(&p->idm);
554
555 return nf->lsa_id;
556 }
557
558 net_addr_ip4 *net = (void *) nf->fn.addr;
559 u32 id = ip4_to_u32(net->prefix);
560 int pxlen = net->pxlen;
561
562 if ((pxlen == 0) || (pxlen == 32))
563 return id;
564
565 if (id & (1 << (32 - pxlen)))
566 return id;
567 else
568 return id | ~u32_mkmask(pxlen);
569 }
570
571
572 static void *
573 lsab_alloc(struct ospf_proto *p, uint size)
574 {
575 uint offset = p->lsab_used;
576 p->lsab_used += size;
577 if (p->lsab_used > p->lsab_size)
578 {
579 p->lsab_size = MAX(p->lsab_used, 2 * p->lsab_size);
580 p->lsab = p->lsab ? mb_realloc(p->lsab, p->lsab_size):
581 mb_alloc(p->p.pool, p->lsab_size);
582 }
583 return ((byte *) p->lsab) + offset;
584 }
585
586 static inline void *
587 lsab_allocz(struct ospf_proto *p, uint size)
588 {
589 void *r = lsab_alloc(p, size);
590 bzero(r, size);
591 return r;
592 }
593
594 static inline void *
595 lsab_flush(struct ospf_proto *p)
596 {
597 void *r = mb_alloc(p->p.pool, p->lsab_used);
598 memcpy(r, p->lsab, p->lsab_used);
599 p->lsab_used = 0;
600 return r;
601 }
602
603 static inline void
604 lsab_reset(struct ospf_proto *p)
605 {
606 p->lsab_used = 0;
607 }
608
609 static inline void *
610 lsab_offset(struct ospf_proto *p, uint offset)
611 {
612 return ((byte *) p->lsab) + offset;
613 }
614
615 static inline void * UNUSED
616 lsab_end(struct ospf_proto *p)
617 {
618 return ((byte *) p->lsab) + p->lsab_used;
619 }
620
621
622 /*
623 * Router-LSA handling
624 * Type = LSA_T_RT
625 */
626
627 static int
628 configured_stubnet(struct ospf_area *oa, struct ifa *a)
629 {
630 /* Does not work for IA_PEER addresses, but it is not called on these */
631 struct ospf_stubnet_config *sn;
632 WALK_LIST(sn, oa->ac->stubnet_list)
633 {
634 if (sn->summary)
635 {
636 if (net_in_netX(&a->prefix, &sn->prefix))
637 return 1;
638 }
639 else
640 {
641 if (net_equal(&a->prefix, &sn->prefix))
642 return 1;
643 }
644 }
645
646 return 0;
647 }
648
649 static int
650 bcast_net_active(struct ospf_iface *ifa)
651 {
652 struct ospf_neighbor *neigh;
653
654 if (ifa->state == OSPF_IS_WAITING)
655 return 0;
656
657 WALK_LIST(neigh, ifa->neigh_list)
658 {
659 if (neigh->state == NEIGHBOR_FULL)
660 {
661 if (neigh->rid == ifa->drid)
662 return 1;
663
664 if (ifa->state == OSPF_IS_DR)
665 return 1;
666 }
667 }
668
669 return 0;
670 }
671
672 static inline u32
673 get_rt_options(struct ospf_proto *p, struct ospf_area *oa, int bitv)
674 {
675 u32 opts = 0;
676
677 if (p->areano > 1)
678 opts |= OPT_RT_B;
679
680 if ((p->areano > 1) && oa_is_nssa(oa) && oa->ac->translator)
681 opts |= OPT_RT_NT;
682
683 if (p->asbr && !oa_is_stub(oa))
684 opts |= OPT_RT_E;
685
686 if (bitv)
687 opts |= OPT_RT_V;
688
689 return opts;
690 }
691
692 static inline void
693 add_rt2_lsa_link(struct ospf_proto *p, u8 type, u32 id, u32 data, u16 metric)
694 {
695 struct ospf_lsa_rt2_link *ln = lsab_alloc(p, sizeof(struct ospf_lsa_rt2_link));
696 ln->type = type;
697 ln->id = id;
698 ln->data = data;
699 ln->metric = metric;
700 ln->no_tos = 0;
701 }
702
703 static void
704 prepare_rt2_lsa_body(struct ospf_proto *p, struct ospf_area *oa)
705 {
706 struct ospf_iface *ifa;
707 int i = 0, bitv = 0;
708 struct ospf_neighbor *neigh;
709
710 ASSERT(p->lsab_used == 0);
711 lsab_allocz(p, sizeof(struct ospf_lsa_rt));
712 /* ospf_lsa_rt header will be filled later */
713
714 WALK_LIST(ifa, p->iface_list)
715 {
716 int net_lsa = 0;
717 u32 link_cost = p->stub_router ? 0xffff : ifa->cost;
718
719 if ((ifa->type == OSPF_IT_VLINK) && (ifa->voa == oa) &&
720 (!EMPTY_LIST(ifa->neigh_list)))
721 {
722 neigh = (struct ospf_neighbor *) HEAD(ifa->neigh_list);
723 if ((neigh->state == NEIGHBOR_FULL) && (ifa->cost <= 0xffff))
724 bitv = 1;
725 }
726
727 if ((ifa->oa != oa) || (ifa->state == OSPF_IS_DOWN))
728 continue;
729
730 ifa->rt_pos_beg = i;
731
732 /* RFC 2328 - 12.4.1.1-4 */
733 switch (ifa->type)
734 {
735 case OSPF_IT_PTP:
736 case OSPF_IT_PTMP:
737 WALK_LIST(neigh, ifa->neigh_list)
738 if (neigh->state == NEIGHBOR_FULL)
739 {
740 /*
741 * ln->data should be ifa->iface_id in case of no/ptp
742 * address (ifa->addr->flags & IA_PEER) on PTP link (see
743 * RFC 2328 12.4.1.1.), but the iface ID value has no use,
744 * while using IP address even in this case is here for
745 * compatibility with some broken implementations that use
746 * this address as a next-hop.
747 */
748 add_rt2_lsa_link(p, LSART_PTP, neigh->rid, ipa_to_u32(ifa->addr->ip), link_cost);
749 i++;
750 }
751 break;
752
753 case OSPF_IT_BCAST:
754 case OSPF_IT_NBMA:
755 if (bcast_net_active(ifa))
756 {
757 add_rt2_lsa_link(p, LSART_NET, ipa_to_u32(ifa->drip), ipa_to_u32(ifa->addr->ip), link_cost);
758 i++;
759 net_lsa = 1;
760 }
761 break;
762
763 case OSPF_IT_VLINK:
764 neigh = (struct ospf_neighbor *) HEAD(ifa->neigh_list);
765 if ((!EMPTY_LIST(ifa->neigh_list)) && (neigh->state == NEIGHBOR_FULL) && (ifa->cost <= 0xffff))
766 add_rt2_lsa_link(p, LSART_VLNK, neigh->rid, ipa_to_u32(ifa->addr->ip), link_cost), i++;
767 break;
768
769 default:
770 log(L_BUG "OSPF: Unknown interface type");
771 break;
772 }
773
774 ifa->rt_pos_end = i;
775
776 /* Now we will originate stub area if there is no primary */
777 if (net_lsa ||
778 (ifa->type == OSPF_IT_VLINK) ||
779 ((ifa->addr->flags & IA_PEER) && ! ifa->cf->stub) ||
780 configured_stubnet(oa, ifa->addr))
781 continue;
782
783 /* Host or network stub entry */
784 if ((ifa->addr->flags & IA_HOST) ||
785 (ifa->state == OSPF_IS_LOOP) ||
786 (ifa->type == OSPF_IT_PTMP))
787 add_rt2_lsa_link(p, LSART_STUB, ipa_to_u32(ifa->addr->ip), 0xffffffff, 0);
788 else
789 add_rt2_lsa_link(p, LSART_STUB, ip4_to_u32(net4_prefix(&ifa->addr->prefix)),
790 u32_mkmask(net4_pxlen(&ifa->addr->prefix)), ifa->cost);
791 i++;
792
793 ifa->rt_pos_end = i;
794 }
795
796 struct ospf_stubnet_config *sn;
797 WALK_LIST(sn, oa->ac->stubnet_list)
798 if (!sn->hidden)
799 add_rt2_lsa_link(p, LSART_STUB, ip4_to_u32(net4_prefix(&sn->prefix)),
800 u32_mkmask(net4_pxlen(&sn->prefix)), sn->cost), i++;
801
802 struct ospf_lsa_rt *rt = p->lsab;
803 /* Store number of links in lower half of options */
804 rt->options = get_rt_options(p, oa, bitv) | (u16) i;
805 }
806
807 static inline void
808 add_rt3_lsa_link(struct ospf_proto *p, u8 type, struct ospf_iface *ifa, u32 nif, u32 id)
809 {
810 struct ospf_lsa_rt3_link *ln = lsab_alloc(p, sizeof(struct ospf_lsa_rt3_link));
811 ln->type = type;
812 ln->padding = 0;
813 ln->metric = ifa->cost;
814 ln->lif = ifa->iface_id;
815 ln->nif = nif;
816 ln->id = id;
817 }
818
819 static void
820 prepare_rt3_lsa_body(struct ospf_proto *p, struct ospf_area *oa)
821 {
822 struct ospf_iface *ifa;
823 struct ospf_neighbor *neigh;
824 int bitv = 0;
825 int i = 0;
826
827 ASSERT(p->lsab_used == 0);
828 lsab_allocz(p, sizeof(struct ospf_lsa_rt));
829 /* ospf_lsa_rt header will be filled later */
830
831 WALK_LIST(ifa, p->iface_list)
832 {
833 if ((ifa->type == OSPF_IT_VLINK) && (ifa->voa == oa) &&
834 (!EMPTY_LIST(ifa->neigh_list)))
835 {
836 neigh = (struct ospf_neighbor *) HEAD(ifa->neigh_list);
837 if ((neigh->state == NEIGHBOR_FULL) && (ifa->cost <= 0xffff))
838 bitv = 1;
839 }
840
841 if ((ifa->oa != oa) || (ifa->state == OSPF_IS_DOWN))
842 continue;
843
844 ifa->rt_pos_beg = i;
845
846 /* RFC 5340 - 4.4.3.2 */
847 switch (ifa->type)
848 {
849 case OSPF_IT_PTP:
850 case OSPF_IT_PTMP:
851 WALK_LIST(neigh, ifa->neigh_list)
852 if (neigh->state == NEIGHBOR_FULL)
853 add_rt3_lsa_link(p, LSART_PTP, ifa, neigh->iface_id, neigh->rid), i++;
854 break;
855
856 case OSPF_IT_BCAST:
857 case OSPF_IT_NBMA:
858 if (bcast_net_active(ifa))
859 add_rt3_lsa_link(p, LSART_NET, ifa, ifa->dr_iface_id, ifa->drid), i++;
860 break;
861
862 case OSPF_IT_VLINK:
863 neigh = (struct ospf_neighbor *) HEAD(ifa->neigh_list);
864 if ((!EMPTY_LIST(ifa->neigh_list)) && (neigh->state == NEIGHBOR_FULL) && (ifa->cost <= 0xffff))
865 add_rt3_lsa_link(p, LSART_VLNK, ifa, neigh->iface_id, neigh->rid), i++;
866 break;
867
868 default:
869 log(L_BUG "OSPF: Unknown interface type");
870 break;
871 }
872
873 ifa->rt_pos_end = i;
874 }
875
876 struct ospf_lsa_rt *rt = p->lsab;
877 rt->options = get_rt_options(p, oa, bitv) | (oa->options & LSA_OPTIONS_MASK);
878 }
879
880 static void
881 ospf_originate_rt_lsa(struct ospf_proto *p, struct ospf_area *oa)
882 {
883 struct ospf_new_lsa lsa = {
884 .type = LSA_T_RT,
885 .dom = oa->areaid,
886 .id = ospf_is_v2(p) ? p->router_id : 0,
887 .opts = oa->options
888 };
889
890 OSPF_TRACE(D_EVENTS, "Updating router state for area %R", oa->areaid);
891
892 if (ospf_is_v2(p))
893 prepare_rt2_lsa_body(p, oa);
894 else
895 prepare_rt3_lsa_body(p, oa);
896
897 oa->rt = ospf_originate_lsa(p, &lsa);
898 }
899
900
901 /*
902 * Net-LSA handling
903 * Type = LSA_T_NET
904 */
905
906 static void
907 prepare_net2_lsa_body(struct ospf_proto *p, struct ospf_iface *ifa)
908 {
909 struct ospf_lsa_net *net;
910 struct ospf_neighbor *n;
911 int nodes = ifa->fadj + 1;
912 u16 i = 1;
913
914 ASSERT(p->lsab_used == 0);
915 net = lsab_alloc(p, sizeof(struct ospf_lsa_net) + 4 * nodes);
916
917 net->optx = u32_mkmask(ifa->addr->prefix.pxlen);
918 net->routers[0] = p->router_id;
919
920 WALK_LIST(n, ifa->neigh_list)
921 {
922 if (n->state == NEIGHBOR_FULL)
923 {
924 net->routers[i] = n->rid;
925 i++;
926 }
927 }
928 ASSERT(i == nodes);
929 }
930
931 static void
932 prepare_net3_lsa_body(struct ospf_proto *p, struct ospf_iface *ifa)
933 {
934 struct ospf_lsa_net *net;
935 int nodes = ifa->fadj + 1;
936 u32 options = 0;
937 u16 i = 1;
938
939 ASSERT(p->lsab_used == 0);
940 net = lsab_alloc(p, sizeof(struct ospf_lsa_net) + 4 * nodes);
941
942 net->routers[0] = p->router_id;
943
944 struct ospf_neighbor *n;
945 WALK_LIST(n, ifa->neigh_list)
946 {
947 if (n->state == NEIGHBOR_FULL)
948 {
949 /* In OSPFv3, we would like to merge options from Link LSAs of added neighbors */
950
951 struct top_hash_entry *en =
952 ospf_hash_find(p->gr, ifa->iface_id, n->iface_id, n->rid, LSA_T_LINK);
953
954 if (en)
955 options |= ((struct ospf_lsa_link *) en->lsa_body)->options;
956
957 net->routers[i] = n->rid;
958 i++;
959 }
960 }
961 ASSERT(i == nodes);
962
963 net->optx = options & LSA_OPTIONS_MASK;
964 }
965
966 static void
967 ospf_originate_net_lsa(struct ospf_proto *p, struct ospf_iface *ifa)
968 {
969 struct ospf_new_lsa lsa = {
970 .type = LSA_T_NET,
971 .dom = ifa->oa->areaid,
972 .id = ospf_is_v2(p) ? ipa_to_u32(ifa->addr->ip) : ifa->iface_id,
973 .opts = ifa->oa->options,
974 .ifa = ifa
975 };
976
977 OSPF_TRACE(D_EVENTS, "Updating network state for %s (Id: %R)", ifa->ifname, lsa.id);
978
979 if (ospf_is_v2(p))
980 prepare_net2_lsa_body(p, ifa);
981 else
982 prepare_net3_lsa_body(p, ifa);
983
984 ifa->net_lsa = ospf_originate_lsa(p, &lsa);
985 }
986
987
988 /*
989 * (Net|Rt)-summary-LSA handling
990 * (a.k.a. Inter-Area-(Prefix|Router)-LSA)
991 * Type = LSA_T_SUM_NET, LSA_T_SUM_RT
992 */
993
994 static inline void
995 prepare_sum2_lsa_body(struct ospf_proto *p, uint pxlen, u32 metric)
996 {
997 struct ospf_lsa_sum2 *sum;
998
999 sum = lsab_allocz(p, sizeof(struct ospf_lsa_sum2));
1000 sum->netmask = u32_mkmask(pxlen);
1001 sum->metric = metric;
1002 }
1003
1004 static inline void
1005 prepare_sum3_net_lsa_body(struct ospf_proto *p, ort *nf, u32 metric)
1006 {
1007 struct ospf_lsa_sum3_net *sum;
1008
1009 sum = lsab_allocz(p, sizeof(struct ospf_lsa_sum3_net) +
1010 IPV6_PREFIX_SPACE(nf->fn.addr->pxlen));
1011 sum->metric = metric;
1012 ospf3_put_prefix(sum->prefix, nf->fn.addr, 0, 0);
1013 }
1014
1015 static inline void
1016 prepare_sum3_rt_lsa_body(struct ospf_proto *p, u32 drid, u32 metric, u32 options)
1017 {
1018 struct ospf_lsa_sum3_rt *sum;
1019
1020 sum = lsab_allocz(p, sizeof(struct ospf_lsa_sum3_rt));
1021 sum->options = options;
1022 sum->metric = metric;
1023 sum->drid = drid;
1024 }
1025
1026 void
1027 ospf_originate_sum_net_lsa(struct ospf_proto *p, struct ospf_area *oa, ort *nf, int metric)
1028 {
1029 struct ospf_new_lsa lsa = {
1030 .type = LSA_T_SUM_NET,
1031 .mode = LSA_M_RTCALC,
1032 .dom = oa->areaid,
1033 .id = ort_to_lsaid(p, nf),
1034 .opts = oa->options,
1035 .nf = nf
1036 };
1037
1038 if (ospf_is_v2(p))
1039 prepare_sum2_lsa_body(p, nf->fn.addr->pxlen, metric);
1040 else
1041 prepare_sum3_net_lsa_body(p, nf, metric);
1042
1043 ospf_originate_lsa(p, &lsa);
1044 }
1045
1046 void
1047 ospf_originate_sum_rt_lsa(struct ospf_proto *p, struct ospf_area *oa, u32 drid, int metric, u32 options)
1048 {
1049 struct ospf_new_lsa lsa = {
1050 .type = LSA_T_SUM_RT,
1051 .mode = LSA_M_RTCALC,
1052 .dom = oa->areaid,
1053 .id = drid, /* Router ID of ASBR, irrelevant for OSPFv3 */
1054 .opts = oa->options
1055 };
1056
1057 if (ospf_is_v2(p))
1058 prepare_sum2_lsa_body(p, 0, metric);
1059 else
1060 prepare_sum3_rt_lsa_body(p, drid, metric, options & LSA_OPTIONS_MASK);
1061
1062 ospf_originate_lsa(p, &lsa);
1063 }
1064
1065
1066 /*
1067 * AS-external-LSA and NSSA-LSA handling
1068 * Type = LSA_T_EXT, LSA_T_NSSA
1069 */
1070
1071 static inline void
1072 prepare_ext2_lsa_body(struct ospf_proto *p, uint pxlen,
1073 u32 metric, u32 ebit, ip_addr fwaddr, u32 tag)
1074 {
1075 struct ospf_lsa_ext2 *ext;
1076
1077 ext = lsab_allocz(p, sizeof(struct ospf_lsa_ext2));
1078 ext->metric = metric & LSA_METRIC_MASK;
1079 ext->netmask = u32_mkmask(pxlen);
1080 ext->fwaddr = ipa_to_u32(fwaddr);
1081 ext->tag = tag;
1082
1083 if (ebit)
1084 ext->metric |= LSA_EXT2_EBIT;
1085 }
1086
1087 static inline void
1088 prepare_ext3_lsa_body(struct ospf_proto *p, ort *nf,
1089 u32 metric, u32 ebit, ip_addr fwaddr, u32 tag, int pbit)
1090 {
1091 struct ospf_lsa_ext3 *ext;
1092 int bsize = sizeof(struct ospf_lsa_ext3)
1093 + IPV6_PREFIX_SPACE(nf->fn.addr->pxlen)
1094 + (ipa_nonzero(fwaddr) ? 16 : 0)
1095 + (tag ? 4 : 0);
1096
1097 ext = lsab_allocz(p, bsize);
1098 ext->metric = metric & LSA_METRIC_MASK;
1099 u32 *buf = ext->rest;
1100
1101 buf = ospf3_put_prefix(buf, nf->fn.addr, pbit ? OPT_PX_P : 0, 0);
1102
1103 if (ebit)
1104 ext->metric |= LSA_EXT3_EBIT;
1105
1106 if (ipa_nonzero(fwaddr))
1107 {
1108 ext->metric |= LSA_EXT3_FBIT;
1109 buf = ospf3_put_addr(buf, fwaddr);
1110 }
1111
1112 if (tag)
1113 {
1114 ext->metric |= LSA_EXT3_TBIT;
1115 *buf++ = tag;
1116 }
1117 }
1118
1119 /**
1120 * originate_ext_lsa - new route received from nest and filters
1121 * @p: OSPF protocol instance
1122 * @oa: ospf_area for which LSA is originated
1123 * @nf: network prefix and mask
1124 * @mode: the mode of the LSA (LSA_M_EXPORT or LSA_M_RTCALC)
1125 * @metric: the metric of a route
1126 * @ebit: E-bit for route metric (bool)
1127 * @fwaddr: the forwarding address
1128 * @tag: the route tag
1129 * @pbit: P-bit for NSSA LSAs (bool), ignored for external LSAs
1130 *
1131 * If I receive a message that new route is installed, I try to originate an
1132 * external LSA. If @oa is an NSSA area, NSSA-LSA is originated instead.
1133 * @oa should not be a stub area. @src does not specify whether the LSA
1134 * is external or NSSA, but it specifies the source of origination -
1135 * the export from ospf_rt_notify(), or the NSSA-EXT translation.
1136 */
1137 void
1138 ospf_originate_ext_lsa(struct ospf_proto *p, struct ospf_area *oa, ort *nf, u8 mode,
1139 u32 metric, u32 ebit, ip_addr fwaddr, u32 tag, int pbit)
1140 {
1141 struct ospf_new_lsa lsa = {
1142 .type = oa ? LSA_T_NSSA : LSA_T_EXT,
1143 .mode = mode, /* LSA_M_EXPORT or LSA_M_RTCALC */
1144 .dom = oa ? oa->areaid : 0,
1145 .id = ort_to_lsaid(p, nf),
1146 .opts = oa ? (pbit ? OPT_P : 0) : OPT_E,
1147 .nf = nf
1148 };
1149
1150 if (ospf_is_v2(p))
1151 prepare_ext2_lsa_body(p, nf->fn.addr->pxlen, metric, ebit, fwaddr, tag);
1152 else
1153 prepare_ext3_lsa_body(p, nf, metric, ebit, fwaddr, tag, oa && pbit);
1154
1155 ospf_originate_lsa(p, &lsa);
1156 }
1157
1158 static struct top_hash_entry *
1159 ospf_hash_find_(struct top_graph *f, u32 domain, u32 lsa, u32 rtr, u32 type);
1160
1161 static void
1162 ospf_flush_ext_lsa(struct ospf_proto *p, struct ospf_area *oa, ort *nf)
1163 {
1164 struct top_hash_entry *en;
1165
1166 u32 type = oa ? LSA_T_NSSA : LSA_T_EXT;
1167 u32 dom = oa ? oa->areaid : 0;
1168 u32 id = ort_to_lsaid(p, nf);
1169
1170 en = ospf_hash_find_(p->gr, dom, id, p->router_id, type);
1171
1172 if (!en || (en->nf != nf))
1173 return;
1174
1175 ospf_flush_lsa(p, en);
1176 }
1177
1178 static inline int
1179 use_gw_for_fwaddr(struct ospf_proto *p, ip_addr gw, struct iface *iface)
1180 {
1181 struct ospf_iface *ifa;
1182
1183 if (ipa_zero(gw) || ipa_is_link_local(gw))
1184 return 0;
1185
1186 WALK_LIST(ifa, p->iface_list)
1187 if ((ifa->iface == iface) &&
1188 (!ospf_is_v2(p) || ipa_in_netX(gw, &ifa->addr->prefix)))
1189 return 1;
1190
1191 return 0;
1192 }
1193
1194 static inline ip_addr
1195 find_surrogate_fwaddr(struct ospf_proto *p, struct ospf_area *oa)
1196 {
1197 struct ospf_iface *ifa;
1198 struct ifa *a, *cur_addr = NULL;
1199 int np, cur_np = 0;
1200
1201 /* RFC 3101 2.3 - surrogate forwarding address selection */
1202
1203 WALK_LIST(ifa, p->iface_list)
1204 {
1205 if ((ifa->oa != oa) ||
1206 (ifa->type == OSPF_IT_VLINK))
1207 continue;
1208
1209 if (ospf_is_v2(p))
1210 {
1211 a = ifa->addr;
1212 if (a->flags & IA_PEER)
1213 continue;
1214
1215 np = (a->flags & IA_HOST) ? 3 : (ifa->stub ? 2 : 1);
1216 if (np > cur_np)
1217 {
1218 cur_addr = a;
1219 cur_np = np;
1220 }
1221 }
1222 else /* OSPFv3 */
1223 {
1224 WALK_LIST(a, ifa->iface->addrs)
1225 {
1226 if ((a->prefix.type != ospf_get_af(p)) ||
1227 (a->flags & IA_SECONDARY) ||
1228 (a->flags & IA_PEER) ||
1229 (a->scope <= SCOPE_LINK))
1230 continue;
1231
1232 np = (a->flags & IA_HOST) ? 3 : (ifa->stub ? 2 : 1);
1233 if (np > cur_np)
1234 {
1235 cur_addr = a;
1236 cur_np = np;
1237 }
1238 }
1239 }
1240 }
1241
1242 return cur_addr ? cur_addr->ip : IPA_NONE;
1243 }
1244
1245 void
1246 ospf_rt_notify(struct proto *P, struct channel *ch UNUSED, net *n, rte *new, rte *old UNUSED)
1247 {
1248 struct ospf_proto *p = (struct ospf_proto *) P;
1249 struct ospf_area *oa = NULL; /* non-NULL for NSSA-LSA */
1250 ort *nf;
1251
1252 /*
1253 * There are several posibilities:
1254 * 1) router in regular area - originate external LSA with global scope
1255 * 2) router in NSSA area - originate area-specific NSSA-LSA
1256 * 3) router in stub area - cannot export routes
1257 * 4) area border router - same as (1), it is attached to backbone
1258 */
1259
1260 if ((p->areano == 1) && oa_is_nssa(HEAD(p->area_list)))
1261 oa = HEAD(p->area_list);
1262
1263 if (!new)
1264 {
1265 nf = fib_find(&p->rtf, n->n.addr);
1266
1267 if (!nf || !nf->external_rte)
1268 return;
1269
1270 ospf_flush_ext_lsa(p, oa, nf);
1271 nf->external_rte = 0;
1272
1273 /* Old external route might blocked some NSSA translation */
1274 if ((p->areano > 1) && rt_is_nssa(nf) && nf->n.oa->translate)
1275 ospf_schedule_rtcalc(p);
1276
1277 return;
1278 }
1279
1280 ASSERT(p->asbr);
1281
1282 /* Get route attributes */
1283 rta *a = new->attrs;
1284 eattr *m1a = ea_find(a->eattrs, EA_OSPF_METRIC1);
1285 eattr *m2a = ea_find(a->eattrs, EA_OSPF_METRIC2);
1286 uint m1 = m1a ? m1a->u.data : 0;
1287 uint m2 = m2a ? m2a->u.data : 10000;
1288
1289 if (m1 > LSINFINITY)
1290 {
1291 log(L_WARN "%s: Invalid ospf_metric1 value %u for route %N",
1292 p->p.name, m1, n->n.addr);
1293 m1 = LSINFINITY;
1294 }
1295
1296 if (m2 > LSINFINITY)
1297 {
1298 log(L_WARN "%s: Invalid ospf_metric2 value %u for route %N",
1299 p->p.name, m2, n->n.addr);
1300 m2 = LSINFINITY;
1301 }
1302
1303 /* Ensure monotonicity of metric if both m1 and m2 are used */
1304 if ((m1 > 0) && (m2 < LSINFINITY))
1305 m2++;
1306
1307 uint ebit = m2a || !m1a;
1308 uint metric = ebit ? m2 : m1;
1309 uint tag = ea_get_int(a->eattrs, EA_OSPF_TAG, 0);
1310
1311 ip_addr fwd = IPA_NONE;
1312 if ((a->dest == RTD_UNICAST) && use_gw_for_fwaddr(p, a->nh.gw, a->nh.iface))
1313 fwd = a->nh.gw;
1314
1315 /* NSSA-LSA with P-bit set must have non-zero forwarding address */
1316 if (oa && ipa_zero(fwd))
1317 {
1318 fwd = find_surrogate_fwaddr(p, oa);
1319
1320 if (ipa_zero(fwd))
1321 {
1322 log(L_ERR "%s: Cannot find forwarding address for NSSA-LSA %N",
1323 p->p.name, n->n.addr);
1324 return;
1325 }
1326 }
1327
1328 nf = fib_get(&p->rtf, n->n.addr);
1329 ospf_originate_ext_lsa(p, oa, nf, LSA_M_EXPORT, metric, ebit, fwd, tag, 1);
1330 nf->external_rte = 1;
1331 }
1332
1333
1334 /*
1335 * Link-LSA handling (assume OSPFv3)
1336 * Type = LSA_T_LINK
1337 */
1338
1339 static inline void
1340 lsab_put_prefix(struct ospf_proto *p, net_addr *n, u32 cost)
1341 {
1342 void *buf = lsab_alloc(p, IPV6_PREFIX_SPACE(net_pxlen(n)));
1343 uint max = (n->type == NET_IP4) ? IP4_MAX_PREFIX_LENGTH : IP6_MAX_PREFIX_LENGTH;
1344 u8 flags = (net_pxlen(n) < max) ? 0 : OPT_PX_LA;
1345 ospf3_put_prefix(buf, n, flags, cost);
1346 }
1347
1348 static void
1349 prepare_link_lsa_body(struct ospf_proto *p, struct ospf_iface *ifa)
1350 {
1351 ip_addr nh = ospf_is_ip4(p) ? IPA_NONE : ifa->addr->ip;
1352 int i = 0;
1353
1354 /* Preallocating space for header */
1355 ASSERT(p->lsab_used == 0);
1356 lsab_allocz(p, sizeof(struct ospf_lsa_link));
1357
1358 struct ifa *a;
1359 WALK_LIST(a, ifa->iface->addrs)
1360 {
1361 if ((a->prefix.type != ospf_get_af(p)) ||
1362 (a->flags & IA_SECONDARY) ||
1363 (a->scope <= SCOPE_LINK))
1364 continue;
1365
1366 if (ospf_is_ip4(p) && ipa_zero(nh))
1367 nh = a->ip;
1368
1369 lsab_put_prefix(p, &a->prefix, 0);
1370 i++;
1371 }
1372
1373 /* Filling the preallocated header */
1374 struct ospf_lsa_link *ll = p->lsab;
1375 ll->options = ifa->oa->options | (ifa->priority << 24);
1376 ll->lladdr = ospf_is_ip4(p) ? ospf3_4to6(ipa_to_ip4(nh)) : ipa_to_ip6(nh);
1377 ll->pxcount = i;
1378
1379 if (ipa_zero(nh))
1380 log(L_ERR "%s: Cannot find next hop address for %s", p->p.name, ifa->ifname);
1381 }
1382
1383 static void
1384 ospf_originate_link_lsa(struct ospf_proto *p, struct ospf_iface *ifa)
1385 {
1386 if (ospf_is_v2(p))
1387 return;
1388
1389 struct ospf_new_lsa lsa = {
1390 .type = LSA_T_LINK,
1391 .dom = ifa->iface_id,
1392 .id = ifa->iface_id,
1393 .ifa = ifa
1394 };
1395
1396 OSPF_TRACE(D_EVENTS, "Updating link state for %s (Id: %R)", ifa->ifname, lsa.id);
1397
1398 prepare_link_lsa_body(p, ifa);
1399
1400 ifa->link_lsa = ospf_originate_lsa(p, &lsa);
1401 }
1402
1403
1404 /*
1405 * Prefix-Rt-LSA handling (assume OSPFv3)
1406 * Type = LSA_T_PREFIX, referred type = LSA_T_RT
1407 */
1408
1409 static void
1410 prepare_prefix_rt_lsa_body(struct ospf_proto *p, struct ospf_area *oa)
1411 {
1412 struct ospf_config *cf = (struct ospf_config *) (p->p.cf);
1413 struct ospf_iface *ifa;
1414 struct ospf_lsa_prefix *lp;
1415 int host_addr = 0;
1416 int net_lsa;
1417 int i = 0;
1418
1419 ASSERT(p->lsab_used == 0);
1420 lp = lsab_allocz(p, sizeof(struct ospf_lsa_prefix));
1421 lp->ref_type = LSA_T_RT;
1422 lp->ref_id = 0;
1423 lp->ref_rt = p->router_id;
1424 lp = NULL; /* buffer might be reallocated later */
1425
1426 WALK_LIST(ifa, p->iface_list)
1427 {
1428 if ((ifa->oa != oa) || (ifa->type == OSPF_IT_VLINK) || (ifa->state == OSPF_IS_DOWN))
1429 continue;
1430
1431 ifa->px_pos_beg = i;
1432
1433 if ((ifa->type == OSPF_IT_BCAST) ||
1434 (ifa->type == OSPF_IT_NBMA))
1435 net_lsa = bcast_net_active(ifa);
1436 else
1437 net_lsa = 0;
1438
1439 struct ifa *a;
1440 WALK_LIST(a, ifa->iface->addrs)
1441 {
1442 if ((a->prefix.type != ospf_get_af(p)) ||
1443 (a->flags & IA_SECONDARY) ||
1444 (a->flags & IA_PEER) ||
1445 (a->scope <= SCOPE_LINK))
1446 continue;
1447
1448 if (((a->prefix.pxlen < IP6_MAX_PREFIX_LENGTH) && net_lsa) ||
1449 configured_stubnet(oa, a))
1450 continue;
1451
1452 if ((a->flags & IA_HOST) ||
1453 (ifa->state == OSPF_IS_LOOP) ||
1454 (ifa->type == OSPF_IT_PTMP))
1455 {
1456 net_addr_ip6 net = NET_ADDR_IP6(a->ip, IP6_MAX_PREFIX_LENGTH);
1457 lsab_put_prefix(p, (net_addr *) &net, 0);
1458 host_addr = 1;
1459 }
1460 else
1461 lsab_put_prefix(p, &a->prefix, ifa->cost);
1462 i++;
1463 }
1464
1465 ifa->px_pos_end = i;
1466 }
1467
1468 struct ospf_stubnet_config *sn;
1469 WALK_LIST(sn, oa->ac->stubnet_list)
1470 if (!sn->hidden)
1471 {
1472 lsab_put_prefix(p, &sn->prefix, sn->cost);
1473 if (sn->prefix.pxlen == IP6_MAX_PREFIX_LENGTH)
1474 host_addr = 1;
1475 i++;
1476 }
1477
1478 /* If there are some configured vlinks, find some global address
1479 (even from another area), which will be used as a vlink endpoint. */
1480 if (!EMPTY_LIST(cf->vlink_list) && !host_addr && ospf_is_ip6(p))
1481 {
1482 WALK_LIST(ifa, p->iface_list)
1483 {
1484 if ((ifa->type == OSPF_IT_VLINK) || (ifa->state == OSPF_IS_DOWN))
1485 continue;
1486
1487 struct ifa *a;
1488 WALK_LIST(a, ifa->iface->addrs)
1489 {
1490 if ((a->prefix.type != NET_IP6) ||
1491 (a->flags & IA_SECONDARY) ||
1492 (a->scope <= SCOPE_LINK))
1493 continue;
1494
1495 /* Found some IP */
1496 net_addr_ip6 net = NET_ADDR_IP6(a->ip, IP6_MAX_PREFIX_LENGTH);
1497 lsab_put_prefix(p, (net_addr *) &net, 0);
1498 i++;
1499 goto done;
1500 }
1501 }
1502 }
1503
1504 done:
1505 lp = p->lsab;
1506 lp->pxcount = i;
1507 }
1508
1509 static void
1510 ospf_originate_prefix_rt_lsa(struct ospf_proto *p, struct ospf_area *oa)
1511 {
1512 if (ospf_is_v2(p))
1513 return;
1514
1515 struct ospf_new_lsa lsa = {
1516 .type = LSA_T_PREFIX,
1517 .dom = oa->areaid,
1518 .id = 0
1519 };
1520
1521 prepare_prefix_rt_lsa_body(p, oa);
1522
1523 ospf_originate_lsa(p, &lsa);
1524 }
1525
1526
1527 /*
1528 * Prefix-Net-LSA handling (assume OSPFv3)
1529 * Type = LSA_T_PREFIX, referred type = LSA_T_NET
1530 */
1531
1532 static inline int
1533 prefix_space(u32 *buf)
1534 {
1535 int pxl = *buf >> 24;
1536 return IPV6_PREFIX_SPACE(pxl);
1537 }
1538
1539 static inline int
1540 prefix_same(u32 *b1, u32 *b2)
1541 {
1542 int pxl1 = *b1 >> 24;
1543 int pxl2 = *b2 >> 24;
1544 int pxs, i;
1545
1546 if (pxl1 != pxl2)
1547 return 0;
1548
1549 pxs = IPV6_PREFIX_WORDS(pxl1);
1550 for (i = 1; i < pxs; i++)
1551 if (b1[i] != b2[i])
1552 return 0;
1553
1554 return 1;
1555 }
1556
1557 static inline u32 *
1558 prefix_advance(u32 *buf)
1559 {
1560 int pxl = *buf >> 24;
1561 return buf + IPV6_PREFIX_WORDS(pxl);
1562 }
1563
1564 /* FIXME eliminate items with LA bit set? see 4.4.3.9 */
1565 static void
1566 add_prefix(struct ospf_proto *p, u32 *px, int offset, int *pxc)
1567 {
1568 u32 *pxl = lsab_offset(p, offset);
1569 int i;
1570 for (i = 0; i < *pxc; pxl = prefix_advance(pxl), i++)
1571 if (prefix_same(px, pxl))
1572 {
1573 /* Options should be logically OR'ed together */
1574 *pxl |= (*px & 0x00FF0000);
1575 return;
1576 }
1577
1578 ASSERT(pxl == lsab_end(p));
1579
1580 int pxspace = prefix_space(px);
1581 pxl = lsab_alloc(p, pxspace);
1582 memcpy(pxl, px, pxspace);
1583 *pxl &= 0xFFFF0000; /* Set metric to zero */
1584 (*pxc)++;
1585 }
1586
1587 static void
1588 add_link_lsa(struct ospf_proto *p, struct ospf_lsa_link *ll, int offset, int *pxc)
1589 {
1590 u32 *pxb = ll->rest;
1591 uint j;
1592
1593 for (j = 0; j < ll->pxcount; pxb = prefix_advance(pxb), j++)
1594 {
1595 u8 pxlen = (pxb[0] >> 24);
1596 u8 pxopts = (pxb[0] >> 16);
1597
1598 /* Skip NU or LA prefixes */
1599 if (pxopts & (OPT_PX_NU | OPT_PX_LA))
1600 continue;
1601
1602 /* Skip link-local prefixes */
1603 if (ospf_is_ip6(p) && (pxlen >= 10) && ((pxb[1] & 0xffc00000) == 0xfe800000))
1604 continue;
1605
1606 add_prefix(p, pxb, offset, pxc);
1607 }
1608 }
1609
1610 static void
1611 prepare_prefix_net_lsa_body(struct ospf_proto *p, struct ospf_iface *ifa)
1612 {
1613 struct ospf_lsa_prefix *lp;
1614 struct ospf_neighbor *n;
1615 struct top_hash_entry *en;
1616 int pxc, offset;
1617
1618 ASSERT(p->lsab_used == 0);
1619 lp = lsab_allocz(p, sizeof(struct ospf_lsa_prefix));
1620 lp->ref_type = LSA_T_NET;
1621 lp->ref_id = ifa->net_lsa->lsa.id;
1622 lp->ref_rt = p->router_id;
1623 lp = NULL; /* buffer might be reallocated later */
1624
1625 pxc = 0;
1626 offset = p->lsab_used;
1627
1628 /* Find all Link LSAs associated with the link and merge their prefixes */
1629 if (en = ifa->link_lsa)
1630 add_link_lsa(p, en->next_lsa_body ?: en->lsa_body, offset, &pxc);
1631
1632 WALK_LIST(n, ifa->neigh_list)
1633 if ((n->state == NEIGHBOR_FULL) &&
1634 (en = ospf_hash_find(p->gr, ifa->iface_id, n->iface_id, n->rid, LSA_T_LINK)))
1635 add_link_lsa(p, en->lsa_body, offset, &pxc);
1636
1637 lp = p->lsab;
1638 lp->pxcount = pxc;
1639 }
1640
1641 static void
1642 ospf_originate_prefix_net_lsa(struct ospf_proto *p, struct ospf_iface *ifa)
1643 {
1644 if (ospf_is_v2(p))
1645 return;
1646
1647 struct ospf_new_lsa lsa = {
1648 .type = LSA_T_PREFIX,
1649 .dom = ifa->oa->areaid,
1650 .id = ifa->iface_id,
1651 .ifa = ifa
1652 };
1653
1654 prepare_prefix_net_lsa_body(p, ifa);
1655
1656 ifa->pxn_lsa = ospf_originate_lsa(p, &lsa);
1657 }
1658
1659 static inline int breaks_minlsinterval(struct top_hash_entry *en)
1660 { return en && (en->lsa.age < LSA_MAXAGE) && (lsa_inst_age(en) < MINLSINTERVAL); }
1661
1662 void
1663 ospf_update_topology(struct ospf_proto *p)
1664 {
1665 struct ospf_area *oa;
1666 struct ospf_iface *ifa;
1667
1668 WALK_LIST(oa, p->area_list)
1669 {
1670 if (oa->update_rt_lsa)
1671 {
1672 /*
1673 * Generally, MinLSInterval is enforced in ospf_do_originate_lsa(), but
1674 * origination of (prefix) router LSA is a special case. We do not want to
1675 * prepare a new router LSA body and then postpone it in en->next_lsa_body
1676 * for later origination, because there are side effects (updates of
1677 * rt_pos_* and px_pos_* in ospf_iface structures) during that, which may
1678 * confuse routing table calculation if executed after LSA body
1679 * preparation but before final LSA origination (as rtcalc would use
1680 * current rt_pos_* indexes but the old router LSA body).
1681 *
1682 * Here, we ensure that MinLSInterval is observed and we do not even try
1683 * to originate these LSAs if it is not. Therefore, origination, when
1684 * requested, will succeed unless there is also a seqnum wrapping, which
1685 * is not a problem because in that case rtcalc is blocked by MaxAge.
1686 */
1687
1688 if (breaks_minlsinterval(oa->rt) || breaks_minlsinterval(oa->pxr_lsa))
1689 continue;
1690
1691 ospf_originate_rt_lsa(p, oa);
1692 ospf_originate_prefix_rt_lsa(p, oa);
1693 oa->update_rt_lsa = 0;
1694 }
1695 }
1696
1697 WALK_LIST(ifa, p->iface_list)
1698 {
1699 if (ifa->type == OSPF_IT_VLINK)
1700 continue;
1701
1702 if (ifa->update_link_lsa)
1703 {
1704 if ((ifa->state > OSPF_IS_LOOP) && !ifa->link_lsa_suppression)
1705 ospf_originate_link_lsa(p, ifa);
1706 else
1707 ospf_flush2_lsa(p, &ifa->link_lsa);
1708
1709 ifa->update_link_lsa = 0;
1710 }
1711
1712 if (ifa->update_net_lsa)
1713 {
1714 if ((ifa->state == OSPF_IS_DR) && (ifa->fadj > 0))
1715 {
1716 ospf_originate_net_lsa(p, ifa);
1717 ospf_originate_prefix_net_lsa(p, ifa);
1718 }
1719 else
1720 {
1721 ospf_flush2_lsa(p, &ifa->net_lsa);
1722 ospf_flush2_lsa(p, &ifa->pxn_lsa);
1723 }
1724
1725 ifa->update_net_lsa = 0;
1726 }
1727 }
1728 }
1729
1730
1731 static void
1732 ospf_top_ht_alloc(struct top_graph *f)
1733 {
1734 f->hash_size = 1 << f->hash_order;
1735 f->hash_mask = f->hash_size - 1;
1736 if (f->hash_order > HASH_HI_MAX - HASH_HI_STEP)
1737 f->hash_entries_max = ~0;
1738 else
1739 f->hash_entries_max = f->hash_size HASH_HI_MARK;
1740 if (f->hash_order < HASH_LO_MIN + HASH_LO_STEP)
1741 f->hash_entries_min = 0;
1742 else
1743 f->hash_entries_min = f->hash_size HASH_LO_MARK;
1744 DBG("Allocating OSPF hash of order %d: %d hash_entries, %d low, %d high\n",
1745 f->hash_order, f->hash_size, f->hash_entries_min, f->hash_entries_max);
1746 f->hash_table =
1747 mb_alloc(f->pool, f->hash_size * sizeof(struct top_hash_entry *));
1748 bzero(f->hash_table, f->hash_size * sizeof(struct top_hash_entry *));
1749 }
1750
1751 static inline void
1752 ospf_top_ht_free(struct top_hash_entry **h)
1753 {
1754 mb_free(h);
1755 }
1756
1757 static inline u32
1758 ospf_top_hash_u32(u32 a)
1759 {
1760 /* Shamelessly stolen from IP address hashing in ipv4.h */
1761 a ^= a >> 16;
1762 a ^= a << 10;
1763 return a;
1764 }
1765
1766 static uint
1767 ospf_top_hash(struct top_graph *f, u32 domain, u32 lsaid, u32 rtrid, u32 type)
1768 {
1769 /* In OSPFv2, we don't know Router ID when looking for network LSAs.
1770 In OSPFv3, we don't know LSA ID when looking for router LSAs.
1771 In both cases, there is (usually) just one (or small number)
1772 appropriate LSA, so we just clear unknown part of key. */
1773
1774 return (((f->ospf2 && (type == LSA_T_NET)) ? 0 : ospf_top_hash_u32(rtrid)) +
1775 ((!f->ospf2 && (type == LSA_T_RT)) ? 0 : ospf_top_hash_u32(lsaid)) +
1776 type + domain) & f->hash_mask;
1777
1778 /*
1779 return (ospf_top_hash_u32(lsaid) + ospf_top_hash_u32(rtrid) +
1780 type + areaid) & f->hash_mask;
1781 */
1782 }
1783
1784 /**
1785 * ospf_top_new - allocated new topology database
1786 * @p: OSPF protocol instance
1787 * @pool: pool for allocation
1788 *
1789 * This dynamically hashed structure is used for keeping LSAs. Mainly it is used
1790 * for the LSA database of the OSPF protocol, but also for LSA retransmission
1791 * and request lists of OSPF neighbors.
1792 */
1793 struct top_graph *
1794 ospf_top_new(struct ospf_proto *p, pool *pool)
1795 {
1796 struct top_graph *f;
1797
1798 f = mb_allocz(pool, sizeof(struct top_graph));
1799 f->pool = pool;
1800 f->hash_slab = sl_new(f->pool, sizeof(struct top_hash_entry));
1801 f->hash_order = HASH_DEF_ORDER;
1802 ospf_top_ht_alloc(f);
1803 f->hash_entries = 0;
1804 f->hash_entries_min = 0;
1805 f->ospf2 = ospf_is_v2(p);
1806 return f;
1807 }
1808
1809 void
1810 ospf_top_free(struct top_graph *f)
1811 {
1812 rfree(f->hash_slab);
1813 ospf_top_ht_free(f->hash_table);
1814 mb_free(f);
1815 }
1816
1817 static void
1818 ospf_top_rehash(struct top_graph *f, int step)
1819 {
1820 struct top_hash_entry **n, **oldt, **newt, *e, *x;
1821 uint oldn, oldh;
1822
1823 oldn = f->hash_size;
1824 oldt = f->hash_table;
1825 DBG("re-hashing topology hash from order %d to %d\n", f->hash_order,
1826 f->hash_order + step);
1827 f->hash_order += step;
1828 ospf_top_ht_alloc(f);
1829 newt = f->hash_table;
1830
1831 for (oldh = 0; oldh < oldn; oldh++)
1832 {
1833 e = oldt[oldh];
1834 while (e)
1835 {
1836 x = e->next;
1837 n = newt + ospf_top_hash(f, e->domain, e->lsa.id, e->lsa.rt, e->lsa_type);
1838 e->next = *n;
1839 *n = e;
1840 e = x;
1841 }
1842 }
1843 ospf_top_ht_free(oldt);
1844 }
1845
1846 static struct top_hash_entry *
1847 ospf_hash_find_(struct top_graph *f, u32 domain, u32 lsa, u32 rtr, u32 type)
1848 {
1849 struct top_hash_entry *e;
1850 e = f->hash_table[ospf_top_hash(f, domain, lsa, rtr, type)];
1851
1852 while (e && (e->lsa.id != lsa || e->lsa.rt != rtr ||
1853 e->lsa_type != type || e->domain != domain))
1854 e = e->next;
1855
1856 return e;
1857 }
1858
1859 struct top_hash_entry *
1860 ospf_hash_find(struct top_graph *f, u32 domain, u32 lsa, u32 rtr, u32 type)
1861 {
1862 struct top_hash_entry *e = ospf_hash_find_(f, domain, lsa, rtr, type);
1863
1864 /* Hide hash entry with empty lsa_body */
1865 return (e && e->lsa_body) ? e : NULL;
1866 }
1867
1868 /* In OSPFv2, lsa.id is the same as lsa.rt for router LSA. In OSPFv3, we don't know
1869 lsa.id when looking for router LSAs. We return matching LSA with smallest lsa.id. */
1870 struct top_hash_entry *
1871 ospf_hash_find_rt(struct top_graph *f, u32 domain, u32 rtr)
1872 {
1873 struct top_hash_entry *rv = NULL;
1874 struct top_hash_entry *e;
1875 /* We can put rtr for lsa.id to hash fn, it is ignored in OSPFv3 */
1876 e = f->hash_table[ospf_top_hash(f, domain, rtr, rtr, LSA_T_RT)];
1877
1878 while (e)
1879 {
1880 if (e->lsa.rt == rtr && e->lsa_type == LSA_T_RT && e->domain == domain && e->lsa_body)
1881 {
1882 if (f->ospf2 && (e->lsa.id == rtr))
1883 return e;
1884 if (!f->ospf2 && (!rv || e->lsa.id < rv->lsa.id))
1885 rv = e;
1886 }
1887 e = e->next;
1888 }
1889
1890 return rv;
1891 }
1892
1893 /*
1894 * ospf_hash_find_rt3_first() and ospf_hash_find_rt3_next() are used exclusively
1895 * for lsa_walk_rt_init(), lsa_walk_rt(), therefore they skip MaxAge entries.
1896 */
1897 static inline struct top_hash_entry *
1898 find_matching_rt3(struct top_hash_entry *e, u32 domain, u32 rtr)
1899 {
1900 while (e && (e->lsa.rt != rtr || e->lsa_type != LSA_T_RT ||
1901 e->domain != domain || e->lsa.age == LSA_MAXAGE))
1902 e = e->next;
1903 return e;
1904 }
1905
1906 struct top_hash_entry *
1907 ospf_hash_find_rt3_first(struct top_graph *f, u32 domain, u32 rtr)
1908 {
1909 struct top_hash_entry *e;
1910 e = f->hash_table[ospf_top_hash(f, domain, 0, rtr, LSA_T_RT)];
1911 return find_matching_rt3(e, domain, rtr);
1912 }
1913
1914 struct top_hash_entry *
1915 ospf_hash_find_rt3_next(struct top_hash_entry *e)
1916 {
1917 return find_matching_rt3(e->next, e->domain, e->lsa.rt);
1918 }
1919
1920 /* In OSPFv2, we don't know Router ID when looking for network LSAs.
1921 There should be just one, so we find any match. */
1922 struct top_hash_entry *
1923 ospf_hash_find_net2(struct top_graph *f, u32 domain, u32 id)
1924 {
1925 struct top_hash_entry *e;
1926 e = f->hash_table[ospf_top_hash(f, domain, id, 0, LSA_T_NET)];
1927
1928 while (e && (e->lsa.id != id || e->lsa_type != LSA_T_NET ||
1929 e->domain != domain || e->lsa_body == NULL))
1930 e = e->next;
1931
1932 return e;
1933 }
1934
1935
1936 struct top_hash_entry *
1937 ospf_hash_get(struct top_graph *f, u32 domain, u32 lsa, u32 rtr, u32 type)
1938 {
1939 struct top_hash_entry **ee;
1940 struct top_hash_entry *e;
1941
1942 ee = f->hash_table + ospf_top_hash(f, domain, lsa, rtr, type);
1943 e = *ee;
1944
1945 while (e && (e->lsa.id != lsa || e->lsa.rt != rtr ||
1946 e->lsa_type != type || e->domain != domain))
1947 e = e->next;
1948
1949 if (e)
1950 return e;
1951
1952 e = sl_alloc(f->hash_slab);
1953 bzero(e, sizeof(struct top_hash_entry));
1954
1955 e->color = OUTSPF;
1956 e->dist = LSINFINITY;
1957 e->lsa.type_raw = type;
1958 e->lsa.id = lsa;
1959 e->lsa.rt = rtr;
1960 e->lsa.sn = LSA_ZEROSEQNO;
1961 e->lsa_type = type;
1962 e->domain = domain;
1963 e->next = *ee;
1964 *ee = e;
1965 if (f->hash_entries++ > f->hash_entries_max)
1966 ospf_top_rehash(f, HASH_HI_STEP);
1967 return e;
1968 }
1969
1970 void
1971 ospf_hash_delete(struct top_graph *f, struct top_hash_entry *e)
1972 {
1973 struct top_hash_entry **ee = f->hash_table +
1974 ospf_top_hash(f, e->domain, e->lsa.id, e->lsa.rt, e->lsa_type);
1975
1976 while (*ee)
1977 {
1978 if (*ee == e)
1979 {
1980 *ee = e->next;
1981 sl_free(f->hash_slab, e);
1982 if (f->hash_entries-- < f->hash_entries_min)
1983 ospf_top_rehash(f, -HASH_LO_STEP);
1984 return;
1985 }
1986 ee = &((*ee)->next);
1987 }
1988 bug("ospf_hash_delete() called for invalid node");
1989 }
1990
1991 /*
1992 static void
1993 ospf_dump_lsa(struct top_hash_entry *he, struct proto *p)
1994 {
1995
1996 struct ospf_lsa_rt *rt = NULL;
1997 struct ospf_lsa_rt_link *rr = NULL;
1998 struct ospf_lsa_net *ln = NULL;
1999 u32 *rts = NULL;
2000 u32 i, max;
2001
2002 OSPF_TRACE(D_EVENTS, "- %1x %-1R %-1R %4u 0x%08x 0x%04x %-1R",
2003 he->lsa.type, he->lsa.id, he->lsa.rt, he->lsa.age, he->lsa.sn,
2004 he->lsa.checksum, he->domain);
2005
2006
2007 switch (he->lsa.type)
2008 {
2009 case LSA_T_RT:
2010 rt = he->lsa_body;
2011 rr = (struct ospf_lsa_rt_link *) (rt + 1);
2012
2013 for (i = 0; i < lsa_rt_items(&he->lsa); i++)
2014 OSPF_TRACE(D_EVENTS, " - %1x %-1R %-1R %5u",
2015 rr[i].type, rr[i].id, rr[i].data, rr[i].metric);
2016 break;
2017
2018 case LSA_T_NET:
2019 ln = he->lsa_body;
2020 rts = (u32 *) (ln + 1);
2021
2022 for (i = 0; i < lsa_net_items(&he->lsa); i++)
2023 OSPF_TRACE(D_EVENTS, " - %-1R", rts[i]);
2024 break;
2025
2026 default:
2027 break;
2028 }
2029 }
2030
2031 void
2032 ospf_top_dump(struct top_graph *f, struct proto *p)
2033 {
2034 uint i;
2035 OSPF_TRACE(D_EVENTS, "Hash entries: %d", f->hash_entries);
2036
2037 for (i = 0; i < f->hash_size; i++)
2038 {
2039 struct top_hash_entry *e;
2040 for (e = f->hash_table[i]; e != NULL; e = e->next)
2041 ospf_dump_lsa(e, p);
2042 }
2043 }
2044 */