Annotation of embedaddon/bird/doc/prog-5.html, revision 1.1.1.2

1.1       misho       1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
                      2: <HTML>
                      3: <HEAD>
                      4:  <META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 1.0.9">
                      5:  <TITLE>BIRD Programmer's Documentation: Protocols</TITLE>
                      6:  <LINK HREF="prog-6.html" REL=next>
                      7:  <LINK HREF="prog-4.html" REL=previous>
                      8:  <LINK HREF="prog.html#toc5" REL=contents>
                      9: </HEAD>
                     10: <BODY>
                     11: <A HREF="prog-6.html">Next</A>
                     12: <A HREF="prog-4.html">Previous</A>
                     13: <A HREF="prog.html#toc5">Contents</A>
                     14: <HR>
                     15: <H2><A NAME="s5">5.</A> <A HREF="prog.html#toc5">Protocols</A></H2>
                     16: 
                     17: <H2><A NAME="ss5.1">5.1</A> <A HREF="prog.html#toc5.1">The Babel protocol</A>
                     18: </H2>
                     19: 
                     20: <P>
                     21: <P>Babel (RFC6126) is a loop-avoiding distance-vector routing protocol that is
                     22: robust and efficient both in ordinary wired networks and in wireless mesh
                     23: networks.
                     24: <P>The Babel protocol keeps state for each neighbour in a <I>babel_neighbor</I>
                     25: struct, tracking received Hello and I Heard You (IHU) messages. A
                     26: <I>babel_interface</I> struct keeps hello and update times for each interface, and
                     27: a separate hello seqno is maintained for each interface.
                     28: <P>For each prefix, Babel keeps track of both the possible routes (with next hop
                     29: and router IDs), as well as the feasibility distance for each prefix and
                     30: router id. The prefix itself is tracked in a <I>babel_entry</I> struct, while the
                     31: possible routes for the prefix are tracked as <I>babel_route</I> entries and the
                     32: feasibility distance is maintained through <I>babel_source</I> structures.
                     33: <P>The main route selection is done in <B>babel_select_route()</B>. This is called when
                     34: an entry is updated by receiving updates from the network or when modified by
                     35: internal timers. It performs feasibility checks on the available routes for
                     36: the prefix and selects the one with the lowest metric to be announced to the
                     37: core.
                     38: <P>
                     39: <P><HR><H3>Function</H3>
                     40: <P><I>void</I>
                     41: <B>babel_announce_rte</B>
                     42: (<I>struct babel_proto *</I> <B>p</B>, <I>struct babel_entry *</I> <B>e</B>) --     announce selected route to the core
                     43: <P>
                     44: <H3>Arguments</H3>
                     45: <P>
                     46: <DL>
                     47: <DT><I>struct babel_proto *</I> <B>p</B><DD><P>Babel protocol instance
                     48: <DT><I>struct babel_entry *</I> <B>e</B><DD><P>Babel route entry to announce
                     49: </DL>
                     50: <H3>Description</H3>
                     51: <P>This function announces a Babel entry to the core if it has a selected
                     52: incoming path, and retracts it otherwise. If the selected entry has infinite
                     53: metric, the route is announced as unreachable.
                     54: 
                     55: 
                     56: <HR><H3>Function</H3>
                     57: <P><I>void</I>
                     58: <B>babel_select_route</B>
                     59: (<I>struct babel_entry *</I> <B>e</B>) --     select best route for given route entry
                     60: <P>
                     61: <H3>Arguments</H3>
                     62: <P>
                     63: <DL>
                     64: <DT><I>struct babel_entry *</I> <B>e</B><DD><P>Babel entry to select the best route for
                     65: </DL>
                     66: <H3>Description</H3>
                     67: <P>Select the best feasible route for a given prefix among the routes received
                     68: from peers, and propagate it to the nest. This just selects the feasible
                     69: route with the lowest metric.
                     70: <P>If no feasible route is available for a prefix that previously had a route
                     71: selected, a seqno request is sent to try to get a valid route. In the
                     72: meantime, the route is marked as infeasible in the nest (to blackhole packets
                     73: going to it, as per the RFC).
                     74: <P>If no feasible route is available, and no previous route is selected, the
                     75: route is removed from the nest entirely.
                     76: 
                     77: 
                     78: <HR><H3>Function</H3>
                     79: <P><I>void</I>
                     80: <B>babel_send_update</B>
                     81: (<I>struct babel_iface *</I> <B>ifa</B>, <I>bird_clock_t</I> <B>changed</B>) --     send route table updates
                     82: <P>
                     83: <H3>Arguments</H3>
                     84: <P>
                     85: <DL>
                     86: <DT><I>struct babel_iface *</I> <B>ifa</B><DD><P>Interface to transmit on
                     87: <DT><I>bird_clock_t</I> <B>changed</B><DD><P>Only send entries changed since this time
                     88: </DL>
                     89: <H3>Description</H3>
                     90: <P>This function produces update TLVs for all entries changed since the time
                     91: indicated by the <I>changed</I> parameter and queues them for transmission on the
                     92: selected interface. During the process, the feasibility distance for each
                     93: transmitted entry is updated.
                     94: 
                     95: 
                     96: <HR><H3>Function</H3>
                     97: <P><I>void</I>
                     98: <B>babel_handle_update</B>
                     99: (<I>union babel_msg *</I> <B>m</B>, <I>struct babel_iface *</I> <B>ifa</B>) --     handle incoming route updates
                    100: <P>
                    101: <H3>Arguments</H3>
                    102: <P>
                    103: <DL>
                    104: <DT><I>union babel_msg *</I> <B>m</B><DD><P>Incoming update TLV
                    105: <DT><I>struct babel_iface *</I> <B>ifa</B><DD><P>Interface the update was received on
                    106: </DL>
                    107: <H3>Description</H3>
                    108: <P>This function is called as a handler for update TLVs and handles the updating
                    109: and maintenance of route entries in Babel's internal routing cache. The
                    110: handling follows the actions described in the Babel RFC, and at the end of
                    111: each update handling, <B>babel_select_route()</B> is called on the affected entry to
                    112: optionally update the selected routes and propagate them to the core.
                    113: 
                    114: 
                    115: <HR><H3>Function</H3>
                    116: <P><I>void</I>
                    117: <B>babel_iface_timer</B>
                    118: (<I>timer *</I> <B>t</B>) --     Babel interface timer handler
                    119: <P>
                    120: <H3>Arguments</H3>
                    121: <P>
                    122: <DL>
                    123: <DT><I>timer *</I> <B>t</B><DD><P>Timer
                    124: </DL>
                    125: <H3>Description</H3>
                    126: <P>This function is called by the per-interface timer and triggers sending of
                    127: periodic Hello's and both triggered and periodic updates. Periodic Hello's
                    128: and updates are simply handled by setting the next_{hello,regular} variables
                    129: on the interface, and triggering an update (and resetting the variable)
                    130: whenever 'now' exceeds that value.
                    131: <P>For triggered updates, <B>babel_trigger_iface_update()</B> will set the
                    132: want_triggered field on the interface to a timestamp value. If this is set
                    133: (and the next_triggered time has passed; this is a rate limiting mechanism),
                    134: <B>babel_send_update()</B> will be called with this timestamp as the second
                    135: parameter. This causes updates to be send consisting of only the routes that
                    136: have changed since the time saved in want_triggered.
                    137: <P>Mostly when an update is triggered, the route being modified will be set to
                    138: the value of 'now' at the time of the trigger; the &gt;= comparison for
                    139: selecting which routes to send in the update will make sure this is included.
                    140: 
                    141: 
                    142: <HR><H3>Function</H3>
                    143: <P><I>void</I>
                    144: <B>babel_timer</B>
                    145: (<I>timer *</I> <B>t</B>) --     global timer hook
                    146: <P>
                    147: <H3>Arguments</H3>
                    148: <P>
                    149: <DL>
                    150: <DT><I>timer *</I> <B>t</B><DD><P>Timer
                    151: </DL>
                    152: <H3>Description</H3>
                    153: <P>This function is called by the global protocol instance timer and handles
                    154: expiration of routes and neighbours as well as pruning of the seqno request
                    155: cache.
                    156: 
                    157: 
                    158: <HR><H3>Function</H3>
                    159: <P><I>uint</I>
                    160: <B>babel_write_queue</B>
                    161: (<I>struct babel_iface *</I> <B>ifa</B>, <I>list *</I> <B>queue</B>) --  Write a TLV queue to a transmission buffer
                    162: <P>
                    163: <H3>Arguments</H3>
                    164: <P>
                    165: <DL>
                    166: <DT><I>struct babel_iface *</I> <B>ifa</B><DD><P>Interface holding the transmission buffer
                    167: <DT><I>list *</I> <B>queue</B><DD><P>TLV queue to write (containing internal-format TLVs)
                    168: </DL>
                    169: <H3>Description</H3>
                    170: <P>This function writes a packet to the interface transmission buffer with as
                    171: many TLVs from the <I>queue</I> as will fit in the buffer. It returns the number of
                    172: bytes written (NOT counting the packet header). The function is called by
                    173: <B>babel_send_queue()</B> and <B>babel_send_unicast()</B> to construct packets for
                    174: transmission, and uses per-TLV helper functions to convert the
                    175: internal-format TLVs to their wire representations.
                    176: <P>The TLVs in the queue are freed after they are written to the buffer.
                    177: 
                    178: 
                    179: <HR><H3>Function</H3>
                    180: <P><I>void</I>
                    181: <B>babel_send_unicast</B>
                    182: (<I>union babel_msg *</I> <B>msg</B>, <I>struct babel_iface *</I> <B>ifa</B>, <I>ip_addr</I> <B>dest</B>) --  send a single TLV via unicast to a destination
                    183: <P>
                    184: <H3>Arguments</H3>
                    185: <P>
                    186: <DL>
                    187: <DT><I>union babel_msg *</I> <B>msg</B><DD><P>TLV to send
                    188: <DT><I>struct babel_iface *</I> <B>ifa</B><DD><P>Interface to send via
                    189: <DT><I>ip_addr</I> <B>dest</B><DD><P>Destination of the TLV
                    190: </DL>
                    191: <H3>Description</H3>
                    192: <P>This function is used to send a single TLV via unicast to a designated
                    193: receiver. This is used for replying to certain incoming requests, and for
                    194: sending unicast requests to refresh routes before they expire.
                    195: 
                    196: 
                    197: <HR><H3>Function</H3>
                    198: <P><I>void</I>
                    199: <B>babel_enqueue</B>
                    200: (<I>union babel_msg *</I> <B>msg</B>, <I>struct babel_iface *</I> <B>ifa</B>) --  enqueue a TLV for transmission on an interface
                    201: <P>
                    202: <H3>Arguments</H3>
                    203: <P>
                    204: <DL>
                    205: <DT><I>union babel_msg *</I> <B>msg</B><DD><P>TLV to enqueue (in internal TLV format)
                    206: <DT><I>struct babel_iface *</I> <B>ifa</B><DD><P>Interface to enqueue to
                    207: </DL>
                    208: <H3>Description</H3>
                    209: <P>This function is called to enqueue a TLV for subsequent transmission on an
                    210: interface. The transmission event is triggered whenever a TLV is enqueued;
                    211: this ensures that TLVs will be transmitted in a timely manner, but that TLVs
                    212: which are enqueued in rapid succession can be transmitted together in one
                    213: packet.
                    214: 
                    215: 
                    216: <HR><H3>Function</H3>
                    217: <P><I>void</I>
                    218: <B>babel_process_packet</B>
                    219: (<I>struct babel_pkt_header *</I> <B>pkt</B>, <I>int</I> <B>len</B>, <I>ip_addr</I> <B>saddr</B>, <I>struct babel_iface *</I> <B>ifa</B>) --  process incoming data packet
                    220: <P>
                    221: <H3>Arguments</H3>
                    222: <P>
                    223: <DL>
                    224: <DT><I>struct babel_pkt_header *</I> <B>pkt</B><DD><P>Pointer to the packet data
                    225: <DT><I>int</I> <B>len</B><DD><P>Length of received packet
                    226: <DT><I>ip_addr</I> <B>saddr</B><DD><P>Address of packet sender
                    227: <DT><I>struct babel_iface *</I> <B>ifa</B><DD><P>Interface packet was received on.
                    228: </DL>
                    229: <H3>Description</H3>
                    230: <P>This function is the main processing hook of incoming Babel packets. It
                    231: checks that the packet header is well-formed, then processes the TLVs
                    232: contained in the packet. This is done in two passes: First all TLVs are
                    233: parsed into the internal TLV format. If a TLV parser fails, processing of the
                    234: rest of the packet is aborted.
                    235: <P>After the parsing step, the TLV handlers are called for each parsed TLV in
                    236: order.
                    237: 
                    238: <H2><A NAME="ss5.2">5.2</A> <A HREF="prog.html#toc5.2">Bidirectional Forwarding Detection</A>
                    239: </H2>
                    240: 
                    241: <P>
                    242: <P>The BFD protocol is implemented in three files: <CODE>bfd.c</CODE> containing the
                    243: protocol logic and the protocol glue with BIRD core, <CODE>packets.c</CODE> handling BFD
                    244: packet processing, RX, TX and protocol sockets. <CODE>io.c</CODE> then contains generic
                    245: code for the event loop, threads and event sources (sockets, microsecond
                    246: timers). This generic code will be merged to the main BIRD I/O code in the
                    247: future.
                    248: <P>The BFD implementation uses a separate thread with an internal event loop for
                    249: handling the protocol logic, which requires high-res and low-latency timing,
                    250: so it is not affected by the rest of BIRD, which has several low-granularity
                    251: hooks in the main loop, uses second-based timers and cannot offer good
                    252: latency. The core of BFD protocol (the code related to BFD sessions,
                    253: interfaces and packets) runs in the BFD thread, while the rest (the code
                    254: related to BFD requests, BFD neighbors and the protocol glue) runs in the
                    255: main thread.
                    256: <P>BFD sessions are represented by structure <I>bfd_session</I> that contains a state
                    257: related to the session and two timers (TX timer for periodic packets and hold
                    258: timer for session timeout). These sessions are allocated from <B>session_slab</B>
                    259: and are accessible by two hash tables, <B>session_hash_id</B> (by session ID) and
                    260: <B>session_hash_ip</B> (by IP addresses of neighbors). Slab and both hashes are in
                    261: the main protocol structure <I>bfd_proto</I>. The protocol logic related to BFD
                    262: sessions is implemented in internal functions bfd_session_*(), which are
                    263: expected to be called from the context of BFD thread, and external functions
                    264: <B>bfd_add_session()</B>, <B>bfd_remove_session()</B> and <B>bfd_reconfigure_session()</B>, which
                    265: form an interface to the BFD core for the rest and are expected to be called
                    266: from the context of main thread.
                    267: <P>Each BFD session has an associated BFD interface, represented by structure
                    268: <I>bfd_iface</I>. A BFD interface contains a socket used for TX (the one for RX is
                    269: shared in <I>bfd_proto</I>), an interface configuration and reference counter.
                    270: Compared to interface structures of other protocols, these structures are not
                    271: created and removed based on interface notification events, but according to
                    272: the needs of BFD sessions. When a new session is created, it requests a
                    273: proper BFD interface by function <B>bfd_get_iface()</B>, which either finds an
                    274: existing one in <I>iface_list</I> (from <I>bfd_proto</I>) or allocates a new one. When a
                    275: session is removed, an associated iface is discharged by <B>bfd_free_iface()</B>.
                    276: <P>BFD requests are the external API for the other protocols. When a protocol
                    277: wants a BFD session, it calls <B>bfd_request_session()</B>, which creates a
                    278: structure <I>bfd_request</I> containing approprite information and an notify hook.
                    279: This structure is a resource associated with the caller's resource pool. When
                    280: a BFD protocol is available, a BFD request is submitted to the protocol, an
                    281: appropriate BFD session is found or created and the request is attached to
                    282: the session. When a session changes state, all attached requests (and related
                    283: protocols) are notified. Note that BFD requests do not depend on BFD protocol
                    284: running. When the BFD protocol is stopped or removed (or not available from
                    285: beginning), related BFD requests are stored in <B>bfd_wait_list</B>, where waits
                    286: for a new protocol.
                    287: <P>BFD neighbors are just a way to statically configure BFD sessions without
                    288: requests from other protocol. Structures <I>bfd_neighbor</I> are part of BFD
                    289: configuration (like static routes in the static protocol). BFD neighbors are
                    290: handled by BFD protocol like it is a BFD client -- when a BFD neighbor is
                    291: ready, the protocol just creates a BFD request like any other protocol.
                    292: <P>The protocol uses a new generic event loop (structure <I>birdloop</I>) from <CODE>io.c</CODE>,
                    293: which supports sockets, timers and events like the main loop. Timers
                    294: (structure <I>timer2</I>) are new microsecond based timers, while sockets and
                    295: events are the same. A birdloop is associated with a thread (field <B>thread</B>)
                    296: in which event hooks are executed. Most functions for setting event sources
                    297: (like <B>sk_start()</B> or <B>tm2_start()</B>) must be called from the context of that
                    298: thread. Birdloop allows to temporarily acquire the context of that thread for
                    299: the main thread by calling <B>birdloop_enter()</B> and then <B>birdloop_leave()</B>, which
                    300: also ensures mutual exclusion with all event hooks. Note that resources
                    301: associated with a birdloop (like timers) should be attached to the
                    302: independent resource pool, detached from the main resource tree.
                    303: <P>There are two kinds of interaction between the BFD core (running in the BFD
                    304: thread) and the rest of BFD (running in the main thread). The first kind are
                    305: configuration calls from main thread to the BFD thread (like <B>bfd_add_session()</B>).
                    306: These calls are synchronous and use <B>birdloop_enter()</B> mechanism for mutual
                    307: exclusion. The second kind is a notification about session changes from the
                    308: BFD thread to the main thread. This is done in an asynchronous way, sesions
                    309: with pending notifications are linked (in the BFD thread) to <B>notify_list</B> in
                    310: <I>bfd_proto</I>, and then <B>bfd_notify_hook()</B> in the main thread is activated using
                    311: <B>bfd_notify_kick()</B> and a pipe. The hook then processes scheduled sessions and
                    312: calls hooks from associated BFD requests. This <B>notify_list</B> (and state fields
                    313: in structure <I>bfd_session</I>) is protected by a spinlock in <I>bfd_proto</I> and
                    314: functions <B>bfd_lock_sessions()</B> / <B>bfd_unlock_sessions()</B>.
                    315: <P>There are few data races (accessing <B>p</B>-&gt;p.debug from <B>TRACE()</B> from the BFD
                    316: thread and accessing some some private fields of <I>bfd_session</I> from
                    317: <B>bfd_show_sessions()</B> from the main thread, but these are harmless (i hope).
                    318: <P>TODO: document functions and access restrictions for fields in BFD structures.
                    319: <P>Supported standards:
                    320: - RFC 5880 - main BFD standard
                    321: - RFC 5881 - BFD for IP links
                    322: - RFC 5882 - generic application of BFD
                    323: - RFC 5883 - BFD for multihop paths
                    324: <P>
                    325: <P>
                    326: <H2><A NAME="ss5.3">5.3</A> <A HREF="prog.html#toc5.3">Border Gateway Protocol</A>
                    327: </H2>
                    328: 
                    329: <P>
                    330: <P>The BGP protocol is implemented in three parts: <CODE>bgp.c</CODE> which takes care of the
                    331: connection and most of the interface with BIRD core, <CODE>packets.c</CODE> handling
                    332: both incoming and outgoing BGP packets and <CODE>attrs.c</CODE> containing functions for
                    333: manipulation with BGP attribute lists.
                    334: <P>As opposed to the other existing routing daemons, BIRD has a sophisticated core
                    335: architecture which is able to keep all the information needed by BGP in the
                    336: primary routing table, therefore no complex data structures like a central
                    337: BGP table are needed. This increases memory footprint of a BGP router with
                    338: many connections, but not too much and, which is more important, it makes
                    339: BGP much easier to implement.
                    340: <P>Each instance of BGP (corresponding to a single BGP peer) is described by a <I>bgp_proto</I>
                    341: structure to which are attached individual connections represented by <I>bgp_connection</I>
                    342: (usually, there exists only one connection, but during BGP session setup, there
                    343: can be more of them). The connections are handled according to the BGP state machine
                    344: defined in the RFC with all the timers and all the parameters configurable.
                    345: <P>In incoming direction, we listen on the connection's socket and each time we receive
                    346: some input, we pass it to <B>bgp_rx()</B>. It decodes packet headers and the markers and
                    347: passes complete packets to <B>bgp_rx_packet()</B> which distributes the packet according
                    348: to its type.
                    349: <P>In outgoing direction, we gather all the routing updates and sort them to buckets
                    350: (<I>bgp_bucket</I>) according to their attributes (we keep a hash table for fast comparison
                    351: of <I>rta</I>'s and a <I>fib</I> which helps us to find if we already have another route for
                    352: the same destination queued for sending, so that we can replace it with the new one
                    353: immediately instead of sending both updates). There also exists a special bucket holding
                    354: all the route withdrawals which cannot be queued anywhere else as they don't have any
                    355: attributes. If we have any packet to send (due to either new routes or the connection
                    356: tracking code wanting to send a Open, Keepalive or Notification message), we call
                    357: <B>bgp_schedule_packet()</B> which sets the corresponding bit in a <B>packet_to_send</B>
                    358: bit field in <I>bgp_conn</I> and as soon as the transmit socket buffer becomes empty,
                    359: we call <B>bgp_fire_tx()</B>. It inspects state of all the packet type bits and calls
                    360: the corresponding <B>bgp_create_xx()</B> functions, eventually rescheduling the same packet
                    361: type if we have more data of the same type to send.
                    362: <P>The processing of attributes consists of two functions: <B>bgp_decode_attrs()</B> for checking
                    363: of the attribute blocks and translating them to the language of BIRD's extended attributes
                    364: and <B>bgp_encode_attrs()</B> which does the converse. Both functions are built around a
                    365: <B>bgp_attr_table</B> array describing all important characteristics of all known attributes.
                    366: Unknown transitive attributes are attached to the route as <I>EAF_TYPE_OPAQUE</I> byte streams.
                    367: <P>BGP protocol implements graceful restart in both restarting (local restart)
                    368: and receiving (neighbor restart) roles. The first is handled mostly by the
                    369: graceful restart code in the nest, BGP protocol just handles capabilities,
                    370: sets <B>gr_wait</B> and locks graceful restart until end-of-RIB mark is received.
                    371: The second is implemented by internal restart of the BGP state to <I>BS_IDLE</I>
                    372: and protocol state to <I>PS_START</I>, but keeping the protocol up from the core
                    373: point of view and therefore maintaining received routes. Routing table
                    374: refresh cycle (<B>rt_refresh_begin()</B>, <B>rt_refresh_end()</B>) is used for removing
                    375: stale routes after reestablishment of BGP session during graceful restart.
                    376: <P>
                    377: <P><HR><H3>Function</H3>
                    378: <P><I>int</I>
                    379: <B>bgp_open</B>
                    380: (<I>struct bgp_proto *</I> <B>p</B>) --     open a BGP instance
                    381: <P>
                    382: <H3>Arguments</H3>
                    383: <P>
                    384: <DL>
                    385: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance
                    386: </DL>
                    387: <H3>Description</H3>
                    388: <P>This function allocates and configures shared BGP resources.
                    389: Should be called as the last step during initialization
                    390: (when lock is acquired and neighbor is ready).
                    391: When error, state changed to PS_DOWN, -1 is returned and caller
                    392: should return immediately.
                    393: 
                    394: 
                    395: <HR><H3>Function</H3>
                    396: <P><I>void</I>
                    397: <B>bgp_close</B>
                    398: (<I>struct bgp_proto *</I> <B>p</B>, <I>int</I> <B>apply_md5</B>) --     close a BGP instance
                    399: <P>
                    400: <H3>Arguments</H3>
                    401: <P>
                    402: <DL>
                    403: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance
                    404: <DT><I>int</I> <B>apply_md5</B><DD><P>0 to disable unsetting MD5 auth
                    405: </DL>
                    406: <H3>Description</H3>
                    407: <P>This function frees and deconfigures shared BGP resources.
                    408: <B>apply_md5</B> is set to 0 when bgp_close is called as a cleanup
                    409: from failed <B>bgp_open()</B>.
                    410: 
                    411: 
                    412: <HR><H3>Function</H3>
                    413: <P><I>void</I>
                    414: <B>bgp_start_timer</B>
                    415: (<I>timer *</I> <B>t</B>, <I>int</I> <B>value</B>) --     start a BGP timer
                    416: <P>
                    417: <H3>Arguments</H3>
                    418: <P>
                    419: <DL>
                    420: <DT><I>timer *</I> <B>t</B><DD><P>timer
                    421: <DT><I>int</I> <B>value</B><DD><P>time to fire (0 to disable the timer)
                    422: </DL>
                    423: <H3>Description</H3>
                    424: <P>This functions calls <B>tm_start()</B> on <B>t</B> with time <B>value</B> and the
                    425: amount of randomization suggested by the BGP standard. Please use
                    426: it for all BGP timers.
                    427: 
                    428: 
                    429: <HR><H3>Function</H3>
                    430: <P><I>void</I>
                    431: <B>bgp_close_conn</B>
                    432: (<I>struct bgp_conn *</I> <B>conn</B>) --     close a BGP connection
                    433: <P>
                    434: <H3>Arguments</H3>
                    435: <P>
                    436: <DL>
                    437: <DT><I>struct bgp_conn *</I> <B>conn</B><DD><P>connection to close
                    438: </DL>
                    439: <H3>Description</H3>
                    440: <P>This function takes a connection described by the <I>bgp_conn</I> structure,
                    441: closes its socket and frees all resources associated with it.
                    442: 
                    443: 
                    444: <HR><H3>Function</H3>
                    445: <P><I>void</I>
                    446: <B>bgp_update_startup_delay</B>
                    447: (<I>struct bgp_proto *</I> <B>p</B>) --     update a startup delay
                    448: <P>
                    449: <H3>Arguments</H3>
                    450: <P>
                    451: <DL>
                    452: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance
                    453: </DL>
                    454: <H3>Description</H3>
                    455: <P>This function updates a startup delay that is used to postpone next BGP connect.
                    456: It also handles disable_after_error and might stop BGP instance when error
                    457: happened and disable_after_error is on.
                    458: <P>It should be called when BGP protocol error happened.
                    459: 
                    460: 
                    461: <HR><H3>Function</H3>
                    462: <P><I>void</I>
                    463: <B>bgp_handle_graceful_restart</B>
                    464: (<I>struct bgp_proto *</I> <B>p</B>) --     handle detected BGP graceful restart
                    465: <P>
                    466: <H3>Arguments</H3>
                    467: <P>
                    468: <DL>
                    469: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance
                    470: </DL>
                    471: <H3>Description</H3>
                    472: <P>This function is called when a BGP graceful restart of the neighbor is
                    473: detected (when the TCP connection fails or when a new TCP connection
                    474: appears). The function activates processing of the restart - starts routing
                    475: table refresh cycle and activates BGP restart timer. The protocol state goes
                    476: back to <I>PS_START</I>, but changing BGP state back to <I>BS_IDLE</I> is left for the
                    477: caller.
                    478: 
                    479: 
                    480: <HR><H3>Function</H3>
                    481: <P><I>void</I>
                    482: <B>bgp_graceful_restart_done</B>
                    483: (<I>struct bgp_proto *</I> <B>p</B>) --     finish active BGP graceful restart
                    484: <P>
                    485: <H3>Arguments</H3>
                    486: <P>
                    487: <DL>
                    488: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance
                    489: </DL>
                    490: <H3>Description</H3>
                    491: <P>This function is called when the active BGP graceful restart of the neighbor
                    492: should be finished - either successfully (the neighbor sends all paths and
                    493: reports end-of-RIB on the new session) or unsuccessfully (the neighbor does
                    494: not support BGP graceful restart on the new session). The function ends
                    495: routing table refresh cycle and stops BGP restart timer.
                    496: 
                    497: 
                    498: <HR><H3>Function</H3>
                    499: <P><I>void</I>
                    500: <B>bgp_graceful_restart_timeout</B>
                    501: (<I>timer *</I> <B>t</B>) --     timeout of graceful restart 'restart timer'
                    502: <P>
                    503: <H3>Arguments</H3>
                    504: <P>
                    505: <DL>
                    506: <DT><I>timer *</I> <B>t</B><DD><P>timer
                    507: </DL>
                    508: <H3>Description</H3>
                    509: <P>This function is a timeout hook for <B>gr_timer</B>, implementing BGP restart time
                    510: limit for reestablisment of the BGP session after the graceful restart. When
                    511: fired, we just proceed with the usual protocol restart.
                    512: 
                    513: 
                    514: <HR><H3>Function</H3>
                    515: <P><I>void</I>
                    516: <B>bgp_refresh_begin</B>
                    517: (<I>struct bgp_proto *</I> <B>p</B>) --     start incoming enhanced route refresh sequence
                    518: <P>
                    519: <H3>Arguments</H3>
                    520: <P>
                    521: <DL>
                    522: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance
                    523: </DL>
                    524: <H3>Description</H3>
                    525: <P>This function is called when an incoming enhanced route refresh sequence is
                    526: started by the neighbor, demarcated by the BoRR packet. The function updates
                    527: the load state and starts the routing table refresh cycle. Note that graceful
                    528: restart also uses routing table refresh cycle, but RFC 7313 and load states
                    529: ensure that these two sequences do not overlap.
                    530: 
                    531: 
                    532: <HR><H3>Function</H3>
                    533: <P><I>void</I>
                    534: <B>bgp_refresh_end</B>
                    535: (<I>struct bgp_proto *</I> <B>p</B>) --     finish incoming enhanced route refresh sequence
                    536: <P>
                    537: <H3>Arguments</H3>
                    538: <P>
                    539: <DL>
                    540: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance
                    541: </DL>
                    542: <H3>Description</H3>
                    543: <P>This function is called when an incoming enhanced route refresh sequence is
                    544: finished by the neighbor, demarcated by the EoRR packet. The function updates
                    545: the load state and ends the routing table refresh cycle. Routes not received
                    546: during the sequence are removed by the nest.
                    547: 
                    548: 
                    549: <HR><H3>Function</H3>
                    550: <P><I>void</I>
                    551: <B>bgp_connect</B>
                    552: (<I>struct bgp_proto *</I> <B>p</B>) --     initiate an outgoing connection
                    553: <P>
                    554: <H3>Arguments</H3>
                    555: <P>
                    556: <DL>
                    557: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance
                    558: </DL>
                    559: <H3>Description</H3>
                    560: <P>The <B>bgp_connect()</B> function creates a new <I>bgp_conn</I> and initiates
                    561: a TCP connection to the peer. The rest of connection setup is governed
                    562: by the BGP state machine as described in the standard.
                    563: 
                    564: 
                    565: <HR><H3>Function</H3>
                    566: <P><I>struct bgp_proto *</I>
                    567: <B>bgp_find_proto</B>
                    568: (<I>sock *</I> <B>sk</B>) --     find existing proto for incoming connection
                    569: <P>
                    570: <H3>Arguments</H3>
                    571: <P>
                    572: <DL>
                    573: <DT><I>sock *</I> <B>sk</B><DD><P>TCP socket
                    574: </DL>
                    575: 
                    576: 
                    577: <HR><H3>Function</H3>
                    578: <P><I>int</I>
                    579: <B>bgp_incoming_connection</B>
                    580: (<I>sock *</I> <B>sk</B>, <I>uint dummy</I> <B>UNUSED</B>) --     handle an incoming connection
                    581: <P>
                    582: <H3>Arguments</H3>
                    583: <P>
                    584: <DL>
                    585: <DT><I>sock *</I> <B>sk</B><DD><P>TCP socket
                    586: <DT><I>uint dummy</I> <B>UNUSED</B><DD><P>-- undescribed --
                    587: </DL>
                    588: <H3>Description</H3>
                    589: <P>This function serves as a socket hook for accepting of new BGP
                    590: connections. It searches a BGP instance corresponding to the peer
                    591: which has connected and if such an instance exists, it creates a
                    592: <I>bgp_conn</I> structure, attaches it to the instance and either sends
                    593: an Open message or (if there already is an active connection) it
                    594: closes the new connection by sending a Notification message.
                    595: 
                    596: 
                    597: <HR><H3>Function</H3>
                    598: <P><I>void</I>
                    599: <B>bgp_error</B>
                    600: (<I>struct bgp_conn *</I> <B>c</B>, <I>unsigned</I> <B>code</B>, <I>unsigned</I> <B>subcode</B>, <I>byte *</I> <B>data</B>, <I>int</I> <B>len</B>) --     report a protocol error
                    601: <P>
                    602: <H3>Arguments</H3>
                    603: <P>
                    604: <DL>
                    605: <DT><I>struct bgp_conn *</I> <B>c</B><DD><P>connection
                    606: <DT><I>unsigned</I> <B>code</B><DD><P>error code (according to the RFC)
                    607: <DT><I>unsigned</I> <B>subcode</B><DD><P>error sub-code
                    608: <DT><I>byte *</I> <B>data</B><DD><P>data to be passed in the Notification message
                    609: <DT><I>int</I> <B>len</B><DD><P>length of the data
                    610: </DL>
                    611: <H3>Description</H3>
                    612: <P><B>bgp_error()</B> sends a notification packet to tell the other side that a protocol
                    613: error has occurred (including the data considered erroneous if possible) and
                    614: closes the connection.
                    615: 
                    616: 
                    617: <HR><H3>Function</H3>
                    618: <P><I>void</I>
                    619: <B>bgp_store_error</B>
                    620: (<I>struct bgp_proto *</I> <B>p</B>, <I>struct bgp_conn *</I> <B>c</B>, <I>u8</I> <B>class</B>, <I>u32</I> <B>code</B>) --     store last error for status report
                    621: <P>
                    622: <H3>Arguments</H3>
                    623: <P>
                    624: <DL>
                    625: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance
                    626: <DT><I>struct bgp_conn *</I> <B>c</B><DD><P>connection
                    627: <DT><I>u8</I> <B>class</B><DD><P>error class (BE_xxx constants)
                    628: <DT><I>u32</I> <B>code</B><DD><P>error code (class specific)
                    629: </DL>
                    630: <H3>Description</H3>
                    631: <P><B>bgp_store_error()</B> decides whether given error is interesting enough
                    632: and store that error to last_error variables of <B>p</B>
                    633: 
                    634: 
                    635: <HR><H3>Function</H3>
                    636: <P><I>int</I>
                    637: <B>bgp_fire_tx</B>
                    638: (<I>struct bgp_conn *</I> <B>conn</B>) --  transmit packets
                    639: <P>
                    640: <H3>Arguments</H3>
                    641: <P>
                    642: <DL>
                    643: <DT><I>struct bgp_conn *</I> <B>conn</B><DD><P>connection
                    644: </DL>
                    645: <H3>Description</H3>
                    646: <P>Whenever the transmit buffers of the underlying TCP connection
                    647: are free and we have any packets queued for sending, the socket functions
                    648: call <B>bgp_fire_tx()</B> which takes care of selecting the highest priority packet
                    649: queued (Notification &gt; Keepalive &gt; Open &gt; Update), assembling its header
                    650: and body and sending it to the connection.
                    651: 
                    652: 
                    653: <HR><H3>Function</H3>
                    654: <P><I>void</I>
                    655: <B>bgp_schedule_packet</B>
                    656: (<I>struct bgp_conn *</I> <B>conn</B>, <I>int</I> <B>type</B>) --  schedule a packet for transmission
                    657: <P>
                    658: <H3>Arguments</H3>
                    659: <P>
                    660: <DL>
                    661: <DT><I>struct bgp_conn *</I> <B>conn</B><DD><P>connection
                    662: <DT><I>int</I> <B>type</B><DD><P>packet type
                    663: </DL>
                    664: <H3>Description</H3>
                    665: <P>Schedule a packet of type <B>type</B> to be sent as soon as possible.
                    666: 
                    667: 
                    668: <HR><H3>Function</H3>
                    669: <P><I>const char *</I>
                    670: <B>bgp_error_dsc</B>
                    671: (<I>unsigned</I> <B>code</B>, <I>unsigned</I> <B>subcode</B>) --  return BGP error description
                    672: <P>
                    673: <H3>Arguments</H3>
                    674: <P>
                    675: <DL>
                    676: <DT><I>unsigned</I> <B>code</B><DD><P>BGP error code
                    677: <DT><I>unsigned</I> <B>subcode</B><DD><P>BGP error subcode
                    678: </DL>
                    679: <H3>Description</H3>
                    680: <P><B>bgp_error_dsc()</B> returns error description for BGP errors
                    681: which might be static string or given temporary buffer.
                    682: 
                    683: 
                    684: <HR><H3>Function</H3>
                    685: <P><I>void</I>
                    686: <B>bgp_rx_packet</B>
                    687: (<I>struct bgp_conn *</I> <B>conn</B>, <I>byte *</I> <B>pkt</B>, <I>unsigned</I> <B>len</B>) --  handle a received packet
                    688: <P>
                    689: <H3>Arguments</H3>
                    690: <P>
                    691: <DL>
                    692: <DT><I>struct bgp_conn *</I> <B>conn</B><DD><P>BGP connection
                    693: <DT><I>byte *</I> <B>pkt</B><DD><P>start of the packet
                    694: <DT><I>unsigned</I> <B>len</B><DD><P>packet size
                    695: </DL>
                    696: <H3>Description</H3>
                    697: <P><B>bgp_rx_packet()</B> takes a newly received packet and calls the corresponding
                    698: packet handler according to the packet type.
                    699: 
                    700: 
                    701: <HR><H3>Function</H3>
                    702: <P><I>int</I>
                    703: <B>bgp_rx</B>
                    704: (<I>sock *</I> <B>sk</B>, <I>uint</I> <B>size</B>) --  handle received data
                    705: <P>
                    706: <H3>Arguments</H3>
                    707: <P>
                    708: <DL>
                    709: <DT><I>sock *</I> <B>sk</B><DD><P>socket
                    710: <DT><I>uint</I> <B>size</B><DD><P>amount of data received
                    711: </DL>
                    712: <H3>Description</H3>
                    713: <P><B>bgp_rx()</B> is called by the socket layer whenever new data arrive from
                    714: the underlying TCP connection. It assembles the data fragments to packets,
                    715: checks their headers and framing and passes complete packets to
                    716: <B>bgp_rx_packet()</B>.
                    717: 
                    718: 
                    719: <HR><H3>Function</H3>
                    720: <P><I>uint</I>
                    721: <B>bgp_encode_attrs</B>
                    722: (<I>struct bgp_proto *</I> <B>p</B>, <I>byte *</I> <B>w</B>, <I>ea_list *</I> <B>attrs</B>, <I>int</I> <B>remains</B>) --  encode BGP attributes
                    723: <P>
                    724: <H3>Arguments</H3>
                    725: <P>
                    726: <DL>
1.1.1.2 ! misho     727: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance (or NULL)
1.1       misho     728: <DT><I>byte *</I> <B>w</B><DD><P>buffer
                    729: <DT><I>ea_list *</I> <B>attrs</B><DD><P>a list of extended attributes
                    730: <DT><I>int</I> <B>remains</B><DD><P>remaining space in the buffer
                    731: </DL>
                    732: <H3>Description</H3>
                    733: <P>The <B>bgp_encode_attrs()</B> function takes a list of extended attributes
                    734: and converts it to its BGP representation (a part of an Update message).
                    735: <H3>Result</H3>
                    736: <P>Length of the attribute block generated or -1 if not enough space.
                    737: 
                    738: 
                    739: <HR><H3>Function</H3>
                    740: <P><I>struct rta *</I>
                    741: <B>bgp_decode_attrs</B>
                    742: (<I>struct bgp_conn *</I> <B>conn</B>, <I>byte *</I> <B>attr</B>, <I>uint</I> <B>len</B>, <I>struct linpool *</I> <B>pool</B>, <I>int</I> <B>mandatory</B>) --  check and decode BGP attributes
                    743: <P>
                    744: <H3>Arguments</H3>
                    745: <P>
                    746: <DL>
                    747: <DT><I>struct bgp_conn *</I> <B>conn</B><DD><P>connection
                    748: <DT><I>byte *</I> <B>attr</B><DD><P>start of attribute block
                    749: <DT><I>uint</I> <B>len</B><DD><P>length of attribute block
                    750: <DT><I>struct linpool *</I> <B>pool</B><DD><P>linear pool to make all the allocations in
                    751: <DT><I>int</I> <B>mandatory</B><DD><P>1 iff presence of mandatory attributes has to be checked
                    752: </DL>
                    753: <H3>Description</H3>
                    754: <P>This function takes a BGP attribute block (a part of an Update message), checks
                    755: its consistency and converts it to a list of BIRD route attributes represented
                    756: by a <I>rta</I>.
                    757: 
1.1.1.2 ! misho     758: <H2><A NAME="ss5.4">5.4</A> <A HREF="prog.html#toc5.4">Multi-Threaded Routing Toolkit (MRT) protocol</A>
        !           759: </H2>
        !           760: 
        !           761: <P>
        !           762: <P>The MRT protocol is implemented in just one file: <CODE>mrt.c</CODE>. It contains of
        !           763: several parts: Generic functions for preparing MRT messages in a buffer,
        !           764: functions for MRT table dump (called from timer or CLI), functions for MRT
        !           765: BGP4MP dump (called from BGP), and the usual protocol glue. For the MRT table
        !           766: dump, the key structure is struct mrt_table_dump_state, which contains all
        !           767: necessary data and created when the MRT dump cycle is started for the
        !           768: duration of the MRT dump. The MBGP4MP dump is currently not bound to MRT
        !           769: protocol instance and uses the config-&gt;mrtdump_file fd.
        !           770: <P>The protocol is simple, just periodically scans routing table and export it
        !           771: to a file. It does not use the regular update mechanism, but a direct access
        !           772: in order to handle iteration through multiple routing tables. The table dump
        !           773: needs to dump all peers first and then use indexes to address the peers, we
        !           774: use a hash table (<B>peer_hash</B>) to find peer index based on BGP protocol key
        !           775: attributes.
        !           776: <P>One thing worth documenting is the locking. During processing, the currently
        !           777: processed table (<B>table</B> field in the state structure) is locked and also the
        !           778: explicitly named table is locked (<B>table_ptr</B> field in the state structure) if
        !           779: specified. Between dumps no table is locked. Also the current config is
        !           780: locked (by <B>config_add_obstacle()</B>) during table dumps as some data (strings,
        !           781: filters) are shared from the config and the running table dump may be
        !           782: interrupted by reconfiguration.
        !           783: <P>Supported standards:
        !           784: - RFC 6396 - MRT format standard
        !           785: - RFC 8050 - ADD_PATH extension
        !           786: <P>
        !           787: <P>
        !           788: <H2><A NAME="ss5.5">5.5</A> <A HREF="prog.html#toc5.5">Open Shortest Path First (OSPF)</A>
1.1       misho     789: </H2>
                    790: 
                    791: <P>
                    792: <P>The OSPF protocol is quite complicated and its complex implemenation is split
                    793: to many files. In <CODE>ospf.c</CODE>, you will find mainly the interface for
                    794: communication with the core (e.g., reconfiguration hooks, shutdown and
                    795: initialisation and so on). File <CODE>iface.c</CODE> contains the interface state
                    796: machine and functions for allocation and deallocation of OSPF's interface
                    797: data structures. Source <CODE>neighbor.c</CODE> includes the neighbor state machine and
                    798: functions for election of Designated Router and Backup Designated router. In
                    799: <CODE>packet.c</CODE>, you will find various functions for sending and receiving generic
                    800: OSPF packets. There are also routines for authentication and checksumming.
                    801: In <CODE>hello.c</CODE>, there are routines for sending and receiving of hello packets
                    802: as well as functions for maintaining wait times and the inactivity timer.
                    803: Files <CODE>lsreq.c</CODE>, <CODE>lsack.c</CODE>, <CODE>dbdes.c</CODE> contain functions for sending and
                    804: receiving of link-state requests, link-state acknowledgements and database
                    805: descriptions respectively.  In <CODE>lsupd.c</CODE>, there are functions for sending and
                    806: receiving of link-state updates and also the flooding algorithm. Source
                    807: <CODE>topology.c</CODE> is a place where routines for searching LSAs in the link-state
                    808: database, adding and deleting them reside, there also are functions for
                    809: originating of various types of LSAs (router LSA, net LSA, external LSA).
                    810: File <CODE>rt.c</CODE> contains routines for calculating the routing table. <CODE>lsalib.c</CODE>
                    811: is a set of various functions for working with the LSAs (endianity
                    812: conversions, calculation of checksum etc.).
                    813: <P>One instance of the protocol is able to hold LSA databases for multiple OSPF
                    814: areas, to exchange routing information between multiple neighbors and to
                    815: calculate the routing tables. The core structure is <I>ospf_proto</I> to which
                    816: multiple <I>ospf_area</I> and <I>ospf_iface</I> structures are connected. <I>ospf_proto</I> is
                    817: also connected to <I>top_hash_graph</I> which is a dynamic hashing structure that
                    818: describes the link-state database. It allows fast search, addition and
                    819: deletion. Each LSA is kept in two pieces: header and body. Both of them are
                    820: kept in the endianity of the CPU.
                    821: <P>In OSPFv2 specification, it is implied that there is one IP prefix for each
                    822: physical network/interface (unless it is an ptp link). But in modern systems,
                    823: there might be more independent IP prefixes associated with an interface.  To
                    824: handle this situation, we have one <I>ospf_iface</I> for each active IP prefix
                    825: (instead for each active iface); This behaves like virtual interface for the
                    826: purpose of OSPF.  If we receive packet, we associate it with a proper virtual
                    827: interface mainly according to its source address.
                    828: <P>OSPF keeps one socket per <I>ospf_iface</I>. This allows us (compared to one socket
                    829: approach) to evade problems with a limit of multicast groups per socket and
                    830: with sending multicast packets to appropriate interface in a portable way.
                    831: The socket is associated with underlying physical iface and should not
                    832: receive packets received on other ifaces (unfortunately, this is not true on
                    833: BSD). Generally, one packet can be received by more sockets (for example, if
                    834: there are more <I>ospf_iface</I> on one physical iface), therefore we explicitly
                    835: filter received packets according to src/dst IP address and received iface.
                    836: <P>Vlinks are implemented using particularly degenerate form of <I>ospf_iface</I>,
                    837: which has several exceptions: it does not have its iface or socket (it copies
                    838: these from 'parent' <I>ospf_iface</I>) and it is present in iface list even when
                    839: down (it is not freed in <B>ospf_iface_down()</B>).
                    840: <P>The heart beat of ospf is <B>ospf_disp()</B>. It is called at regular intervals
                    841: (<I>ospf_proto</I>-&gt;tick). It is responsible for aging and flushing of LSAs in the
                    842: database, updating topology information in LSAs and for routing table
                    843: calculation.
                    844: <P>To every <I>ospf_iface</I>, we connect one or more <I>ospf_neighbor</I>'s -- a structure
                    845: containing many timers and queues for building adjacency and for exchange of
                    846: routing messages.
                    847: <P>BIRD's OSPF implementation respects RFC2328 in every detail, but some of
                    848: internal algorithms do differ. The RFC recommends making a snapshot of the
                    849: link-state database when a new adjacency is forming and sending the database
                    850: description packets based on the information in this snapshot. The database
                    851: can be quite large in some networks, so rather we walk through a <I>slist</I>
                    852: structure which allows us to continue even if the actual LSA we were working
                    853: with is deleted. New LSAs are added at the tail of this <I>slist</I>.
                    854: <P>We also do not keep a separate OSPF routing table, because the core helps us
                    855: by being able to recognize when a route is updated to an identical one and it
                    856: suppresses the update automatically. Due to this, we can flush all the routes
                    857: we have recalculated and also those we have deleted to the core's routing
                    858: table and the core will take care of the rest. This simplifies the process
                    859: and conserves memory.
                    860: <P>Supported standards:
                    861: - RFC 2328 - main OSPFv2 standard
                    862: - RFC 5340 - main OSPFv3 standard
                    863: - RFC 3101 - OSPFv2 NSSA areas
                    864: - RFC 6549 - OSPFv2 multi-instance extensions
                    865: - RFC 6987 - OSPF stub router advertisement
                    866: <P>
                    867: <P><HR><H3>Function</H3>
                    868: <P><I>void</I>
                    869: <B>ospf_disp</B>
                    870: (<I>timer *</I> <B>timer</B>) --     invokes routing table calculation, aging and also <B>area_disp()</B>
                    871: <P>
                    872: <H3>Arguments</H3>
                    873: <P>
                    874: <DL>
                    875: <DT><I>timer *</I> <B>timer</B><DD><P>timer usually called every <B>ospf_proto</B>-&gt;tick second, <B>timer</B>-&gt;data
                    876: point to <B>ospf_proto</B>
                    877: </DL>
                    878: 
                    879: 
                    880: <HR><H3>Function</H3>
                    881: <P><I>int</I>
                    882: <B>ospf_import_control</B>
                    883: (<I>struct proto *</I> <B>P</B>, <I>rte **</I> <B>new</B>, <I>ea_list **</I> <B>attrs</B>, <I>struct linpool *</I> <B>pool</B>) --     accept or reject new route from nest's routing table
                    884: <P>
                    885: <H3>Arguments</H3>
                    886: <P>
                    887: <DL>
                    888: <DT><I>struct proto *</I> <B>P</B><DD><P>OSPF protocol instance
                    889: <DT><I>rte **</I> <B>new</B><DD><P>the new route
                    890: <DT><I>ea_list **</I> <B>attrs</B><DD><P>list of attributes
                    891: <DT><I>struct linpool *</I> <B>pool</B><DD><P>pool for allocation of attributes
                    892: </DL>
                    893: <H3>Description</H3>
                    894: <P>Its quite simple. It does not accept our own routes and leaves the decision on
                    895: import to the filters.
                    896: 
                    897: 
                    898: <HR><H3>Function</H3>
                    899: <P><I>int</I>
                    900: <B>ospf_shutdown</B>
                    901: (<I>struct proto *</I> <B>P</B>) --     Finish of OSPF instance
                    902: <P>
                    903: <H3>Arguments</H3>
                    904: <P>
                    905: <DL>
                    906: <DT><I>struct proto *</I> <B>P</B><DD><P>OSPF protocol instance
                    907: </DL>
                    908: <H3>Description</H3>
                    909: <P>RFC does not define any action that should be taken before router
                    910: shutdown. To make my neighbors react as fast as possible, I send
                    911: them hello packet with empty neighbor list. They should start
                    912: their neighbor state machine with event <I>NEIGHBOR_1WAY</I>.
                    913: 
                    914: 
                    915: <HR><H3>Function</H3>
                    916: <P><I>int</I>
                    917: <B>ospf_reconfigure</B>
                    918: (<I>struct proto *</I> <B>P</B>, <I>struct proto_config *</I> <B>c</B>) --     reconfiguration hook
                    919: <P>
                    920: <H3>Arguments</H3>
                    921: <P>
                    922: <DL>
                    923: <DT><I>struct proto *</I> <B>P</B><DD><P>current instance of protocol (with old configuration)
                    924: <DT><I>struct proto_config *</I> <B>c</B><DD><P>new configuration requested by user
                    925: </DL>
                    926: <H3>Description</H3>
                    927: <P>This hook tries to be a little bit intelligent. Instance of OSPF
                    928: will survive change of many constants like hello interval,
                    929: password change, addition or deletion of some neighbor on
                    930: nonbroadcast network, cost of interface, etc.
                    931: 
                    932: 
                    933: <HR><H3>Function</H3>
                    934: <P><I>struct top_hash_entry *</I>
                    935: <B>ospf_install_lsa</B>
                    936: (<I>struct ospf_proto *</I> <B>p</B>, <I>struct ospf_lsa_header *</I> <B>lsa</B>, <I>u32</I> <B>type</B>, <I>u32</I> <B>domain</B>, <I>void *</I> <B>body</B>) --  install new LSA into database
                    937: <P>
                    938: <H3>Arguments</H3>
                    939: <P>
                    940: <DL>
                    941: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
                    942: <DT><I>struct ospf_lsa_header *</I> <B>lsa</B><DD><P>LSA header
                    943: <DT><I>u32</I> <B>type</B><DD><P>type of LSA
                    944: <DT><I>u32</I> <B>domain</B><DD><P>domain of LSA
                    945: <DT><I>void *</I> <B>body</B><DD><P>pointer to LSA body
                    946: </DL>
                    947: <H3>Description</H3>
                    948: <P>This function ensures installing new LSA received in LS update into LSA
                    949: database. Old instance is replaced. Several actions are taken to detect if
                    950: new routing table calculation is necessary. This is described in 13.2 of RFC
                    951: 2328. This function is for received LSA only, locally originated LSAs are
                    952: installed by <B>ospf_originate_lsa()</B>.
                    953: <P>The LSA body in <B>body</B> is expected to be mb_allocated by the caller and its
                    954: ownership is transferred to the LSA entry structure.
                    955: 
                    956: 
                    957: <HR><H3>Function</H3>
                    958: <P><I>void</I>
                    959: <B>ospf_advance_lsa</B>
                    960: (<I>struct ospf_proto *</I> <B>p</B>, <I>struct top_hash_entry *</I> <B>en</B>, <I>struct ospf_lsa_header *</I> <B>lsa</B>, <I>u32</I> <B>type</B>, <I>u32</I> <B>domain</B>, <I>void *</I> <B>body</B>) --  handle received unexpected self-originated LSA
                    961: <P>
                    962: <H3>Arguments</H3>
                    963: <P>
                    964: <DL>
                    965: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
                    966: <DT><I>struct top_hash_entry *</I> <B>en</B><DD><P>current LSA entry or NULL
                    967: <DT><I>struct ospf_lsa_header *</I> <B>lsa</B><DD><P>new LSA header
                    968: <DT><I>u32</I> <B>type</B><DD><P>type of LSA
                    969: <DT><I>u32</I> <B>domain</B><DD><P>domain of LSA
                    970: <DT><I>void *</I> <B>body</B><DD><P>pointer to LSA body
                    971: </DL>
                    972: <H3>Description</H3>
                    973: <P>This function handles received unexpected self-originated LSA (<B>lsa</B>, <B>body</B>)
                    974: by either advancing sequence number of the local LSA instance (<B>en</B>) and
                    975: propagating it, or installing the received LSA and immediately flushing it
                    976: (if there is no local LSA; i.e., <B>en</B> is NULL or MaxAge).
                    977: <P>The LSA body in <B>body</B> is expected to be mb_allocated by the caller and its
                    978: ownership is transferred to the LSA entry structure or it is freed.
                    979: 
                    980: 
                    981: <HR><H3>Function</H3>
                    982: <P><I>struct top_hash_entry *</I>
                    983: <B>ospf_originate_lsa</B>
                    984: (<I>struct ospf_proto *</I> <B>p</B>, <I>struct ospf_new_lsa *</I> <B>lsa</B>) --  originate new LSA
                    985: <P>
                    986: <H3>Arguments</H3>
                    987: <P>
                    988: <DL>
                    989: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
                    990: <DT><I>struct ospf_new_lsa *</I> <B>lsa</B><DD><P>New LSA specification
                    991: </DL>
                    992: <H3>Description</H3>
                    993: <P>This function prepares a new LSA, installs it into the LSA database and
                    994: floods it. If the new LSA cannot be originated now (because the old instance
                    995: was originated within MinLSInterval, or because the LSA seqnum is currently
                    996: wrapping), the origination is instead scheduled for later. If the new LSA is
                    997: equivalent to the current LSA, the origination is skipped. In all cases, the
                    998: corresponding LSA entry is returned. The new LSA is based on the LSA
                    999: specification (<B>lsa</B>) and the LSA body from lsab buffer of <B>p</B>, which is
                   1000: emptied after the call. The opposite of this function is <B>ospf_flush_lsa()</B>.
                   1001: 
                   1002: 
                   1003: <HR><H3>Function</H3>
                   1004: <P><I>void</I>
                   1005: <B>ospf_flush_lsa</B>
                   1006: (<I>struct ospf_proto *</I> <B>p</B>, <I>struct top_hash_entry *</I> <B>en</B>) --  flush LSA from OSPF domain
                   1007: <P>
                   1008: <H3>Arguments</H3>
                   1009: <P>
                   1010: <DL>
                   1011: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
                   1012: <DT><I>struct top_hash_entry *</I> <B>en</B><DD><P>LSA entry to flush
                   1013: </DL>
                   1014: <H3>Description</H3>
                   1015: <P>This function flushes <B>en</B> from the OSPF domain by setting its age to
                   1016: <I>LSA_MAXAGE</I> and flooding it. That also triggers subsequent events in LSA
                   1017: lifecycle leading to removal of the LSA from the LSA database (e.g. the LSA
                   1018: content is freed when flushing is acknowledged by neighbors). The function
                   1019: does nothing if the LSA is already being flushed. LSA entries are not
                   1020: immediately removed when being flushed, the caller may assume that <B>en</B> still
                   1021: exists after the call. The function is the opposite of <B>ospf_originate_lsa()</B>
                   1022: and is supposed to do the right thing even in cases of postponed
                   1023: origination.
                   1024: 
                   1025: 
                   1026: <HR><H3>Function</H3>
                   1027: <P><I>void</I>
                   1028: <B>ospf_update_lsadb</B>
                   1029: (<I>struct ospf_proto *</I> <B>p</B>) --  update LSA database
                   1030: <P>
                   1031: <H3>Arguments</H3>
                   1032: <P>
                   1033: <DL>
                   1034: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
                   1035: </DL>
                   1036: <H3>Description</H3>
                   1037: <P>This function is periodicaly invoked from <B>ospf_disp()</B>. It does some periodic
                   1038: or postponed processing related to LSA entries. It originates postponed LSAs
                   1039: scheduled by <B>ospf_originate_lsa()</B>, It continues in flushing processes started
                   1040: by <B>ospf_flush_lsa()</B>. It also periodically refreshs locally originated LSAs --
                   1041: when the current instance is older <I>LSREFRESHTIME</I>, a new instance is originated.
                   1042: Finally, it also ages stored LSAs and flushes ones that reached <I>LSA_MAXAGE</I>.
                   1043: <P>The RFC 2328 says that a router should periodically check checksums of all
                   1044: stored LSAs to detect hardware problems. This is not implemented.
                   1045: 
                   1046: 
                   1047: <HR><H3>Function</H3>
                   1048: <P><I>void</I>
                   1049: <B>ospf_originate_ext_lsa</B>
                   1050: (<I>struct ospf_proto *</I> <B>p</B>, <I>struct ospf_area *</I> <B>oa</B>, <I>ort *</I> <B>nf</B>, <I>u8</I> <B>mode</B>, <I>u32</I> <B>metric</B>, <I>u32</I> <B>ebit</B>, <I>ip_addr</I> <B>fwaddr</B>, <I>u32</I> <B>tag</B>, <I>int</I> <B>pbit</B>) --  new route received from nest and filters
                   1051: <P>
                   1052: <H3>Arguments</H3>
                   1053: <P>
                   1054: <DL>
                   1055: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
                   1056: <DT><I>struct ospf_area *</I> <B>oa</B><DD><P>ospf_area for which LSA is originated
                   1057: <DT><I>ort *</I> <B>nf</B><DD><P>network prefix and mask
                   1058: <DT><I>u8</I> <B>mode</B><DD><P>the mode of the LSA (LSA_M_EXPORT or LSA_M_RTCALC)
                   1059: <DT><I>u32</I> <B>metric</B><DD><P>the metric of a route
                   1060: <DT><I>u32</I> <B>ebit</B><DD><P>E-bit for route metric (bool)
                   1061: <DT><I>ip_addr</I> <B>fwaddr</B><DD><P>the forwarding address
                   1062: <DT><I>u32</I> <B>tag</B><DD><P>the route tag
                   1063: <DT><I>int</I> <B>pbit</B><DD><P>P-bit for NSSA LSAs (bool), ignored for external LSAs
                   1064: </DL>
                   1065: <H3>Description</H3>
                   1066: <P>If I receive a message that new route is installed, I try to originate an
                   1067: external LSA. If <B>oa</B> is an NSSA area, NSSA-LSA is originated instead.
                   1068: <B>oa</B> should not be a stub area. <B>src</B> does not specify whether the LSA
                   1069: is external or NSSA, but it specifies the source of origination -
                   1070: the export from <B>ospf_rt_notify()</B>, or the NSSA-EXT translation.
                   1071: 
                   1072: 
                   1073: <HR><H3>Function</H3>
                   1074: <P><I>struct top_graph *</I>
                   1075: <B>ospf_top_new</B>
                   1076: (<I>struct ospf_proto *p UNUSED4</I> <B>UNUSED6</B>, <I>pool *</I> <B>pool</B>) --  allocated new topology database
                   1077: <P>
                   1078: <H3>Arguments</H3>
                   1079: <P>
                   1080: <DL>
                   1081: <DT><I>struct ospf_proto *p UNUSED4</I> <B>UNUSED6</B><DD><P>-- undescribed --
                   1082: <DT><I>pool *</I> <B>pool</B><DD><P>pool for allocation
                   1083: </DL>
                   1084: <H3>Description</H3>
                   1085: <P>This dynamically hashed structure is used for keeping LSAs. Mainly it is used
                   1086: for the LSA database of the OSPF protocol, but also for LSA retransmission
                   1087: and request lists of OSPF neighbors.
                   1088: 
                   1089: 
                   1090: <HR><H3>Function</H3>
                   1091: <P><I>void</I>
                   1092: <B>ospf_neigh_chstate</B>
                   1093: (<I>struct ospf_neighbor *</I> <B>n</B>, <I>u8</I> <B>state</B>) --  handles changes related to new or lod state of neighbor
                   1094: <P>
                   1095: <H3>Arguments</H3>
                   1096: <P>
                   1097: <DL>
                   1098: <DT><I>struct ospf_neighbor *</I> <B>n</B><DD><P>OSPF neighbor
                   1099: <DT><I>u8</I> <B>state</B><DD><P>new state
                   1100: </DL>
                   1101: <H3>Description</H3>
                   1102: <P>Many actions have to be taken acording to a change of state of a neighbor. It
                   1103: starts rxmt timers, call interface state machine etc.
                   1104: 
                   1105: 
                   1106: <HR><H3>Function</H3>
                   1107: <P><I>void</I>
                   1108: <B>ospf_neigh_sm</B>
                   1109: (<I>struct ospf_neighbor *</I> <B>n</B>, <I>int</I> <B>event</B>) --  ospf neighbor state machine
                   1110: <P>
                   1111: <H3>Arguments</H3>
                   1112: <P>
                   1113: <DL>
                   1114: <DT><I>struct ospf_neighbor *</I> <B>n</B><DD><P>neighor
                   1115: <DT><I>int</I> <B>event</B><DD><P>actual event
                   1116: </DL>
                   1117: <H3>Description</H3>
                   1118: <P>This part implements the neighbor state machine as described in 10.3 of
                   1119: RFC 2328. The only difference is that state <I>NEIGHBOR_ATTEMPT</I> is not
                   1120: used. We discover neighbors on nonbroadcast networks in the
                   1121: same way as on broadcast networks. The only difference is in
                   1122: sending hello packets. These are sent to IPs listed in
                   1123: <B>ospf_iface</B>-&gt;nbma_list .
                   1124: 
                   1125: 
                   1126: <HR><H3>Function</H3>
                   1127: <P><I>void</I>
                   1128: <B>ospf_dr_election</B>
                   1129: (<I>struct ospf_iface *</I> <B>ifa</B>) --  (Backup) Designed Router election
                   1130: <P>
                   1131: <H3>Arguments</H3>
                   1132: <P>
                   1133: <DL>
                   1134: <DT><I>struct ospf_iface *</I> <B>ifa</B><DD><P>actual interface
                   1135: </DL>
                   1136: <H3>Description</H3>
                   1137: <P>When the wait timer fires, it is time to elect (Backup) Designated Router.
                   1138: Structure describing me is added to this list so every electing router has
                   1139: the same list. Backup Designated Router is elected before Designated
                   1140: Router. This process is described in 9.4 of RFC 2328. The function is
                   1141: supposed to be called only from <B>ospf_iface_sm()</B> as a part of the interface
                   1142: state machine.
                   1143: 
                   1144: 
                   1145: <HR><H3>Function</H3>
                   1146: <P><I>void</I>
                   1147: <B>ospf_iface_chstate</B>
                   1148: (<I>struct ospf_iface *</I> <B>ifa</B>, <I>u8</I> <B>state</B>) --  handle changes of interface state
                   1149: <P>
                   1150: <H3>Arguments</H3>
                   1151: <P>
                   1152: <DL>
                   1153: <DT><I>struct ospf_iface *</I> <B>ifa</B><DD><P>OSPF interface
                   1154: <DT><I>u8</I> <B>state</B><DD><P>new state
                   1155: </DL>
                   1156: <H3>Description</H3>
                   1157: <P>Many actions must be taken according to interface state changes. New network
                   1158: LSAs must be originated, flushed, new multicast sockets to listen for messages for
                   1159: <I>ALLDROUTERS</I> have to be opened, etc.
                   1160: 
                   1161: 
                   1162: <HR><H3>Function</H3>
                   1163: <P><I>void</I>
                   1164: <B>ospf_iface_sm</B>
                   1165: (<I>struct ospf_iface *</I> <B>ifa</B>, <I>int</I> <B>event</B>) --  OSPF interface state machine
                   1166: <P>
                   1167: <H3>Arguments</H3>
                   1168: <P>
                   1169: <DL>
                   1170: <DT><I>struct ospf_iface *</I> <B>ifa</B><DD><P>OSPF interface
                   1171: <DT><I>int</I> <B>event</B><DD><P>event comming to state machine
                   1172: </DL>
                   1173: <H3>Description</H3>
                   1174: <P>This fully respects 9.3 of RFC 2328 except we have slightly
                   1175: different handling of <I>DOWN</I> and <I>LOOP</I> state. We remove intefaces
                   1176: that are <I>DOWN</I>. <I>DOWN</I> state is used when an interface is waiting
                   1177: for a lock. <I>LOOP</I> state is used when an interface does not have a
                   1178: link.
                   1179: 
                   1180: 
                   1181: <HR><H3>Function</H3>
                   1182: <P><I>int</I>
                   1183: <B>ospf_rx_hook</B>
                   1184: (<I>sock *</I> <B>sk</B>, <I>uint</I> <B>len</B>)
                   1185: <H3>Arguments</H3>
                   1186: <P>
                   1187: <DL>
                   1188: <DT><I>sock *</I> <B>sk</B><DD><P>socket we received the packet.
                   1189: <DT><I>uint</I> <B>len</B><DD><P>size of the packet
                   1190: </DL>
                   1191: <H3>Description</H3>
                   1192: <P>This is the entry point for messages from neighbors. Many checks (like
                   1193: authentication, checksums, size) are done before the packet is passed to
                   1194: non generic functions.
                   1195: 
                   1196: 
                   1197: <HR><H3>Function</H3>
                   1198: <P><I>int</I>
                   1199: <B>lsa_validate</B>
                   1200: (<I>struct ospf_lsa_header *</I> <B>lsa</B>, <I>u32</I> <B>lsa_type</B>, <I>int</I> <B>ospf2</B>, <I>void *</I> <B>body</B>) --  check whether given LSA is valid
                   1201: <P>
                   1202: <H3>Arguments</H3>
                   1203: <P>
                   1204: <DL>
                   1205: <DT><I>struct ospf_lsa_header *</I> <B>lsa</B><DD><P>LSA header
                   1206: <DT><I>u32</I> <B>lsa_type</B><DD><P>one of <I>LSA_T_xxx</I>
                   1207: <DT><I>int</I> <B>ospf2</B><DD><P><I>true</I> means OSPF version 2, <I>false</I> means OSPF version 3
                   1208: <DT><I>void *</I> <B>body</B><DD><P>pointer to LSA body
                   1209: </DL>
                   1210: <H3>Description</H3>
                   1211: <P>Checks internal structure of given LSA body (minimal length,
                   1212: consistency). Returns true if valid.
                   1213: 
                   1214: 
                   1215: <HR><H3>Function</H3>
                   1216: <P><I>void</I>
                   1217: <B>ospf_send_dbdes</B>
                   1218: (<I>struct ospf_proto *</I> <B>p</B>, <I>struct ospf_neighbor *</I> <B>n</B>) --  transmit database description packet
                   1219: <P>
                   1220: <H3>Arguments</H3>
                   1221: <P>
                   1222: <DL>
                   1223: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
                   1224: <DT><I>struct ospf_neighbor *</I> <B>n</B><DD><P>neighbor
                   1225: </DL>
                   1226: <H3>Description</H3>
                   1227: <P>Sending of a database description packet is described in 10.8 of RFC 2328.
                   1228: Reception of each packet is acknowledged in the sequence number of another.
                   1229: When I send a packet to a neighbor I keep a copy in a buffer. If the neighbor
                   1230: does not reply, I don't create a new packet but just send the content
                   1231: of the buffer.
                   1232: 
                   1233: 
                   1234: <HR><H3>Function</H3>
                   1235: <P><I>void</I>
                   1236: <B>ospf_rt_spf</B>
                   1237: (<I>struct ospf_proto *</I> <B>p</B>) --  calculate internal routes
                   1238: <P>
                   1239: <H3>Arguments</H3>
                   1240: <P>
                   1241: <DL>
                   1242: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
                   1243: </DL>
                   1244: <H3>Description</H3>
                   1245: <P>Calculation of internal paths in an area is described in 16.1 of RFC 2328.
                   1246: It's based on Dijkstra's shortest path tree algorithms.
                   1247: This function is invoked from <B>ospf_disp()</B>.
                   1248: 
1.1.1.2 ! misho    1249: <H2><A NAME="ss5.6">5.6</A> <A HREF="prog.html#toc5.6">Pipe</A>
1.1       misho    1250: </H2>
                   1251: 
                   1252: <P>
                   1253: <P>The Pipe protocol is very simple. It just connects to two routing tables
                   1254: using <B>proto_add_announce_hook()</B> and whenever it receives a <B>rt_notify()</B>
                   1255: about a change in one of the tables, it converts it to a <B>rte_update()</B>
                   1256: in the other one.
                   1257: <P>To avoid pipe loops, Pipe keeps a `being updated' flag in each routing
                   1258: table.
                   1259: <P>A pipe has two announce hooks, the first connected to the main
                   1260: table, the second connected to the peer table. When a new route is
                   1261: announced on the main table, it gets checked by an export filter in
                   1262: ahook 1, and, after that, it is announced to the peer table via
                   1263: <B>rte_update()</B>, an import filter in ahook 2 is called. When a new
                   1264: route is announced in the peer table, an export filter in ahook2
                   1265: and an import filter in ahook 1 are used. Oviously, there is no
                   1266: need in filtering the same route twice, so both import filters are
                   1267: set to accept, while user configured 'import' and 'export' filters
                   1268: are used as export filters in ahooks 2 and 1. Route limits are
                   1269: handled similarly, but on the import side of ahooks.
                   1270: <P>
                   1271: <P>
1.1.1.2 ! misho    1272: <H2><A NAME="ss5.7">5.7</A> <A HREF="prog.html#toc5.7">Routing Information Protocol (RIP)</A>
1.1       misho    1273: </H2>
                   1274: 
                   1275: <P>
                   1276: <P>The RIP protocol is implemented in two files: <CODE>rip.c</CODE> containing the protocol
                   1277: logic, route management and the protocol glue with BIRD core, and <CODE>packets.c</CODE>
                   1278: handling RIP packet processing, RX, TX and protocol sockets.
                   1279: <P>Each instance of RIP is described by a structure <I>rip_proto</I>, which contains
                   1280: an internal RIP routing table, a list of protocol interfaces and the main
                   1281: timer responsible for RIP routing table cleanup.
                   1282: <P>RIP internal routing table contains incoming and outgoing routes. For each
                   1283: network (represented by structure <I>rip_entry</I>) there is one outgoing route
                   1284: stored directly in <I>rip_entry</I> and an one-way linked list of incoming routes
                   1285: (structures <I>rip_rte</I>). The list contains incoming routes from different RIP
                   1286: neighbors, but only routes with the lowest metric are stored (i.e., all
                   1287: stored incoming routes have the same metric).
                   1288: <P>Note that RIP itself does not select outgoing route, that is done by the core
                   1289: routing table. When a new incoming route is received, it is propagated to the
                   1290: RIP table by <B>rip_update_rte()</B> and possibly stored in the list of incoming
                   1291: routes. Then the change may be propagated to the core by <B>rip_announce_rte()</B>.
                   1292: The core selects the best route and propagate it to RIP by <B>rip_rt_notify()</B>,
                   1293: which updates outgoing route part of <I>rip_entry</I> and possibly triggers route
                   1294: propagation by <B>rip_trigger_update()</B>.
                   1295: <P>RIP interfaces are represented by structures <I>rip_iface</I>. A RIP interface
                   1296: contains a per-interface socket, a list of associated neighbors, interface
                   1297: configuration, and state information related to scheduled interface events
                   1298: and running update sessions. RIP interfaces are added and removed based on
                   1299: core interface notifications.
                   1300: <P>There are two RIP interface events - regular updates and triggered updates.
                   1301: Both are managed from the RIP interface timer (<B>rip_iface_timer()</B>). Regular
                   1302: updates are called at fixed interval and propagate the whole routing table,
                   1303: while triggered updates are scheduled by <B>rip_trigger_update()</B> due to some
                   1304: routing table change and propagate only the routes modified since the time
                   1305: they were scheduled. There are also unicast-destined requested updates, but
                   1306: these are sent directly as a reaction to received RIP request message. The
                   1307: update session is started by <B>rip_send_table()</B>. There may be at most one
                   1308: active update session per interface, as the associated state (including the
                   1309: fib iterator) is stored directly in <I>rip_iface</I> structure.
                   1310: <P>RIP neighbors are represented by structures <I>rip_neighbor</I>. Compared to
                   1311: neighbor handling in other routing protocols, RIP does not have explicit
                   1312: neighbor discovery and adjacency maintenance, which makes the <I>rip_neighbor</I>
                   1313: related code a bit peculiar. RIP neighbors are interlinked with core neighbor
                   1314: structures (<I>neighbor</I>) and use core neighbor notifications to ensure that RIP
                   1315: neighbors are timely removed. RIP neighbors are added based on received route
                   1316: notifications and removed based on core neighbor and RIP interface events.
                   1317: <P>RIP neighbors are linked by RIP routes and use counter to track the number of
                   1318: associated routes, but when these RIP routes timeout, associated RIP neighbor
                   1319: is still alive (with zero counter). When RIP neighbor is removed but still
                   1320: has some associated routes, it is not freed, just changed to detached state
                   1321: (core neighbors and RIP ifaces are unlinked), then during the main timer
                   1322: cleanup phase the associated routes are removed and the <I>rip_neighbor</I>
                   1323: structure is finally freed.
                   1324: <P>Supported standards:
                   1325: - RFC 1058 - RIPv1
                   1326: - RFC 2453 - RIPv2
                   1327: - RFC 2080 - RIPng
                   1328: - RFC 4822 - RIP cryptographic authentication
                   1329: <P>
                   1330: <P><HR><H3>Function</H3>
                   1331: <P><I>void</I>
                   1332: <B>rip_announce_rte</B>
                   1333: (<I>struct rip_proto *</I> <B>p</B>, <I>struct rip_entry *</I> <B>en</B>) --     announce route from RIP routing table to the core
                   1334: <P>
                   1335: <H3>Arguments</H3>
                   1336: <P>
                   1337: <DL>
                   1338: <DT><I>struct rip_proto *</I> <B>p</B><DD><P>RIP instance
                   1339: <DT><I>struct rip_entry *</I> <B>en</B><DD><P>related network
                   1340: </DL>
                   1341: <H3>Description</H3>
                   1342: <P>The function takes a list of incoming routes from <B>en</B>, prepare appropriate
                   1343: <I>rte</I> for the core and propagate it by <B>rte_update()</B>.
                   1344: 
                   1345: 
                   1346: <HR><H3>Function</H3>
                   1347: <P><I>void</I>
                   1348: <B>rip_update_rte</B>
                   1349: (<I>struct rip_proto *</I> <B>p</B>, <I>ip_addr *</I> <B>prefix</B>, <I>int</I> <B>pxlen</B>, <I>struct rip_rte *</I> <B>new</B>) --     enter a route update to RIP routing table
                   1350: <P>
                   1351: <H3>Arguments</H3>
                   1352: <P>
                   1353: <DL>
                   1354: <DT><I>struct rip_proto *</I> <B>p</B><DD><P>RIP instance
                   1355: <DT><I>ip_addr *</I> <B>prefix</B><DD><P>network prefix
                   1356: <DT><I>int</I> <B>pxlen</B><DD><P>network prefix length
                   1357: <DT><I>struct rip_rte *</I> <B>new</B><DD><P>a <I>rip_rte</I> representing the new route
                   1358: </DL>
                   1359: <H3>Description</H3>
                   1360: <P>The function is called by the RIP packet processing code whenever it receives
                   1361: a reachable route. The appropriate routing table entry is found and the list
                   1362: of incoming routes is updated. Eventually, the change is also propagated to
                   1363: the core by <B>rip_announce_rte()</B>. Note that for unreachable routes,
                   1364: <B>rip_withdraw_rte()</B> should be called instead of <B>rip_update_rte()</B>.
                   1365: 
                   1366: 
                   1367: <HR><H3>Function</H3>
                   1368: <P><I>void</I>
                   1369: <B>rip_withdraw_rte</B>
                   1370: (<I>struct rip_proto *</I> <B>p</B>, <I>ip_addr *</I> <B>prefix</B>, <I>int</I> <B>pxlen</B>, <I>struct rip_neighbor *</I> <B>from</B>) --     enter a route withdraw to RIP routing table
                   1371: <P>
                   1372: <H3>Arguments</H3>
                   1373: <P>
                   1374: <DL>
                   1375: <DT><I>struct rip_proto *</I> <B>p</B><DD><P>RIP instance
                   1376: <DT><I>ip_addr *</I> <B>prefix</B><DD><P>network prefix
                   1377: <DT><I>int</I> <B>pxlen</B><DD><P>network prefix length
                   1378: <DT><I>struct rip_neighbor *</I> <B>from</B><DD><P>a <I>rip_neighbor</I> propagating the withdraw
                   1379: </DL>
                   1380: <H3>Description</H3>
                   1381: <P>The function is called by the RIP packet processing code whenever it receives
                   1382: an unreachable route. The incoming route for given network from nbr <B>from</B> is
                   1383: removed. Eventually, the change is also propagated by <B>rip_announce_rte()</B>.
                   1384: 
                   1385: 
                   1386: <HR><H3>Function</H3>
                   1387: <P><I>void</I>
                   1388: <B>rip_timer</B>
                   1389: (<I>timer *</I> <B>t</B>) --     RIP main timer hook
                   1390: <P>
                   1391: <H3>Arguments</H3>
                   1392: <P>
                   1393: <DL>
                   1394: <DT><I>timer *</I> <B>t</B><DD><P>timer
                   1395: </DL>
                   1396: <H3>Description</H3>
                   1397: <P>The RIP main timer is responsible for routing table maintenance. Invalid or
                   1398: expired routes (<I>rip_rte</I>) are removed and garbage collection of stale routing
                   1399: table entries (<I>rip_entry</I>) is done. Changes are propagated to core tables,
                   1400: route reload is also done here. Note that garbage collection uses a maximal
                   1401: GC time, while interfaces maintain an illusion of per-interface GC times in
                   1402: <B>rip_send_response()</B>.
                   1403: <P>Keeping incoming routes and the selected outgoing route are two independent
                   1404: functions, therefore after garbage collection some entries now considered
                   1405: invalid (RIP_ENTRY_DUMMY) still may have non-empty list of incoming routes,
                   1406: while some valid entries (representing an outgoing route) may have that list
                   1407: empty.
                   1408: <P>The main timer is not scheduled periodically but it uses the time of the
                   1409: current next event and the minimal interval of any possible event to compute
                   1410: the time of the next run.
                   1411: 
                   1412: 
                   1413: <HR><H3>Function</H3>
                   1414: <P><I>void</I>
                   1415: <B>rip_iface_timer</B>
                   1416: (<I>timer *</I> <B>t</B>) --     RIP interface timer hook
                   1417: <P>
                   1418: <H3>Arguments</H3>
                   1419: <P>
                   1420: <DL>
                   1421: <DT><I>timer *</I> <B>t</B><DD><P>timer
                   1422: </DL>
                   1423: <H3>Description</H3>
                   1424: <P>RIP interface timers are responsible for scheduling both regular and
                   1425: triggered updates. Fixed, delay-independent period is used for regular
                   1426: updates, while minimal separating interval is enforced for triggered updates.
                   1427: The function also ensures that a new update is not started when the old one
                   1428: is still running.
                   1429: 
                   1430: 
                   1431: <HR><H3>Function</H3>
                   1432: <P><I>void</I>
                   1433: <B>rip_send_table</B>
                   1434: (<I>struct rip_proto *</I> <B>p</B>, <I>struct rip_iface *</I> <B>ifa</B>, <I>ip_addr</I> <B>addr</B>, <I>bird_clock_t</I> <B>changed</B>) --  RIP interface timer hook
                   1435: <P>
                   1436: <H3>Arguments</H3>
                   1437: <P>
                   1438: <DL>
                   1439: <DT><I>struct rip_proto *</I> <B>p</B><DD><P>RIP instance
                   1440: <DT><I>struct rip_iface *</I> <B>ifa</B><DD><P>RIP interface
                   1441: <DT><I>ip_addr</I> <B>addr</B><DD><P>destination IP address
                   1442: <DT><I>bird_clock_t</I> <B>changed</B><DD><P>time limit for triggered updates
                   1443: </DL>
                   1444: <H3>Description</H3>
                   1445: <P>The function activates an update session and starts sending routing update
                   1446: packets (using <B>rip_send_response()</B>). The session may be finished during the
                   1447: call or may continue in <B>rip_tx_hook()</B> until all appropriate routes are
                   1448: transmitted. Note that there may be at most one active update session per
                   1449: interface, the function will terminate the old active session before
                   1450: activating the new one.
                   1451: 
1.1.1.2 ! misho    1452: <H2><A NAME="ss5.8">5.8</A> <A HREF="prog.html#toc5.8">Router Advertisements</A>
1.1       misho    1453: </H2>
                   1454: 
                   1455: <P>
1.1.1.2 ! misho    1456: <P>The RAdv protocol is implemented in two files: <CODE>radv.c</CODE> containing the
        !          1457: interface with BIRD core and the protocol logic and <CODE>packets.c</CODE> handling low
        !          1458: level protocol stuff (RX, TX and packet formats). The protocol does not
        !          1459: export any routes.
        !          1460: <P>The RAdv is structured in the usual way - for each handled interface there is
        !          1461: a structure <I>radv_iface</I> that contains a state related to that interface
        !          1462: together with its resources (a socket, a timer). There is also a prepared RA
        !          1463: stored in a TX buffer of the socket associated with an iface. These iface
        !          1464: structures are created and removed according to iface events from BIRD core
        !          1465: handled by <B>radv_if_notify()</B> callback.
        !          1466: <P>The main logic of RAdv consists of two functions: <B>radv_iface_notify()</B>, which
        !          1467: processes asynchronous events (specified by RA_EV_* codes), and <B>radv_timer()</B>,
        !          1468: which triggers sending RAs and computes the next timeout.
        !          1469: <P>The RAdv protocol could receive routes (through <B>radv_import_control()</B> and
        !          1470: <B>radv_rt_notify()</B>), but only the configured trigger route is tracked (in
        !          1471: <I>active</I> var).  When a radv protocol is reconfigured, the connected routing
        !          1472: table is examined (in <B>radv_check_active()</B>) to have proper <I>active</I> value in
        !          1473: case of the specified trigger prefix was changed.
1.1       misho    1474: <P>Supported standards:
                   1475: - RFC 4861 - main RA standard
1.1.1.2 ! misho    1476: - RFC 4191 - Default Router Preferences and More-Specific Routes
1.1       misho    1477: - RFC 6106 - DNS extensions (RDDNS, DNSSL)
                   1478: <P>
                   1479: <P>
1.1.1.2 ! misho    1480: <H2><A NAME="ss5.9">5.9</A> <A HREF="prog.html#toc5.9">Static</A>
1.1       misho    1481: </H2>
                   1482: 
                   1483: <P>
                   1484: <P>The Static protocol is implemented in a straightforward way. It keeps
                   1485: two lists of static routes: one containing interface routes and one
                   1486: holding the remaining ones. Interface routes are inserted and removed according
                   1487: to interface events received from the core via the <B>if_notify()</B> hook. Routes
                   1488: pointing to a neighboring router use a sticky node in the neighbor cache
                   1489: to be notified about gaining or losing the neighbor. Special
                   1490: routes like black holes or rejects are inserted all the time.
                   1491: <P>Multipath routes are tricky. Because these routes depends on
                   1492: several neighbors we need to integrate that to the neighbor
                   1493: notification handling, we use dummy static_route nodes, one for
                   1494: each nexthop. Therefore, a multipath route consists of a master
                   1495: static_route node (of dest RTD_MULTIPATH), which specifies prefix
                   1496: and is used in most circumstances, and a list of dummy static_route
                   1497: nodes (of dest RTD_NONE), which stores info about nexthops and are
                   1498: connected to neighbor entries and neighbor notifications. Dummy
                   1499: nodes are chained using mp_next, they aren't in other_routes list,
                   1500: and abuse some fields (masklen, if_name) for other purposes.
                   1501: <P>The only other thing worth mentioning is that when asked for reconfiguration,
                   1502: Static not only compares the two configurations, but it also calculates
                   1503: difference between the lists of static routes and it just inserts the
                   1504: newly added routes and removes the obsolete ones.
                   1505: <P>
                   1506: <P>
1.1.1.2 ! misho    1507: <H2><A NAME="ss5.10">5.10</A> <A HREF="prog.html#toc5.10">Direct</A>
1.1       misho    1508: </H2>
                   1509: 
                   1510: <P>
                   1511: <P>The Direct protocol works by converting all <B>ifa_notify()</B> events it receives
                   1512: to <B>rte_update()</B> calls for the corresponding network.
                   1513: <P>
                   1514: <P>
                   1515: <P>
                   1516: <HR>
                   1517: <A HREF="prog-6.html">Next</A>
                   1518: <A HREF="prog-4.html">Previous</A>
                   1519: <A HREF="prog.html#toc5">Contents</A>
                   1520: </BODY>
                   1521: </HTML>

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