Annotation of embedaddon/bird/proto/ospf/rt.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *      BIRD -- OSPF
                      3:  *
                      4:  *      (c) 2000--2004 Ondrej Filip <feela@network.cz>
                      5:  *     (c) 2009--2014 Ondrej Zajicek <santiago@crfreenet.org>
                      6:  *     (c) 2009--2014 CZ.NIC z.s.p.o.
                      7:  *
                      8:  *      Can be freely distributed and used under the terms of the GNU GPL.
                      9:  */
                     10: 
                     11: #ifndef _BIRD_OSPF_RT_H_
                     12: #define _BIRD_OSPF_RT_H_
                     13: 
                     14: 
                     15: #define ORT_NET 0
                     16: #define ORT_ROUTER 1
                     17: 
                     18: typedef struct orta
                     19: {
                     20:   u8 type;                     /* RTS_OSPF_* */
                     21:   u8 nhs_reuse;                        /* Whether nhs nodes can be reused during merging.
                     22:                                   See a note in rt.c:add_cand() */
                     23:   u32 options;
                     24:   /*
                     25:    * For ORT_ROUTER routes, options field are router-LSA style
                     26:    * options, with V,E,B bits. In OSPFv2, ASBRs from another areas
                     27:    * (that we know from rt-summary-lsa) have just ORTA_ASBR in
                     28:    * options, their real options are unknown.
                     29:    */
                     30: #define ORTA_ASBR OPT_RT_E
                     31: #define ORTA_ABR  OPT_RT_B
                     32:   /*
                     33:    * For ORT_NET routes, there are just several flags for external routes:
                     34:    *
                     35:    * ORTA_PREF for external routes means that the route is preferred in AS
                     36:    * external route selection according to 16.4.1. - it is intra-area path using
                     37:    * non-backbone area. In other words, the forwarding address (or ASBR if
                     38:    * forwarding address is zero) is intra-area (type == RTS_OSPF) and its area
                     39:    * is not a backbone.
                     40:    *
                     41:    * ORTA_NSSA means that the entry represents an NSSA route, and ORTA_PROP
                     42:    * means that the NSSA route has propagate-bit set. These flags are used in
                     43:    * NSSA translation.
                     44:    */
                     45: #define ORTA_PREF 0x80000000
                     46: #define ORTA_NSSA 0x40000000
                     47: #define ORTA_PROP 0x20000000
                     48: 
                     49:   u32 metric1;
                     50:   u32 metric2;
                     51:   u32 tag;
                     52:   u32 rid;                     /* Router ID of real advertising router */
                     53:   struct ospf_area *oa;
                     54:   struct ospf_area *voa;       /* Used when route is replaced in ospf_rt_sum_tr(),
                     55:                                   NULL otherwise */
                     56:   struct mpnh *nhs;            /* Next hops computed during SPF */
                     57:   struct top_hash_entry *en;   /* LSA responsible for this orta */
                     58: }
                     59: orta;
                     60: 
                     61: typedef struct ort
                     62: {
                     63:   /*
                     64:    * Most OSPF routing table entries are for computed OSPF routes, these have
                     65:    * defined n.type. There are also few other cases: entries for configured area
                     66:    * networks (these have area_net field set) and entries for external routes
                     67:    * exported to OSPF (these have external_rte field set). These entries are
                     68:    * kept even if they do not contain 'proper' rt entry. That is needed to keep
                     69:    * allocated stable UID numbers (fn.uid), which are used as LSA IDs in OSPFv3
                     70:    * (see fibnode_to_lsaid()) for related LSAs (network summary LSAs in the
                     71:    * first case, external or NSSA LSAs in the second case). Entries for external
                     72:    * routes also have a second purpose - to prevent NSSA translation of received
                     73:    * NSSA routes if regular external routes were already originated for the same
                     74:    * network (see check_nssa_lsa()).
                     75:    *
                     76:    * old_* values are here to represent the last route update. old_rta is cached
                     77:    * (we keep reference), mainly for multipath nexthops.  old_rta == NULL means
                     78:    * route was not in the last update, in that case other old_* values are not
                     79:    * valid.
                     80:    */
                     81:   struct fib_node fn;
                     82:   orta n;
                     83:   u32 old_metric1, old_metric2, old_tag, old_rid;
                     84:   rta *old_rta;
                     85:   u8 external_rte;
                     86:   u8 area_net;
                     87:   u8 keep;
                     88: }
                     89: ort;
                     90: 
                     91: static inline int rt_is_nssa(ort *nf)
                     92: { return nf->n.options & ORTA_NSSA; }
                     93: 
                     94: 
                     95: /*
                     96:  * Invariants for structs top_hash_entry (nodes of LSA db)
                     97:  * enforced by SPF calculation for final nodes (color == INSPF):
                     98:  * - only router, network and AS-external LSAs
                     99:  * - lsa.age < LSA_MAXAGE
                    100:  * - dist < LSINFINITY (or 2*LSINFINITY for ext-LSAs)
                    101:  * - nhs is non-NULL unless the node is oa->rt (calculating router itself)
                    102:  * - beware, nhs is not valid after SPF calculation
                    103:  *
                    104:  * Invariants for structs orta nodes of fib tables po->rtf, oa->rtr:
                    105:  * - nodes may be invalid (n.type == 0), in that case other invariants don't hold
                    106:  * - n.metric1 may be at most a small multiple of LSINFINITY,
                    107:  *   therefore sums do not overflow
                    108:  * - n.oa is always non-NULL
                    109:  * - n.nhs is always non-NULL unless it is configured stubnet
                    110:  * - n.en is non-NULL for external routes, NULL for intra/inter area routes.
                    111:  * - oa->rtr does not contain calculating router itself
                    112:  *
                    113:  * There are four types of nexthops in nhs fields:
                    114:  * - gateway nexthops (non-NULL iface, gw != IPA_NONE)
                    115:  * - device nexthops (non-NULL iface, gw == IPA_NONE)
                    116:  * - dummy vlink nexthops (NULL iface, gw == IPA_NONE)
                    117:  * - configured stubnets (nhs is NULL, only RTS_OSPF orta nodes in po->rtf)
                    118:  *
                    119:  * Dummy vlink nexthops and configured stubnets cannot be mixed with
                    120:  * regular ones, nhs field contains either list of gateway+device nodes,
                    121:  * one vlink node, or NULL for configured stubnet.
                    122:  *
                    123:  * Dummy vlink nexthops can appear in both network (rtf) and backbone area router
                    124:  * (rtr) tables for regular and inter-area routes, but only if areano > 1. They are
                    125:  * replaced in ospf_rt_sum_tr() and removed in ospf_rt_abr1(), therefore cannot
                    126:  * appear in ASBR pre-selection and external routes processing.
                    127:  */
                    128: 
                    129: void ospf_rt_spf(struct ospf_proto *p);
                    130: void ospf_rt_initort(struct fib_node *fn);
                    131: 
                    132: 
                    133: #endif /* _BIRD_OSPF_RT_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>