Annotation of embedaddon/bird/doc/prog-5.html, revision 1.1
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 >= 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>->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 > Keepalive > Open > 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>
! 727: <DT><I>struct bgp_proto *</I> <B>p</B><DD><P>BGP instance
! 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:
! 758: <H2><A NAME="ss5.4">5.4</A> <A HREF="prog.html#toc5.4">Open Shortest Path First (OSPF)</A>
! 759: </H2>
! 760:
! 761: <P>
! 762: <P>The OSPF protocol is quite complicated and its complex implemenation is split
! 763: to many files. In <CODE>ospf.c</CODE>, you will find mainly the interface for
! 764: communication with the core (e.g., reconfiguration hooks, shutdown and
! 765: initialisation and so on). File <CODE>iface.c</CODE> contains the interface state
! 766: machine and functions for allocation and deallocation of OSPF's interface
! 767: data structures. Source <CODE>neighbor.c</CODE> includes the neighbor state machine and
! 768: functions for election of Designated Router and Backup Designated router. In
! 769: <CODE>packet.c</CODE>, you will find various functions for sending and receiving generic
! 770: OSPF packets. There are also routines for authentication and checksumming.
! 771: In <CODE>hello.c</CODE>, there are routines for sending and receiving of hello packets
! 772: as well as functions for maintaining wait times and the inactivity timer.
! 773: Files <CODE>lsreq.c</CODE>, <CODE>lsack.c</CODE>, <CODE>dbdes.c</CODE> contain functions for sending and
! 774: receiving of link-state requests, link-state acknowledgements and database
! 775: descriptions respectively. In <CODE>lsupd.c</CODE>, there are functions for sending and
! 776: receiving of link-state updates and also the flooding algorithm. Source
! 777: <CODE>topology.c</CODE> is a place where routines for searching LSAs in the link-state
! 778: database, adding and deleting them reside, there also are functions for
! 779: originating of various types of LSAs (router LSA, net LSA, external LSA).
! 780: File <CODE>rt.c</CODE> contains routines for calculating the routing table. <CODE>lsalib.c</CODE>
! 781: is a set of various functions for working with the LSAs (endianity
! 782: conversions, calculation of checksum etc.).
! 783: <P>One instance of the protocol is able to hold LSA databases for multiple OSPF
! 784: areas, to exchange routing information between multiple neighbors and to
! 785: calculate the routing tables. The core structure is <I>ospf_proto</I> to which
! 786: multiple <I>ospf_area</I> and <I>ospf_iface</I> structures are connected. <I>ospf_proto</I> is
! 787: also connected to <I>top_hash_graph</I> which is a dynamic hashing structure that
! 788: describes the link-state database. It allows fast search, addition and
! 789: deletion. Each LSA is kept in two pieces: header and body. Both of them are
! 790: kept in the endianity of the CPU.
! 791: <P>In OSPFv2 specification, it is implied that there is one IP prefix for each
! 792: physical network/interface (unless it is an ptp link). But in modern systems,
! 793: there might be more independent IP prefixes associated with an interface. To
! 794: handle this situation, we have one <I>ospf_iface</I> for each active IP prefix
! 795: (instead for each active iface); This behaves like virtual interface for the
! 796: purpose of OSPF. If we receive packet, we associate it with a proper virtual
! 797: interface mainly according to its source address.
! 798: <P>OSPF keeps one socket per <I>ospf_iface</I>. This allows us (compared to one socket
! 799: approach) to evade problems with a limit of multicast groups per socket and
! 800: with sending multicast packets to appropriate interface in a portable way.
! 801: The socket is associated with underlying physical iface and should not
! 802: receive packets received on other ifaces (unfortunately, this is not true on
! 803: BSD). Generally, one packet can be received by more sockets (for example, if
! 804: there are more <I>ospf_iface</I> on one physical iface), therefore we explicitly
! 805: filter received packets according to src/dst IP address and received iface.
! 806: <P>Vlinks are implemented using particularly degenerate form of <I>ospf_iface</I>,
! 807: which has several exceptions: it does not have its iface or socket (it copies
! 808: these from 'parent' <I>ospf_iface</I>) and it is present in iface list even when
! 809: down (it is not freed in <B>ospf_iface_down()</B>).
! 810: <P>The heart beat of ospf is <B>ospf_disp()</B>. It is called at regular intervals
! 811: (<I>ospf_proto</I>->tick). It is responsible for aging and flushing of LSAs in the
! 812: database, updating topology information in LSAs and for routing table
! 813: calculation.
! 814: <P>To every <I>ospf_iface</I>, we connect one or more <I>ospf_neighbor</I>'s -- a structure
! 815: containing many timers and queues for building adjacency and for exchange of
! 816: routing messages.
! 817: <P>BIRD's OSPF implementation respects RFC2328 in every detail, but some of
! 818: internal algorithms do differ. The RFC recommends making a snapshot of the
! 819: link-state database when a new adjacency is forming and sending the database
! 820: description packets based on the information in this snapshot. The database
! 821: can be quite large in some networks, so rather we walk through a <I>slist</I>
! 822: structure which allows us to continue even if the actual LSA we were working
! 823: with is deleted. New LSAs are added at the tail of this <I>slist</I>.
! 824: <P>We also do not keep a separate OSPF routing table, because the core helps us
! 825: by being able to recognize when a route is updated to an identical one and it
! 826: suppresses the update automatically. Due to this, we can flush all the routes
! 827: we have recalculated and also those we have deleted to the core's routing
! 828: table and the core will take care of the rest. This simplifies the process
! 829: and conserves memory.
! 830: <P>Supported standards:
! 831: - RFC 2328 - main OSPFv2 standard
! 832: - RFC 5340 - main OSPFv3 standard
! 833: - RFC 3101 - OSPFv2 NSSA areas
! 834: - RFC 6549 - OSPFv2 multi-instance extensions
! 835: - RFC 6987 - OSPF stub router advertisement
! 836: <P>
! 837: <P><HR><H3>Function</H3>
! 838: <P><I>void</I>
! 839: <B>ospf_disp</B>
! 840: (<I>timer *</I> <B>timer</B>) -- invokes routing table calculation, aging and also <B>area_disp()</B>
! 841: <P>
! 842: <H3>Arguments</H3>
! 843: <P>
! 844: <DL>
! 845: <DT><I>timer *</I> <B>timer</B><DD><P>timer usually called every <B>ospf_proto</B>->tick second, <B>timer</B>->data
! 846: point to <B>ospf_proto</B>
! 847: </DL>
! 848:
! 849:
! 850: <HR><H3>Function</H3>
! 851: <P><I>int</I>
! 852: <B>ospf_import_control</B>
! 853: (<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
! 854: <P>
! 855: <H3>Arguments</H3>
! 856: <P>
! 857: <DL>
! 858: <DT><I>struct proto *</I> <B>P</B><DD><P>OSPF protocol instance
! 859: <DT><I>rte **</I> <B>new</B><DD><P>the new route
! 860: <DT><I>ea_list **</I> <B>attrs</B><DD><P>list of attributes
! 861: <DT><I>struct linpool *</I> <B>pool</B><DD><P>pool for allocation of attributes
! 862: </DL>
! 863: <H3>Description</H3>
! 864: <P>Its quite simple. It does not accept our own routes and leaves the decision on
! 865: import to the filters.
! 866:
! 867:
! 868: <HR><H3>Function</H3>
! 869: <P><I>int</I>
! 870: <B>ospf_shutdown</B>
! 871: (<I>struct proto *</I> <B>P</B>) -- Finish of OSPF instance
! 872: <P>
! 873: <H3>Arguments</H3>
! 874: <P>
! 875: <DL>
! 876: <DT><I>struct proto *</I> <B>P</B><DD><P>OSPF protocol instance
! 877: </DL>
! 878: <H3>Description</H3>
! 879: <P>RFC does not define any action that should be taken before router
! 880: shutdown. To make my neighbors react as fast as possible, I send
! 881: them hello packet with empty neighbor list. They should start
! 882: their neighbor state machine with event <I>NEIGHBOR_1WAY</I>.
! 883:
! 884:
! 885: <HR><H3>Function</H3>
! 886: <P><I>int</I>
! 887: <B>ospf_reconfigure</B>
! 888: (<I>struct proto *</I> <B>P</B>, <I>struct proto_config *</I> <B>c</B>) -- reconfiguration hook
! 889: <P>
! 890: <H3>Arguments</H3>
! 891: <P>
! 892: <DL>
! 893: <DT><I>struct proto *</I> <B>P</B><DD><P>current instance of protocol (with old configuration)
! 894: <DT><I>struct proto_config *</I> <B>c</B><DD><P>new configuration requested by user
! 895: </DL>
! 896: <H3>Description</H3>
! 897: <P>This hook tries to be a little bit intelligent. Instance of OSPF
! 898: will survive change of many constants like hello interval,
! 899: password change, addition or deletion of some neighbor on
! 900: nonbroadcast network, cost of interface, etc.
! 901:
! 902:
! 903: <HR><H3>Function</H3>
! 904: <P><I>struct top_hash_entry *</I>
! 905: <B>ospf_install_lsa</B>
! 906: (<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
! 907: <P>
! 908: <H3>Arguments</H3>
! 909: <P>
! 910: <DL>
! 911: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
! 912: <DT><I>struct ospf_lsa_header *</I> <B>lsa</B><DD><P>LSA header
! 913: <DT><I>u32</I> <B>type</B><DD><P>type of LSA
! 914: <DT><I>u32</I> <B>domain</B><DD><P>domain of LSA
! 915: <DT><I>void *</I> <B>body</B><DD><P>pointer to LSA body
! 916: </DL>
! 917: <H3>Description</H3>
! 918: <P>This function ensures installing new LSA received in LS update into LSA
! 919: database. Old instance is replaced. Several actions are taken to detect if
! 920: new routing table calculation is necessary. This is described in 13.2 of RFC
! 921: 2328. This function is for received LSA only, locally originated LSAs are
! 922: installed by <B>ospf_originate_lsa()</B>.
! 923: <P>The LSA body in <B>body</B> is expected to be mb_allocated by the caller and its
! 924: ownership is transferred to the LSA entry structure.
! 925:
! 926:
! 927: <HR><H3>Function</H3>
! 928: <P><I>void</I>
! 929: <B>ospf_advance_lsa</B>
! 930: (<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
! 931: <P>
! 932: <H3>Arguments</H3>
! 933: <P>
! 934: <DL>
! 935: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
! 936: <DT><I>struct top_hash_entry *</I> <B>en</B><DD><P>current LSA entry or NULL
! 937: <DT><I>struct ospf_lsa_header *</I> <B>lsa</B><DD><P>new LSA header
! 938: <DT><I>u32</I> <B>type</B><DD><P>type of LSA
! 939: <DT><I>u32</I> <B>domain</B><DD><P>domain of LSA
! 940: <DT><I>void *</I> <B>body</B><DD><P>pointer to LSA body
! 941: </DL>
! 942: <H3>Description</H3>
! 943: <P>This function handles received unexpected self-originated LSA (<B>lsa</B>, <B>body</B>)
! 944: by either advancing sequence number of the local LSA instance (<B>en</B>) and
! 945: propagating it, or installing the received LSA and immediately flushing it
! 946: (if there is no local LSA; i.e., <B>en</B> is NULL or MaxAge).
! 947: <P>The LSA body in <B>body</B> is expected to be mb_allocated by the caller and its
! 948: ownership is transferred to the LSA entry structure or it is freed.
! 949:
! 950:
! 951: <HR><H3>Function</H3>
! 952: <P><I>struct top_hash_entry *</I>
! 953: <B>ospf_originate_lsa</B>
! 954: (<I>struct ospf_proto *</I> <B>p</B>, <I>struct ospf_new_lsa *</I> <B>lsa</B>) -- originate new LSA
! 955: <P>
! 956: <H3>Arguments</H3>
! 957: <P>
! 958: <DL>
! 959: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
! 960: <DT><I>struct ospf_new_lsa *</I> <B>lsa</B><DD><P>New LSA specification
! 961: </DL>
! 962: <H3>Description</H3>
! 963: <P>This function prepares a new LSA, installs it into the LSA database and
! 964: floods it. If the new LSA cannot be originated now (because the old instance
! 965: was originated within MinLSInterval, or because the LSA seqnum is currently
! 966: wrapping), the origination is instead scheduled for later. If the new LSA is
! 967: equivalent to the current LSA, the origination is skipped. In all cases, the
! 968: corresponding LSA entry is returned. The new LSA is based on the LSA
! 969: specification (<B>lsa</B>) and the LSA body from lsab buffer of <B>p</B>, which is
! 970: emptied after the call. The opposite of this function is <B>ospf_flush_lsa()</B>.
! 971:
! 972:
! 973: <HR><H3>Function</H3>
! 974: <P><I>void</I>
! 975: <B>ospf_flush_lsa</B>
! 976: (<I>struct ospf_proto *</I> <B>p</B>, <I>struct top_hash_entry *</I> <B>en</B>) -- flush LSA from OSPF domain
! 977: <P>
! 978: <H3>Arguments</H3>
! 979: <P>
! 980: <DL>
! 981: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
! 982: <DT><I>struct top_hash_entry *</I> <B>en</B><DD><P>LSA entry to flush
! 983: </DL>
! 984: <H3>Description</H3>
! 985: <P>This function flushes <B>en</B> from the OSPF domain by setting its age to
! 986: <I>LSA_MAXAGE</I> and flooding it. That also triggers subsequent events in LSA
! 987: lifecycle leading to removal of the LSA from the LSA database (e.g. the LSA
! 988: content is freed when flushing is acknowledged by neighbors). The function
! 989: does nothing if the LSA is already being flushed. LSA entries are not
! 990: immediately removed when being flushed, the caller may assume that <B>en</B> still
! 991: exists after the call. The function is the opposite of <B>ospf_originate_lsa()</B>
! 992: and is supposed to do the right thing even in cases of postponed
! 993: origination.
! 994:
! 995:
! 996: <HR><H3>Function</H3>
! 997: <P><I>void</I>
! 998: <B>ospf_update_lsadb</B>
! 999: (<I>struct ospf_proto *</I> <B>p</B>) -- update LSA database
! 1000: <P>
! 1001: <H3>Arguments</H3>
! 1002: <P>
! 1003: <DL>
! 1004: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
! 1005: </DL>
! 1006: <H3>Description</H3>
! 1007: <P>This function is periodicaly invoked from <B>ospf_disp()</B>. It does some periodic
! 1008: or postponed processing related to LSA entries. It originates postponed LSAs
! 1009: scheduled by <B>ospf_originate_lsa()</B>, It continues in flushing processes started
! 1010: by <B>ospf_flush_lsa()</B>. It also periodically refreshs locally originated LSAs --
! 1011: when the current instance is older <I>LSREFRESHTIME</I>, a new instance is originated.
! 1012: Finally, it also ages stored LSAs and flushes ones that reached <I>LSA_MAXAGE</I>.
! 1013: <P>The RFC 2328 says that a router should periodically check checksums of all
! 1014: stored LSAs to detect hardware problems. This is not implemented.
! 1015:
! 1016:
! 1017: <HR><H3>Function</H3>
! 1018: <P><I>void</I>
! 1019: <B>ospf_originate_ext_lsa</B>
! 1020: (<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
! 1021: <P>
! 1022: <H3>Arguments</H3>
! 1023: <P>
! 1024: <DL>
! 1025: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
! 1026: <DT><I>struct ospf_area *</I> <B>oa</B><DD><P>ospf_area for which LSA is originated
! 1027: <DT><I>ort *</I> <B>nf</B><DD><P>network prefix and mask
! 1028: <DT><I>u8</I> <B>mode</B><DD><P>the mode of the LSA (LSA_M_EXPORT or LSA_M_RTCALC)
! 1029: <DT><I>u32</I> <B>metric</B><DD><P>the metric of a route
! 1030: <DT><I>u32</I> <B>ebit</B><DD><P>E-bit for route metric (bool)
! 1031: <DT><I>ip_addr</I> <B>fwaddr</B><DD><P>the forwarding address
! 1032: <DT><I>u32</I> <B>tag</B><DD><P>the route tag
! 1033: <DT><I>int</I> <B>pbit</B><DD><P>P-bit for NSSA LSAs (bool), ignored for external LSAs
! 1034: </DL>
! 1035: <H3>Description</H3>
! 1036: <P>If I receive a message that new route is installed, I try to originate an
! 1037: external LSA. If <B>oa</B> is an NSSA area, NSSA-LSA is originated instead.
! 1038: <B>oa</B> should not be a stub area. <B>src</B> does not specify whether the LSA
! 1039: is external or NSSA, but it specifies the source of origination -
! 1040: the export from <B>ospf_rt_notify()</B>, or the NSSA-EXT translation.
! 1041:
! 1042:
! 1043: <HR><H3>Function</H3>
! 1044: <P><I>struct top_graph *</I>
! 1045: <B>ospf_top_new</B>
! 1046: (<I>struct ospf_proto *p UNUSED4</I> <B>UNUSED6</B>, <I>pool *</I> <B>pool</B>) -- allocated new topology database
! 1047: <P>
! 1048: <H3>Arguments</H3>
! 1049: <P>
! 1050: <DL>
! 1051: <DT><I>struct ospf_proto *p UNUSED4</I> <B>UNUSED6</B><DD><P>-- undescribed --
! 1052: <DT><I>pool *</I> <B>pool</B><DD><P>pool for allocation
! 1053: </DL>
! 1054: <H3>Description</H3>
! 1055: <P>This dynamically hashed structure is used for keeping LSAs. Mainly it is used
! 1056: for the LSA database of the OSPF protocol, but also for LSA retransmission
! 1057: and request lists of OSPF neighbors.
! 1058:
! 1059:
! 1060: <HR><H3>Function</H3>
! 1061: <P><I>void</I>
! 1062: <B>ospf_neigh_chstate</B>
! 1063: (<I>struct ospf_neighbor *</I> <B>n</B>, <I>u8</I> <B>state</B>) -- handles changes related to new or lod state of neighbor
! 1064: <P>
! 1065: <H3>Arguments</H3>
! 1066: <P>
! 1067: <DL>
! 1068: <DT><I>struct ospf_neighbor *</I> <B>n</B><DD><P>OSPF neighbor
! 1069: <DT><I>u8</I> <B>state</B><DD><P>new state
! 1070: </DL>
! 1071: <H3>Description</H3>
! 1072: <P>Many actions have to be taken acording to a change of state of a neighbor. It
! 1073: starts rxmt timers, call interface state machine etc.
! 1074:
! 1075:
! 1076: <HR><H3>Function</H3>
! 1077: <P><I>void</I>
! 1078: <B>ospf_neigh_sm</B>
! 1079: (<I>struct ospf_neighbor *</I> <B>n</B>, <I>int</I> <B>event</B>) -- ospf neighbor state machine
! 1080: <P>
! 1081: <H3>Arguments</H3>
! 1082: <P>
! 1083: <DL>
! 1084: <DT><I>struct ospf_neighbor *</I> <B>n</B><DD><P>neighor
! 1085: <DT><I>int</I> <B>event</B><DD><P>actual event
! 1086: </DL>
! 1087: <H3>Description</H3>
! 1088: <P>This part implements the neighbor state machine as described in 10.3 of
! 1089: RFC 2328. The only difference is that state <I>NEIGHBOR_ATTEMPT</I> is not
! 1090: used. We discover neighbors on nonbroadcast networks in the
! 1091: same way as on broadcast networks. The only difference is in
! 1092: sending hello packets. These are sent to IPs listed in
! 1093: <B>ospf_iface</B>->nbma_list .
! 1094:
! 1095:
! 1096: <HR><H3>Function</H3>
! 1097: <P><I>void</I>
! 1098: <B>ospf_dr_election</B>
! 1099: (<I>struct ospf_iface *</I> <B>ifa</B>) -- (Backup) Designed Router election
! 1100: <P>
! 1101: <H3>Arguments</H3>
! 1102: <P>
! 1103: <DL>
! 1104: <DT><I>struct ospf_iface *</I> <B>ifa</B><DD><P>actual interface
! 1105: </DL>
! 1106: <H3>Description</H3>
! 1107: <P>When the wait timer fires, it is time to elect (Backup) Designated Router.
! 1108: Structure describing me is added to this list so every electing router has
! 1109: the same list. Backup Designated Router is elected before Designated
! 1110: Router. This process is described in 9.4 of RFC 2328. The function is
! 1111: supposed to be called only from <B>ospf_iface_sm()</B> as a part of the interface
! 1112: state machine.
! 1113:
! 1114:
! 1115: <HR><H3>Function</H3>
! 1116: <P><I>void</I>
! 1117: <B>ospf_iface_chstate</B>
! 1118: (<I>struct ospf_iface *</I> <B>ifa</B>, <I>u8</I> <B>state</B>) -- handle changes of interface state
! 1119: <P>
! 1120: <H3>Arguments</H3>
! 1121: <P>
! 1122: <DL>
! 1123: <DT><I>struct ospf_iface *</I> <B>ifa</B><DD><P>OSPF interface
! 1124: <DT><I>u8</I> <B>state</B><DD><P>new state
! 1125: </DL>
! 1126: <H3>Description</H3>
! 1127: <P>Many actions must be taken according to interface state changes. New network
! 1128: LSAs must be originated, flushed, new multicast sockets to listen for messages for
! 1129: <I>ALLDROUTERS</I> have to be opened, etc.
! 1130:
! 1131:
! 1132: <HR><H3>Function</H3>
! 1133: <P><I>void</I>
! 1134: <B>ospf_iface_sm</B>
! 1135: (<I>struct ospf_iface *</I> <B>ifa</B>, <I>int</I> <B>event</B>) -- OSPF interface state machine
! 1136: <P>
! 1137: <H3>Arguments</H3>
! 1138: <P>
! 1139: <DL>
! 1140: <DT><I>struct ospf_iface *</I> <B>ifa</B><DD><P>OSPF interface
! 1141: <DT><I>int</I> <B>event</B><DD><P>event comming to state machine
! 1142: </DL>
! 1143: <H3>Description</H3>
! 1144: <P>This fully respects 9.3 of RFC 2328 except we have slightly
! 1145: different handling of <I>DOWN</I> and <I>LOOP</I> state. We remove intefaces
! 1146: that are <I>DOWN</I>. <I>DOWN</I> state is used when an interface is waiting
! 1147: for a lock. <I>LOOP</I> state is used when an interface does not have a
! 1148: link.
! 1149:
! 1150:
! 1151: <HR><H3>Function</H3>
! 1152: <P><I>int</I>
! 1153: <B>ospf_rx_hook</B>
! 1154: (<I>sock *</I> <B>sk</B>, <I>uint</I> <B>len</B>)
! 1155: <H3>Arguments</H3>
! 1156: <P>
! 1157: <DL>
! 1158: <DT><I>sock *</I> <B>sk</B><DD><P>socket we received the packet.
! 1159: <DT><I>uint</I> <B>len</B><DD><P>size of the packet
! 1160: </DL>
! 1161: <H3>Description</H3>
! 1162: <P>This is the entry point for messages from neighbors. Many checks (like
! 1163: authentication, checksums, size) are done before the packet is passed to
! 1164: non generic functions.
! 1165:
! 1166:
! 1167: <HR><H3>Function</H3>
! 1168: <P><I>int</I>
! 1169: <B>lsa_validate</B>
! 1170: (<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
! 1171: <P>
! 1172: <H3>Arguments</H3>
! 1173: <P>
! 1174: <DL>
! 1175: <DT><I>struct ospf_lsa_header *</I> <B>lsa</B><DD><P>LSA header
! 1176: <DT><I>u32</I> <B>lsa_type</B><DD><P>one of <I>LSA_T_xxx</I>
! 1177: <DT><I>int</I> <B>ospf2</B><DD><P><I>true</I> means OSPF version 2, <I>false</I> means OSPF version 3
! 1178: <DT><I>void *</I> <B>body</B><DD><P>pointer to LSA body
! 1179: </DL>
! 1180: <H3>Description</H3>
! 1181: <P>Checks internal structure of given LSA body (minimal length,
! 1182: consistency). Returns true if valid.
! 1183:
! 1184:
! 1185: <HR><H3>Function</H3>
! 1186: <P><I>void</I>
! 1187: <B>ospf_send_dbdes</B>
! 1188: (<I>struct ospf_proto *</I> <B>p</B>, <I>struct ospf_neighbor *</I> <B>n</B>) -- transmit database description packet
! 1189: <P>
! 1190: <H3>Arguments</H3>
! 1191: <P>
! 1192: <DL>
! 1193: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
! 1194: <DT><I>struct ospf_neighbor *</I> <B>n</B><DD><P>neighbor
! 1195: </DL>
! 1196: <H3>Description</H3>
! 1197: <P>Sending of a database description packet is described in 10.8 of RFC 2328.
! 1198: Reception of each packet is acknowledged in the sequence number of another.
! 1199: When I send a packet to a neighbor I keep a copy in a buffer. If the neighbor
! 1200: does not reply, I don't create a new packet but just send the content
! 1201: of the buffer.
! 1202:
! 1203:
! 1204: <HR><H3>Function</H3>
! 1205: <P><I>void</I>
! 1206: <B>ospf_rt_spf</B>
! 1207: (<I>struct ospf_proto *</I> <B>p</B>) -- calculate internal routes
! 1208: <P>
! 1209: <H3>Arguments</H3>
! 1210: <P>
! 1211: <DL>
! 1212: <DT><I>struct ospf_proto *</I> <B>p</B><DD><P>OSPF protocol instance
! 1213: </DL>
! 1214: <H3>Description</H3>
! 1215: <P>Calculation of internal paths in an area is described in 16.1 of RFC 2328.
! 1216: It's based on Dijkstra's shortest path tree algorithms.
! 1217: This function is invoked from <B>ospf_disp()</B>.
! 1218:
! 1219: <H2><A NAME="ss5.5">5.5</A> <A HREF="prog.html#toc5.5">Pipe</A>
! 1220: </H2>
! 1221:
! 1222: <P>
! 1223: <P>The Pipe protocol is very simple. It just connects to two routing tables
! 1224: using <B>proto_add_announce_hook()</B> and whenever it receives a <B>rt_notify()</B>
! 1225: about a change in one of the tables, it converts it to a <B>rte_update()</B>
! 1226: in the other one.
! 1227: <P>To avoid pipe loops, Pipe keeps a `being updated' flag in each routing
! 1228: table.
! 1229: <P>A pipe has two announce hooks, the first connected to the main
! 1230: table, the second connected to the peer table. When a new route is
! 1231: announced on the main table, it gets checked by an export filter in
! 1232: ahook 1, and, after that, it is announced to the peer table via
! 1233: <B>rte_update()</B>, an import filter in ahook 2 is called. When a new
! 1234: route is announced in the peer table, an export filter in ahook2
! 1235: and an import filter in ahook 1 are used. Oviously, there is no
! 1236: need in filtering the same route twice, so both import filters are
! 1237: set to accept, while user configured 'import' and 'export' filters
! 1238: are used as export filters in ahooks 2 and 1. Route limits are
! 1239: handled similarly, but on the import side of ahooks.
! 1240: <P>
! 1241: <P>
! 1242: <H2><A NAME="ss5.6">5.6</A> <A HREF="prog.html#toc5.6">Routing Information Protocol (RIP)</A>
! 1243: </H2>
! 1244:
! 1245: <P>
! 1246: <P>The RIP protocol is implemented in two files: <CODE>rip.c</CODE> containing the protocol
! 1247: logic, route management and the protocol glue with BIRD core, and <CODE>packets.c</CODE>
! 1248: handling RIP packet processing, RX, TX and protocol sockets.
! 1249: <P>Each instance of RIP is described by a structure <I>rip_proto</I>, which contains
! 1250: an internal RIP routing table, a list of protocol interfaces and the main
! 1251: timer responsible for RIP routing table cleanup.
! 1252: <P>RIP internal routing table contains incoming and outgoing routes. For each
! 1253: network (represented by structure <I>rip_entry</I>) there is one outgoing route
! 1254: stored directly in <I>rip_entry</I> and an one-way linked list of incoming routes
! 1255: (structures <I>rip_rte</I>). The list contains incoming routes from different RIP
! 1256: neighbors, but only routes with the lowest metric are stored (i.e., all
! 1257: stored incoming routes have the same metric).
! 1258: <P>Note that RIP itself does not select outgoing route, that is done by the core
! 1259: routing table. When a new incoming route is received, it is propagated to the
! 1260: RIP table by <B>rip_update_rte()</B> and possibly stored in the list of incoming
! 1261: routes. Then the change may be propagated to the core by <B>rip_announce_rte()</B>.
! 1262: The core selects the best route and propagate it to RIP by <B>rip_rt_notify()</B>,
! 1263: which updates outgoing route part of <I>rip_entry</I> and possibly triggers route
! 1264: propagation by <B>rip_trigger_update()</B>.
! 1265: <P>RIP interfaces are represented by structures <I>rip_iface</I>. A RIP interface
! 1266: contains a per-interface socket, a list of associated neighbors, interface
! 1267: configuration, and state information related to scheduled interface events
! 1268: and running update sessions. RIP interfaces are added and removed based on
! 1269: core interface notifications.
! 1270: <P>There are two RIP interface events - regular updates and triggered updates.
! 1271: Both are managed from the RIP interface timer (<B>rip_iface_timer()</B>). Regular
! 1272: updates are called at fixed interval and propagate the whole routing table,
! 1273: while triggered updates are scheduled by <B>rip_trigger_update()</B> due to some
! 1274: routing table change and propagate only the routes modified since the time
! 1275: they were scheduled. There are also unicast-destined requested updates, but
! 1276: these are sent directly as a reaction to received RIP request message. The
! 1277: update session is started by <B>rip_send_table()</B>. There may be at most one
! 1278: active update session per interface, as the associated state (including the
! 1279: fib iterator) is stored directly in <I>rip_iface</I> structure.
! 1280: <P>RIP neighbors are represented by structures <I>rip_neighbor</I>. Compared to
! 1281: neighbor handling in other routing protocols, RIP does not have explicit
! 1282: neighbor discovery and adjacency maintenance, which makes the <I>rip_neighbor</I>
! 1283: related code a bit peculiar. RIP neighbors are interlinked with core neighbor
! 1284: structures (<I>neighbor</I>) and use core neighbor notifications to ensure that RIP
! 1285: neighbors are timely removed. RIP neighbors are added based on received route
! 1286: notifications and removed based on core neighbor and RIP interface events.
! 1287: <P>RIP neighbors are linked by RIP routes and use counter to track the number of
! 1288: associated routes, but when these RIP routes timeout, associated RIP neighbor
! 1289: is still alive (with zero counter). When RIP neighbor is removed but still
! 1290: has some associated routes, it is not freed, just changed to detached state
! 1291: (core neighbors and RIP ifaces are unlinked), then during the main timer
! 1292: cleanup phase the associated routes are removed and the <I>rip_neighbor</I>
! 1293: structure is finally freed.
! 1294: <P>Supported standards:
! 1295: - RFC 1058 - RIPv1
! 1296: - RFC 2453 - RIPv2
! 1297: - RFC 2080 - RIPng
! 1298: - RFC 4822 - RIP cryptographic authentication
! 1299: <P>
! 1300: <P><HR><H3>Function</H3>
! 1301: <P><I>void</I>
! 1302: <B>rip_announce_rte</B>
! 1303: (<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
! 1304: <P>
! 1305: <H3>Arguments</H3>
! 1306: <P>
! 1307: <DL>
! 1308: <DT><I>struct rip_proto *</I> <B>p</B><DD><P>RIP instance
! 1309: <DT><I>struct rip_entry *</I> <B>en</B><DD><P>related network
! 1310: </DL>
! 1311: <H3>Description</H3>
! 1312: <P>The function takes a list of incoming routes from <B>en</B>, prepare appropriate
! 1313: <I>rte</I> for the core and propagate it by <B>rte_update()</B>.
! 1314:
! 1315:
! 1316: <HR><H3>Function</H3>
! 1317: <P><I>void</I>
! 1318: <B>rip_update_rte</B>
! 1319: (<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
! 1320: <P>
! 1321: <H3>Arguments</H3>
! 1322: <P>
! 1323: <DL>
! 1324: <DT><I>struct rip_proto *</I> <B>p</B><DD><P>RIP instance
! 1325: <DT><I>ip_addr *</I> <B>prefix</B><DD><P>network prefix
! 1326: <DT><I>int</I> <B>pxlen</B><DD><P>network prefix length
! 1327: <DT><I>struct rip_rte *</I> <B>new</B><DD><P>a <I>rip_rte</I> representing the new route
! 1328: </DL>
! 1329: <H3>Description</H3>
! 1330: <P>The function is called by the RIP packet processing code whenever it receives
! 1331: a reachable route. The appropriate routing table entry is found and the list
! 1332: of incoming routes is updated. Eventually, the change is also propagated to
! 1333: the core by <B>rip_announce_rte()</B>. Note that for unreachable routes,
! 1334: <B>rip_withdraw_rte()</B> should be called instead of <B>rip_update_rte()</B>.
! 1335:
! 1336:
! 1337: <HR><H3>Function</H3>
! 1338: <P><I>void</I>
! 1339: <B>rip_withdraw_rte</B>
! 1340: (<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
! 1341: <P>
! 1342: <H3>Arguments</H3>
! 1343: <P>
! 1344: <DL>
! 1345: <DT><I>struct rip_proto *</I> <B>p</B><DD><P>RIP instance
! 1346: <DT><I>ip_addr *</I> <B>prefix</B><DD><P>network prefix
! 1347: <DT><I>int</I> <B>pxlen</B><DD><P>network prefix length
! 1348: <DT><I>struct rip_neighbor *</I> <B>from</B><DD><P>a <I>rip_neighbor</I> propagating the withdraw
! 1349: </DL>
! 1350: <H3>Description</H3>
! 1351: <P>The function is called by the RIP packet processing code whenever it receives
! 1352: an unreachable route. The incoming route for given network from nbr <B>from</B> is
! 1353: removed. Eventually, the change is also propagated by <B>rip_announce_rte()</B>.
! 1354:
! 1355:
! 1356: <HR><H3>Function</H3>
! 1357: <P><I>void</I>
! 1358: <B>rip_timer</B>
! 1359: (<I>timer *</I> <B>t</B>) -- RIP main timer hook
! 1360: <P>
! 1361: <H3>Arguments</H3>
! 1362: <P>
! 1363: <DL>
! 1364: <DT><I>timer *</I> <B>t</B><DD><P>timer
! 1365: </DL>
! 1366: <H3>Description</H3>
! 1367: <P>The RIP main timer is responsible for routing table maintenance. Invalid or
! 1368: expired routes (<I>rip_rte</I>) are removed and garbage collection of stale routing
! 1369: table entries (<I>rip_entry</I>) is done. Changes are propagated to core tables,
! 1370: route reload is also done here. Note that garbage collection uses a maximal
! 1371: GC time, while interfaces maintain an illusion of per-interface GC times in
! 1372: <B>rip_send_response()</B>.
! 1373: <P>Keeping incoming routes and the selected outgoing route are two independent
! 1374: functions, therefore after garbage collection some entries now considered
! 1375: invalid (RIP_ENTRY_DUMMY) still may have non-empty list of incoming routes,
! 1376: while some valid entries (representing an outgoing route) may have that list
! 1377: empty.
! 1378: <P>The main timer is not scheduled periodically but it uses the time of the
! 1379: current next event and the minimal interval of any possible event to compute
! 1380: the time of the next run.
! 1381:
! 1382:
! 1383: <HR><H3>Function</H3>
! 1384: <P><I>void</I>
! 1385: <B>rip_iface_timer</B>
! 1386: (<I>timer *</I> <B>t</B>) -- RIP interface timer hook
! 1387: <P>
! 1388: <H3>Arguments</H3>
! 1389: <P>
! 1390: <DL>
! 1391: <DT><I>timer *</I> <B>t</B><DD><P>timer
! 1392: </DL>
! 1393: <H3>Description</H3>
! 1394: <P>RIP interface timers are responsible for scheduling both regular and
! 1395: triggered updates. Fixed, delay-independent period is used for regular
! 1396: updates, while minimal separating interval is enforced for triggered updates.
! 1397: The function also ensures that a new update is not started when the old one
! 1398: is still running.
! 1399:
! 1400:
! 1401: <HR><H3>Function</H3>
! 1402: <P><I>void</I>
! 1403: <B>rip_send_table</B>
! 1404: (<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
! 1405: <P>
! 1406: <H3>Arguments</H3>
! 1407: <P>
! 1408: <DL>
! 1409: <DT><I>struct rip_proto *</I> <B>p</B><DD><P>RIP instance
! 1410: <DT><I>struct rip_iface *</I> <B>ifa</B><DD><P>RIP interface
! 1411: <DT><I>ip_addr</I> <B>addr</B><DD><P>destination IP address
! 1412: <DT><I>bird_clock_t</I> <B>changed</B><DD><P>time limit for triggered updates
! 1413: </DL>
! 1414: <H3>Description</H3>
! 1415: <P>The function activates an update session and starts sending routing update
! 1416: packets (using <B>rip_send_response()</B>). The session may be finished during the
! 1417: call or may continue in <B>rip_tx_hook()</B> until all appropriate routes are
! 1418: transmitted. Note that there may be at most one active update session per
! 1419: interface, the function will terminate the old active session before
! 1420: activating the new one.
! 1421:
! 1422: <H2><A NAME="ss5.7">5.7</A> <A HREF="prog.html#toc5.7">Router Advertisements</A>
! 1423: </H2>
! 1424:
! 1425: <P>
! 1426: <P>The RAdv protocol is implemented in two files: <CODE>radv.c</CODE> containing
! 1427: the interface with BIRD core and the protocol logic and <CODE>packets.c</CODE>
! 1428: handling low level protocol stuff (RX, TX and packet formats).
! 1429: The protocol does not export any routes.
! 1430: <P>The RAdv is structured in the usual way - for each handled interface
! 1431: there is a structure <I>radv_iface</I> that contains a state related to
! 1432: that interface together with its resources (a socket, a timer).
! 1433: There is also a prepared RA stored in a TX buffer of the socket
! 1434: associated with an iface. These iface structures are created
! 1435: and removed according to iface events from BIRD core handled by
! 1436: <B>radv_if_notify()</B> callback.
! 1437: <P>The main logic of RAdv consists of two functions:
! 1438: <B>radv_iface_notify()</B>, which processes asynchronous events (specified
! 1439: by RA_EV_* codes), and <B>radv_timer()</B>, which triggers sending RAs and
! 1440: computes the next timeout.
! 1441: <P>The RAdv protocol could receive routes (through
! 1442: <B>radv_import_control()</B> and <B>radv_rt_notify()</B>), but only the
! 1443: configured trigger route is tracked (in <I>active</I> var). When a radv
! 1444: protocol is reconfigured, the connected routing table is examined
! 1445: (in <B>radv_check_active()</B>) to have proper <I>active</I> value in case of
! 1446: the specified trigger prefix was changed.
! 1447: <P>Supported standards:
! 1448: - RFC 4861 - main RA standard
! 1449: - RFC 6106 - DNS extensions (RDDNS, DNSSL)
! 1450: - RFC 4191 (partial) - Default Router Preference
! 1451: <P>
! 1452: <P>
! 1453: <H2><A NAME="ss5.8">5.8</A> <A HREF="prog.html#toc5.8">Static</A>
! 1454: </H2>
! 1455:
! 1456: <P>
! 1457: <P>The Static protocol is implemented in a straightforward way. It keeps
! 1458: two lists of static routes: one containing interface routes and one
! 1459: holding the remaining ones. Interface routes are inserted and removed according
! 1460: to interface events received from the core via the <B>if_notify()</B> hook. Routes
! 1461: pointing to a neighboring router use a sticky node in the neighbor cache
! 1462: to be notified about gaining or losing the neighbor. Special
! 1463: routes like black holes or rejects are inserted all the time.
! 1464: <P>Multipath routes are tricky. Because these routes depends on
! 1465: several neighbors we need to integrate that to the neighbor
! 1466: notification handling, we use dummy static_route nodes, one for
! 1467: each nexthop. Therefore, a multipath route consists of a master
! 1468: static_route node (of dest RTD_MULTIPATH), which specifies prefix
! 1469: and is used in most circumstances, and a list of dummy static_route
! 1470: nodes (of dest RTD_NONE), which stores info about nexthops and are
! 1471: connected to neighbor entries and neighbor notifications. Dummy
! 1472: nodes are chained using mp_next, they aren't in other_routes list,
! 1473: and abuse some fields (masklen, if_name) for other purposes.
! 1474: <P>The only other thing worth mentioning is that when asked for reconfiguration,
! 1475: Static not only compares the two configurations, but it also calculates
! 1476: difference between the lists of static routes and it just inserts the
! 1477: newly added routes and removes the obsolete ones.
! 1478: <P>
! 1479: <P>
! 1480: <H2><A NAME="ss5.9">5.9</A> <A HREF="prog.html#toc5.9">Direct</A>
! 1481: </H2>
! 1482:
! 1483: <P>
! 1484: <P>The Direct protocol works by converting all <B>ifa_notify()</B> events it receives
! 1485: to <B>rte_update()</B> calls for the corresponding network.
! 1486: <P>
! 1487: <P>
! 1488: <P>
! 1489: <HR>
! 1490: <A HREF="prog-6.html">Next</A>
! 1491: <A HREF="prog-4.html">Previous</A>
! 1492: <A HREF="prog.html#toc5">Contents</A>
! 1493: </BODY>
! 1494: </HTML>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>