Annotation of embedaddon/bird/doc/prog-5.html, revision 1.1.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>