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