Annotation of embedaddon/bird2/doc/prog.sgml, revision 1.1.1.1
1.1 misho 1: <!doctype birddoc system>
2:
3: <!--
4: BIRD: Programmer's Documentation
5:
6: Copyright (c) 2000 Martin Mares <mj@ucw.cz>
7: -->
8:
9: <book>
10: <progdoc>
11:
12: <title>BIRD Programmer's Documentation
13: <author>
14: Ondrej Filip <it/<feela@network.cz>/,
15: Pavel Machek <it/<pavel@ucw.cz>/,
16: Martin Mares <it/<mj@ucw.cz>/,
17: Ondrej Zajicek <it/<santiago@crfreenet.org>/
18: </author>
19:
20: <abstract>
21: This document contains programmer's documentation for the BIRD Internet Routing Daemon project.
22: </abstract>
23:
24: <!-- Table of contents -->
25: <toc>
26:
27: <!-- Begin the document -->
28: <chapt>BIRD Design
29:
30: <sect>Introduction
31:
32: <p>This document describes the internal workings of BIRD, its architecture,
33: design decisions and rationale behind them. It also contains documentation on
34: all the essential components of the system and their interfaces.
35:
36: <p>Routing daemons are complicated things which need to act in real time
37: to complex sequences of external events, respond correctly even to the most erroneous behavior
38: of their environment and still handle enormous amount of data with reasonable
39: speed. Due to all of this, their design is very tricky as one needs to carefully
40: balance between efficiency, stability and (last, but not least) simplicity of
41: the program and it would be possible to write literally hundreds of pages about
42: all of these issues. In accordance to the famous quote of Anton Chekhov "Shortness
43: is a sister of talent", we've tried to write a much shorter document highlighting
44: the most important stuff and leaving the boring technical details better explained
45: by the program source itself together with comments contained therein.
46:
47: <sect>Design goals
48:
49: <p>When planning the architecture of BIRD, we've taken a close look at the other existing routing
50: daemons and also at some of the operating systems used on dedicated routers, gathered all important
51: features and added lots of new ones to overcome their shortcomings and to better match the requirements
52: of routing in today's Internet: IPv6, policy routing, route filtering and so on. From this
53: planning, the following set of design goals has arisen:
54:
55: <itemize>
56:
57: <item><it>Support all the standard routing protocols and make it easy to add new ones.</it>
58: This leads to modularity and clean separation between the core and the protocols.
59:
60: <item><it>Support both IPv4 and IPv6 in the same source tree, re-using most of the code.</it>
61: This leads to abstraction of IP addresses and operations on them.
62:
63: <item><it>Minimize OS dependent code to make porting as easy as possible.</it>
64: Unfortunately, such code cannot be avoided at all as the details of communication with
65: the IP stack differ from OS to OS and they often vary even between different
66: versions of the same OS. But we can isolate such code in special modules and
67: do the porting by changing or replacing just these modules.
68: Also, don't rely on specific features of various operating systems, but be able
69: to make use of them if they are available.
70:
71: <item><it>Allow multiple routing tables.</it>
72: Easily solvable by abstracting out routing tables and the corresponding operations.
73:
74: <item><it>Offer powerful route filtering.</it>
75: There already were several attempts to incorporate route filters to a dynamic router,
76: but most of them have used simple sequences of filtering rules which were very inflexible
77: and hard to use for non-trivial filters. We've decided to employ a simple loop-free
78: programming language having access to all the route attributes and being able to
79: modify the most of them.
80:
81: <item><it>Support easy configuration and re-configuration.</it>
82: Most routers use a simple configuration language designed ad hoc with no structure at all
83: and allow online changes of configuration by using their command-line interface, thus
84: any complex re-configurations are hard to achieve without replacing the configuration
85: file and restarting the whole router. We've decided to use a more general approach: to
86: have a configuration defined in a context-free language with blocks and nesting, to
87: perform all configuration changes by editing the configuration file, but to be able
88: to read the new configuration and smoothly adapt to it without disturbing parts of
89: the routing process which are not affected by the change.
90:
91: <item><it>Be able to be controlled online.</it>
92: In addition to the online reconfiguration, a routing daemon should be able to communicate
93: with the user and with many other programs (primarily scripts used for network maintenance)
94: in order to make it possible to inspect contents of routing tables, status of all
95: routing protocols and also to control their behavior (disable, enable or reset a protocol without restarting all the others). To achieve
96: this, we implement a simple command-line protocol based on those used by FTP and SMTP
97: (that is textual commands and textual replies accompanied by a numeric code which makes
98: them both readable to a human and easy to recognize in software).
99:
100: <item><it>Respond to all events in real time.</it>
101: A typical solution to this problem is to use lots of threads to separate the workings
102: of all the routing protocols and also of the user interface parts and to hope that
103: the scheduler will assign time to them in a fair enough manner. This is surely a good
104: solution, but we have resisted the temptation and preferred to avoid the overhead of threading
105: and the large number of locks involved and preferred a event driven architecture with
106: our own scheduling of events. An unpleasant consequence of such an approach
107: is that long lasting tasks must be split to more parts linked by special
108: events or timers to make the CPU available for other tasks as well.
109:
110: </itemize>
111:
112: <sect>Architecture
113:
114: <p>The requirements set above have lead to a simple modular architecture containing
115: the following types of modules:
116:
117: <descrip>
118:
119: <tagp>Core modules</tagp> implement the core functions of BIRD: taking care
120: of routing tables, keeping protocol status, interacting with the user using
121: the Command-Line Interface (to be called CLI in the rest of this document)
122: etc.
123:
124: <tagp>Library modules</tagp> form a large set of various library functions
125: implementing several data abstractions, utility functions and also functions
126: which are a part of the standard libraries on some systems, but missing on other
127: ones.
128:
129: <tagp>Resource management modules</tagp> take care of resources, their allocation
130: and automatic freeing when the module having requested shuts itself down.
131:
132: <tagp>Configuration modules</tagp> are fragments of lexical analyzer,
133: grammar rules and the corresponding snippets of C code. For each group
134: of code modules (core, each protocol, filters) there exist a configuration
135: module taking care of all the related configuration stuff.
136:
137: <tagp>The filter</tagp> implements the route filtering language.
138:
139: <tagp>Protocol modules</tagp> implement the individual routing protocols.
140:
141: <tagp>System-dependent modules</tagp> implement the interface between BIRD
142: and specific operating systems.
143:
144: <tagp>The client</tagp> is a simple program providing an easy, though friendly
145: interface to the CLI.
146:
147: </descrip>
148:
149: <sect>Implementation
150:
151: <p>BIRD has been written in GNU C. We've considered using C++, but we've
152: preferred the simplicity and straightforward nature of C which gives us fine
153: control over all implementation details and on the other hand enough
154: instruments to build the abstractions we need.
155:
156: <p>The modules are statically linked to produce a single executable file
157: (except for the client which stands on its own).
158:
159: <p>The building process is controlled by a set of Makefiles for GNU Make,
160: intermixed with several Perl and shell scripts.
161:
162: <p>The initial configuration of the daemon, detection of system features
163: and selection of the right modules to include for the particular OS
164: and the set of protocols the user has chosen is performed by a configure
165: script generated by GNU Autoconf.
166:
167: <p>The parser of the configuration is generated by the GNU Bison.
168:
169: <p>The documentation is generated using <file/SGMLtools/ with our own DTD
170: and mapping rules which produce both an online version in HTML and
171: a neatly formatted one for printing (first converted
172: from SGML to &latex; and then processed by &tex; and <file/dvips/ to
173: get a PostScript file).
174:
175: <p>The comments from C sources which form a part of the programmer's
176: documentation are extracted using a modified version of the <file/kernel-doc/
177: tool.
178:
179: <p>If you want to work on BIRD, it's highly recommended to configure it
180: with a <tt/--enable-debug/ switch which enables some internal consistency
181: checks and it also links BIRD with a memory allocation checking library
182: if you have one (either <tt/efence/ or <tt/dmalloc/).
183:
184: <!--
185: LocalWords: IPv IP CLI snippets Perl Autoconf SGMLtools DTD SGML dvips
186: LocalWords: PostScript
187: -->
188: <chapt>Core
189: <sect>Forwarding Information Base
190: <p>
191: <p>
192: FIB is a data structure designed for storage of routes indexed by their
193: network prefixes. It supports insertion, deletion, searching by prefix,
194: `routing' (in CIDR sense, that is searching for a longest prefix matching
195: a given IP address) and (which makes the structure very tricky to implement)
196: asynchronous reading, that is enumerating the contents of a FIB while other
197: modules add, modify or remove entries.
198: <p>
199: Internally, each FIB is represented as a collection of nodes of type <struct/fib_node/
200: indexed using a sophisticated hashing mechanism.
201: We use two-stage hashing where we calculate a 16-bit primary hash key independent
202: on hash table size and then we just divide the primary keys modulo table size
203: to get a real hash key used for determining the bucket containing the node.
204: The lists of nodes in each bucket are sorted according to the primary hash
205: key, hence if we keep the total number of buckets to be a power of two,
206: re-hashing of the structure keeps the relative order of the nodes.
207: <p>
208: To get the asynchronous reading consistent over node deletions, we need to
209: keep a list of readers for each node. When a node gets deleted, its readers
210: are automatically moved to the next node in the table.
211: <p>
212: Basic FIB operations are performed by functions defined by this module,
213: enumerating of FIB contents is accomplished by using the <func/FIB_WALK()/ macro
214: or <func/FIB_ITERATE_START()/ if you want to do it asynchronously.
215: <p>
216: For simple iteration just place the body of the loop between <func/FIB_WALK()/ and
217: <func/FIB_WALK_END()/. You can't modify the FIB during the iteration (you can modify
218: data in the node, but not add or remove nodes).
219: <p>
220: If you need more freedom, you can use the FIB_ITERATE_*() group of macros.
221: First, you initialize an iterator with <func/FIB_ITERATE_INIT()/. Then you can put
222: the loop body in between <func/FIB_ITERATE_START()/ and <func/FIB_ITERATE_END()/. In
223: addition, the iteration can be suspended by calling <func/FIB_ITERATE_PUT()/.
224: This'll link the iterator inside the FIB. While suspended, you may modify the
225: FIB, exit the current function, etc. To resume the iteration, enter the loop
226: again. You can use <func/FIB_ITERATE_UNLINK()/ to unlink the iterator (while
227: iteration is suspended) in cases like premature end of FIB iteration.
228: <p>
229: Note that the iterator must not be destroyed when the iteration is suspended,
230: the FIB would then contain a pointer to invalid memory. Therefore, after each
231: <func/FIB_ITERATE_INIT()/ or <func/FIB_ITERATE_PUT()/ there must be either
232: <func/FIB_ITERATE_START()/ or <func/FIB_ITERATE_UNLINK()/ before the iterator is destroyed.
233:
234:
235: <function><p><type>void</type>
236: <funcdef>fib_init</funcdef>
237: (<type>struct fib *</type> <param>f</param>, <type>pool *</type> <param>p</param>, <type>unsigned</type> <param>node_size</param>, <type>unsigned</type> <param>hash_order</param>, <type>fib_init_func</type> <param>init</param>) -- initialize a new FIB
238:
239: <funcsect>Arguments
240: <p><descrip>
241: <tagp><type>struct fib *</type> <param>f</param></tagp>
242: the FIB to be initialized (the structure itself being allocated by the caller)
243: <tagp><type>pool *</type> <param>p</param></tagp>
244: pool to allocate the nodes in
245: <tagp><type>unsigned</type> <param>node_size</param></tagp>
246: node size to be used (each node consists of a standard header <struct/fib_node/
247: followed by user data)
248: <tagp><type>unsigned</type> <param>hash_order</param></tagp>
249: initial hash order (a binary logarithm of hash table size), 0 to use default order
250: (recommended)
251: <tagp><type>fib_init_func</type> <param>init</param></tagp>
252: pointer a function to be called to initialize a newly created node
253: </descrip>
254: <funcsect>Description
255: <p>
256: This function initializes a newly allocated FIB and prepares it for use.
257: </function>
258: <function><p><type>void *</type>
259: <funcdef>fib_find</funcdef>
260: (<type>struct fib *</type> <param>f</param>, <type>ip_addr *</type> <param>a</param>, <type>int</type> <param>len</param>) -- search for FIB node by prefix
261:
262: <funcsect>Arguments
263: <p><descrip>
264: <tagp><type>struct fib *</type> <param>f</param></tagp>
265: FIB to search in
266: <tagp><type>ip_addr *</type> <param>a</param></tagp>
267: pointer to IP address of the prefix
268: <tagp><type>int</type> <param>len</param></tagp>
269: prefix length
270: </descrip>
271: <funcsect>Description
272: <p>
273: Search for a FIB node corresponding to the given prefix, return
274: a pointer to it or <const/NULL/ if no such node exists.
275: </function>
276: <function><p><type>void *</type>
277: <funcdef>fib_get</funcdef>
278: (<type>struct fib *</type> <param>f</param>, <type>ip_addr *</type> <param>a</param>, <type>int</type> <param>len</param>) -- find or create a FIB node
279:
280: <funcsect>Arguments
281: <p><descrip>
282: <tagp><type>struct fib *</type> <param>f</param></tagp>
283: FIB to work with
284: <tagp><type>ip_addr *</type> <param>a</param></tagp>
285: pointer to IP address of the prefix
286: <tagp><type>int</type> <param>len</param></tagp>
287: prefix length
288: </descrip>
289: <funcsect>Description
290: <p>
291: Search for a FIB node corresponding to the given prefix and
292: return a pointer to it. If no such node exists, create it.
293: </function>
294: <function><p><type>void *</type>
295: <funcdef>fib_route</funcdef>
296: (<type>struct fib *</type> <param>f</param>, <type>ip_addr</type> <param>a</param>, <type>int</type> <param>len</param>) -- CIDR routing lookup
297:
298: <funcsect>Arguments
299: <p><descrip>
300: <tagp><type>struct fib *</type> <param>f</param></tagp>
301: FIB to search in
302: <tagp><type>ip_addr</type> <param>a</param></tagp>
303: pointer to IP address of the prefix
304: <tagp><type>int</type> <param>len</param></tagp>
305: prefix length
306: </descrip>
307: <funcsect>Description
308: <p>
309: Search for a FIB node with longest prefix matching the given
310: network, that is a node which a CIDR router would use for routing
311: that network.
312: </function>
313: <function><p><type>void</type>
314: <funcdef>fib_delete</funcdef>
315: (<type>struct fib *</type> <param>f</param>, <type>void *</type> <param>E</param>) -- delete a FIB node
316:
317: <funcsect>Arguments
318: <p><descrip>
319: <tagp><type>struct fib *</type> <param>f</param></tagp>
320: FIB to delete from
321: <tagp><type>void *</type> <param>E</param></tagp>
322: entry to delete
323: </descrip>
324: <funcsect>Description
325: <p>
326: This function removes the given entry from the FIB,
327: taking care of all the asynchronous readers by shifting
328: them to the next node in the canonical reading order.
329: </function>
330: <function><p><type>void</type>
331: <funcdef>fib_free</funcdef>
332: (<type>struct fib *</type> <param>f</param>) -- delete a FIB
333:
334: <funcsect>Arguments
335: <p><descrip>
336: <tagp><type>struct fib *</type> <param>f</param></tagp>
337: FIB to be deleted
338: </descrip>
339: <funcsect>Description
340: <p>
341: This function deletes a FIB -- it frees all memory associated
342: with it and all its entries.
343: </function>
344: <function><p><type>void</type>
345: <funcdef>fib_check</funcdef>
346: (<type>struct fib *</type> <param>f</param>) -- audit a FIB
347:
348: <funcsect>Arguments
349: <p><descrip>
350: <tagp><type>struct fib *</type> <param>f</param></tagp>
351: FIB to be checked
352: </descrip>
353: <funcsect>Description
354: <p>
355: This debugging function audits a FIB by checking its internal consistency.
356: Use when you suspect somebody of corrupting innocent data structures.
357: </function>
358: <sect>Routing tables
359: <p>
360: <p>
361: Routing tables are probably the most important structures BIRD uses. They
362: hold all the information about known networks, the associated routes and
363: their attributes.
364: <p>
365: There are multiple routing tables (a primary one together with any
366: number of secondary ones if requested by the configuration). Each table
367: is basically a FIB containing entries describing the individual
368: destination networks. For each network (represented by structure <struct/net/),
369: there is a one-way linked list of route entries (<struct/rte/), the first entry
370: on the list being the best one (i.e., the one we currently use
371: for routing), the order of the other ones is undetermined.
372: <p>
373: The <struct/rte/ contains information specific to the route (preference, protocol
374: metrics, time of last modification etc.) and a pointer to a <struct/rta/ structure
375: (see the route attribute module for a precise explanation) holding the
376: remaining route attributes which are expected to be shared by multiple
377: routes in order to conserve memory.
378:
379:
380: <function><p><type>rte *</type>
381: <funcdef>rte_find</funcdef>
382: (<type>net *</type> <param>net</param>, <type>struct rte_src *</type> <param>src</param>) -- find a route
383:
384: <funcsect>Arguments
385: <p><descrip>
386: <tagp><type>net *</type> <param>net</param></tagp>
387: network node
388: <tagp><type>struct rte_src *</type> <param>src</param></tagp>
389: route source
390: </descrip>
391: <funcsect>Description
392: <p>
393: The <func/rte_find()/ function returns a route for destination <param/net/
394: which is from route source <param/src/.
395: </function>
396: <function><p><type>rte *</type>
397: <funcdef>rte_get_temp</funcdef>
398: (<type>rta *</type> <param>a</param>) -- get a temporary <struct/rte/
399:
400: <funcsect>Arguments
401: <p><descrip>
402: <tagp><type>rta *</type> <param>a</param></tagp>
403: attributes to assign to the new route (a <struct/rta/; in case it's
404: un-cached, <func/rte_update()/ will create a cached copy automatically)
405: </descrip>
406: <funcsect>Description
407: <p>
408: Create a temporary <struct/rte/ and bind it with the attributes <param/a/.
409: Also set route preference to the default preference set for
410: the protocol.
411: </function>
412: <function><p><type>rte *</type>
413: <funcdef>rte_cow_rta</funcdef>
414: (<type>rte *</type> <param>r</param>, <type>linpool *</type> <param>lp</param>) -- get a private writable copy of <struct/rte/ with writable <struct/rta/
415:
416: <funcsect>Arguments
417: <p><descrip>
418: <tagp><type>rte *</type> <param>r</param></tagp>
419: a route entry to be copied
420: <tagp><type>linpool *</type> <param>lp</param></tagp>
421: a linpool from which to allocate <struct/rta/
422: </descrip>
423: <funcsect>Description
424: <p>
425: <func/rte_cow_rta()/ takes a <struct/rte/ and prepares it and associated <struct/rta/ for
426: modification. There are three possibilities: First, both <struct/rte/ and <struct/rta/ are
427: private copies, in that case they are returned unchanged. Second, <struct/rte/ is
428: private copy, but <struct/rta/ is cached, in that case <struct/rta/ is duplicated using
429: <func/rta_do_cow()/. Third, both <struct/rte/ is shared and <struct/rta/ is cached, in that case
430: both structures are duplicated by <func/rte_do_cow()/ and <func/rta_do_cow()/.
431: <p>
432: Note that in the second case, cached <struct/rta/ loses one reference, while private
433: copy created by <func/rta_do_cow()/ is a shallow copy sharing indirect data (eattrs,
434: nexthops, ...) with it. To work properly, original shared <struct/rta/ should have
435: another reference during the life of created private copy.
436: <funcsect>Result
437: <p>
438: a pointer to the new writable <struct/rte/ with writable <struct/rta/.
439: </function>
440: <function><p><type>void</type>
441: <funcdef>rte_announce</funcdef>
442: (<type>rtable *</type> <param>tab</param>, <type>unsigned</type> <param>type</param>, <type>net *</type> <param>net</param>, <type>rte *</type> <param>new</param>, <type>rte *</type> <param>old</param>, <type>rte *</type> <param>new_best</param>, <type>rte *</type> <param>old_best</param>, <type>rte *</type> <param>before_old</param>) -- announce a routing table change
443:
444: <funcsect>Arguments
445: <p><descrip>
446: <tagp><type>rtable *</type> <param>tab</param></tagp>
447: table the route has been added to
448: <tagp><type>unsigned</type> <param>type</param></tagp>
449: type of route announcement (RA_OPTIMAL or RA_ANY)
450: <tagp><type>net *</type> <param>net</param></tagp>
451: network in question
452: <tagp><type>rte *</type> <param>new</param></tagp>
453: the new route to be announced
454: <tagp><type>rte *</type> <param>old</param></tagp>
455: the previous route for the same network
456: <tagp><type>rte *</type> <param>new_best</param></tagp>
457: the new best route for the same network
458: <tagp><type>rte *</type> <param>old_best</param></tagp>
459: the previous best route for the same network
460: <tagp><type>rte *</type> <param>before_old</param></tagp>
461: The previous route before <param/old/ for the same network.
462: If <param/before_old/ is NULL <param/old/ was the first.
463: </descrip>
464: <funcsect>Description
465: <p>
466: This function gets a routing table update and announces it
467: to all protocols that acccepts given type of route announcement
468: and are connected to the same table by their announcement hooks.
469: <p>
470: Route announcement of type <const/RA_OPTIMAL/ si generated when optimal
471: route (in routing table <param/tab/) changes. In that case <param/old/ stores the
472: old optimal route.
473: <p>
474: Route announcement of type <const/RA_ANY/ si generated when any route (in
475: routing table <param/tab/) changes In that case <param/old/ stores the old route
476: from the same protocol.
477: <p>
478: For each appropriate protocol, we first call its <func/import_control()/
479: hook which performs basic checks on the route (each protocol has a
480: right to veto or force accept of the route before any filter is
481: asked) and adds default values of attributes specific to the new
482: protocol (metrics, tags etc.). Then it consults the protocol's
483: export filter and if it accepts the route, the <func/rt_notify()/ hook of
484: the protocol gets called.
485: </function>
486: <function><p><type>void</type>
487: <funcdef>rte_free</funcdef>
488: (<type>rte *</type> <param>e</param>) -- delete a <struct/rte/
489:
490: <funcsect>Arguments
491: <p><descrip>
492: <tagp><type>rte *</type> <param>e</param></tagp>
493: <struct/rte/ to be deleted
494: </descrip>
495: <funcsect>Description
496: <p>
497: <func/rte_free()/ deletes the given <struct/rte/ from the routing table it's linked to.
498: </function>
499: <function><p><type>void</type>
500: <funcdef>rte_update2</funcdef>
501: (<type>struct announce_hook *</type> <param>ah</param>, <type>net *</type> <param>net</param>, <type>rte *</type> <param>new</param>, <type>struct rte_src *</type> <param>src</param>) -- enter a new update to a routing table
502:
503: <funcsect>Arguments
504: <p><descrip>
505: <tagp><type>struct announce_hook *</type> <param>ah</param></tagp>
506: pointer to table announce hook
507: <tagp><type>net *</type> <param>net</param></tagp>
508: network node
509: <tagp><type>rte *</type> <param>new</param></tagp>
510: a <struct/rte/ representing the new route or <const/NULL/ for route removal.
511: <tagp><type>struct rte_src *</type> <param>src</param></tagp>
512: protocol originating the update
513: </descrip>
514: <funcsect>Description
515: <p>
516: This function is called by the routing protocols whenever they discover
517: a new route or wish to update/remove an existing route. The right announcement
518: sequence is to build route attributes first (either un-cached with <param/aflags/ set
519: to zero or a cached one using <func/rta_lookup()/; in this case please note that
520: you need to increase the use count of the attributes yourself by calling
521: <func/rta_clone()/), call <func/rte_get_temp()/ to obtain a temporary <struct/rte/, fill in all
522: the appropriate data and finally submit the new <struct/rte/ by calling <func/rte_update()/.
523: <p>
524: <param/src/ specifies the protocol that originally created the route and the meaning
525: of protocol-dependent data of <param/new/. If <param/new/ is not <const/NULL/, <param/src/ have to be the
526: same value as <param/new/->attrs->proto. <param/p/ specifies the protocol that called
527: <func/rte_update()/. In most cases it is the same protocol as <param/src/. <func/rte_update()/
528: stores <param/p/ in <param/new/->sender;
529: <p>
530: When <func/rte_update()/ gets any route, it automatically validates it (checks,
531: whether the network and next hop address are valid IP addresses and also
532: whether a normal routing protocol doesn't try to smuggle a host or link
533: scope route to the table), converts all protocol dependent attributes stored
534: in the <struct/rte/ to temporary extended attributes, consults import filters of the
535: protocol to see if the route should be accepted and/or its attributes modified,
536: stores the temporary attributes back to the <struct/rte/.
537: <p>
538: Now, having a "public" version of the route, we
539: automatically find any old route defined by the protocol <param/src/
540: for network <param/n/, replace it by the new one (or removing it if <param/new/ is <const/NULL/),
541: recalculate the optimal route for this destination and finally broadcast
542: the change (if any) to all routing protocols by calling <func/rte_announce()/.
543: <p>
544: All memory used for attribute lists and other temporary allocations is taken
545: from a special linear pool <param/rte_update_pool/ and freed when <func/rte_update()/
546: finishes.
547: </function>
548: <function><p><type>void</type>
549: <funcdef>rt_refresh_begin</funcdef>
550: (<type>rtable *</type> <param>t</param>, <type>struct announce_hook *</type> <param>ah</param>) -- start a refresh cycle
551:
552: <funcsect>Arguments
553: <p><descrip>
554: <tagp><type>rtable *</type> <param>t</param></tagp>
555: related routing table
556: <tagp><type>struct announce_hook *</type> <param>ah</param></tagp>
557: related announce hook
558: </descrip>
559: <funcsect>Description
560: <p>
561: This function starts a refresh cycle for given routing table and announce
562: hook. The refresh cycle is a sequence where the protocol sends all its valid
563: routes to the routing table (by <func/rte_update()/). After that, all protocol
564: routes (more precisely routes with <param/ah/ as <param/sender/) not sent during the
565: refresh cycle but still in the table from the past are pruned. This is
566: implemented by marking all related routes as stale by REF_STALE flag in
567: <func/rt_refresh_begin()/, then marking all related stale routes with REF_DISCARD
568: flag in <func/rt_refresh_end()/ and then removing such routes in the prune loop.
569: </function>
570: <function><p><type>void</type>
571: <funcdef>rt_refresh_end</funcdef>
572: (<type>rtable *</type> <param>t</param>, <type>struct announce_hook *</type> <param>ah</param>) -- end a refresh cycle
573:
574: <funcsect>Arguments
575: <p><descrip>
576: <tagp><type>rtable *</type> <param>t</param></tagp>
577: related routing table
578: <tagp><type>struct announce_hook *</type> <param>ah</param></tagp>
579: related announce hook
580: </descrip>
581: <funcsect>Description
582: <p>
583: This function starts a refresh cycle for given routing table and announce
584: hook. See <func/rt_refresh_begin()/ for description of refresh cycles.
585: </function>
586: <function><p><type>void</type>
587: <funcdef>rte_dump</funcdef>
588: (<type>rte *</type> <param>e</param>) -- dump a route
589:
590: <funcsect>Arguments
591: <p><descrip>
592: <tagp><type>rte *</type> <param>e</param></tagp>
593: <struct/rte/ to be dumped
594: </descrip>
595: <funcsect>Description
596: <p>
597: This functions dumps contents of a <struct/rte/ to debug output.
598: </function>
599: <function><p><type>void</type>
600: <funcdef>rt_dump</funcdef>
601: (<type>rtable *</type> <param>t</param>) -- dump a routing table
602:
603: <funcsect>Arguments
604: <p><descrip>
605: <tagp><type>rtable *</type> <param>t</param></tagp>
606: routing table to be dumped
607: </descrip>
608: <funcsect>Description
609: <p>
610: This function dumps contents of a given routing table to debug output.
611: </function>
612: <function><p><type>void</type>
613: <funcdef>rt_dump_all</funcdef>
614: (<param>void</param>) -- dump all routing tables
615:
616: <funcsect>Description
617: <p>
618: <p>
619: This function dumps contents of all routing tables to debug output.
620: </function>
621: <function><p><type>void</type>
622: <funcdef>rt_init</funcdef>
623: (<param>void</param>) -- initialize routing tables
624:
625: <funcsect>Description
626: <p>
627: <p>
628: This function is called during BIRD startup. It initializes the
629: routing table module.
630: </function>
631: <function><p><type>int</type>
632: <funcdef>rt_prune_table</funcdef>
633: (<type>rtable *</type> <param>tab</param>) -- prune a routing table
634:
635: <funcsect>Arguments
636: <p><descrip>
637: <tagp><type>rtable *</type> <param>tab</param></tagp>
638: a routing table for pruning
639: </descrip>
640: <funcsect>Description
641: <p>
642: This function scans the routing table <param/tab/ and removes routes belonging to
643: flushing protocols, discarded routes and also stale network entries, in a
644: similar fashion like <func/rt_prune_loop()/. Returns 1 when all such routes are
645: pruned. Contrary to <func/rt_prune_loop()/, this function is not a part of the
646: protocol flushing loop, but it is called from <func/rt_event()/ for just one routing
647: table.
648: <p>
649: Note that <func/rt_prune_table()/ and <func/rt_prune_loop()/ share (for each table) the
650: prune state (<param/prune_state/) and also the pruning iterator (<param/prune_fit/).
651: </function>
652: <function><p><type>int</type>
653: <funcdef>rt_prune_loop</funcdef>
654: (<param>void</param>) -- prune routing tables
655:
656: <funcsect>Description
657: <p>
658: <p>
659: The prune loop scans routing tables and removes routes belonging to flushing
660: protocols, discarded routes and also stale network entries. Returns 1 when
661: all such routes are pruned. It is a part of the protocol flushing loop.
662: </function>
663: <function><p><type>void</type>
664: <funcdef>rt_lock_table</funcdef>
665: (<type>rtable *</type> <param>r</param>) -- lock a routing table
666:
667: <funcsect>Arguments
668: <p><descrip>
669: <tagp><type>rtable *</type> <param>r</param></tagp>
670: routing table to be locked
671: </descrip>
672: <funcsect>Description
673: <p>
674: Lock a routing table, because it's in use by a protocol,
675: preventing it from being freed when it gets undefined in a new
676: configuration.
677: </function>
678: <function><p><type>void</type>
679: <funcdef>rt_unlock_table</funcdef>
680: (<type>rtable *</type> <param>r</param>) -- unlock a routing table
681:
682: <funcsect>Arguments
683: <p><descrip>
684: <tagp><type>rtable *</type> <param>r</param></tagp>
685: routing table to be unlocked
686: </descrip>
687: <funcsect>Description
688: <p>
689: Unlock a routing table formerly locked by <func/rt_lock_table()/,
690: that is decrease its use count and delete it if it's scheduled
691: for deletion by configuration changes.
692: </function>
693: <function><p><type>void</type>
694: <funcdef>rt_commit</funcdef>
695: (<type>struct config *</type> <param>new</param>, <type>struct config *</type> <param>old</param>) -- commit new routing table configuration
696:
697: <funcsect>Arguments
698: <p><descrip>
699: <tagp><type>struct config *</type> <param>new</param></tagp>
700: new configuration
701: <tagp><type>struct config *</type> <param>old</param></tagp>
702: original configuration or <const/NULL/ if it's boot time config
703: </descrip>
704: <funcsect>Description
705: <p>
706: Scan differences between <param/old/ and <param/new/ configuration and modify
707: the routing tables according to these changes. If <param/new/ defines a
708: previously unknown table, create it, if it omits a table existing
709: in <param/old/, schedule it for deletion (it gets deleted when all protocols
710: disconnect from it by calling <func/rt_unlock_table()/), if it exists
711: in both configurations, leave it unchanged.
712: </function>
713: <function><p><type>int</type>
714: <funcdef>rt_feed_baby</funcdef>
715: (<type>struct proto *</type> <param>p</param>) -- advertise routes to a new protocol
716:
717: <funcsect>Arguments
718: <p><descrip>
719: <tagp><type>struct proto *</type> <param>p</param></tagp>
720: protocol to be fed
721: </descrip>
722: <funcsect>Description
723: <p>
724: This function performs one pass of advertisement of routes to a newly
725: initialized protocol. It's called by the protocol code as long as it
726: has something to do. (We avoid transferring all the routes in single
727: pass in order not to monopolize CPU time.)
728: </function>
729: <function><p><type>void</type>
730: <funcdef>rt_feed_baby_abort</funcdef>
731: (<type>struct proto *</type> <param>p</param>) -- abort protocol feeding
732:
733: <funcsect>Arguments
734: <p><descrip>
735: <tagp><type>struct proto *</type> <param>p</param></tagp>
736: protocol
737: </descrip>
738: <funcsect>Description
739: <p>
740: This function is called by the protocol code when the protocol
741: stops or ceases to exist before the last iteration of <func/rt_feed_baby()/
742: has finished.
743: </function>
744: <function><p><type>net *</type>
745: <funcdef>net_find</funcdef>
746: (<type>rtable *</type> <param>tab</param>, <type>ip_addr</type> <param>addr</param>, <type>unsigned</type> <param>len</param>) -- find a network entry
747:
748: <funcsect>Arguments
749: <p><descrip>
750: <tagp><type>rtable *</type> <param>tab</param></tagp>
751: a routing table
752: <tagp><type>ip_addr</type> <param>addr</param></tagp>
753: address of the network
754: <tagp><type>unsigned</type> <param>len</param></tagp>
755: length of the network prefix
756: </descrip>
757: <funcsect>Description
758: <p>
759: <func/net_find()/ looks up the given network in routing table <param/tab/ and
760: returns a pointer to its <struct/net/ entry or <const/NULL/ if no such network
761: exists.
762: </function>
763: <function><p><type>net *</type>
764: <funcdef>net_get</funcdef>
765: (<type>rtable *</type> <param>tab</param>, <type>ip_addr</type> <param>addr</param>, <type>unsigned</type> <param>len</param>) -- obtain a network entry
766:
767: <funcsect>Arguments
768: <p><descrip>
769: <tagp><type>rtable *</type> <param>tab</param></tagp>
770: a routing table
771: <tagp><type>ip_addr</type> <param>addr</param></tagp>
772: address of the network
773: <tagp><type>unsigned</type> <param>len</param></tagp>
774: length of the network prefix
775: </descrip>
776: <funcsect>Description
777: <p>
778: <func/net_get()/ looks up the given network in routing table <param/tab/ and
779: returns a pointer to its <struct/net/ entry. If no such entry exists, it's
780: created.
781: </function>
782: <function><p><type>rte *</type>
783: <funcdef>rte_cow</funcdef>
784: (<type>rte *</type> <param>r</param>) -- copy a route for writing
785:
786: <funcsect>Arguments
787: <p><descrip>
788: <tagp><type>rte *</type> <param>r</param></tagp>
789: a route entry to be copied
790: </descrip>
791: <funcsect>Description
792: <p>
793: <func/rte_cow()/ takes a <struct/rte/ and prepares it for modification. The exact action
794: taken depends on the flags of the <struct/rte/ -- if it's a temporary entry, it's
795: just returned unchanged, else a new temporary entry with the same contents
796: is created.
797: <p>
798: The primary use of this function is inside the filter machinery -- when
799: a filter wants to modify <struct/rte/ contents (to change the preference or to
800: attach another set of attributes), it must ensure that the <struct/rte/ is not
801: shared with anyone else (and especially that it isn't stored in any routing
802: table).
803: <funcsect>Result
804: <p>
805: a pointer to the new writable <struct/rte/.
806: </function>
807: <sect>Route attribute cache
808: <p>
809: <p>
810: Each route entry carries a set of route attributes. Several of them
811: vary from route to route, but most attributes are usually common
812: for a large number of routes. To conserve memory, we've decided to
813: store only the varying ones directly in the <struct/rte/ and hold the rest
814: in a special structure called <struct/rta/ which is shared among all the
815: <struct/rte/'s with these attributes.
816: <p>
817: Each <struct/rta/ contains all the static attributes of the route (i.e.,
818: those which are always present) as structure members and a list of
819: dynamic attributes represented by a linked list of <struct/ea_list/
820: structures, each of them consisting of an array of <struct/eattr/'s containing
821: the individual attributes. An attribute can be specified more than once
822: in the <struct/ea_list/ chain and in such case the first occurrence overrides
823: the others. This semantics is used especially when someone (for example
824: a filter) wishes to alter values of several dynamic attributes, but
825: it wants to preserve the original attribute lists maintained by
826: another module.
827: <p>
828: Each <struct/eattr/ contains an attribute identifier (split to protocol ID and
829: per-protocol attribute ID), protocol dependent flags, a type code (consisting
830: of several bit fields describing attribute characteristics) and either an
831: embedded 32-bit value or a pointer to a <struct/adata/ structure holding attribute
832: contents.
833: <p>
834: There exist two variants of <struct/rta/'s -- cached and un-cached ones. Un-cached
835: <struct/rta/'s can have arbitrarily complex structure of <struct/ea_list/'s and they
836: can be modified by any module in the route processing chain. Cached
837: <struct/rta/'s have their attribute lists normalized (that means at most one
838: <struct/ea_list/ is present and its values are sorted in order to speed up
839: searching), they are stored in a hash table to make fast lookup possible
840: and they are provided with a use count to allow sharing.
841: <p>
842: Routing tables always contain only cached <struct/rta/'s.
843:
844:
845: <function><p><type>struct mpnh *</type>
846: <funcdef>mpnh_merge</funcdef>
847: (<type>struct mpnh *</type> <param>x</param>, <type>struct mpnh *</type> <param>y</param>, <type>int</type> <param>rx</param>, <type>int</type> <param>ry</param>, <type>int</type> <param>max</param>, <type>linpool *</type> <param>lp</param>) -- merge nexthop lists
848:
849: <funcsect>Arguments
850: <p><descrip>
851: <tagp><type>struct mpnh *</type> <param>x</param></tagp>
852: list 1
853: <tagp><type>struct mpnh *</type> <param>y</param></tagp>
854: list 2
855: <tagp><type>int</type> <param>rx</param></tagp>
856: reusability of list <param/x/
857: <tagp><type>int</type> <param>ry</param></tagp>
858: reusability of list <param/y/
859: <tagp><type>int</type> <param>max</param></tagp>
860: max number of nexthops
861: <tagp><type>linpool *</type> <param>lp</param></tagp>
862: linpool for allocating nexthops
863: </descrip>
864: <funcsect>Description
865: <p>
866: The <func/mpnh_merge()/ function takes two nexthop lists <param/x/ and <param/y/ and merges them,
867: eliminating possible duplicates. The input lists must be sorted and the
868: result is sorted too. The number of nexthops in result is limited by <param/max/.
869: New nodes are allocated from linpool <param/lp/.
870: <p>
871: The arguments <param/rx/ and <param/ry/ specify whether corresponding input lists may be
872: consumed by the function (i.e. their nodes reused in the resulting list), in
873: that case the caller should not access these lists after that. To eliminate
874: issues with deallocation of these lists, the caller should use some form of
875: bulk deallocation (e.g. stack or linpool) to free these nodes when the
876: resulting list is no longer needed. When reusability is not set, the
877: corresponding lists are not modified nor linked from the resulting list.
878: </function>
879: <function><p><type>eattr *</type>
880: <funcdef>ea_find</funcdef>
881: (<type>ea_list *</type> <param>e</param>, <type>unsigned</type> <param>id</param>) -- find an extended attribute
882:
883: <funcsect>Arguments
884: <p><descrip>
885: <tagp><type>ea_list *</type> <param>e</param></tagp>
886: attribute list to search in
887: <tagp><type>unsigned</type> <param>id</param></tagp>
888: attribute ID to search for
889: </descrip>
890: <funcsect>Description
891: <p>
892: Given an extended attribute list, <func/ea_find()/ searches for a first
893: occurrence of an attribute with specified ID, returning either a pointer
894: to its <struct/eattr/ structure or <const/NULL/ if no such attribute exists.
895: </function>
896: <function><p><type>eattr *</type>
897: <funcdef>ea_walk</funcdef>
898: (<type>struct ea_walk_state *</type> <param>s</param>, <type>uint</type> <param>id</param>, <type>uint</type> <param>max</param>) -- walk through extended attributes
899:
900: <funcsect>Arguments
901: <p><descrip>
902: <tagp><type>struct ea_walk_state *</type> <param>s</param></tagp>
903: walk state structure
904: <tagp><type>uint</type> <param>id</param></tagp>
905: start of attribute ID interval
906: <tagp><type>uint</type> <param>max</param></tagp>
907: length of attribute ID interval
908: </descrip>
909: <funcsect>Description
910: <p>
911: Given an extended attribute list, <func/ea_walk()/ walks through the list looking
912: for first occurrences of attributes with ID in specified interval from <param/id/ to
913: (<param/id/ + <param/max/ - 1), returning pointers to found <struct/eattr/ structures, storing its
914: walk state in <param/s/ for subsequent calls.
915: <p>
916: The function <func/ea_walk()/ is supposed to be called in a loop, with initially
917: zeroed walk state structure <param/s/ with filled the initial extended attribute
918: list, returning one found attribute in each call or <const/NULL/ when no other
919: attribute exists. The extended attribute list or the arguments should not be
920: modified between calls. The maximum value of <param/max/ is 128.
921: </function>
922: <function><p><type>int</type>
923: <funcdef>ea_get_int</funcdef>
924: (<type>ea_list *</type> <param>e</param>, <type>unsigned</type> <param>id</param>, <type>int</type> <param>def</param>) -- fetch an integer attribute
925:
926: <funcsect>Arguments
927: <p><descrip>
928: <tagp><type>ea_list *</type> <param>e</param></tagp>
929: attribute list
930: <tagp><type>unsigned</type> <param>id</param></tagp>
931: attribute ID
932: <tagp><type>int</type> <param>def</param></tagp>
933: default value
934: </descrip>
935: <funcsect>Description
936: <p>
937: This function is a shortcut for retrieving a value of an integer attribute
938: by calling <func/ea_find()/ to find the attribute, extracting its value or returning
939: a provided default if no such attribute is present.
940: </function>
941: <function><p><type>void</type>
942: <funcdef>ea_sort</funcdef>
943: (<type>ea_list *</type> <param>e</param>) -- sort an attribute list
944:
945: <funcsect>Arguments
946: <p><descrip>
947: <tagp><type>ea_list *</type> <param>e</param></tagp>
948: list to be sorted
949: </descrip>
950: <funcsect>Description
951: <p>
952: This function takes a <struct/ea_list/ chain and sorts the attributes
953: within each of its entries.
954: <p>
955: If an attribute occurs multiple times in a single <struct/ea_list/,
956: <func/ea_sort()/ leaves only the first (the only significant) occurrence.
957: </function>
958: <function><p><type>unsigned</type>
959: <funcdef>ea_scan</funcdef>
960: (<type>ea_list *</type> <param>e</param>) -- estimate attribute list size
961:
962: <funcsect>Arguments
963: <p><descrip>
964: <tagp><type>ea_list *</type> <param>e</param></tagp>
965: attribute list
966: </descrip>
967: <funcsect>Description
968: <p>
969: This function calculates an upper bound of the size of
970: a given <struct/ea_list/ after merging with <func/ea_merge()/.
971: </function>
972: <function><p><type>void</type>
973: <funcdef>ea_merge</funcdef>
974: (<type>ea_list *</type> <param>e</param>, <type>ea_list *</type> <param>t</param>) -- merge segments of an attribute list
975:
976: <funcsect>Arguments
977: <p><descrip>
978: <tagp><type>ea_list *</type> <param>e</param></tagp>
979: attribute list
980: <tagp><type>ea_list *</type> <param>t</param></tagp>
981: buffer to store the result to
982: </descrip>
983: <funcsect>Description
984: <p>
985: This function takes a possibly multi-segment attribute list
986: and merges all of its segments to one.
987: <p>
988: The primary use of this function is for <struct/ea_list/ normalization:
989: first call <func/ea_scan()/ to determine how much memory will the result
990: take, then allocate a buffer (usually using <func/alloca()/), merge the
991: segments with <func/ea_merge()/ and finally sort and prune the result
992: by calling <func/ea_sort()/.
993: </function>
994: <function><p><type>int</type>
995: <funcdef>ea_same</funcdef>
996: (<type>ea_list *</type> <param>x</param>, <type>ea_list *</type> <param>y</param>) -- compare two <struct/ea_list/'s
997:
998: <funcsect>Arguments
999: <p><descrip>
1000: <tagp><type>ea_list *</type> <param>x</param></tagp>
1001: attribute list
1002: <tagp><type>ea_list *</type> <param>y</param></tagp>
1003: attribute list
1004: </descrip>
1005: <funcsect>Description
1006: <p>
1007: <func/ea_same()/ compares two normalized attribute lists <param/x/ and <param/y/ and returns
1008: 1 if they contain the same attributes, 0 otherwise.
1009: </function>
1010: <function><p><type>void</type>
1011: <funcdef>ea_show</funcdef>
1012: (<type>struct cli *</type> <param>c</param>, <type>eattr *</type> <param>e</param>) -- print an <struct/eattr/ to CLI
1013:
1014: <funcsect>Arguments
1015: <p><descrip>
1016: <tagp><type>struct cli *</type> <param>c</param></tagp>
1017: destination CLI
1018: <tagp><type>eattr *</type> <param>e</param></tagp>
1019: attribute to be printed
1020: </descrip>
1021: <funcsect>Description
1022: <p>
1023: This function takes an extended attribute represented by its <struct/eattr/
1024: structure and prints it to the CLI according to the type information.
1025: <p>
1026: If the protocol defining the attribute provides its own
1027: <func/get_attr()/ hook, it's consulted first.
1028: </function>
1029: <function><p><type>void</type>
1030: <funcdef>ea_dump</funcdef>
1031: (<type>ea_list *</type> <param>e</param>) -- dump an extended attribute
1032:
1033: <funcsect>Arguments
1034: <p><descrip>
1035: <tagp><type>ea_list *</type> <param>e</param></tagp>
1036: attribute to be dumped
1037: </descrip>
1038: <funcsect>Description
1039: <p>
1040: <func/ea_dump()/ dumps contents of the extended attribute given to
1041: the debug output.
1042: </function>
1043: <function><p><type>uint</type>
1044: <funcdef>ea_hash</funcdef>
1045: (<type>ea_list *</type> <param>e</param>) -- calculate an <struct/ea_list/ hash key
1046:
1047: <funcsect>Arguments
1048: <p><descrip>
1049: <tagp><type>ea_list *</type> <param>e</param></tagp>
1050: attribute list
1051: </descrip>
1052: <funcsect>Description
1053: <p>
1054: <func/ea_hash()/ takes an extended attribute list and calculated a hopefully
1055: uniformly distributed hash value from its contents.
1056: </function>
1057: <function><p><type>ea_list *</type>
1058: <funcdef>ea_append</funcdef>
1059: (<type>ea_list *</type> <param>to</param>, <type>ea_list *</type> <param>what</param>) -- concatenate <struct/ea_list/'s
1060:
1061: <funcsect>Arguments
1062: <p><descrip>
1063: <tagp><type>ea_list *</type> <param>to</param></tagp>
1064: destination list (can be <const/NULL/)
1065: <tagp><type>ea_list *</type> <param>what</param></tagp>
1066: list to be appended (can be <const/NULL/)
1067: </descrip>
1068: <funcsect>Description
1069: <p>
1070: This function appends the <struct/ea_list/ <param/what/ at the end of
1071: <struct/ea_list/ <param/to/ and returns a pointer to the resulting list.
1072: </function>
1073: <function><p><type>rta *</type>
1074: <funcdef>rta_lookup</funcdef>
1075: (<type>rta *</type> <param>o</param>) -- look up a <struct/rta/ in attribute cache
1076:
1077: <funcsect>Arguments
1078: <p><descrip>
1079: <tagp><type>rta *</type> <param>o</param></tagp>
1080: a un-cached <struct/rta/
1081: </descrip>
1082: <funcsect>Description
1083: <p>
1084: <func/rta_lookup()/ gets an un-cached <struct/rta/ structure and returns its cached
1085: counterpart. It starts with examining the attribute cache to see whether
1086: there exists a matching entry. If such an entry exists, it's returned and
1087: its use count is incremented, else a new entry is created with use count
1088: set to 1.
1089: <p>
1090: The extended attribute lists attached to the <struct/rta/ are automatically
1091: converted to the normalized form.
1092: </function>
1093: <function><p><type>void</type>
1094: <funcdef>rta_dump</funcdef>
1095: (<type>rta *</type> <param>a</param>) -- dump route attributes
1096:
1097: <funcsect>Arguments
1098: <p><descrip>
1099: <tagp><type>rta *</type> <param>a</param></tagp>
1100: attribute structure to dump
1101: </descrip>
1102: <funcsect>Description
1103: <p>
1104: This function takes a <struct/rta/ and dumps its contents to the debug output.
1105: </function>
1106: <function><p><type>void</type>
1107: <funcdef>rta_dump_all</funcdef>
1108: (<param>void</param>) -- dump attribute cache
1109:
1110: <funcsect>Description
1111: <p>
1112: <p>
1113: This function dumps the whole contents of route attribute cache
1114: to the debug output.
1115: </function>
1116: <function><p><type>void</type>
1117: <funcdef>rta_init</funcdef>
1118: (<param>void</param>) -- initialize route attribute cache
1119:
1120: <funcsect>Description
1121: <p>
1122: <p>
1123: This function is called during initialization of the routing
1124: table module to set up the internals of the attribute cache.
1125: </function>
1126: <function><p><type>rta *</type>
1127: <funcdef>rta_clone</funcdef>
1128: (<type>rta *</type> <param>r</param>) -- clone route attributes
1129:
1130: <funcsect>Arguments
1131: <p><descrip>
1132: <tagp><type>rta *</type> <param>r</param></tagp>
1133: a <struct/rta/ to be cloned
1134: </descrip>
1135: <funcsect>Description
1136: <p>
1137: <func/rta_clone()/ takes a cached <struct/rta/ and returns its identical cached
1138: copy. Currently it works by just returning the original <struct/rta/ with
1139: its use count incremented.
1140: </function>
1141: <function><p><type>void</type>
1142: <funcdef>rta_free</funcdef>
1143: (<type>rta *</type> <param>r</param>) -- free route attributes
1144:
1145: <funcsect>Arguments
1146: <p><descrip>
1147: <tagp><type>rta *</type> <param>r</param></tagp>
1148: a <struct/rta/ to be freed
1149: </descrip>
1150: <funcsect>Description
1151: <p>
1152: If you stop using a <struct/rta/ (for example when deleting a route which uses
1153: it), you need to call <func/rta_free()/ to notify the attribute cache the
1154: attribute is no longer in use and can be freed if you were the last
1155: user (which <func/rta_free()/ tests by inspecting the use count).
1156: </function>
1157: <!--
1158: BIRD Programmer's Guide: Protocols
1159:
1160: (c) 2000 Martin Mares <mj@ucw.cz>
1161: -->
1162:
1163: <sect>Routing protocols
1164:
1165: <sect1>Introduction
1166:
1167: <p>The routing protocols are the bird's heart and a fine amount of code
1168: is dedicated to their management and for providing support functions to them.
1169: (-: Actually, this is the reason why the directory with sources of the core
1170: code is called <tt/nest/ :-).
1171:
1172: <p>When talking about protocols, one need to distinguish between <em/protocols/
1173: and protocol <em/instances/. A protocol exists exactly once, not depending on whether
1174: it's configured or not and it can have an arbitrary number of instances corresponding
1175: to its "incarnations" requested by the configuration file. Each instance is completely
1176: autonomous, has its own configuration, its own status, its own set of routes and its
1177: own set of interfaces it works on.
1178:
1179: <p>A protocol is represented by a <struct/protocol/ structure containing all the basic
1180: information (protocol name, default settings and pointers to most of the protocol
1181: hooks). All these structures are linked in the <param/protocol_list/ list.
1182:
1183: <p>Each instance has its own <struct/proto/ structure describing all its properties: protocol
1184: type, configuration, a resource pool where all resources belonging to the instance
1185: live, various protocol attributes (take a look at the declaration of <struct/proto/ in
1186: <tt/protocol.h/), protocol states (see below for what do they mean), connections
1187: to routing tables, filters attached to the protocol
1188: and finally a set of pointers to the rest of protocol hooks (they
1189: are the same for all instances of the protocol, but in order to avoid extra
1190: indirections when calling the hooks from the fast path, they are stored directly
1191: in <struct/proto/). The instance is always linked in both the global instance list
1192: (<param/proto_list/) and a per-status list (either <param/active_proto_list/ for
1193: running protocols, <param/initial_proto_list/ for protocols being initialized or
1194: <param/flush_proto_list/ when the protocol is being shut down).
1195:
1196: <p>The protocol hooks are described in the next chapter, for more information about
1197: configuration of protocols, please refer to the configuration chapter and also
1198: to the description of the <func/proto_commit/ function.
1199:
1200: <sect1>Protocol states
1201:
1202: <p>As startup and shutdown of each protocol are complex processes which can be affected
1203: by lots of external events (user's actions, reconfigurations, behavior of neighboring routers etc.),
1204: we have decided to supervise them by a pair of simple state machines -- the protocol
1205: state machine and a core state machine.
1206:
1207: <p>The <em/protocol state machine/ corresponds to internal state of the protocol
1208: and the protocol can alter its state whenever it wants to. There are
1209: the following states:
1210:
1211: <descrip>
1212: <tag/PS_DOWN/ The protocol is down and waits for being woken up by calling its
1213: start() hook.
1214: <tag/PS_START/ The protocol is waiting for connection with the rest of the
1215: network. It's active, it has resources allocated, but it still doesn't want
1216: any routes since it doesn't know what to do with them.
1217: <tag/PS_UP/ The protocol is up and running. It communicates with the core,
1218: delivers routes to tables and wants to hear announcement about route changes.
1219: <tag/PS_STOP/ The protocol has been shut down (either by being asked by the
1220: core code to do so or due to having encountered a protocol error).
1221: </descrip>
1222:
1223: <p>Unless the protocol is in the <tt/PS_DOWN/ state, it can decide to change
1224: its state by calling the <func/proto_notify_state/ function.
1225:
1226: <p>At any time, the core code can ask the protocol to shut itself down by calling its stop() hook.
1227:
1228: <p>The <em/core state machine/ takes care of the core view of protocol state.
1229: The states are traversed according to changes of the protocol state machine, but
1230: sometimes the transitions are delayed if the core needs to finish some actions
1231: (for example sending of new routes to the protocol) before proceeding to the
1232: new state. There are the following core states:
1233:
1234: <descrip>
1235: <tag/FS_HUNGRY/ The protocol is down, it doesn't have any routes and
1236: doesn't want them.
1237: <tag/FS_FEEDING/ The protocol has reached the <tt/PS_UP/ state, but
1238: we are still busy sending the initial set of routes to it.
1239: <tag/FS_HAPPY/ The protocol is up and has complete routing information.
1240: <tag/FS_FLUSHING/ The protocol is shutting down (it's in either <tt/PS_STOP/
1241: or <tt/PS_DOWN/ state) and we're flushing all of its routes from the
1242: routing tables.
1243: </descrip>
1244:
1245: <sect1>Functions of the protocol module
1246:
1247: <p>The protocol module provides the following functions:
1248: <function><p><type>void *</type>
1249: <funcdef>proto_new</funcdef>
1250: (<type>struct proto_config *</type> <param>c</param>, <type>unsigned</type> <param>size</param>) -- create a new protocol instance
1251:
1252: <funcsect>Arguments
1253: <p><descrip>
1254: <tagp><type>struct proto_config *</type> <param>c</param></tagp>
1255: protocol configuration
1256: <tagp><type>unsigned</type> <param>size</param></tagp>
1257: size of protocol data structure (each protocol instance is represented by
1258: a structure starting with generic part [struct <struct/proto/] and continued
1259: with data specific to the protocol)
1260: </descrip>
1261: <funcsect>Description
1262: <p>
1263: When a new configuration has been read in, the core code starts
1264: initializing all the protocol instances configured by calling their
1265: <func/init()/ hooks with the corresponding instance configuration. The initialization
1266: code of the protocol is expected to create a new instance according to the
1267: configuration by calling this function and then modifying the default settings
1268: to values wanted by the protocol.
1269: </function>
1270: <function><p><type>struct announce_hook *</type>
1271: <funcdef>proto_add_announce_hook</funcdef>
1272: (<type>struct proto *</type> <param>p</param>, <type>struct rtable *</type> <param>t</param>, <type>struct proto_stats *</type> <param>stats</param>) -- connect protocol to a routing table
1273:
1274: <funcsect>Arguments
1275: <p><descrip>
1276: <tagp><type>struct proto *</type> <param>p</param></tagp>
1277: protocol instance
1278: <tagp><type>struct rtable *</type> <param>t</param></tagp>
1279: routing table to connect to
1280: <tagp><type>struct proto_stats *</type> <param>stats</param></tagp>
1281: per-table protocol statistics
1282: </descrip>
1283: <funcsect>Description
1284: <p>
1285: This function creates a connection between the protocol instance <param/p/ and the
1286: routing table <param/t/, making the protocol hear all changes in the table.
1287: <p>
1288: The announce hook is linked in the protocol ahook list. Announce hooks are
1289: allocated from the routing table resource pool and when protocol accepts
1290: routes also in the table ahook list. The are linked to the table ahook list
1291: and unlinked from it depending on export_state (in <func/proto_want_export_up()/ and
1292: <func/proto_want_export_down()/) and they are automatically freed after the protocol
1293: is flushed (in <func/proto_fell_down()/).
1294: <p>
1295: Unless you want to listen to multiple routing tables (as the Pipe protocol
1296: does), you needn't to worry about this function since the connection to the
1297: protocol's primary routing table is initialized automatically by the core
1298: code.
1299: </function>
1300: <function><p><type>struct announce_hook *</type>
1301: <funcdef>proto_find_announce_hook</funcdef>
1302: (<type>struct proto *</type> <param>p</param>, <type>struct rtable *</type> <param>t</param>) -- find announce hooks
1303:
1304: <funcsect>Arguments
1305: <p><descrip>
1306: <tagp><type>struct proto *</type> <param>p</param></tagp>
1307: protocol instance
1308: <tagp><type>struct rtable *</type> <param>t</param></tagp>
1309: routing table
1310: </descrip>
1311: <funcsect>Description
1312: <p>
1313: Returns pointer to announce hook or NULL
1314: </function>
1315: <function><p><type>void *</type>
1316: <funcdef>proto_config_new</funcdef>
1317: (<type>struct protocol *</type> <param>pr</param>, <type>int</type> <param>class</param>) -- create a new protocol configuration
1318:
1319: <funcsect>Arguments
1320: <p><descrip>
1321: <tagp><type>struct protocol *</type> <param>pr</param></tagp>
1322: protocol the configuration will belong to
1323: <tagp><type>int</type> <param>class</param></tagp>
1324: SYM_PROTO or SYM_TEMPLATE
1325: </descrip>
1326: <funcsect>Description
1327: <p>
1328: Whenever the configuration file says that a new instance
1329: of a routing protocol should be created, the parser calls
1330: <func/proto_config_new()/ to create a configuration entry for this
1331: instance (a structure staring with the <struct/proto_config/ header
1332: containing all the generic items followed by protocol-specific
1333: ones). Also, the configuration entry gets added to the list
1334: of protocol instances kept in the configuration.
1335: <p>
1336: The function is also used to create protocol templates (when class
1337: SYM_TEMPLATE is specified), the only difference is that templates
1338: are not added to the list of protocol instances and therefore not
1339: initialized during <func/protos_commit()/).
1340: </function>
1341: <function><p><type>void</type>
1342: <funcdef>proto_copy_config</funcdef>
1343: (<type>struct proto_config *</type> <param>dest</param>, <type>struct proto_config *</type> <param>src</param>) -- copy a protocol configuration
1344:
1345: <funcsect>Arguments
1346: <p><descrip>
1347: <tagp><type>struct proto_config *</type> <param>dest</param></tagp>
1348: destination protocol configuration
1349: <tagp><type>struct proto_config *</type> <param>src</param></tagp>
1350: source protocol configuration
1351: </descrip>
1352: <funcsect>Description
1353: <p>
1354: Whenever a new instance of a routing protocol is created from the
1355: template, <func/proto_copy_config()/ is called to copy a content of
1356: the source protocol configuration to the new protocol configuration.
1357: Name, class and a node in protos list of <param/dest/ are kept intact.
1358: <func/copy_config()/ protocol hook is used to copy protocol-specific data.
1359: </function>
1360: <function><p><type>void</type>
1361: <funcdef>protos_preconfig</funcdef>
1362: (<type>struct config *</type> <param>c</param>) -- pre-configuration processing
1363:
1364: <funcsect>Arguments
1365: <p><descrip>
1366: <tagp><type>struct config *</type> <param>c</param></tagp>
1367: new configuration
1368: </descrip>
1369: <funcsect>Description
1370: <p>
1371: This function calls the <func/preconfig()/ hooks of all routing
1372: protocols available to prepare them for reading of the new
1373: configuration.
1374: </function>
1375: <function><p><type>void</type>
1376: <funcdef>protos_postconfig</funcdef>
1377: (<type>struct config *</type> <param>c</param>) -- post-configuration processing
1378:
1379: <funcsect>Arguments
1380: <p><descrip>
1381: <tagp><type>struct config *</type> <param>c</param></tagp>
1382: new configuration
1383: </descrip>
1384: <funcsect>Description
1385: <p>
1386: This function calls the <func/postconfig()/ hooks of all protocol
1387: instances specified in configuration <param/c/. The hooks are not
1388: called for protocol templates.
1389: </function>
1390: <function><p><type>void</type>
1391: <funcdef>protos_commit</funcdef>
1392: (<type>struct config *</type> <param>new</param>, <type>struct config *</type> <param>old</param>, <type>int</type> <param>force_reconfig</param>, <type>int</type> <param>type</param>) -- commit new protocol configuration
1393:
1394: <funcsect>Arguments
1395: <p><descrip>
1396: <tagp><type>struct config *</type> <param>new</param></tagp>
1397: new configuration
1398: <tagp><type>struct config *</type> <param>old</param></tagp>
1399: old configuration or <const/NULL/ if it's boot time config
1400: <tagp><type>int</type> <param>force_reconfig</param></tagp>
1401: force restart of all protocols (used for example
1402: when the router ID changes)
1403: <tagp><type>int</type> <param>type</param></tagp>
1404: type of reconfiguration (RECONFIG_SOFT or RECONFIG_HARD)
1405: </descrip>
1406: <funcsect>Description
1407: <p>
1408: Scan differences between <param/old/ and <param/new/ configuration and adjust all
1409: protocol instances to conform to the new configuration.
1410: <p>
1411: When a protocol exists in the new configuration, but it doesn't in the
1412: original one, it's immediately started. When a collision with the other
1413: running protocol would arise, the new protocol will be temporarily stopped
1414: by the locking mechanism.
1415: <p>
1416: When a protocol exists in the old configuration, but it doesn't in the
1417: new one, it's shut down and deleted after the shutdown completes.
1418: <p>
1419: When a protocol exists in both configurations, the core decides
1420: whether it's possible to reconfigure it dynamically - it checks all
1421: the core properties of the protocol (changes in filters are ignored
1422: if type is RECONFIG_SOFT) and if they match, it asks the
1423: <func/reconfigure()/ hook of the protocol to see if the protocol is able
1424: to switch to the new configuration. If it isn't possible, the
1425: protocol is shut down and a new instance is started with the new
1426: configuration after the shutdown is completed.
1427: </function>
1428: <sect>Graceful restart recovery
1429: <p>
1430: <p>
1431: Graceful restart of a router is a process when the routing plane (e.g. BIRD)
1432: restarts but both the forwarding plane (e.g kernel routing table) and routing
1433: neighbors keep proper routes, and therefore uninterrupted packet forwarding
1434: is maintained.
1435: <p>
1436: BIRD implements graceful restart recovery by deferring export of routes to
1437: protocols until routing tables are refilled with the expected content. After
1438: start, protocols generate routes as usual, but routes are not propagated to
1439: them, until protocols report that they generated all routes. After that,
1440: graceful restart recovery is finished and the export (and the initial feed)
1441: to protocols is enabled.
1442: <p>
1443: When graceful restart recovery need is detected during initialization, then
1444: enabled protocols are marked with <param/gr_recovery/ flag before start. Such
1445: protocols then decide how to proceed with graceful restart, participation is
1446: voluntary. Protocols could lock the recovery by <func/proto_graceful_restart_lock()/
1447: (stored in <param/gr_lock/ flag), which means that they want to postpone the end of
1448: the recovery until they converge and then unlock it. They also could set
1449: <param/gr_wait/ before advancing to <const/PS_UP/, which means that the core should defer
1450: route export to that protocol until the end of the recovery. This should be
1451: done by protocols that expect their neigbors to keep the proper routes
1452: (kernel table, BGP sessions with BGP graceful restart capability).
1453: <p>
1454: The graceful restart recovery is finished when either all graceful restart
1455: locks are unlocked or when graceful restart wait timer fires.
1456:
1457:
1458: <function><p><type>void</type>
1459: <funcdef>graceful_restart_recovery</funcdef>
1460: (<param>void</param>) -- request initial graceful restart recovery
1461:
1462: <funcsect>Graceful restart recovery
1463: <p>
1464: <p>
1465: Called by the platform initialization code if the need for recovery
1466: after graceful restart is detected during boot. Have to be called
1467: before <func/protos_commit()/.
1468: </function>
1469: <function><p><type>void</type>
1470: <funcdef>graceful_restart_init</funcdef>
1471: (<param>void</param>) -- initialize graceful restart
1472:
1473: <funcsect>Description
1474: <p>
1475: <p>
1476: When graceful restart recovery was requested, the function starts an active
1477: phase of the recovery and initializes graceful restart wait timer. The
1478: function have to be called after <func/protos_commit()/.
1479: </function>
1480: <function><p><type>void</type>
1481: <funcdef>graceful_restart_done</funcdef>
1482: (<type>struct timer *t</type> <param>UNUSED</param>) -- finalize graceful restart
1483:
1484: <funcsect>Arguments
1485: <p><descrip>
1486: <tagp><type>struct timer *t</type> <param>UNUSED</param></tagp>
1487: -- undescribed --
1488: </descrip>
1489: <funcsect>Description
1490: <p>
1491: When there are no locks on graceful restart, the functions finalizes the
1492: graceful restart recovery. Protocols postponing route export until the end of
1493: the recovery are awakened and the export to them is enabled. All other
1494: related state is cleared. The function is also called when the graceful
1495: restart wait timer fires (but there are still some locks).
1496: </function>
1497: <function><p><type>void</type>
1498: <funcdef>proto_graceful_restart_lock</funcdef>
1499: (<type>struct proto *</type> <param>p</param>) -- lock graceful restart by protocol
1500:
1501: <funcsect>Arguments
1502: <p><descrip>
1503: <tagp><type>struct proto *</type> <param>p</param></tagp>
1504: protocol instance
1505: </descrip>
1506: <funcsect>Description
1507: <p>
1508: This function allows a protocol to postpone the end of graceful restart
1509: recovery until it converges. The lock is removed when the protocol calls
1510: <func/proto_graceful_restart_unlock()/ or when the protocol is stopped.
1511: <p>
1512: The function have to be called during the initial phase of graceful restart
1513: recovery and only for protocols that are part of graceful restart (i.e. their
1514: <param/gr_recovery/ is set), which means it should be called from protocol start
1515: hooks.
1516: </function>
1517: <function><p><type>void</type>
1518: <funcdef>proto_graceful_restart_unlock</funcdef>
1519: (<type>struct proto *</type> <param>p</param>) -- unlock graceful restart by protocol
1520:
1521: <funcsect>Arguments
1522: <p><descrip>
1523: <tagp><type>struct proto *</type> <param>p</param></tagp>
1524: protocol instance
1525: </descrip>
1526: <funcsect>Description
1527: <p>
1528: This function unlocks a lock from <func/proto_graceful_restart_lock()/. It is also
1529: automatically called when the lock holding protocol went down.
1530: </function>
1531: <function><p><type>void</type>
1532: <funcdef>protos_dump_all</funcdef>
1533: (<param>void</param>) -- dump status of all protocols
1534:
1535: <funcsect>Description
1536: <p>
1537: <p>
1538: This function dumps status of all existing protocol instances to the
1539: debug output. It involves printing of general status information
1540: such as protocol states, its position on the protocol lists
1541: and also calling of a <func/dump()/ hook of the protocol to print
1542: the internals.
1543: </function>
1544: <function><p><type>void</type>
1545: <funcdef>proto_build</funcdef>
1546: (<type>struct protocol *</type> <param>p</param>) -- make a single protocol available
1547:
1548: <funcsect>Arguments
1549: <p><descrip>
1550: <tagp><type>struct protocol *</type> <param>p</param></tagp>
1551: the protocol
1552: </descrip>
1553: <funcsect>Description
1554: <p>
1555: After the platform specific initialization code uses <func/protos_build()/
1556: to add all the standard protocols, it should call <func/proto_build()/ for
1557: all platform specific protocols to inform the core that they exist.
1558: </function>
1559: <function><p><type>void</type>
1560: <funcdef>protos_build</funcdef>
1561: (<param>void</param>) -- build a protocol list
1562:
1563: <funcsect>Description
1564: <p>
1565: <p>
1566: This function is called during BIRD startup to insert
1567: all standard protocols to the global protocol list. Insertion
1568: of platform specific protocols (such as the kernel syncer)
1569: is in the domain of competence of the platform dependent
1570: startup code.
1571: </function>
1572: <function><p><type>void</type>
1573: <funcdef>proto_set_message</funcdef>
1574: (<type>struct proto *</type> <param>p</param>, <type>char *</type> <param>msg</param>, <type>int</type> <param>len</param>) -- set administrative message to protocol
1575:
1576: <funcsect>Arguments
1577: <p><descrip>
1578: <tagp><type>struct proto *</type> <param>p</param></tagp>
1579: protocol
1580: <tagp><type>char *</type> <param>msg</param></tagp>
1581: message
1582: <tagp><type>int</type> <param>len</param></tagp>
1583: message length (-1 for NULL-terminated string)
1584: </descrip>
1585: <funcsect>Description
1586: <p>
1587: The function sets administrative message (string) related to protocol state
1588: change. It is called by the nest code for manual enable/disable/restart
1589: commands all routes to the protocol, and by protocol-specific code when the
1590: protocol state change is initiated by the protocol. Using NULL message clears
1591: the last message. The message string may be either NULL-terminated or with an
1592: explicit length.
1593: </function>
1594: <function><p><type>void</type>
1595: <funcdef>proto_request_feeding</funcdef>
1596: (<type>struct proto *</type> <param>p</param>) -- request feeding routes to the protocol
1597:
1598: <funcsect>Arguments
1599: <p><descrip>
1600: <tagp><type>struct proto *</type> <param>p</param></tagp>
1601: given protocol
1602: </descrip>
1603: <funcsect>Description
1604: <p>
1605: Sometimes it is needed to send again all routes to the
1606: protocol. This is called feeding and can be requested by this
1607: function. This would cause protocol export state transition
1608: to ES_FEEDING (during feeding) and when completed, it will
1609: switch back to ES_READY. This function can be called even
1610: when feeding is already running, in that case it is restarted.
1611: </function>
1612: <function><p><type>void</type>
1613: <funcdef>proto_notify_limit</funcdef>
1614: (<type>struct announce_hook *</type> <param>ah</param>, <type>struct proto_limit *</type> <param>l</param>, <type>int</type> <param>dir</param>, <type>u32</type> <param>rt_count</param>)
1615: <funcsect>Arguments
1616: <p><descrip>
1617: <tagp><type>struct announce_hook *</type> <param>ah</param></tagp>
1618: announce hook
1619: <tagp><type>struct proto_limit *</type> <param>l</param></tagp>
1620: limit being hit
1621: <tagp><type>int</type> <param>dir</param></tagp>
1622: limit direction (PLD_*)
1623: <tagp><type>u32</type> <param>rt_count</param></tagp>
1624: the number of routes
1625: </descrip>
1626: <funcsect>Description
1627: <p>
1628: The function is called by the route processing core when limit <param/l/
1629: is breached. It activates the limit and tooks appropriate action
1630: according to <param/l/->action.
1631: </function>
1632: <function><p><type>void</type>
1633: <funcdef>proto_notify_state</funcdef>
1634: (<type>struct proto *</type> <param>p</param>, <type>unsigned</type> <param>ps</param>) -- notify core about protocol state change
1635:
1636: <funcsect>Arguments
1637: <p><descrip>
1638: <tagp><type>struct proto *</type> <param>p</param></tagp>
1639: protocol the state of which has changed
1640: <tagp><type>unsigned</type> <param>ps</param></tagp>
1641: the new status
1642: </descrip>
1643: <funcsect>Description
1644: <p>
1645: Whenever a state of a protocol changes due to some event internal
1646: to the protocol (i.e., not inside a <func/start()/ or <func/shutdown()/ hook),
1647: it should immediately notify the core about the change by calling
1648: <func/proto_notify_state()/ which will write the new state to the <struct/proto/
1649: structure and take all the actions necessary to adapt to the new
1650: state. State change to PS_DOWN immediately frees resources of protocol
1651: and might execute start callback of protocol; therefore,
1652: it should be used at tail positions of protocol callbacks.
1653: </function>
1654: <sect>Protocol hooks
1655: <p>
1656: <p>
1657: Each protocol can provide a rich set of hook functions referred to by pointers
1658: in either the <struct/proto/ or <struct/protocol/ structure. They are called by the core whenever
1659: it wants the protocol to perform some action or to notify the protocol about
1660: any change of its environment. All of the hooks can be set to <const/NULL/ which means
1661: to ignore the change or to take a default action.
1662:
1663:
1664: <function><p><type>void</type>
1665: <funcdef>preconfig</funcdef>
1666: (<type>struct protocol *</type> <param>p</param>, <type>struct config *</type> <param>c</param>) -- protocol preconfiguration
1667:
1668: <funcsect>Arguments
1669: <p><descrip>
1670: <tagp><type>struct protocol *</type> <param>p</param></tagp>
1671: a routing protocol
1672: <tagp><type>struct config *</type> <param>c</param></tagp>
1673: new configuration
1674: </descrip>
1675: <funcsect>Description
1676: <p>
1677: The <func/preconfig()/ hook is called before parsing of a new configuration.
1678: </function>
1679: <function><p><type>void</type>
1680: <funcdef>postconfig</funcdef>
1681: (<type>struct proto_config *</type> <param>c</param>) -- instance post-configuration
1682:
1683: <funcsect>Arguments
1684: <p><descrip>
1685: <tagp><type>struct proto_config *</type> <param>c</param></tagp>
1686: instance configuration
1687: </descrip>
1688: <funcsect>Description
1689: <p>
1690: The <func/postconfig()/ hook is called for each configured instance after
1691: parsing of the new configuration is finished.
1692: </function>
1693: <function><p><type>struct proto *</type>
1694: <funcdef>init</funcdef>
1695: (<type>struct proto_config *</type> <param>c</param>) -- initialize an instance
1696:
1697: <funcsect>Arguments
1698: <p><descrip>
1699: <tagp><type>struct proto_config *</type> <param>c</param></tagp>
1700: instance configuration
1701: </descrip>
1702: <funcsect>Description
1703: <p>
1704: The <func/init()/ hook is called by the core to create a protocol instance
1705: according to supplied protocol configuration.
1706: <funcsect>Result
1707: <p>
1708: a pointer to the instance created
1709: </function>
1710: <function><p><type>int</type>
1711: <funcdef>reconfigure</funcdef>
1712: (<type>struct proto *</type> <param>p</param>, <type>struct proto_config *</type> <param>c</param>) -- request instance reconfiguration
1713:
1714: <funcsect>Arguments
1715: <p><descrip>
1716: <tagp><type>struct proto *</type> <param>p</param></tagp>
1717: an instance
1718: <tagp><type>struct proto_config *</type> <param>c</param></tagp>
1719: new configuration
1720: </descrip>
1721: <funcsect>Description
1722: <p>
1723: The core calls the <func/reconfigure()/ hook whenever it wants to ask the
1724: protocol for switching to a new configuration. If the reconfiguration
1725: is possible, the hook returns 1. Otherwise, it returns 0 and the core
1726: will shut down the instance and start a new one with the new configuration.
1727: <p>
1728: After the protocol confirms reconfiguration, it must no longer keep any
1729: references to the old configuration since the memory it's stored in can
1730: be re-used at any time.
1731: </function>
1732: <function><p><type>void</type>
1733: <funcdef>dump</funcdef>
1734: (<type>struct proto *</type> <param>p</param>) -- dump protocol state
1735:
1736: <funcsect>Arguments
1737: <p><descrip>
1738: <tagp><type>struct proto *</type> <param>p</param></tagp>
1739: an instance
1740: </descrip>
1741: <funcsect>Description
1742: <p>
1743: This hook dumps the complete state of the instance to the
1744: debug output.
1745: </function>
1746: <function><p><type>void</type>
1747: <funcdef>dump_attrs</funcdef>
1748: (<type>rte *</type> <param>e</param>) -- dump protocol-dependent attributes
1749:
1750: <funcsect>Arguments
1751: <p><descrip>
1752: <tagp><type>rte *</type> <param>e</param></tagp>
1753: a route entry
1754: </descrip>
1755: <funcsect>Description
1756: <p>
1757: This hook dumps all attributes in the <struct/rte/ which belong to this
1758: protocol to the debug output.
1759: </function>
1760: <function><p><type>int</type>
1761: <funcdef>start</funcdef>
1762: (<type>struct proto *</type> <param>p</param>) -- request instance startup
1763:
1764: <funcsect>Arguments
1765: <p><descrip>
1766: <tagp><type>struct proto *</type> <param>p</param></tagp>
1767: protocol instance
1768: </descrip>
1769: <funcsect>Description
1770: <p>
1771: The <func/start()/ hook is called by the core when it wishes to start
1772: the instance. Multitable protocols should lock their tables here.
1773: <funcsect>Result
1774: <p>
1775: new protocol state
1776: </function>
1777: <function><p><type>int</type>
1778: <funcdef>shutdown</funcdef>
1779: (<type>struct proto *</type> <param>p</param>) -- request instance shutdown
1780:
1781: <funcsect>Arguments
1782: <p><descrip>
1783: <tagp><type>struct proto *</type> <param>p</param></tagp>
1784: protocol instance
1785: </descrip>
1786: <funcsect>Description
1787: <p>
1788: The <func/stop()/ hook is called by the core when it wishes to shut
1789: the instance down for some reason.
1790: <funcsect>Returns
1791: <p>
1792: new protocol state
1793: </function>
1794: <function><p><type>void</type>
1795: <funcdef>cleanup</funcdef>
1796: (<type>struct proto *</type> <param>p</param>) -- request instance cleanup
1797:
1798: <funcsect>Arguments
1799: <p><descrip>
1800: <tagp><type>struct proto *</type> <param>p</param></tagp>
1801: protocol instance
1802: </descrip>
1803: <funcsect>Description
1804: <p>
1805: The <func/cleanup()/ hook is called by the core when the protocol became
1806: hungry/down, i.e. all protocol ahooks and routes are flushed.
1807: Multitable protocols should unlock their tables here.
1808: </function>
1809: <function><p><type>void</type>
1810: <funcdef>get_status</funcdef>
1811: (<type>struct proto *</type> <param>p</param>, <type>byte *</type> <param>buf</param>) -- get instance status
1812:
1813: <funcsect>Arguments
1814: <p><descrip>
1815: <tagp><type>struct proto *</type> <param>p</param></tagp>
1816: protocol instance
1817: <tagp><type>byte *</type> <param>buf</param></tagp>
1818: buffer to be filled with the status string
1819: </descrip>
1820: <funcsect>Description
1821: <p>
1822: This hook is called by the core if it wishes to obtain an brief one-line user friendly
1823: representation of the status of the instance to be printed by the <cf/show protocols/
1824: command.
1825: </function>
1826: <function><p><type>void</type>
1827: <funcdef>get_route_info</funcdef>
1828: (<type>rte *</type> <param>e</param>, <type>byte *</type> <param>buf</param>, <type>ea_list *</type> <param>attrs</param>) -- get route information
1829:
1830: <funcsect>Arguments
1831: <p><descrip>
1832: <tagp><type>rte *</type> <param>e</param></tagp>
1833: a route entry
1834: <tagp><type>byte *</type> <param>buf</param></tagp>
1835: buffer to be filled with the resulting string
1836: <tagp><type>ea_list *</type> <param>attrs</param></tagp>
1837: extended attributes of the route
1838: </descrip>
1839: <funcsect>Description
1840: <p>
1841: This hook is called to fill the buffer <param/buf/ with a brief user friendly
1842: representation of metrics of a route belonging to this protocol.
1843: </function>
1844: <function><p><type>int</type>
1845: <funcdef>get_attr</funcdef>
1846: (<type>eattr *</type> <param>a</param>, <type>byte *</type> <param>buf</param>, <type>int</type> <param>buflen</param>) -- get attribute information
1847:
1848: <funcsect>Arguments
1849: <p><descrip>
1850: <tagp><type>eattr *</type> <param>a</param></tagp>
1851: an extended attribute
1852: <tagp><type>byte *</type> <param>buf</param></tagp>
1853: buffer to be filled with attribute information
1854: <tagp><type>int</type> <param>buflen</param></tagp>
1855: a length of the <param/buf/ parameter
1856: </descrip>
1857: <funcsect>Description
1858: <p>
1859: The <func/get_attr()/ hook is called by the core to obtain a user friendly
1860: representation of an extended route attribute. It can either leave
1861: the whole conversion to the core (by returning <const/GA_UNKNOWN/), fill
1862: in only attribute name (and let the core format the attribute value
1863: automatically according to the type field; by returning <const/GA_NAME/)
1864: or doing the whole conversion (used in case the value requires extra
1865: care; return <const/GA_FULL/).
1866: </function>
1867: <function><p><type>void</type>
1868: <funcdef>if_notify</funcdef>
1869: (<type>struct proto *</type> <param>p</param>, <type>unsigned</type> <param>flags</param>, <type>struct iface *</type> <param>i</param>) -- notify instance about interface changes
1870:
1871: <funcsect>Arguments
1872: <p><descrip>
1873: <tagp><type>struct proto *</type> <param>p</param></tagp>
1874: protocol instance
1875: <tagp><type>unsigned</type> <param>flags</param></tagp>
1876: interface change flags
1877: <tagp><type>struct iface *</type> <param>i</param></tagp>
1878: the interface in question
1879: </descrip>
1880: <funcsect>Description
1881: <p>
1882: This hook is called whenever any network interface changes its status.
1883: The change is described by a combination of status bits (<const/IF_CHANGE_xxx/)
1884: in the <param/flags/ parameter.
1885: </function>
1886: <function><p><type>void</type>
1887: <funcdef>ifa_notify</funcdef>
1888: (<type>struct proto *</type> <param>p</param>, <type>unsigned</type> <param>flags</param>, <type>struct ifa *</type> <param>a</param>) -- notify instance about interface address changes
1889:
1890: <funcsect>Arguments
1891: <p><descrip>
1892: <tagp><type>struct proto *</type> <param>p</param></tagp>
1893: protocol instance
1894: <tagp><type>unsigned</type> <param>flags</param></tagp>
1895: address change flags
1896: <tagp><type>struct ifa *</type> <param>a</param></tagp>
1897: the interface address
1898: </descrip>
1899: <funcsect>Description
1900: <p>
1901: This hook is called to notify the protocol instance about an interface
1902: acquiring or losing one of its addresses. The change is described by
1903: a combination of status bits (<const/IF_CHANGE_xxx/) in the <param/flags/ parameter.
1904: </function>
1905: <function><p><type>void</type>
1906: <funcdef>rt_notify</funcdef>
1907: (<type>struct proto *</type> <param>p</param>, <type>net *</type> <param>net</param>, <type>rte *</type> <param>new</param>, <type>rte *</type> <param>old</param>, <type>ea_list *</type> <param>attrs</param>) -- notify instance about routing table change
1908:
1909: <funcsect>Arguments
1910: <p><descrip>
1911: <tagp><type>struct proto *</type> <param>p</param></tagp>
1912: protocol instance
1913: <tagp><type>net *</type> <param>net</param></tagp>
1914: a network entry
1915: <tagp><type>rte *</type> <param>new</param></tagp>
1916: new route for the network
1917: <tagp><type>rte *</type> <param>old</param></tagp>
1918: old route for the network
1919: <tagp><type>ea_list *</type> <param>attrs</param></tagp>
1920: extended attributes associated with the <param/new/ entry
1921: </descrip>
1922: <funcsect>Description
1923: <p>
1924: The <func/rt_notify()/ hook is called to inform the protocol instance about
1925: changes in the connected routing table <param/table/, that is a route <param/old/
1926: belonging to network <param/net/ being replaced by a new route <param/new/ with
1927: extended attributes <param/attrs/. Either <param/new/ or <param/old/ or both can be <const/NULL/
1928: if the corresponding route doesn't exist.
1929: <p>
1930: If the type of route announcement is RA_OPTIMAL, it is an
1931: announcement of optimal route change, <param/new/ stores the new optimal
1932: route and <param/old/ stores the old optimal route.
1933: <p>
1934: If the type of route announcement is RA_ANY, it is an announcement
1935: of any route change, <param/new/ stores the new route and <param/old/ stores the
1936: old route from the same protocol.
1937: <p>
1938: <param/p/->accept_ra_types specifies which kind of route announcements
1939: protocol wants to receive.
1940: </function>
1941: <function><p><type>void</type>
1942: <funcdef>neigh_notify</funcdef>
1943: (<type>neighbor *</type> <param>neigh</param>) -- notify instance about neighbor status change
1944:
1945: <funcsect>Arguments
1946: <p><descrip>
1947: <tagp><type>neighbor *</type> <param>neigh</param></tagp>
1948: a neighbor cache entry
1949: </descrip>
1950: <funcsect>Description
1951: <p>
1952: The <func/neigh_notify()/ hook is called by the neighbor cache whenever
1953: a neighbor changes its state, that is it gets disconnected or a
1954: sticky neighbor gets connected.
1955: </function>
1956: <function><p><type>ea_list *</type>
1957: <funcdef>make_tmp_attrs</funcdef>
1958: (<type>rte *</type> <param>e</param>, <type>struct linpool *</type> <param>pool</param>) -- convert embedded attributes to temporary ones
1959:
1960: <funcsect>Arguments
1961: <p><descrip>
1962: <tagp><type>rte *</type> <param>e</param></tagp>
1963: route entry
1964: <tagp><type>struct linpool *</type> <param>pool</param></tagp>
1965: linear pool to allocate attribute memory in
1966: </descrip>
1967: <funcsect>Description
1968: <p>
1969: This hook is called by the routing table functions if they need
1970: to convert the protocol attributes embedded directly in the <struct/rte/
1971: to temporary extended attributes in order to distribute them
1972: to other protocols or to filters. <func/make_tmp_attrs()/ creates
1973: an <struct/ea_list/ in the linear pool <param/pool/, fills it with values of the
1974: temporary attributes and returns a pointer to it.
1975: </function>
1976: <function><p><type>void</type>
1977: <funcdef>store_tmp_attrs</funcdef>
1978: (<type>rte *</type> <param>e</param>, <type>ea_list *</type> <param>attrs</param>) -- convert temporary attributes to embedded ones
1979:
1980: <funcsect>Arguments
1981: <p><descrip>
1982: <tagp><type>rte *</type> <param>e</param></tagp>
1983: route entry
1984: <tagp><type>ea_list *</type> <param>attrs</param></tagp>
1985: temporary attributes to be converted
1986: </descrip>
1987: <funcsect>Description
1988: <p>
1989: This hook is an exact opposite of <func/make_tmp_attrs()/ -- it takes
1990: a list of extended attributes and converts them to attributes
1991: embedded in the <struct/rte/ corresponding to this protocol.
1992: <p>
1993: You must be prepared for any of the attributes being missing
1994: from the list and use default values instead.
1995: </function>
1996: <function><p><type>int</type>
1997: <funcdef>import_control</funcdef>
1998: (<type>struct proto *</type> <param>p</param>, <type>rte **</type> <param>e</param>, <type>ea_list **</type> <param>attrs</param>, <type>struct linpool *</type> <param>pool</param>) -- pre-filtering decisions on route import
1999:
2000: <funcsect>Arguments
2001: <p><descrip>
2002: <tagp><type>struct proto *</type> <param>p</param></tagp>
2003: protocol instance the route is going to be imported to
2004: <tagp><type>rte **</type> <param>e</param></tagp>
2005: the route in question
2006: <tagp><type>ea_list **</type> <param>attrs</param></tagp>
2007: extended attributes of the route
2008: <tagp><type>struct linpool *</type> <param>pool</param></tagp>
2009: linear pool for allocation of all temporary data
2010: </descrip>
2011: <funcsect>Description
2012: <p>
2013: The <func/import_control()/ hook is called as the first step of a exporting
2014: a route from a routing table to the protocol instance. It can modify
2015: route attributes and force acceptance or rejection of the route regardless
2016: of user-specified filters. See <func/rte_announce()/ for a complete description
2017: of the route distribution process.
2018: <p>
2019: The standard use of this hook is to reject routes having originated
2020: from the same instance and to set default values of the protocol's metrics.
2021: <funcsect>Result
2022: <p>
2023: 1 if the route has to be accepted, -1 if rejected and 0 if it
2024: should be passed to the filters.
2025: </function>
2026: <function><p><type>int</type>
2027: <funcdef>rte_recalculate</funcdef>
2028: (<type>struct rtable *</type> <param>table</param>, <type>struct network *</type> <param>net</param>, <type>struct rte *</type> <param>new</param>, <type>struct rte *</type> <param>old</param>, <type>struct rte *</type> <param>old_best</param>) -- prepare routes for comparison
2029:
2030: <funcsect>Arguments
2031: <p><descrip>
2032: <tagp><type>struct rtable *</type> <param>table</param></tagp>
2033: a routing table
2034: <tagp><type>struct network *</type> <param>net</param></tagp>
2035: a network entry
2036: <tagp><type>struct rte *</type> <param>new</param></tagp>
2037: new route for the network
2038: <tagp><type>struct rte *</type> <param>old</param></tagp>
2039: old route for the network
2040: <tagp><type>struct rte *</type> <param>old_best</param></tagp>
2041: old best route for the network (may be NULL)
2042: </descrip>
2043: <funcsect>Description
2044: <p>
2045: This hook is called when a route change (from <param/old/ to <param/new/ for a
2046: <param/net/ entry) is propagated to a <param/table/. It may be used to prepare
2047: routes for comparison by <func/rte_better()/ in the best route
2048: selection. <param/new/ may or may not be in <param/net/->routes list,
2049: <param/old/ is not there.
2050: <funcsect>Result
2051: <p>
2052: 1 if the ordering implied by <func/rte_better()/ changes enough
2053: that full best route calculation have to be done, 0 otherwise.
2054: </function>
2055: <function><p><type>int</type>
2056: <funcdef>rte_better</funcdef>
2057: (<type>rte *</type> <param>new</param>, <type>rte *</type> <param>old</param>) -- compare metrics of two routes
2058:
2059: <funcsect>Arguments
2060: <p><descrip>
2061: <tagp><type>rte *</type> <param>new</param></tagp>
2062: the new route
2063: <tagp><type>rte *</type> <param>old</param></tagp>
2064: the original route
2065: </descrip>
2066: <funcsect>Description
2067: <p>
2068: This hook gets called when the routing table contains two routes
2069: for the same network which have originated from different instances
2070: of a single protocol and it wants to select which one is preferred
2071: over the other one. Protocols usually decide according to route metrics.
2072: <funcsect>Result
2073: <p>
2074: 1 if <param/new/ is better (more preferred) than <param/old/, 0 otherwise.
2075: </function>
2076: <function><p><type>int</type>
2077: <funcdef>rte_same</funcdef>
2078: (<type>rte *</type> <param>e1</param>, <type>rte *</type> <param>e2</param>) -- compare two routes
2079:
2080: <funcsect>Arguments
2081: <p><descrip>
2082: <tagp><type>rte *</type> <param>e1</param></tagp>
2083: route
2084: <tagp><type>rte *</type> <param>e2</param></tagp>
2085: route
2086: </descrip>
2087: <funcsect>Description
2088: <p>
2089: The <func/rte_same()/ hook tests whether the routes <param/e1/ and <param/e2/ belonging
2090: to the same protocol instance have identical contents. Contents of
2091: <struct/rta/, all the extended attributes and <struct/rte/ preference are checked
2092: by the core code, no need to take care of them here.
2093: <funcsect>Result
2094: <p>
2095: 1 if <param/e1/ is identical to <param/e2/, 0 otherwise.
2096: </function>
2097: <function><p><type>void</type>
2098: <funcdef>rte_insert</funcdef>
2099: (<type>net *</type> <param>n</param>, <type>rte *</type> <param>e</param>) -- notify instance about route insertion
2100:
2101: <funcsect>Arguments
2102: <p><descrip>
2103: <tagp><type>net *</type> <param>n</param></tagp>
2104: network
2105: <tagp><type>rte *</type> <param>e</param></tagp>
2106: route
2107: </descrip>
2108: <funcsect>Description
2109: <p>
2110: This hook is called whenever a <struct/rte/ belonging to the instance
2111: is accepted for insertion to a routing table.
2112: <p>
2113: Please avoid using this function in new protocols.
2114: </function>
2115: <function><p><type>void</type>
2116: <funcdef>rte_remove</funcdef>
2117: (<type>net *</type> <param>n</param>, <type>rte *</type> <param>e</param>) -- notify instance about route removal
2118:
2119: <funcsect>Arguments
2120: <p><descrip>
2121: <tagp><type>net *</type> <param>n</param></tagp>
2122: network
2123: <tagp><type>rte *</type> <param>e</param></tagp>
2124: route
2125: </descrip>
2126: <funcsect>Description
2127: <p>
2128: This hook is called whenever a <struct/rte/ belonging to the instance
2129: is removed from a routing table.
2130: <p>
2131: Please avoid using this function in new protocols.
2132: </function>
2133: <sect>Interfaces
2134: <p>
2135: <p>
2136: The interface module keeps track of all network interfaces in the
2137: system and their addresses.
2138: <p>
2139: Each interface is represented by an <struct/iface/ structure which carries
2140: interface capability flags (<const/IF_MULTIACCESS/, <const/IF_BROADCAST/ etc.),
2141: MTU, interface name and index and finally a linked list of network
2142: prefixes assigned to the interface, each one represented by
2143: struct <struct/ifa/.
2144: <p>
2145: The interface module keeps a `soft-up' state for each <struct/iface/ which
2146: is a conjunction of link being up, the interface being of a `sane'
2147: type and at least one IP address assigned to it.
2148:
2149:
2150: <function><p><type>void</type>
2151: <funcdef>ifa_dump</funcdef>
2152: (<type>struct ifa *</type> <param>a</param>) -- dump interface address
2153:
2154: <funcsect>Arguments
2155: <p><descrip>
2156: <tagp><type>struct ifa *</type> <param>a</param></tagp>
2157: interface address descriptor
2158: </descrip>
2159: <funcsect>Description
2160: <p>
2161: This function dumps contents of an <struct/ifa/ to the debug output.
2162: </function>
2163: <function><p><type>void</type>
2164: <funcdef>if_dump</funcdef>
2165: (<type>struct iface *</type> <param>i</param>) -- dump interface
2166:
2167: <funcsect>Arguments
2168: <p><descrip>
2169: <tagp><type>struct iface *</type> <param>i</param></tagp>
2170: interface to dump
2171: </descrip>
2172: <funcsect>Description
2173: <p>
2174: This function dumps all information associated with a given
2175: network interface to the debug output.
2176: </function>
2177: <function><p><type>void</type>
2178: <funcdef>if_dump_all</funcdef>
2179: (<param>void</param>) -- dump all interfaces
2180:
2181: <funcsect>Description
2182: <p>
2183: <p>
2184: This function dumps information about all known network
2185: interfaces to the debug output.
2186: </function>
2187: <function><p><type>void</type>
2188: <funcdef>if_delete</funcdef>
2189: (<type>struct iface *</type> <param>old</param>) -- remove interface
2190:
2191: <funcsect>Arguments
2192: <p><descrip>
2193: <tagp><type>struct iface *</type> <param>old</param></tagp>
2194: interface
2195: </descrip>
2196: <funcsect>Description
2197: <p>
2198: This function is called by the low-level platform dependent code
2199: whenever it notices an interface disappears. It is just a shorthand
2200: for <func/if_update()/.
2201: </function>
2202: <function><p><type>struct iface *</type>
2203: <funcdef>if_update</funcdef>
2204: (<type>struct iface *</type> <param>new</param>) -- update interface status
2205:
2206: <funcsect>Arguments
2207: <p><descrip>
2208: <tagp><type>struct iface *</type> <param>new</param></tagp>
2209: new interface status
2210: </descrip>
2211: <funcsect>Description
2212: <p>
2213: <func/if_update()/ is called by the low-level platform dependent code
2214: whenever it notices an interface change.
2215: <p>
2216: There exist two types of interface updates -- synchronous and asynchronous
2217: ones. In the synchronous case, the low-level code calls <func/if_start_update()/,
2218: scans all interfaces reported by the OS, uses <func/if_update()/ and <func/ifa_update()/
2219: to pass them to the core and then it finishes the update sequence by
2220: calling <func/if_end_update()/. When working asynchronously, the sysdep code
2221: calls <func/if_update()/ and <func/ifa_update()/ whenever it notices a change.
2222: <p>
2223: <func/if_update()/ will automatically notify all other modules about the change.
2224: </function>
2225: <function><p><type>void</type>
2226: <funcdef>if_feed_baby</funcdef>
2227: (<type>struct proto *</type> <param>p</param>) -- advertise interfaces to a new protocol
2228:
2229: <funcsect>Arguments
2230: <p><descrip>
2231: <tagp><type>struct proto *</type> <param>p</param></tagp>
2232: protocol to feed
2233: </descrip>
2234: <funcsect>Description
2235: <p>
2236: When a new protocol starts, this function sends it a series
2237: of notifications about all existing interfaces.
2238: </function>
2239: <function><p><type>struct iface *</type>
2240: <funcdef>if_find_by_index</funcdef>
2241: (<type>unsigned</type> <param>idx</param>) -- find interface by ifindex
2242:
2243: <funcsect>Arguments
2244: <p><descrip>
2245: <tagp><type>unsigned</type> <param>idx</param></tagp>
2246: ifindex
2247: </descrip>
2248: <funcsect>Description
2249: <p>
2250: This function finds an <struct/iface/ structure corresponding to an interface
2251: of the given index <param/idx/. Returns a pointer to the structure or <const/NULL/
2252: if no such structure exists.
2253: </function>
2254: <function><p><type>struct iface *</type>
2255: <funcdef>if_find_by_name</funcdef>
2256: (<type>char *</type> <param>name</param>) -- find interface by name
2257:
2258: <funcsect>Arguments
2259: <p><descrip>
2260: <tagp><type>char *</type> <param>name</param></tagp>
2261: interface name
2262: </descrip>
2263: <funcsect>Description
2264: <p>
2265: This function finds an <struct/iface/ structure corresponding to an interface
2266: of the given name <param/name/. Returns a pointer to the structure or <const/NULL/
2267: if no such structure exists.
2268: </function>
2269: <function><p><type>struct ifa *</type>
2270: <funcdef>ifa_update</funcdef>
2271: (<type>struct ifa *</type> <param>a</param>) -- update interface address
2272:
2273: <funcsect>Arguments
2274: <p><descrip>
2275: <tagp><type>struct ifa *</type> <param>a</param></tagp>
2276: new interface address
2277: </descrip>
2278: <funcsect>Description
2279: <p>
2280: This function adds address information to a network
2281: interface. It's called by the platform dependent code during
2282: the interface update process described under <func/if_update()/.
2283: </function>
2284: <function><p><type>void</type>
2285: <funcdef>ifa_delete</funcdef>
2286: (<type>struct ifa *</type> <param>a</param>) -- remove interface address
2287:
2288: <funcsect>Arguments
2289: <p><descrip>
2290: <tagp><type>struct ifa *</type> <param>a</param></tagp>
2291: interface address
2292: </descrip>
2293: <funcsect>Description
2294: <p>
2295: This function removes address information from a network
2296: interface. It's called by the platform dependent code during
2297: the interface update process described under <func/if_update()/.
2298: </function>
2299: <function><p><type>void</type>
2300: <funcdef>if_init</funcdef>
2301: (<param>void</param>) -- initialize interface module
2302:
2303: <funcsect>Description
2304: <p>
2305: <p>
2306: This function is called during BIRD startup to initialize
2307: all data structures of the interface module.
2308: </function>
2309: <sect>Neighbor cache
2310: <p>
2311: <p>
2312: Most routing protocols need to associate their internal state data with
2313: neighboring routers, check whether an address given as the next hop
2314: attribute of a route is really an address of a directly connected host
2315: and which interface is it connected through. Also, they often need to
2316: be notified when a neighbor ceases to exist or when their long awaited
2317: neighbor becomes connected. The neighbor cache is there to solve all
2318: these problems.
2319: <p>
2320: The neighbor cache maintains a collection of neighbor entries. Each
2321: entry represents one IP address corresponding to either our directly
2322: connected neighbor or our own end of the link (when the scope of the
2323: address is set to <const/SCOPE_HOST/) together with per-neighbor data belonging to a
2324: single protocol.
2325: <p>
2326: Active entries represent known neighbors and are stored in a hash
2327: table (to allow fast retrieval based on the IP address of the node) and
2328: two linked lists: one global and one per-interface (allowing quick
2329: processing of interface change events). Inactive entries exist only
2330: when the protocol has explicitly requested it via the <const/NEF_STICKY/
2331: flag because it wishes to be notified when the node will again become
2332: a neighbor. Such entries are enqueued in a special list which is walked
2333: whenever an interface changes its state to up. Neighbor entry VRF
2334: association is implied by respective protocol.
2335: <p>
2336: When a neighbor event occurs (a neighbor gets disconnected or a sticky
2337: inactive neighbor becomes connected), the protocol hook <func/neigh_notify()/
2338: is called to advertise the change.
2339:
2340:
2341: <function><p><type>neighbor *</type>
2342: <funcdef>neigh_find</funcdef>
2343: (<type>struct proto *</type> <param>p</param>, <type>ip_addr *</type> <param>a</param>, <type>unsigned</type> <param>flags</param>) -- find or create a neighbor entry.
2344:
2345: <funcsect>Arguments
2346: <p><descrip>
2347: <tagp><type>struct proto *</type> <param>p</param></tagp>
2348: protocol which asks for the entry.
2349: <tagp><type>ip_addr *</type> <param>a</param></tagp>
2350: pointer to IP address of the node to be searched for.
2351: <tagp><type>unsigned</type> <param>flags</param></tagp>
2352: 0 or <const/NEF_STICKY/ if you want to create a sticky entry.
2353: </descrip>
2354: <funcsect>Description
2355: <p>
2356: Search the neighbor cache for a node with given IP address. If
2357: it's found, a pointer to the neighbor entry is returned. If no
2358: such entry exists and the node is directly connected on
2359: one of our active interfaces, a new entry is created and returned
2360: to the caller with protocol-dependent fields initialized to zero.
2361: If the node is not connected directly or *<param/a/ is not a valid unicast
2362: IP address, <func/neigh_find()/ returns <const/NULL/.
2363: </function>
2364: <function><p><type>void</type>
2365: <funcdef>neigh_dump</funcdef>
2366: (<type>neighbor *</type> <param>n</param>) -- dump specified neighbor entry.
2367:
2368: <funcsect>Arguments
2369: <p><descrip>
2370: <tagp><type>neighbor *</type> <param>n</param></tagp>
2371: the entry to dump
2372: </descrip>
2373: <funcsect>Description
2374: <p>
2375: This functions dumps the contents of a given neighbor entry
2376: to debug output.
2377: </function>
2378: <function><p><type>void</type>
2379: <funcdef>neigh_dump_all</funcdef>
2380: (<param>void</param>) -- dump all neighbor entries.
2381:
2382: <funcsect>Description
2383: <p>
2384: <p>
2385: This function dumps the contents of the neighbor cache to
2386: debug output.
2387: </function>
2388: <function><p><type>void</type>
2389: <funcdef>neigh_if_up</funcdef>
2390: (<type>struct iface *</type> <param>i</param>)
2391: <funcsect>Arguments
2392: <p><descrip>
2393: <tagp><type>struct iface *</type> <param>i</param></tagp>
2394: interface in question
2395: </descrip>
2396: <funcsect>Description
2397: <p>
2398: Tell the neighbor cache that a new interface became up.
2399: <p>
2400: The neighbor cache wakes up all inactive sticky neighbors with
2401: addresses belonging to prefixes of the interface <param/i/.
2402: </function>
2403: <function><p><type>void</type>
2404: <funcdef>neigh_if_down</funcdef>
2405: (<type>struct iface *</type> <param>i</param>) -- notify neighbor cache about interface down event
2406:
2407: <funcsect>Arguments
2408: <p><descrip>
2409: <tagp><type>struct iface *</type> <param>i</param></tagp>
2410: the interface in question
2411: </descrip>
2412: <funcsect>Description
2413: <p>
2414: Notify the neighbor cache that an interface has ceased to exist.
2415: <p>
2416: It causes all entries belonging to neighbors connected to this interface
2417: to be flushed.
2418: </function>
2419: <function><p><type>void</type>
2420: <funcdef>neigh_if_link</funcdef>
2421: (<type>struct iface *</type> <param>i</param>) -- notify neighbor cache about interface link change
2422:
2423: <funcsect>Arguments
2424: <p><descrip>
2425: <tagp><type>struct iface *</type> <param>i</param></tagp>
2426: the interface in question
2427: </descrip>
2428: <funcsect>Description
2429: <p>
2430: Notify the neighbor cache that an interface changed link state.
2431: All owners of neighbor entries connected to this interface are
2432: notified.
2433: </function>
2434: <function><p><type>void</type>
2435: <funcdef>neigh_ifa_update</funcdef>
2436: (<type>struct ifa *</type> <param>a</param>)
2437: <funcsect>Arguments
2438: <p><descrip>
2439: <tagp><type>struct ifa *</type> <param>a</param></tagp>
2440: interface address in question
2441: </descrip>
2442: <funcsect>Description
2443: <p>
2444: Tell the neighbor cache that an address was added or removed.
2445: <p>
2446: The neighbor cache wakes up all inactive sticky neighbors with
2447: addresses belonging to prefixes of the interface belonging to <param/ifa/
2448: and causes all unreachable neighbors to be flushed.
2449: </function>
2450: <function><p><type>void</type>
2451: <funcdef>neigh_prune</funcdef>
2452: (<param>void</param>) -- prune neighbor cache
2453:
2454: <funcsect>Description
2455: <p>
2456: <p>
2457: <func/neigh_prune()/ examines all neighbor entries cached and removes those
2458: corresponding to inactive protocols. It's called whenever a protocol
2459: is shut down to get rid of all its heritage.
2460: </function>
2461: <function><p><type>void</type>
2462: <funcdef>neigh_init</funcdef>
2463: (<type>pool *</type> <param>if_pool</param>) -- initialize the neighbor cache.
2464:
2465: <funcsect>Arguments
2466: <p><descrip>
2467: <tagp><type>pool *</type> <param>if_pool</param></tagp>
2468: resource pool to be used for neighbor entries.
2469: </descrip>
2470: <funcsect>Description
2471: <p>
2472: This function is called during BIRD startup to initialize
2473: the neighbor cache module.
2474: </function>
2475: <sect>Command line interface
2476: <p>
2477: <p>
2478: This module takes care of the BIRD's command-line interface (CLI).
2479: The CLI exists to provide a way to control BIRD remotely and to inspect
2480: its status. It uses a very simple textual protocol over a stream
2481: connection provided by the platform dependent code (on UNIX systems,
2482: it's a UNIX domain socket).
2483: <p>
2484: Each session of the CLI consists of a sequence of request and replies,
2485: slightly resembling the FTP and SMTP protocols.
2486: Requests are commands encoded as a single line of text, replies are
2487: sequences of lines starting with a four-digit code followed by either
2488: a space (if it's the last line of the reply) or a minus sign (when the
2489: reply is going to continue with the next line), the rest of the line
2490: contains a textual message semantics of which depends on the numeric
2491: code. If a reply line has the same code as the previous one and it's
2492: a continuation line, the whole prefix can be replaced by a single
2493: white space character.
2494: <p>
2495: Reply codes starting with 0 stand for `action successfully completed' messages,
2496: 1 means `table entry', 8 `runtime error' and 9 `syntax error'.
2497: <p>
2498: Each CLI session is internally represented by a <struct/cli/ structure and a
2499: resource pool containing all resources associated with the connection,
2500: so that it can be easily freed whenever the connection gets closed, not depending
2501: on the current state of command processing.
2502: <p>
2503: The CLI commands are declared as a part of the configuration grammar
2504: by using the <tt>CF_CLI</tt> macro. When a command is received, it is processed
2505: by the same lexical analyzer and parser as used for the configuration, but
2506: it's switched to a special mode by prepending a fake token to the text,
2507: so that it uses only the CLI command rules. Then the parser invokes
2508: an execution routine corresponding to the command, which either constructs
2509: the whole reply and returns it back or (in case it expects the reply will be long)
2510: it prints a partial reply and asks the CLI module (using the <param/cont/ hook)
2511: to call it again when the output is transferred to the user.
2512: <p>
2513: The <param/this_cli/ variable points to a <struct/cli/ structure of the session being
2514: currently parsed, but it's of course available only in command handlers
2515: not entered using the <param/cont/ hook.
2516: <p>
2517: TX buffer management works as follows: At cli.tx_buf there is a
2518: list of TX buffers (struct cli_out), cli.tx_write is the buffer
2519: currently used by the producer (<func/cli_printf()/, <func/cli_alloc_out()/) and
2520: cli.tx_pos is the buffer currently used by the consumer
2521: (<func/cli_write()/, in system dependent code). The producer uses
2522: cli_out.wpos ptr as the current write position and the consumer
2523: uses cli_out.outpos ptr as the current read position. When the
2524: producer produces something, it calls <func/cli_write_trigger()/. If there
2525: is not enough space in the current buffer, the producer allocates
2526: the new one. When the consumer processes everything in the buffer
2527: queue, it calls <func/cli_written()/, tha frees all buffers (except the
2528: first one) and schedules cli.event .
2529:
2530:
2531: <function><p><type>void</type>
2532: <funcdef>cli_printf</funcdef>
2533: (<type>cli *</type> <param>c</param>, <type>int</type> <param>code</param>, <type>char *</type> <param>msg</param>, <type>...</type> <param>...</param>) -- send reply to a CLI connection
2534:
2535: <funcsect>Arguments
2536: <p><descrip>
2537: <tagp><type>cli *</type> <param>c</param></tagp>
2538: CLI connection
2539: <tagp><type>int</type> <param>code</param></tagp>
2540: numeric code of the reply, negative for continuation lines
2541: <tagp><type>char *</type> <param>msg</param></tagp>
2542: a <func/printf()/-like formatting string.
2543: <tagp><type>...</type> <param>...</param></tagp>
2544: variable arguments
2545: </descrip>
2546: <funcsect>Description
2547: <p>
2548: This function send a single line of reply to a given CLI connection.
2549: In works in all aspects like <func/bsprintf()/ except that it automatically
2550: prepends the reply line prefix.
2551: <p>
2552: Please note that if the connection can be already busy sending some
2553: data in which case <func/cli_printf()/ stores the output to a temporary buffer,
2554: so please avoid sending a large batch of replies without waiting
2555: for the buffers to be flushed.
2556: <p>
2557: If you want to write to the current CLI output, you can use the <func/cli_msg()/
2558: macro instead.
2559: </function>
2560: <function><p><type>void</type>
2561: <funcdef>cli_init</funcdef>
2562: (<param>void</param>) -- initialize the CLI module
2563:
2564: <funcsect>Description
2565: <p>
2566: <p>
2567: This function is called during BIRD startup to initialize
2568: the internal data structures of the CLI module.
2569: </function>
2570: <sect>Object locks
2571: <p>
2572: <p>
2573: The lock module provides a simple mechanism for avoiding conflicts between
2574: various protocols which would like to use a single physical resource (for
2575: example a network port). It would be easy to say that such collisions can
2576: occur only when the user specifies an invalid configuration and therefore
2577: he deserves to get what he has asked for, but unfortunately they can also
2578: arise legitimately when the daemon is reconfigured and there exists (although
2579: for a short time period only) an old protocol instance being shut down and a new one
2580: willing to start up on the same interface.
2581: <p>
2582: The solution is very simple: when any protocol wishes to use a network port
2583: or some other non-shareable resource, it asks the core to lock it and it doesn't
2584: use the resource until it's notified that it has acquired the lock.
2585: <p>
2586: Object locks are represented by <struct/object_lock/ structures which are in turn a
2587: kind of resource. Lockable resources are uniquely determined by resource type
2588: (<const/OBJLOCK_UDP/ for a UDP port etc.), IP address (usually a broadcast or
2589: multicast address the port is bound to), port number, interface and optional
2590: instance ID.
2591:
2592:
2593: <function><p><type>struct object_lock *</type>
2594: <funcdef>olock_new</funcdef>
2595: (<type>pool *</type> <param>p</param>) -- create an object lock
2596:
2597: <funcsect>Arguments
2598: <p><descrip>
2599: <tagp><type>pool *</type> <param>p</param></tagp>
2600: resource pool to create the lock in.
2601: </descrip>
2602: <funcsect>Description
2603: <p>
2604: The <func/olock_new()/ function creates a new resource of type <struct/object_lock/
2605: and returns a pointer to it. After filling in the structure, the caller
2606: should call <func/olock_acquire()/ to do the real locking.
2607: </function>
2608: <function><p><type>void</type>
2609: <funcdef>olock_acquire</funcdef>
2610: (<type>struct object_lock *</type> <param>l</param>) -- acquire a lock
2611:
2612: <funcsect>Arguments
2613: <p><descrip>
2614: <tagp><type>struct object_lock *</type> <param>l</param></tagp>
2615: the lock to acquire
2616: </descrip>
2617: <funcsect>Description
2618: <p>
2619: This function attempts to acquire exclusive access to the non-shareable
2620: resource described by the lock <param/l/. It returns immediately, but as soon
2621: as the resource becomes available, it calls the <func/hook()/ function set up
2622: by the caller.
2623: <p>
2624: When you want to release the resource, just <func/rfree()/ the lock.
2625: </function>
2626: <function><p><type>void</type>
2627: <funcdef>olock_init</funcdef>
2628: (<param>void</param>) -- initialize the object lock mechanism
2629:
2630: <funcsect>Description
2631: <p>
2632: <p>
2633: This function is called during BIRD startup. It initializes
2634: all the internal data structures of the lock module.
2635: </function>
2636: <chapt>Configuration
2637: <sect>Configuration manager
2638: <p>
2639: <p>
2640: Configuration of BIRD is complex, yet straightforward. There are three
2641: modules taking care of the configuration: config manager (which takes care
2642: of storage of the config information and controls switching between configs),
2643: lexical analyzer and parser.
2644: <p>
2645: The configuration manager stores each config as a <struct/config/ structure
2646: accompanied by a linear pool from which all information associated
2647: with the config and pointed to by the <struct/config/ structure is allocated.
2648: <p>
2649: There can exist up to four different configurations at one time: an active
2650: one (pointed to by <param/config/), configuration we are just switching from
2651: (<param/old_config/), one queued for the next reconfiguration (<param/future_config/; if
2652: there is one and the user wants to reconfigure once again, we just free the
2653: previous queued config and replace it with the new one) and finally a config
2654: being parsed (<param/new_config/). The stored <param/old_config/ is also used for undo
2655: reconfiguration, which works in a similar way. Reconfiguration could also
2656: have timeout (using <param/config_timer/) and undo is automatically called if the
2657: new configuration is not confirmed later. The new config (<param/new_config/) and
2658: associated linear pool (<param/cfg_mem/) is non-NULL only during parsing.
2659: <p>
2660: Loading of new configuration is very simple: just call <func/config_alloc()/ to get
2661: a new <struct/config/ structure, then use <func/config_parse()/ to parse a configuration
2662: file and fill all fields of the structure and finally ask the config manager
2663: to switch to the new config by calling <func/config_commit()/.
2664: <p>
2665: CLI commands are parsed in a very similar way -- there is also a stripped-down
2666: <struct/config/ structure associated with them and they are lex-ed and parsed by the
2667: same functions, only a special fake token is prepended before the command
2668: text to make the parser recognize only the rules corresponding to CLI commands.
2669:
2670:
2671: <function><p><type>struct config *</type>
2672: <funcdef>config_alloc</funcdef>
2673: (<type>const byte *</type> <param>name</param>) -- allocate a new configuration
2674:
2675: <funcsect>Arguments
2676: <p><descrip>
2677: <tagp><type>const byte *</type> <param>name</param></tagp>
2678: name of the config
2679: </descrip>
2680: <funcsect>Description
2681: <p>
2682: This function creates new <struct/config/ structure, attaches a resource
2683: pool and a linear memory pool to it and makes it available for
2684: further use. Returns a pointer to the structure.
2685: </function>
2686: <function><p><type>int</type>
2687: <funcdef>config_parse</funcdef>
2688: (<type>struct config *</type> <param>c</param>) -- parse a configuration
2689:
2690: <funcsect>Arguments
2691: <p><descrip>
2692: <tagp><type>struct config *</type> <param>c</param></tagp>
2693: configuration
2694: </descrip>
2695: <funcsect>Description
2696: <p>
2697: <func/config_parse()/ reads input by calling a hook function pointed to
2698: by <param/cf_read_hook/ and parses it according to the configuration
2699: grammar. It also calls all the preconfig and postconfig hooks
2700: before, resp. after parsing.
2701: <funcsect>Result
2702: <p>
2703: 1 if the config has been parsed successfully, 0 if any
2704: error has occurred (such as anybody calling <func/cf_error()/) and
2705: the <param/err_msg/ field has been set to the error message.
2706: </function>
2707: <function><p><type>int</type>
2708: <funcdef>cli_parse</funcdef>
2709: (<type>struct config *</type> <param>c</param>) -- parse a CLI command
2710:
2711: <funcsect>Arguments
2712: <p><descrip>
2713: <tagp><type>struct config *</type> <param>c</param></tagp>
2714: temporary config structure
2715: </descrip>
2716: <funcsect>Description
2717: <p>
2718: <func/cli_parse()/ is similar to <func/config_parse()/, but instead of a configuration,
2719: it parses a CLI command. See the CLI module for more information.
2720: </function>
2721: <function><p><type>void</type>
2722: <funcdef>config_free</funcdef>
2723: (<type>struct config *</type> <param>c</param>) -- free a configuration
2724:
2725: <funcsect>Arguments
2726: <p><descrip>
2727: <tagp><type>struct config *</type> <param>c</param></tagp>
2728: configuration to be freed
2729: </descrip>
2730: <funcsect>Description
2731: <p>
2732: This function takes a <struct/config/ structure and frees all resources
2733: associated with it.
2734: </function>
2735: <function><p><type>int</type>
2736: <funcdef>config_commit</funcdef>
2737: (<type>struct config *</type> <param>c</param>, <type>int</type> <param>type</param>, <type>int</type> <param>timeout</param>) -- commit a configuration
2738:
2739: <funcsect>Arguments
2740: <p><descrip>
2741: <tagp><type>struct config *</type> <param>c</param></tagp>
2742: new configuration
2743: <tagp><type>int</type> <param>type</param></tagp>
2744: type of reconfiguration (RECONFIG_SOFT or RECONFIG_HARD)
2745: <tagp><type>int</type> <param>timeout</param></tagp>
2746: timeout for undo (or 0 for no timeout)
2747: </descrip>
2748: <funcsect>Description
2749: <p>
2750: When a configuration is parsed and prepared for use, the
2751: <func/config_commit()/ function starts the process of reconfiguration.
2752: It checks whether there is already a reconfiguration in progress
2753: in which case it just queues the new config for later processing.
2754: Else it notifies all modules about the new configuration by calling
2755: their <func/commit()/ functions which can either accept it immediately
2756: or call <func/config_add_obstacle()/ to report that they need some time
2757: to complete the reconfiguration. After all such obstacles are removed
2758: using <func/config_del_obstacle()/, the old configuration is freed and
2759: everything runs according to the new one.
2760: <p>
2761: When <param/timeout/ is nonzero, the undo timer is activated with given
2762: timeout. The timer is deactivated when <func/config_commit()/,
2763: <func/config_confirm()/ or <func/config_undo()/ is called.
2764: <funcsect>Result
2765: <p>
2766: <const/CONF_DONE/ if the configuration has been accepted immediately,
2767: <const/CONF_PROGRESS/ if it will take some time to switch to it, <const/CONF_QUEUED/
2768: if it's been queued due to another reconfiguration being in progress now
2769: or <const/CONF_SHUTDOWN/ if BIRD is in shutdown mode and no new configurations
2770: are accepted.
2771: </function>
2772: <function><p><type>int</type>
2773: <funcdef>config_confirm</funcdef>
2774: (<param>void</param>) -- confirm a commited configuration
2775:
2776: <funcsect>Description
2777: <p>
2778: <p>
2779: When the undo timer is activated by <func/config_commit()/ with nonzero timeout,
2780: this function can be used to deactivate it and therefore confirm
2781: the current configuration.
2782: <funcsect>Result
2783: <p>
2784: <const/CONF_CONFIRM/ when the current configuration is confirmed,
2785: <const/CONF_NONE/ when there is nothing to confirm (i.e. undo timer is not active).
2786: </function>
2787: <function><p><type>int</type>
2788: <funcdef>config_undo</funcdef>
2789: (<param>void</param>) -- undo a configuration
2790:
2791: <funcsect>Description
2792: <p>
2793: <p>
2794: Function <func/config_undo()/ can be used to change the current
2795: configuration back to stored <const/old_config/. If no reconfiguration is
2796: running, this stored configuration is commited in the same way as a
2797: new configuration in <func/config_commit()/. If there is already a
2798: reconfiguration in progress and no next reconfiguration is
2799: scheduled, then the undo is scheduled for later processing as
2800: usual, but if another reconfiguration is already scheduled, then
2801: such reconfiguration is removed instead (i.e. undo is applied on
2802: the last commit that scheduled it).
2803: <funcsect>Result
2804: <p>
2805: <const/CONF_DONE/ if the configuration has been accepted immediately,
2806: <const/CONF_PROGRESS/ if it will take some time to switch to it, <const/CONF_QUEUED/
2807: if it's been queued due to another reconfiguration being in progress now,
2808: <const/CONF_UNQUEUED/ if a scheduled reconfiguration is removed, <const/CONF_NOTHING/
2809: if there is no relevant configuration to undo (the previous config request
2810: was <func/config_undo()/ too) or <const/CONF_SHUTDOWN/ if BIRD is in shutdown mode and
2811: no new configuration changes are accepted.
2812: </function>
2813: <function><p><type>void</type>
2814: <funcdef>order_shutdown</funcdef>
2815: (<param>void</param>) -- order BIRD shutdown
2816:
2817: <funcsect>Description
2818: <p>
2819: <p>
2820: This function initiates shutdown of BIRD. It's accomplished by asking
2821: for switching to an empty configuration.
2822: </function>
2823: <function><p><type>void</type>
2824: <funcdef>cf_error</funcdef>
2825: (<type>char *</type> <param>msg</param>, <type>...</type> <param>...</param>) -- report a configuration error
2826:
2827: <funcsect>Arguments
2828: <p><descrip>
2829: <tagp><type>char *</type> <param>msg</param></tagp>
2830: printf-like format string
2831: <tagp><type>...</type> <param>...</param></tagp>
2832: variable arguments
2833: </descrip>
2834: <funcsect>Description
2835: <p>
2836: <func/cf_error()/ can be called during execution of <func/config_parse()/, that is
2837: from the parser, a preconfig hook or a postconfig hook, to report an
2838: error in the configuration.
2839: </function>
2840: <function><p><type>char *</type>
2841: <funcdef>cfg_strdup</funcdef>
2842: (<type>const char *</type> <param>c</param>) -- copy a string to config memory
2843:
2844: <funcsect>Arguments
2845: <p><descrip>
2846: <tagp><type>const char *</type> <param>c</param></tagp>
2847: string to copy
2848: </descrip>
2849: <funcsect>Description
2850: <p>
2851: <func/cfg_strdup()/ creates a new copy of the string in the memory
2852: pool associated with the configuration being currently parsed.
2853: It's often used when a string literal occurs in the configuration
2854: and we want to preserve it for further use.
2855: </function>
2856: <sect>Lexical analyzer
2857: <p>
2858: <p>
2859: The lexical analyzer used for configuration files and CLI commands
2860: is generated using the <tt>flex</tt> tool accompanied by a couple of
2861: functions maintaining the hash tables containing information about
2862: symbols and keywords.
2863: <p>
2864: Each symbol is represented by a <struct/symbol/ structure containing name
2865: of the symbol, its lexical scope, symbol class (<const/SYM_PROTO/ for a
2866: name of a protocol, <const/SYM_CONSTANT/ for a constant etc.) and class
2867: dependent data. When an unknown symbol is encountered, it's
2868: automatically added to the symbol table with class <const/SYM_VOID/.
2869: <p>
2870: The keyword tables are generated from the grammar templates
2871: using the <tt>gen_keywords.m4</tt> script.
2872:
2873:
2874: <function><p><type>void</type>
2875: <funcdef>cf_lex_unwind</funcdef>
2876: (<param>void</param>) -- unwind lexer state during error
2877:
2878: <funcsect>Lexical analyzer
2879: <p>
2880: <p>
2881: <func/cf_lex_unwind()/ frees the internal state on IFS stack when the lexical
2882: analyzer is terminated by <func/cf_error()/.
2883: </function>
2884: <function><p><type>struct symbol *</type>
2885: <funcdef>cf_find_symbol</funcdef>
2886: (<type>struct config *</type> <param>cfg</param>, <type>byte *</type> <param>c</param>) -- find a symbol by name
2887:
2888: <funcsect>Arguments
2889: <p><descrip>
2890: <tagp><type>struct config *</type> <param>cfg</param></tagp>
2891: specificed config
2892: <tagp><type>byte *</type> <param>c</param></tagp>
2893: symbol name
2894: </descrip>
2895: <funcsect>Description
2896: <p>
2897: This functions searches the symbol table in the config <param/cfg/ for a symbol of
2898: given name. First it examines the current scope, then the second recent one
2899: and so on until it either finds the symbol and returns a pointer to its
2900: <struct/symbol/ structure or reaches the end of the scope chain and returns <const/NULL/ to
2901: signify no match.
2902: </function>
2903: <function><p><type>struct symbol *</type>
2904: <funcdef>cf_get_symbol</funcdef>
2905: (<type>byte *</type> <param>c</param>) -- get a symbol by name
2906:
2907: <funcsect>Arguments
2908: <p><descrip>
2909: <tagp><type>byte *</type> <param>c</param></tagp>
2910: symbol name
2911: </descrip>
2912: <funcsect>Description
2913: <p>
2914: This functions searches the symbol table of the currently parsed config
2915: (<param/new_config/) for a symbol of given name. It returns either the already
2916: existing symbol or a newly allocated undefined (<const/SYM_VOID/) symbol if no
2917: existing symbol is found.
2918: </function>
2919: <function><p><type>struct symbol *</type>
2920: <funcdef>cf_define_symbol</funcdef>
2921: (<type>struct symbol *</type> <param>sym</param>, <type>int</type> <param>type</param>, <type>void *</type> <param>def</param>) -- define meaning of a symbol
2922:
2923: <funcsect>Arguments
2924: <p><descrip>
2925: <tagp><type>struct symbol *</type> <param>sym</param></tagp>
2926: symbol to be defined
2927: <tagp><type>int</type> <param>type</param></tagp>
2928: symbol class to assign
2929: <tagp><type>void *</type> <param>def</param></tagp>
2930: class dependent data
2931: </descrip>
2932: <funcsect>Description
2933: <p>
2934: Defines new meaning of a symbol. If the symbol is an undefined
2935: one (<const/SYM_VOID/), it's just re-defined to the new type. If it's defined
2936: in different scope, a new symbol in current scope is created and the
2937: meaning is assigned to it. If it's already defined in the current scope,
2938: an error is reported via <func/cf_error()/.
2939: <funcsect>Result
2940: <p>
2941: Pointer to the newly defined symbol. If we are in the top-level
2942: scope, it's the same <param/sym/ as passed to the function.
2943: </function>
2944: <function><p><type>void</type>
2945: <funcdef>cf_lex_init</funcdef>
2946: (<type>int</type> <param>is_cli</param>, <type>struct config *</type> <param>c</param>) -- initialize the lexer
2947:
2948: <funcsect>Arguments
2949: <p><descrip>
2950: <tagp><type>int</type> <param>is_cli</param></tagp>
2951: true if we're going to parse CLI command, false for configuration
2952: <tagp><type>struct config *</type> <param>c</param></tagp>
2953: configuration structure
2954: </descrip>
2955: <funcsect>Description
2956: <p>
2957: <func/cf_lex_init()/ initializes the lexical analyzer and prepares it for
2958: parsing of a new input.
2959: </function>
2960: <function><p><type>void</type>
2961: <funcdef>cf_push_scope</funcdef>
2962: (<type>struct symbol *</type> <param>sym</param>) -- enter new scope
2963:
2964: <funcsect>Arguments
2965: <p><descrip>
2966: <tagp><type>struct symbol *</type> <param>sym</param></tagp>
2967: symbol representing scope name
2968: </descrip>
2969: <funcsect>Description
2970: <p>
2971: If we want to enter a new scope to process declarations inside
2972: a nested block, we can just call <func/cf_push_scope()/ to push a new
2973: scope onto the scope stack which will cause all new symbols to be
2974: defined in this scope and all existing symbols to be sought for
2975: in all scopes stored on the stack.
2976: </function>
2977: <function><p><type>void</type>
2978: <funcdef>cf_pop_scope</funcdef>
2979: (<param>void</param>) -- leave a scope
2980:
2981: <funcsect>Description
2982: <p>
2983: <p>
2984: <func/cf_pop_scope()/ pops the topmost scope from the scope stack,
2985: leaving all its symbols in the symbol table, but making them
2986: invisible to the rest of the config.
2987: </function>
2988: <function><p><type>char *</type>
2989: <funcdef>cf_symbol_class_name</funcdef>
2990: (<type>struct symbol *</type> <param>sym</param>) -- get name of a symbol class
2991:
2992: <funcsect>Arguments
2993: <p><descrip>
2994: <tagp><type>struct symbol *</type> <param>sym</param></tagp>
2995: symbol
2996: </descrip>
2997: <funcsect>Description
2998: <p>
2999: This function returns a string representing the class
3000: of the given symbol.
3001: </function>
3002: <sect>Parser
3003: <p>
3004: <p>
3005: Both the configuration and CLI commands are analyzed using a syntax
3006: driven parser generated by the <tt>bison</tt> tool from a grammar which
3007: is constructed from information gathered from grammar snippets by
3008: the <tt>gen_parser.m4</tt> script.
3009: <p>
3010: Grammar snippets are files (usually with extension <tt>.Y</tt>) contributed
3011: by various BIRD modules in order to provide information about syntax of their
3012: configuration and their CLI commands. Each snipped consists of several
3013: sections, each of them starting with a special keyword: <tt>CF_HDR</tt> for
3014: a list of <tt>#include</tt> directives needed by the C code, <tt>CF_DEFINES</tt>
3015: for a list of C declarations, <tt>CF_DECLS</tt> for <tt>bison</tt> declarations
3016: including keyword definitions specified as <tt>CF_KEYWORDS</tt>, <tt>CF_GRAMMAR</tt>
3017: for the grammar rules, <tt>CF_CODE</tt> for auxiliary C code and finally
3018: <tt>CF_END</tt> at the end of the snippet.
3019: <p>
3020: To create references between the snippets, it's possible to define
3021: multi-part rules by utilizing the <tt>CF_ADDTO</tt> macro which adds a new
3022: alternative to a multi-part rule.
3023: <p>
3024: CLI commands are defined using a <tt>CF_CLI</tt> macro. Its parameters are:
3025: the list of keywords determining the command, the list of parameters,
3026: help text for the parameters and help text for the command.
3027: <p>
3028: Values of <tt>enum</tt> filter types can be defined using <tt>CF_ENUM</tt> with
3029: the following parameters: name of filter type, prefix common for all
3030: literals of this type and names of all the possible values.
3031:
3032:
3033: <chapt>Filters
3034: <sect>Filters
3035: <p>
3036: <p>
3037: You can find sources of the filter language in <tt>filter/</tt>
3038: directory. File <tt>filter/config.Y</tt> contains filter grammar and basically translates
3039: the source from user into a tree of <struct/f_inst/ structures. These trees are
3040: later interpreted using code in <tt>filter/filter.c</tt>.
3041: <p>
3042: A filter is represented by a tree of <struct/f_inst/ structures, one structure per
3043: "instruction". Each <struct/f_inst/ contains <param/code/, <param/aux/ value which is
3044: usually the data type this instruction operates on and two generic
3045: arguments (<param/a1/, <param/a2/). Some instructions contain pointer(s) to other
3046: instructions in their (<param/a1/, <param/a2/) fields.
3047: <p>
3048: Filters use a <struct/f_val/ structure for their data. Each <struct/f_val/
3049: contains type and value (types are constants prefixed with <const/T_/). Few
3050: of the types are special; <const/T_RETURN/ can be or-ed with a type to indicate
3051: that return from a function or from the whole filter should be
3052: forced. Important thing about <struct/f_val/'s is that they may be copied
3053: with a simple <tt>=</tt>. That's fine for all currently defined types: strings
3054: are read-only (and therefore okay), paths are copied for each
3055: operation (okay too).
3056:
3057:
3058: <function><p><type>int</type>
3059: <funcdef>val_compare</funcdef>
3060: (<type>struct f_val</type> <param>v1</param>, <type>struct f_val</type> <param>v2</param>) -- compare two values
3061:
3062: <funcsect>Arguments
3063: <p><descrip>
3064: <tagp><type>struct f_val</type> <param>v1</param></tagp>
3065: first value
3066: <tagp><type>struct f_val</type> <param>v2</param></tagp>
3067: second value
3068: </descrip>
3069: <funcsect>Description
3070: <p>
3071: Compares two values and returns -1, 0, 1 on <, =, > or CMP_ERROR on
3072: error. Tree module relies on this giving consistent results so
3073: that it can be used for building balanced trees.
3074: </function>
3075: <function><p><type>int</type>
3076: <funcdef>val_same</funcdef>
3077: (<type>struct f_val</type> <param>v1</param>, <type>struct f_val</type> <param>v2</param>) -- compare two values
3078:
3079: <funcsect>Arguments
3080: <p><descrip>
3081: <tagp><type>struct f_val</type> <param>v1</param></tagp>
3082: first value
3083: <tagp><type>struct f_val</type> <param>v2</param></tagp>
3084: second value
3085: </descrip>
3086: <funcsect>Description
3087: <p>
3088: Compares two values and returns 1 if they are same and 0 if not.
3089: Comparison of values of different types is valid and returns 0.
3090: </function>
3091: <function><p><type>int</type>
3092: <funcdef>val_in_range</funcdef>
3093: (<type>struct f_val</type> <param>v1</param>, <type>struct f_val</type> <param>v2</param>) -- implement <tt>~</tt> operator
3094:
3095: <funcsect>Arguments
3096: <p><descrip>
3097: <tagp><type>struct f_val</type> <param>v1</param></tagp>
3098: element
3099: <tagp><type>struct f_val</type> <param>v2</param></tagp>
3100: set
3101: </descrip>
3102: <funcsect>Description
3103: <p>
3104: Checks if <param/v1/ is element (<tt>~</tt> operator) of <param/v2/.
3105: </function>
3106: <function><p><type>struct f_val</type>
3107: <funcdef>interpret</funcdef>
3108: (<type>struct f_inst *</type> <param>what</param>)
3109: <funcsect>Arguments
3110: <p><descrip>
3111: <tagp><type>struct f_inst *</type> <param>what</param></tagp>
3112: filter to interpret
3113: </descrip>
3114: <funcsect>Description
3115: <p>
3116: Interpret given tree of filter instructions. This is core function
3117: of filter system and does all the hard work.
3118: <funcsect>Each instruction has 4 fields
3119: <p>
3120: code (which is instruction code),
3121: aux (which is extension to instruction code, typically type),
3122: arg1 and arg2 - arguments. Depending on instruction, arguments
3123: are either integers, or pointers to instruction trees. Common
3124: instructions like +, that have two expressions as arguments use
3125: TWOARGS macro to get both of them evaluated.
3126: <p>
3127: <struct/f_val/ structures are copied around, so there are no problems with
3128: memory managment.
3129: </function>
3130: <function><p><type>int</type>
3131: <funcdef>f_run</funcdef>
3132: (<type>struct filter *</type> <param>filter</param>, <type>struct rte **</type> <param>rte</param>, <type>struct ea_list **</type> <param>tmp_attrs</param>, <type>struct linpool *</type> <param>tmp_pool</param>, <type>int</type> <param>flags</param>) -- run a filter for a route
3133:
3134: <funcsect>Arguments
3135: <p><descrip>
3136: <tagp><type>struct filter *</type> <param>filter</param></tagp>
3137: filter to run
3138: <tagp><type>struct rte **</type> <param>rte</param></tagp>
3139: route being filtered, may be modified
3140: <tagp><type>struct ea_list **</type> <param>tmp_attrs</param></tagp>
3141: temporary attributes, prepared by caller or generated by <func/f_run()/
3142: <tagp><type>struct linpool *</type> <param>tmp_pool</param></tagp>
3143: all filter allocations go from this pool
3144: <tagp><type>int</type> <param>flags</param></tagp>
3145: flags
3146: </descrip>
3147: <funcsect>Description
3148: <p>
3149: If filter needs to modify the route, there are several
3150: posibilities. <param/rte/ might be read-only (with REF_COW flag), in that
3151: case rw copy is obtained by <func/rte_cow()/ and <param/rte/ is replaced. If
3152: <param/rte/ is originally rw, it may be directly modified (and it is never
3153: copied).
3154: <p>
3155: The returned rte may reuse the (possibly cached, cloned) rta, or
3156: (if rta was modificied) contains a modified uncached rta, which
3157: uses parts allocated from <param/tmp_pool/ and parts shared from original
3158: rta. There is one exception - if <param/rte/ is rw but contains a cached
3159: rta and that is modified, rta in returned rte is also cached.
3160: <p>
3161: Ownership of cached rtas is consistent with rte, i.e.
3162: if a new rte is returned, it has its own clone of cached rta
3163: (and cached rta of read-only source rte is intact), if rte is
3164: modified in place, old cached rta is possibly freed.
3165: </function>
3166: <function><p><type>int</type>
3167: <funcdef>filter_same</funcdef>
3168: (<type>struct filter *</type> <param>new</param>, <type>struct filter *</type> <param>old</param>) -- compare two filters
3169:
3170: <funcsect>Arguments
3171: <p><descrip>
3172: <tagp><type>struct filter *</type> <param>new</param></tagp>
3173: first filter to be compared
3174: <tagp><type>struct filter *</type> <param>old</param></tagp>
3175: second filter to be compared, notice that this filter is
3176: damaged while comparing.
3177: </descrip>
3178: <funcsect>Description
3179: <p>
3180: Returns 1 in case filters are same, otherwise 0. If there are
3181: underlying bugs, it will rather say 0 on same filters than say
3182: 1 on different.
3183: </function>
3184: <function><p><type>struct f_tree *</type>
3185: <funcdef>find_tree</funcdef>
3186: (<type>struct f_tree *</type> <param>t</param>, <type>struct f_val</type> <param>val</param>)
3187: <funcsect>Arguments
3188: <p><descrip>
3189: <tagp><type>struct f_tree *</type> <param>t</param></tagp>
3190: tree to search in
3191: <tagp><type>struct f_val</type> <param>val</param></tagp>
3192: value to find
3193: </descrip>
3194: <funcsect>Description
3195: <p>
3196: Search for given value in the tree. I relies on fact that sorted tree is populated
3197: by <struct/f_val/ structures (that can be compared by <func/val_compare()/). In each node of tree,
3198: either single value (then t->from==t->to) or range is present.
3199: <p>
3200: Both set matching and <tt><func/switch()/ { }</tt> construction is implemented using this function,
3201: thus both are as fast as they can be.
3202: </function>
3203: <function><p><type>struct f_tree *</type>
3204: <funcdef>build_tree</funcdef>
3205: (<type>struct f_tree *</type> <param>from</param>)
3206: <funcsect>Arguments
3207: <p><descrip>
3208: <tagp><type>struct f_tree *</type> <param>from</param></tagp>
3209: degenerated tree (linked by <param/tree/->left) to be transformed into form suitable for <func/find_tree()/
3210: </descrip>
3211: <funcsect>Description
3212: <p>
3213: Transforms degenerated tree into balanced tree.
3214: </function>
3215: <function><p><type>int</type>
3216: <funcdef>same_tree</funcdef>
3217: (<type>struct f_tree *</type> <param>t1</param>, <type>struct f_tree *</type> <param>t2</param>)
3218: <funcsect>Arguments
3219: <p><descrip>
3220: <tagp><type>struct f_tree *</type> <param>t1</param></tagp>
3221: first tree to be compared
3222: <tagp><type>struct f_tree *</type> <param>t2</param></tagp>
3223: second one
3224: </descrip>
3225: <funcsect>Description
3226: <p>
3227: Compares two trees and returns 1 if they are same
3228: </function>
3229: <sect>Trie for prefix sets
3230: <p>
3231: <p>
3232: We use a (compressed) trie to represent prefix sets. Every node
3233: in the trie represents one prefix (<struct/addr//<struct/plen/) and <struct/plen/ also
3234: indicates the index of the bit in the address that is used to
3235: branch at the node. If we need to represent just a set of
3236: prefixes, it would be simple, but we have to represent a
3237: set of prefix patterns. Each prefix pattern consists of
3238: <struct/ppaddr//<struct/pplen/ and two integers: <struct/low/ and <struct/high/, and a prefix
3239: <struct/paddr//<struct/plen/ matches that pattern if the first MIN(<struct/plen/, <struct/pplen/)
3240: bits of <struct/paddr/ and <struct/ppaddr/ are the same and <struct/low/ <= <struct/plen/ <= <struct/high/.
3241: <p>
3242: We use a bitmask (<struct/accept/) to represent accepted prefix lengths
3243: at a node. As there are 33 prefix lengths (0..32 for IPv4), but
3244: there is just one prefix of zero length in the whole trie so we
3245: have <struct/zero/ flag in <struct/f_trie/ (indicating whether the trie accepts
3246: prefix 0.0.0.0/0) as a special case, and <struct/accept/ bitmask
3247: represents accepted prefix lengths from 1 to 32.
3248: <p>
3249: There are two cases in prefix matching - a match when the length
3250: of the prefix is smaller that the length of the prefix pattern,
3251: (<struct/plen/ < <struct/pplen/) and otherwise. The second case is simple - we
3252: just walk through the trie and look at every visited node
3253: whether that prefix accepts our prefix length (<struct/plen/). The
3254: first case is tricky - we don't want to examine every descendant
3255: of a final node, so (when we create the trie) we have to propagate
3256: that information from nodes to their ascendants.
3257: <p>
3258: Suppose that we have two masks (M1 and M2) for a node. Mask M1
3259: represents accepted prefix lengths by just the node and mask M2
3260: represents accepted prefix lengths by the node or any of its
3261: descendants. Therefore M2 is a bitwise or of M1 and children's
3262: M2 and this is a maintained invariant during trie building.
3263: Basically, when we want to match a prefix, we walk through the trie,
3264: check mask M1 for our prefix length and when we came to
3265: final node, we check mask M2.
3266: <p>
3267: There are two differences in the real implementation. First,
3268: we use a compressed trie so there is a case that we skip our
3269: final node (if it is not in the trie) and we came to node that
3270: is either extension of our prefix, or completely out of path
3271: In the first case, we also have to check M2.
3272: <p>
3273: Second, we really need not to maintain two separate bitmasks.
3274: Checks for mask M1 are always larger than <struct/applen/ and we need
3275: just the first <struct/pplen/ bits of mask M2 (if trie compression
3276: hadn't been used it would suffice to know just $applen-th bit),
3277: so we have to store them together in <struct/accept/ mask - the first
3278: <struct/pplen/ bits of mask M2 and then mask M1.
3279: <p>
3280: There are four cases when we walk through a trie:
3281: <p>
3282: - we are in NULL
3283: - we are out of path (prefixes are inconsistent)
3284: - we are in the wanted (final) node (node length == <struct/plen/)
3285: - we are beyond the end of path (node length > <struct/plen/)
3286: - we are still on path and keep walking (node length < <struct/plen/)
3287: <p>
3288: The walking code in <func/trie_match_prefix()/ is structured according to
3289: these cases.
3290:
3291:
3292: <function><p><type>struct f_trie *</type>
3293: <funcdef>f_new_trie</funcdef>
3294: (<type>linpool *</type> <param>lp</param>, <type>uint</type> <param>node_size</param>) -- allocates and returns a new empty trie
3295:
3296: <funcsect>Arguments
3297: <p><descrip>
3298: <tagp><type>linpool *</type> <param>lp</param></tagp>
3299: linear pool to allocate items from
3300: <tagp><type>uint</type> <param>node_size</param></tagp>
3301: node size to be used (<struct/f_trie_node/ and user data)
3302: </descrip>
3303: </function>
3304: <function><p><type>void *</type>
3305: <funcdef>trie_add_prefix</funcdef>
3306: (<type>struct f_trie *</type> <param>t</param>, <type>ip_addr</type> <param>px</param>, <type>int</type> <param>plen</param>, <type>int</type> <param>l</param>, <type>int</type> <param>h</param>)
3307: <funcsect>Arguments
3308: <p><descrip>
3309: <tagp><type>struct f_trie *</type> <param>t</param></tagp>
3310: trie to add to
3311: <tagp><type>ip_addr</type> <param>px</param></tagp>
3312: prefix address
3313: <tagp><type>int</type> <param>plen</param></tagp>
3314: prefix length
3315: <tagp><type>int</type> <param>l</param></tagp>
3316: prefix lower bound
3317: <tagp><type>int</type> <param>h</param></tagp>
3318: prefix upper bound
3319: </descrip>
3320: <funcsect>Description
3321: <p>
3322: Adds prefix (prefix pattern) <param/px//<param/plen/ to trie <param/t/. <param/l/ and <param/h/ are lower
3323: and upper bounds on accepted prefix lengths, both inclusive.
3324: 0 <= l, h <= 32 (128 for IPv6).
3325: <p>
3326: Returns a pointer to the allocated node. The function can return a pointer to
3327: an existing node if <param/px/ and <param/plen/ are the same. If px/plen == 0/0 (or ::/0),
3328: a pointer to the root node is returned.
3329: </function>
3330: <function><p><type>int</type>
3331: <funcdef>trie_match_prefix</funcdef>
3332: (<type>struct f_trie *</type> <param>t</param>, <type>ip_addr</type> <param>px</param>, <type>int</type> <param>plen</param>)
3333: <funcsect>Arguments
3334: <p><descrip>
3335: <tagp><type>struct f_trie *</type> <param>t</param></tagp>
3336: trie
3337: <tagp><type>ip_addr</type> <param>px</param></tagp>
3338: prefix address
3339: <tagp><type>int</type> <param>plen</param></tagp>
3340: prefix length
3341: </descrip>
3342: <funcsect>Description
3343: <p>
3344: Tries to find a matching prefix pattern in the trie such that
3345: prefix <param/px//<param/plen/ matches that prefix pattern. Returns 1 if there
3346: is such prefix pattern in the trie.
3347: </function>
3348: <function><p><type>int</type>
3349: <funcdef>trie_same</funcdef>
3350: (<type>struct f_trie *</type> <param>t1</param>, <type>struct f_trie *</type> <param>t2</param>)
3351: <funcsect>Arguments
3352: <p><descrip>
3353: <tagp><type>struct f_trie *</type> <param>t1</param></tagp>
3354: first trie to be compared
3355: <tagp><type>struct f_trie *</type> <param>t2</param></tagp>
3356: second one
3357: </descrip>
3358: <funcsect>Description
3359: <p>
3360: Compares two tries and returns 1 if they are same
3361: </function>
3362: <function><p><type>void</type>
3363: <funcdef>trie_format</funcdef>
3364: (<type>struct f_trie *</type> <param>t</param>, <type>buffer *</type> <param>buf</param>)
3365: <funcsect>Arguments
3366: <p><descrip>
3367: <tagp><type>struct f_trie *</type> <param>t</param></tagp>
3368: trie to be formatted
3369: <tagp><type>buffer *</type> <param>buf</param></tagp>
3370: destination buffer
3371: </descrip>
3372: <funcsect>Description
3373: <p>
3374: Prints the trie to the supplied buffer.
3375: </function>
3376: <chapt>Protocols
3377: <sect>The Babel protocol
3378: <p>
3379: <p>
3380: Babel (RFC6126) is a loop-avoiding distance-vector routing protocol that is
3381: robust and efficient both in ordinary wired networks and in wireless mesh
3382: networks.
3383: <p>
3384: The Babel protocol keeps state for each neighbour in a <struct/babel_neighbor/
3385: struct, tracking received Hello and I Heard You (IHU) messages. A
3386: <struct/babel_interface/ struct keeps hello and update times for each interface, and
3387: a separate hello seqno is maintained for each interface.
3388: <p>
3389: For each prefix, Babel keeps track of both the possible routes (with next hop
3390: and router IDs), as well as the feasibility distance for each prefix and
3391: router id. The prefix itself is tracked in a <struct/babel_entry/ struct, while the
3392: possible routes for the prefix are tracked as <struct/babel_route/ entries and the
3393: feasibility distance is maintained through <struct/babel_source/ structures.
3394: <p>
3395: The main route selection is done in <func/babel_select_route()/. This is called when
3396: an entry is updated by receiving updates from the network or when modified by
3397: internal timers. It performs feasibility checks on the available routes for
3398: the prefix and selects the one with the lowest metric to be announced to the
3399: core.
3400:
3401:
3402: <function><p><type>void</type>
3403: <funcdef>babel_announce_rte</funcdef>
3404: (<type>struct babel_proto *</type> <param>p</param>, <type>struct babel_entry *</type> <param>e</param>) -- announce selected route to the core
3405:
3406: <funcsect>Arguments
3407: <p><descrip>
3408: <tagp><type>struct babel_proto *</type> <param>p</param></tagp>
3409: Babel protocol instance
3410: <tagp><type>struct babel_entry *</type> <param>e</param></tagp>
3411: Babel route entry to announce
3412: </descrip>
3413: <funcsect>Description
3414: <p>
3415: This function announces a Babel entry to the core if it has a selected
3416: incoming path, and retracts it otherwise. If the selected entry has infinite
3417: metric, the route is announced as unreachable.
3418: </function>
3419: <function><p><type>void</type>
3420: <funcdef>babel_select_route</funcdef>
3421: (<type>struct babel_entry *</type> <param>e</param>) -- select best route for given route entry
3422:
3423: <funcsect>Arguments
3424: <p><descrip>
3425: <tagp><type>struct babel_entry *</type> <param>e</param></tagp>
3426: Babel entry to select the best route for
3427: </descrip>
3428: <funcsect>Description
3429: <p>
3430: Select the best feasible route for a given prefix among the routes received
3431: from peers, and propagate it to the nest. This just selects the feasible
3432: route with the lowest metric.
3433: <p>
3434: If no feasible route is available for a prefix that previously had a route
3435: selected, a seqno request is sent to try to get a valid route. In the
3436: meantime, the route is marked as infeasible in the nest (to blackhole packets
3437: going to it, as per the RFC).
3438: <p>
3439: If no feasible route is available, and no previous route is selected, the
3440: route is removed from the nest entirely.
3441: </function>
3442: <function><p><type>void</type>
3443: <funcdef>babel_send_update</funcdef>
3444: (<type>struct babel_iface *</type> <param>ifa</param>, <type>bird_clock_t</type> <param>changed</param>) -- send route table updates
3445:
3446: <funcsect>Arguments
3447: <p><descrip>
3448: <tagp><type>struct babel_iface *</type> <param>ifa</param></tagp>
3449: Interface to transmit on
3450: <tagp><type>bird_clock_t</type> <param>changed</param></tagp>
3451: Only send entries changed since this time
3452: </descrip>
3453: <funcsect>Description
3454: <p>
3455: This function produces update TLVs for all entries changed since the time
3456: indicated by the <struct/changed/ parameter and queues them for transmission on the
3457: selected interface. During the process, the feasibility distance for each
3458: transmitted entry is updated.
3459: </function>
3460: <function><p><type>void</type>
3461: <funcdef>babel_handle_update</funcdef>
3462: (<type>union babel_msg *</type> <param>m</param>, <type>struct babel_iface *</type> <param>ifa</param>) -- handle incoming route updates
3463:
3464: <funcsect>Arguments
3465: <p><descrip>
3466: <tagp><type>union babel_msg *</type> <param>m</param></tagp>
3467: Incoming update TLV
3468: <tagp><type>struct babel_iface *</type> <param>ifa</param></tagp>
3469: Interface the update was received on
3470: </descrip>
3471: <funcsect>Description
3472: <p>
3473: This function is called as a handler for update TLVs and handles the updating
3474: and maintenance of route entries in Babel's internal routing cache. The
3475: handling follows the actions described in the Babel RFC, and at the end of
3476: each update handling, <func/babel_select_route()/ is called on the affected entry to
3477: optionally update the selected routes and propagate them to the core.
3478: </function>
3479: <function><p><type>void</type>
3480: <funcdef>babel_iface_timer</funcdef>
3481: (<type>timer *</type> <param>t</param>) -- Babel interface timer handler
3482:
3483: <funcsect>Arguments
3484: <p><descrip>
3485: <tagp><type>timer *</type> <param>t</param></tagp>
3486: Timer
3487: </descrip>
3488: <funcsect>Description
3489: <p>
3490: This function is called by the per-interface timer and triggers sending of
3491: periodic Hello's and both triggered and periodic updates. Periodic Hello's
3492: and updates are simply handled by setting the next_{hello,regular} variables
3493: on the interface, and triggering an update (and resetting the variable)
3494: whenever 'now' exceeds that value.
3495: <p>
3496: For triggered updates, <func/babel_trigger_iface_update()/ will set the
3497: want_triggered field on the interface to a timestamp value. If this is set
3498: (and the next_triggered time has passed; this is a rate limiting mechanism),
3499: <func/babel_send_update()/ will be called with this timestamp as the second
3500: parameter. This causes updates to be send consisting of only the routes that
3501: have changed since the time saved in want_triggered.
3502: <p>
3503: Mostly when an update is triggered, the route being modified will be set to
3504: the value of 'now' at the time of the trigger; the >= comparison for
3505: selecting which routes to send in the update will make sure this is included.
3506: </function>
3507: <function><p><type>void</type>
3508: <funcdef>babel_timer</funcdef>
3509: (<type>timer *</type> <param>t</param>) -- global timer hook
3510:
3511: <funcsect>Arguments
3512: <p><descrip>
3513: <tagp><type>timer *</type> <param>t</param></tagp>
3514: Timer
3515: </descrip>
3516: <funcsect>Description
3517: <p>
3518: This function is called by the global protocol instance timer and handles
3519: expiration of routes and neighbours as well as pruning of the seqno request
3520: cache.
3521: </function>
3522: <function><p><type>uint</type>
3523: <funcdef>babel_write_queue</funcdef>
3524: (<type>struct babel_iface *</type> <param>ifa</param>, <type>list *</type> <param>queue</param>) -- Write a TLV queue to a transmission buffer
3525:
3526: <funcsect>Arguments
3527: <p><descrip>
3528: <tagp><type>struct babel_iface *</type> <param>ifa</param></tagp>
3529: Interface holding the transmission buffer
3530: <tagp><type>list *</type> <param>queue</param></tagp>
3531: TLV queue to write (containing internal-format TLVs)
3532: </descrip>
3533: <funcsect>Description
3534: <p>
3535: This function writes a packet to the interface transmission buffer with as
3536: many TLVs from the <struct/queue/ as will fit in the buffer. It returns the number of
3537: bytes written (NOT counting the packet header). The function is called by
3538: <func/babel_send_queue()/ and <func/babel_send_unicast()/ to construct packets for
3539: transmission, and uses per-TLV helper functions to convert the
3540: internal-format TLVs to their wire representations.
3541: <p>
3542: The TLVs in the queue are freed after they are written to the buffer.
3543: </function>
3544: <function><p><type>void</type>
3545: <funcdef>babel_send_unicast</funcdef>
3546: (<type>union babel_msg *</type> <param>msg</param>, <type>struct babel_iface *</type> <param>ifa</param>, <type>ip_addr</type> <param>dest</param>) -- send a single TLV via unicast to a destination
3547:
3548: <funcsect>Arguments
3549: <p><descrip>
3550: <tagp><type>union babel_msg *</type> <param>msg</param></tagp>
3551: TLV to send
3552: <tagp><type>struct babel_iface *</type> <param>ifa</param></tagp>
3553: Interface to send via
3554: <tagp><type>ip_addr</type> <param>dest</param></tagp>
3555: Destination of the TLV
3556: </descrip>
3557: <funcsect>Description
3558: <p>
3559: This function is used to send a single TLV via unicast to a designated
3560: receiver. This is used for replying to certain incoming requests, and for
3561: sending unicast requests to refresh routes before they expire.
3562: </function>
3563: <function><p><type>void</type>
3564: <funcdef>babel_enqueue</funcdef>
3565: (<type>union babel_msg *</type> <param>msg</param>, <type>struct babel_iface *</type> <param>ifa</param>) -- enqueue a TLV for transmission on an interface
3566:
3567: <funcsect>Arguments
3568: <p><descrip>
3569: <tagp><type>union babel_msg *</type> <param>msg</param></tagp>
3570: TLV to enqueue (in internal TLV format)
3571: <tagp><type>struct babel_iface *</type> <param>ifa</param></tagp>
3572: Interface to enqueue to
3573: </descrip>
3574: <funcsect>Description
3575: <p>
3576: This function is called to enqueue a TLV for subsequent transmission on an
3577: interface. The transmission event is triggered whenever a TLV is enqueued;
3578: this ensures that TLVs will be transmitted in a timely manner, but that TLVs
3579: which are enqueued in rapid succession can be transmitted together in one
3580: packet.
3581: </function>
3582: <function><p><type>void</type>
3583: <funcdef>babel_process_packet</funcdef>
3584: (<type>struct babel_pkt_header *</type> <param>pkt</param>, <type>int</type> <param>len</param>, <type>ip_addr</type> <param>saddr</param>, <type>struct babel_iface *</type> <param>ifa</param>) -- process incoming data packet
3585:
3586: <funcsect>Arguments
3587: <p><descrip>
3588: <tagp><type>struct babel_pkt_header *</type> <param>pkt</param></tagp>
3589: Pointer to the packet data
3590: <tagp><type>int</type> <param>len</param></tagp>
3591: Length of received packet
3592: <tagp><type>ip_addr</type> <param>saddr</param></tagp>
3593: Address of packet sender
3594: <tagp><type>struct babel_iface *</type> <param>ifa</param></tagp>
3595: Interface packet was received on.
3596: </descrip>
3597: <funcsect>Description
3598: <p>
3599: This function is the main processing hook of incoming Babel packets. It
3600: checks that the packet header is well-formed, then processes the TLVs
3601: contained in the packet. This is done in two passes: First all TLVs are
3602: parsed into the internal TLV format. If a TLV parser fails, processing of the
3603: rest of the packet is aborted.
3604: <p>
3605: After the parsing step, the TLV handlers are called for each parsed TLV in
3606: order.
3607: </function>
3608: <sect>Bidirectional Forwarding Detection
3609: <p>
3610: <p>
3611: The BFD protocol is implemented in three files: <tt>bfd.c</tt> containing the
3612: protocol logic and the protocol glue with BIRD core, <tt>packets.c</tt> handling BFD
3613: packet processing, RX, TX and protocol sockets. <tt>io.c</tt> then contains generic
3614: code for the event loop, threads and event sources (sockets, microsecond
3615: timers). This generic code will be merged to the main BIRD I/O code in the
3616: future.
3617: <p>
3618: The BFD implementation uses a separate thread with an internal event loop for
3619: handling the protocol logic, which requires high-res and low-latency timing,
3620: so it is not affected by the rest of BIRD, which has several low-granularity
3621: hooks in the main loop, uses second-based timers and cannot offer good
3622: latency. The core of BFD protocol (the code related to BFD sessions,
3623: interfaces and packets) runs in the BFD thread, while the rest (the code
3624: related to BFD requests, BFD neighbors and the protocol glue) runs in the
3625: main thread.
3626: <p>
3627: BFD sessions are represented by structure <struct/bfd_session/ that contains a state
3628: related to the session and two timers (TX timer for periodic packets and hold
3629: timer for session timeout). These sessions are allocated from <param/session_slab/
3630: and are accessible by two hash tables, <param/session_hash_id/ (by session ID) and
3631: <param/session_hash_ip/ (by IP addresses of neighbors). Slab and both hashes are in
3632: the main protocol structure <struct/bfd_proto/. The protocol logic related to BFD
3633: sessions is implemented in internal functions bfd_session_*(), which are
3634: expected to be called from the context of BFD thread, and external functions
3635: <func/bfd_add_session()/, <func/bfd_remove_session()/ and <func/bfd_reconfigure_session()/, which
3636: form an interface to the BFD core for the rest and are expected to be called
3637: from the context of main thread.
3638: <p>
3639: Each BFD session has an associated BFD interface, represented by structure
3640: <struct/bfd_iface/. A BFD interface contains a socket used for TX (the one for RX is
3641: shared in <struct/bfd_proto/), an interface configuration and reference counter.
3642: Compared to interface structures of other protocols, these structures are not
3643: created and removed based on interface notification events, but according to
3644: the needs of BFD sessions. When a new session is created, it requests a
3645: proper BFD interface by function <func/bfd_get_iface()/, which either finds an
3646: existing one in <struct/iface_list/ (from <struct/bfd_proto/) or allocates a new one. When a
3647: session is removed, an associated iface is discharged by <func/bfd_free_iface()/.
3648: <p>
3649: BFD requests are the external API for the other protocols. When a protocol
3650: wants a BFD session, it calls <func/bfd_request_session()/, which creates a
3651: structure <struct/bfd_request/ containing approprite information and an notify hook.
3652: This structure is a resource associated with the caller's resource pool. When
3653: a BFD protocol is available, a BFD request is submitted to the protocol, an
3654: appropriate BFD session is found or created and the request is attached to
3655: the session. When a session changes state, all attached requests (and related
3656: protocols) are notified. Note that BFD requests do not depend on BFD protocol
3657: running. When the BFD protocol is stopped or removed (or not available from
3658: beginning), related BFD requests are stored in <param/bfd_wait_list/, where waits
3659: for a new protocol.
3660: <p>
3661: BFD neighbors are just a way to statically configure BFD sessions without
3662: requests from other protocol. Structures <struct/bfd_neighbor/ are part of BFD
3663: configuration (like static routes in the static protocol). BFD neighbors are
3664: handled by BFD protocol like it is a BFD client -- when a BFD neighbor is
3665: ready, the protocol just creates a BFD request like any other protocol.
3666: <p>
3667: The protocol uses a new generic event loop (structure <struct/birdloop/) from <tt>io.c</tt>,
3668: which supports sockets, timers and events like the main loop. Timers
3669: (structure <struct/timer2/) are new microsecond based timers, while sockets and
3670: events are the same. A birdloop is associated with a thread (field <param/thread/)
3671: in which event hooks are executed. Most functions for setting event sources
3672: (like <func/sk_start()/ or <func/tm2_start()/) must be called from the context of that
3673: thread. Birdloop allows to temporarily acquire the context of that thread for
3674: the main thread by calling <func/birdloop_enter()/ and then <func/birdloop_leave()/, which
3675: also ensures mutual exclusion with all event hooks. Note that resources
3676: associated with a birdloop (like timers) should be attached to the
3677: independent resource pool, detached from the main resource tree.
3678: <p>
3679: There are two kinds of interaction between the BFD core (running in the BFD
3680: thread) and the rest of BFD (running in the main thread). The first kind are
3681: configuration calls from main thread to the BFD thread (like <func/bfd_add_session()/).
3682: These calls are synchronous and use <func/birdloop_enter()/ mechanism for mutual
3683: exclusion. The second kind is a notification about session changes from the
3684: BFD thread to the main thread. This is done in an asynchronous way, sesions
3685: with pending notifications are linked (in the BFD thread) to <param/notify_list/ in
3686: <struct/bfd_proto/, and then <func/bfd_notify_hook()/ in the main thread is activated using
3687: <func/bfd_notify_kick()/ and a pipe. The hook then processes scheduled sessions and
3688: calls hooks from associated BFD requests. This <param/notify_list/ (and state fields
3689: in structure <struct/bfd_session/) is protected by a spinlock in <struct/bfd_proto/ and
3690: functions <func/bfd_lock_sessions()/ / <func/bfd_unlock_sessions()/.
3691: <p>
3692: There are few data races (accessing <param/p/->p.debug from <func/TRACE()/ from the BFD
3693: thread and accessing some some private fields of <const/bfd_session/ from
3694: <func/bfd_show_sessions()/ from the main thread, but these are harmless (i hope).
3695: <p>
3696: TODO: document functions and access restrictions for fields in BFD structures.
3697: <p>
3698: Supported standards:
3699: - RFC 5880 - main BFD standard
3700: - RFC 5881 - BFD for IP links
3701: - RFC 5882 - generic application of BFD
3702: - RFC 5883 - BFD for multihop paths
3703:
3704:
3705: <sect>Border Gateway Protocol
3706: <p>
3707: <p>
3708: The BGP protocol is implemented in three parts: <tt>bgp.c</tt> which takes care of the
3709: connection and most of the interface with BIRD core, <tt>packets.c</tt> handling
3710: both incoming and outgoing BGP packets and <tt>attrs.c</tt> containing functions for
3711: manipulation with BGP attribute lists.
3712: <p>
3713: As opposed to the other existing routing daemons, BIRD has a sophisticated core
3714: architecture which is able to keep all the information needed by BGP in the
3715: primary routing table, therefore no complex data structures like a central
3716: BGP table are needed. This increases memory footprint of a BGP router with
3717: many connections, but not too much and, which is more important, it makes
3718: BGP much easier to implement.
3719: <p>
3720: Each instance of BGP (corresponding to a single BGP peer) is described by a <struct/bgp_proto/
3721: structure to which are attached individual connections represented by <struct/bgp_connection/
3722: (usually, there exists only one connection, but during BGP session setup, there
3723: can be more of them). The connections are handled according to the BGP state machine
3724: defined in the RFC with all the timers and all the parameters configurable.
3725: <p>
3726: In incoming direction, we listen on the connection's socket and each time we receive
3727: some input, we pass it to <func/bgp_rx()/. It decodes packet headers and the markers and
3728: passes complete packets to <func/bgp_rx_packet()/ which distributes the packet according
3729: to its type.
3730: <p>
3731: In outgoing direction, we gather all the routing updates and sort them to buckets
3732: (<struct/bgp_bucket/) according to their attributes (we keep a hash table for fast comparison
3733: of <struct/rta/'s and a <struct/fib/ which helps us to find if we already have another route for
3734: the same destination queued for sending, so that we can replace it with the new one
3735: immediately instead of sending both updates). There also exists a special bucket holding
3736: all the route withdrawals which cannot be queued anywhere else as they don't have any
3737: attributes. If we have any packet to send (due to either new routes or the connection
3738: tracking code wanting to send a Open, Keepalive or Notification message), we call
3739: <func/bgp_schedule_packet()/ which sets the corresponding bit in a <param/packet_to_send/
3740: bit field in <struct/bgp_conn/ and as soon as the transmit socket buffer becomes empty,
3741: we call <func/bgp_fire_tx()/. It inspects state of all the packet type bits and calls
3742: the corresponding <func/bgp_create_xx()/ functions, eventually rescheduling the same packet
3743: type if we have more data of the same type to send.
3744: <p>
3745: The processing of attributes consists of two functions: <func/bgp_decode_attrs()/ for checking
3746: of the attribute blocks and translating them to the language of BIRD's extended attributes
3747: and <func/bgp_encode_attrs()/ which does the converse. Both functions are built around a
3748: <param/bgp_attr_table/ array describing all important characteristics of all known attributes.
3749: Unknown transitive attributes are attached to the route as <const/EAF_TYPE_OPAQUE/ byte streams.
3750: <p>
3751: BGP protocol implements graceful restart in both restarting (local restart)
3752: and receiving (neighbor restart) roles. The first is handled mostly by the
3753: graceful restart code in the nest, BGP protocol just handles capabilities,
3754: sets <param/gr_wait/ and locks graceful restart until end-of-RIB mark is received.
3755: The second is implemented by internal restart of the BGP state to <const/BS_IDLE/
3756: and protocol state to <const/PS_START/, but keeping the protocol up from the core
3757: point of view and therefore maintaining received routes. Routing table
3758: refresh cycle (<func/rt_refresh_begin()/, <func/rt_refresh_end()/) is used for removing
3759: stale routes after reestablishment of BGP session during graceful restart.
3760:
3761:
3762: <function><p><type>int</type>
3763: <funcdef>bgp_open</funcdef>
3764: (<type>struct bgp_proto *</type> <param>p</param>) -- open a BGP instance
3765:
3766: <funcsect>Arguments
3767: <p><descrip>
3768: <tagp><type>struct bgp_proto *</type> <param>p</param></tagp>
3769: BGP instance
3770: </descrip>
3771: <funcsect>Description
3772: <p>
3773: This function allocates and configures shared BGP resources.
3774: Should be called as the last step during initialization
3775: (when lock is acquired and neighbor is ready).
3776: When error, state changed to PS_DOWN, -1 is returned and caller
3777: should return immediately.
3778: </function>
3779: <function><p><type>void</type>
3780: <funcdef>bgp_close</funcdef>
3781: (<type>struct bgp_proto *</type> <param>p</param>, <type>int</type> <param>apply_md5</param>) -- close a BGP instance
3782:
3783: <funcsect>Arguments
3784: <p><descrip>
3785: <tagp><type>struct bgp_proto *</type> <param>p</param></tagp>
3786: BGP instance
3787: <tagp><type>int</type> <param>apply_md5</param></tagp>
3788: 0 to disable unsetting MD5 auth
3789: </descrip>
3790: <funcsect>Description
3791: <p>
3792: This function frees and deconfigures shared BGP resources.
3793: <param/apply_md5/ is set to 0 when bgp_close is called as a cleanup
3794: from failed <func/bgp_open()/.
3795: </function>
3796: <function><p><type>void</type>
3797: <funcdef>bgp_start_timer</funcdef>
3798: (<type>timer *</type> <param>t</param>, <type>int</type> <param>value</param>) -- start a BGP timer
3799:
3800: <funcsect>Arguments
3801: <p><descrip>
3802: <tagp><type>timer *</type> <param>t</param></tagp>
3803: timer
3804: <tagp><type>int</type> <param>value</param></tagp>
3805: time to fire (0 to disable the timer)
3806: </descrip>
3807: <funcsect>Description
3808: <p>
3809: This functions calls <func/tm_start()/ on <param/t/ with time <param/value/ and the
3810: amount of randomization suggested by the BGP standard. Please use
3811: it for all BGP timers.
3812: </function>
3813: <function><p><type>void</type>
3814: <funcdef>bgp_close_conn</funcdef>
3815: (<type>struct bgp_conn *</type> <param>conn</param>) -- close a BGP connection
3816:
3817: <funcsect>Arguments
3818: <p><descrip>
3819: <tagp><type>struct bgp_conn *</type> <param>conn</param></tagp>
3820: connection to close
3821: </descrip>
3822: <funcsect>Description
3823: <p>
3824: This function takes a connection described by the <struct/bgp_conn/ structure,
3825: closes its socket and frees all resources associated with it.
3826: </function>
3827: <function><p><type>void</type>
3828: <funcdef>bgp_update_startup_delay</funcdef>
3829: (<type>struct bgp_proto *</type> <param>p</param>) -- update a startup delay
3830:
3831: <funcsect>Arguments
3832: <p><descrip>
3833: <tagp><type>struct bgp_proto *</type> <param>p</param></tagp>
3834: BGP instance
3835: </descrip>
3836: <funcsect>Description
3837: <p>
3838: This function updates a startup delay that is used to postpone next BGP connect.
3839: It also handles disable_after_error and might stop BGP instance when error
3840: happened and disable_after_error is on.
3841: <p>
3842: It should be called when BGP protocol error happened.
3843: </function>
3844: <function><p><type>void</type>
3845: <funcdef>bgp_handle_graceful_restart</funcdef>
3846: (<type>struct bgp_proto *</type> <param>p</param>) -- handle detected BGP graceful restart
3847:
3848: <funcsect>Arguments
3849: <p><descrip>
3850: <tagp><type>struct bgp_proto *</type> <param>p</param></tagp>
3851: BGP instance
3852: </descrip>
3853: <funcsect>Description
3854: <p>
3855: This function is called when a BGP graceful restart of the neighbor is
3856: detected (when the TCP connection fails or when a new TCP connection
3857: appears). The function activates processing of the restart - starts routing
3858: table refresh cycle and activates BGP restart timer. The protocol state goes
3859: back to <const/PS_START/, but changing BGP state back to <const/BS_IDLE/ is left for the
3860: caller.
3861: </function>
3862: <function><p><type>void</type>
3863: <funcdef>bgp_graceful_restart_done</funcdef>
3864: (<type>struct bgp_proto *</type> <param>p</param>) -- finish active BGP graceful restart
3865:
3866: <funcsect>Arguments
3867: <p><descrip>
3868: <tagp><type>struct bgp_proto *</type> <param>p</param></tagp>
3869: BGP instance
3870: </descrip>
3871: <funcsect>Description
3872: <p>
3873: This function is called when the active BGP graceful restart of the neighbor
3874: should be finished - either successfully (the neighbor sends all paths and
3875: reports end-of-RIB on the new session) or unsuccessfully (the neighbor does
3876: not support BGP graceful restart on the new session). The function ends
3877: routing table refresh cycle and stops BGP restart timer.
3878: </function>
3879: <function><p><type>void</type>
3880: <funcdef>bgp_graceful_restart_timeout</funcdef>
3881: (<type>timer *</type> <param>t</param>) -- timeout of graceful restart 'restart timer'
3882:
3883: <funcsect>Arguments
3884: <p><descrip>
3885: <tagp><type>timer *</type> <param>t</param></tagp>
3886: timer
3887: </descrip>
3888: <funcsect>Description
3889: <p>
3890: This function is a timeout hook for <param/gr_timer/, implementing BGP restart time
3891: limit for reestablisment of the BGP session after the graceful restart. When
3892: fired, we just proceed with the usual protocol restart.
3893: </function>
3894: <function><p><type>void</type>
3895: <funcdef>bgp_refresh_begin</funcdef>
3896: (<type>struct bgp_proto *</type> <param>p</param>) -- start incoming enhanced route refresh sequence
3897:
3898: <funcsect>Arguments
3899: <p><descrip>
3900: <tagp><type>struct bgp_proto *</type> <param>p</param></tagp>
3901: BGP instance
3902: </descrip>
3903: <funcsect>Description
3904: <p>
3905: This function is called when an incoming enhanced route refresh sequence is
3906: started by the neighbor, demarcated by the BoRR packet. The function updates
3907: the load state and starts the routing table refresh cycle. Note that graceful
3908: restart also uses routing table refresh cycle, but RFC 7313 and load states
3909: ensure that these two sequences do not overlap.
3910: </function>
3911: <function><p><type>void</type>
3912: <funcdef>bgp_refresh_end</funcdef>
3913: (<type>struct bgp_proto *</type> <param>p</param>) -- finish incoming enhanced route refresh sequence
3914:
3915: <funcsect>Arguments
3916: <p><descrip>
3917: <tagp><type>struct bgp_proto *</type> <param>p</param></tagp>
3918: BGP instance
3919: </descrip>
3920: <funcsect>Description
3921: <p>
3922: This function is called when an incoming enhanced route refresh sequence is
3923: finished by the neighbor, demarcated by the EoRR packet. The function updates
3924: the load state and ends the routing table refresh cycle. Routes not received
3925: during the sequence are removed by the nest.
3926: </function>
3927: <function><p><type>void</type>
3928: <funcdef>bgp_connect</funcdef>
3929: (<type>struct bgp_proto *</type> <param>p</param>) -- initiate an outgoing connection
3930:
3931: <funcsect>Arguments
3932: <p><descrip>
3933: <tagp><type>struct bgp_proto *</type> <param>p</param></tagp>
3934: BGP instance
3935: </descrip>
3936: <funcsect>Description
3937: <p>
3938: The <func/bgp_connect()/ function creates a new <struct/bgp_conn/ and initiates
3939: a TCP connection to the peer. The rest of connection setup is governed
3940: by the BGP state machine as described in the standard.
3941: </function>
3942: <function><p><type>struct bgp_proto *</type>
3943: <funcdef>bgp_find_proto</funcdef>
3944: (<type>sock *</type> <param>sk</param>) -- find existing proto for incoming connection
3945:
3946: <funcsect>Arguments
3947: <p><descrip>
3948: <tagp><type>sock *</type> <param>sk</param></tagp>
3949: TCP socket
3950: </descrip>
3951: </function>
3952: <function><p><type>int</type>
3953: <funcdef>bgp_incoming_connection</funcdef>
3954: (<type>sock *</type> <param>sk</param>, <type>uint dummy</type> <param>UNUSED</param>) -- handle an incoming connection
3955:
3956: <funcsect>Arguments
3957: <p><descrip>
3958: <tagp><type>sock *</type> <param>sk</param></tagp>
3959: TCP socket
3960: <tagp><type>uint dummy</type> <param>UNUSED</param></tagp>
3961: -- undescribed --
3962: </descrip>
3963: <funcsect>Description
3964: <p>
3965: This function serves as a socket hook for accepting of new BGP
3966: connections. It searches a BGP instance corresponding to the peer
3967: which has connected and if such an instance exists, it creates a
3968: <struct/bgp_conn/ structure, attaches it to the instance and either sends
3969: an Open message or (if there already is an active connection) it
3970: closes the new connection by sending a Notification message.
3971: </function>
3972: <function><p><type>void</type>
3973: <funcdef>bgp_error</funcdef>
3974: (<type>struct bgp_conn *</type> <param>c</param>, <type>unsigned</type> <param>code</param>, <type>unsigned</type> <param>subcode</param>, <type>byte *</type> <param>data</param>, <type>int</type> <param>len</param>) -- report a protocol error
3975:
3976: <funcsect>Arguments
3977: <p><descrip>
3978: <tagp><type>struct bgp_conn *</type> <param>c</param></tagp>
3979: connection
3980: <tagp><type>unsigned</type> <param>code</param></tagp>
3981: error code (according to the RFC)
3982: <tagp><type>unsigned</type> <param>subcode</param></tagp>
3983: error sub-code
3984: <tagp><type>byte *</type> <param>data</param></tagp>
3985: data to be passed in the Notification message
3986: <tagp><type>int</type> <param>len</param></tagp>
3987: length of the data
3988: </descrip>
3989: <funcsect>Description
3990: <p>
3991: <func/bgp_error()/ sends a notification packet to tell the other side that a protocol
3992: error has occurred (including the data considered erroneous if possible) and
3993: closes the connection.
3994: </function>
3995: <function><p><type>void</type>
3996: <funcdef>bgp_store_error</funcdef>
3997: (<type>struct bgp_proto *</type> <param>p</param>, <type>struct bgp_conn *</type> <param>c</param>, <type>u8</type> <param>class</param>, <type>u32</type> <param>code</param>) -- store last error for status report
3998:
3999: <funcsect>Arguments
4000: <p><descrip>
4001: <tagp><type>struct bgp_proto *</type> <param>p</param></tagp>
4002: BGP instance
4003: <tagp><type>struct bgp_conn *</type> <param>c</param></tagp>
4004: connection
4005: <tagp><type>u8</type> <param>class</param></tagp>
4006: error class (BE_xxx constants)
4007: <tagp><type>u32</type> <param>code</param></tagp>
4008: error code (class specific)
4009: </descrip>
4010: <funcsect>Description
4011: <p>
4012: <func/bgp_store_error()/ decides whether given error is interesting enough
4013: and store that error to last_error variables of <param/p/
4014: </function>
4015: <function><p><type>int</type>
4016: <funcdef>bgp_fire_tx</funcdef>
4017: (<type>struct bgp_conn *</type> <param>conn</param>) -- transmit packets
4018:
4019: <funcsect>Arguments
4020: <p><descrip>
4021: <tagp><type>struct bgp_conn *</type> <param>conn</param></tagp>
4022: connection
4023: </descrip>
4024: <funcsect>Description
4025: <p>
4026: Whenever the transmit buffers of the underlying TCP connection
4027: are free and we have any packets queued for sending, the socket functions
4028: call <func/bgp_fire_tx()/ which takes care of selecting the highest priority packet
4029: queued (Notification > Keepalive > Open > Update), assembling its header
4030: and body and sending it to the connection.
4031: </function>
4032: <function><p><type>void</type>
4033: <funcdef>bgp_schedule_packet</funcdef>
4034: (<type>struct bgp_conn *</type> <param>conn</param>, <type>int</type> <param>type</param>) -- schedule a packet for transmission
4035:
4036: <funcsect>Arguments
4037: <p><descrip>
4038: <tagp><type>struct bgp_conn *</type> <param>conn</param></tagp>
4039: connection
4040: <tagp><type>int</type> <param>type</param></tagp>
4041: packet type
4042: </descrip>
4043: <funcsect>Description
4044: <p>
4045: Schedule a packet of type <param/type/ to be sent as soon as possible.
4046: </function>
4047: <function><p><type>const char *</type>
4048: <funcdef>bgp_error_dsc</funcdef>
4049: (<type>unsigned</type> <param>code</param>, <type>unsigned</type> <param>subcode</param>) -- return BGP error description
4050:
4051: <funcsect>Arguments
4052: <p><descrip>
4053: <tagp><type>unsigned</type> <param>code</param></tagp>
4054: BGP error code
4055: <tagp><type>unsigned</type> <param>subcode</param></tagp>
4056: BGP error subcode
4057: </descrip>
4058: <funcsect>Description
4059: <p>
4060: <func/bgp_error_dsc()/ returns error description for BGP errors
4061: which might be static string or given temporary buffer.
4062: </function>
4063: <function><p><type>void</type>
4064: <funcdef>bgp_rx_packet</funcdef>
4065: (<type>struct bgp_conn *</type> <param>conn</param>, <type>byte *</type> <param>pkt</param>, <type>unsigned</type> <param>len</param>) -- handle a received packet
4066:
4067: <funcsect>Arguments
4068: <p><descrip>
4069: <tagp><type>struct bgp_conn *</type> <param>conn</param></tagp>
4070: BGP connection
4071: <tagp><type>byte *</type> <param>pkt</param></tagp>
4072: start of the packet
4073: <tagp><type>unsigned</type> <param>len</param></tagp>
4074: packet size
4075: </descrip>
4076: <funcsect>Description
4077: <p>
4078: <func/bgp_rx_packet()/ takes a newly received packet and calls the corresponding
4079: packet handler according to the packet type.
4080: </function>
4081: <function><p><type>int</type>
4082: <funcdef>bgp_rx</funcdef>
4083: (<type>sock *</type> <param>sk</param>, <type>uint</type> <param>size</param>) -- handle received data
4084:
4085: <funcsect>Arguments
4086: <p><descrip>
4087: <tagp><type>sock *</type> <param>sk</param></tagp>
4088: socket
4089: <tagp><type>uint</type> <param>size</param></tagp>
4090: amount of data received
4091: </descrip>
4092: <funcsect>Description
4093: <p>
4094: <func/bgp_rx()/ is called by the socket layer whenever new data arrive from
4095: the underlying TCP connection. It assembles the data fragments to packets,
4096: checks their headers and framing and passes complete packets to
4097: <func/bgp_rx_packet()/.
4098: </function>
4099: <function><p><type>uint</type>
4100: <funcdef>bgp_encode_attrs</funcdef>
4101: (<type>struct bgp_proto *</type> <param>p</param>, <type>byte *</type> <param>w</param>, <type>ea_list *</type> <param>attrs</param>, <type>int</type> <param>remains</param>) -- encode BGP attributes
4102:
4103: <funcsect>Arguments
4104: <p><descrip>
4105: <tagp><type>struct bgp_proto *</type> <param>p</param></tagp>
4106: BGP instance (or NULL)
4107: <tagp><type>byte *</type> <param>w</param></tagp>
4108: buffer
4109: <tagp><type>ea_list *</type> <param>attrs</param></tagp>
4110: a list of extended attributes
4111: <tagp><type>int</type> <param>remains</param></tagp>
4112: remaining space in the buffer
4113: </descrip>
4114: <funcsect>Description
4115: <p>
4116: The <func/bgp_encode_attrs()/ function takes a list of extended attributes
4117: and converts it to its BGP representation (a part of an Update message).
4118: <funcsect>Result
4119: <p>
4120: Length of the attribute block generated or -1 if not enough space.
4121: </function>
4122: <function><p><type>struct rta *</type>
4123: <funcdef>bgp_decode_attrs</funcdef>
4124: (<type>struct bgp_conn *</type> <param>conn</param>, <type>byte *</type> <param>attr</param>, <type>uint</type> <param>len</param>, <type>struct linpool *</type> <param>pool</param>, <type>int</type> <param>mandatory</param>) -- check and decode BGP attributes
4125:
4126: <funcsect>Arguments
4127: <p><descrip>
4128: <tagp><type>struct bgp_conn *</type> <param>conn</param></tagp>
4129: connection
4130: <tagp><type>byte *</type> <param>attr</param></tagp>
4131: start of attribute block
4132: <tagp><type>uint</type> <param>len</param></tagp>
4133: length of attribute block
4134: <tagp><type>struct linpool *</type> <param>pool</param></tagp>
4135: linear pool to make all the allocations in
4136: <tagp><type>int</type> <param>mandatory</param></tagp>
4137: 1 iff presence of mandatory attributes has to be checked
4138: </descrip>
4139: <funcsect>Description
4140: <p>
4141: This function takes a BGP attribute block (a part of an Update message), checks
4142: its consistency and converts it to a list of BIRD route attributes represented
4143: by a <struct/rta/.
4144: </function>
4145: <sect>Multi-Threaded Routing Toolkit (MRT) protocol
4146: <p>
4147: <p>
4148: The MRT protocol is implemented in just one file: <tt>mrt.c</tt>. It contains of
4149: several parts: Generic functions for preparing MRT messages in a buffer,
4150: functions for MRT table dump (called from timer or CLI), functions for MRT
4151: BGP4MP dump (called from BGP), and the usual protocol glue. For the MRT table
4152: dump, the key structure is struct mrt_table_dump_state, which contains all
4153: necessary data and created when the MRT dump cycle is started for the
4154: duration of the MRT dump. The MBGP4MP dump is currently not bound to MRT
4155: protocol instance and uses the config->mrtdump_file fd.
4156: <p>
4157: The protocol is simple, just periodically scans routing table and export it
4158: to a file. It does not use the regular update mechanism, but a direct access
4159: in order to handle iteration through multiple routing tables. The table dump
4160: needs to dump all peers first and then use indexes to address the peers, we
4161: use a hash table (<param/peer_hash/) to find peer index based on BGP protocol key
4162: attributes.
4163: <p>
4164: One thing worth documenting is the locking. During processing, the currently
4165: processed table (<param/table/ field in the state structure) is locked and also the
4166: explicitly named table is locked (<param/table_ptr/ field in the state structure) if
4167: specified. Between dumps no table is locked. Also the current config is
4168: locked (by <func/config_add_obstacle()/) during table dumps as some data (strings,
4169: filters) are shared from the config and the running table dump may be
4170: interrupted by reconfiguration.
4171: <p>
4172: Supported standards:
4173: - RFC 6396 - MRT format standard
4174: - RFC 8050 - ADD_PATH extension
4175:
4176:
4177: <sect>Open Shortest Path First (OSPF)
4178: <p>
4179: <p>
4180: The OSPF protocol is quite complicated and its complex implemenation is split
4181: to many files. In <tt>ospf.c</tt>, you will find mainly the interface for
4182: communication with the core (e.g., reconfiguration hooks, shutdown and
4183: initialisation and so on). File <tt>iface.c</tt> contains the interface state
4184: machine and functions for allocation and deallocation of OSPF's interface
4185: data structures. Source <tt>neighbor.c</tt> includes the neighbor state machine and
4186: functions for election of Designated Router and Backup Designated router. In
4187: <tt>packet.c</tt>, you will find various functions for sending and receiving generic
4188: OSPF packets. There are also routines for authentication and checksumming.
4189: In <tt>hello.c</tt>, there are routines for sending and receiving of hello packets
4190: as well as functions for maintaining wait times and the inactivity timer.
4191: Files <tt>lsreq.c</tt>, <tt>lsack.c</tt>, <tt>dbdes.c</tt> contain functions for sending and
4192: receiving of link-state requests, link-state acknowledgements and database
4193: descriptions respectively. In <tt>lsupd.c</tt>, there are functions for sending and
4194: receiving of link-state updates and also the flooding algorithm. Source
4195: <tt>topology.c</tt> is a place where routines for searching LSAs in the link-state
4196: database, adding and deleting them reside, there also are functions for
4197: originating of various types of LSAs (router LSA, net LSA, external LSA).
4198: File <tt>rt.c</tt> contains routines for calculating the routing table. <tt>lsalib.c</tt>
4199: is a set of various functions for working with the LSAs (endianity
4200: conversions, calculation of checksum etc.).
4201: <p>
4202: One instance of the protocol is able to hold LSA databases for multiple OSPF
4203: areas, to exchange routing information between multiple neighbors and to
4204: calculate the routing tables. The core structure is <struct/ospf_proto/ to which
4205: multiple <struct/ospf_area/ and <struct/ospf_iface/ structures are connected. <struct/ospf_proto/ is
4206: also connected to <struct/top_hash_graph/ which is a dynamic hashing structure that
4207: describes the link-state database. It allows fast search, addition and
4208: deletion. Each LSA is kept in two pieces: header and body. Both of them are
4209: kept in the endianity of the CPU.
4210: <p>
4211: In OSPFv2 specification, it is implied that there is one IP prefix for each
4212: physical network/interface (unless it is an ptp link). But in modern systems,
4213: there might be more independent IP prefixes associated with an interface. To
4214: handle this situation, we have one <struct/ospf_iface/ for each active IP prefix
4215: (instead for each active iface); This behaves like virtual interface for the
4216: purpose of OSPF. If we receive packet, we associate it with a proper virtual
4217: interface mainly according to its source address.
4218: <p>
4219: OSPF keeps one socket per <struct/ospf_iface/. This allows us (compared to one socket
4220: approach) to evade problems with a limit of multicast groups per socket and
4221: with sending multicast packets to appropriate interface in a portable way.
4222: The socket is associated with underlying physical iface and should not
4223: receive packets received on other ifaces (unfortunately, this is not true on
4224: BSD). Generally, one packet can be received by more sockets (for example, if
4225: there are more <struct/ospf_iface/ on one physical iface), therefore we explicitly
4226: filter received packets according to src/dst IP address and received iface.
4227: <p>
4228: Vlinks are implemented using particularly degenerate form of <struct/ospf_iface/,
4229: which has several exceptions: it does not have its iface or socket (it copies
4230: these from 'parent' <struct/ospf_iface/) and it is present in iface list even when
4231: down (it is not freed in <func/ospf_iface_down()/).
4232: <p>
4233: The heart beat of ospf is <func/ospf_disp()/. It is called at regular intervals
4234: (<struct/ospf_proto/->tick). It is responsible for aging and flushing of LSAs in the
4235: database, updating topology information in LSAs and for routing table
4236: calculation.
4237: <p>
4238: To every <struct/ospf_iface/, we connect one or more <struct/ospf_neighbor/'s -- a structure
4239: containing many timers and queues for building adjacency and for exchange of
4240: routing messages.
4241: <p>
4242: BIRD's OSPF implementation respects RFC2328 in every detail, but some of
4243: internal algorithms do differ. The RFC recommends making a snapshot of the
4244: link-state database when a new adjacency is forming and sending the database
4245: description packets based on the information in this snapshot. The database
4246: can be quite large in some networks, so rather we walk through a <struct/slist/
4247: structure which allows us to continue even if the actual LSA we were working
4248: with is deleted. New LSAs are added at the tail of this <struct/slist/.
4249: <p>
4250: We also do not keep a separate OSPF routing table, because the core helps us
4251: by being able to recognize when a route is updated to an identical one and it
4252: suppresses the update automatically. Due to this, we can flush all the routes
4253: we have recalculated and also those we have deleted to the core's routing
4254: table and the core will take care of the rest. This simplifies the process
4255: and conserves memory.
4256: <p>
4257: Supported standards:
4258: - RFC 2328 - main OSPFv2 standard
4259: - RFC 5340 - main OSPFv3 standard
4260: - RFC 3101 - OSPFv2 NSSA areas
4261: - RFC 6549 - OSPFv2 multi-instance extensions
4262: - RFC 6987 - OSPF stub router advertisement
4263:
4264:
4265: <function><p><type>void</type>
4266: <funcdef>ospf_disp</funcdef>
4267: (<type>timer *</type> <param>timer</param>) -- invokes routing table calculation, aging and also <func/area_disp()/
4268:
4269: <funcsect>Arguments
4270: <p><descrip>
4271: <tagp><type>timer *</type> <param>timer</param></tagp>
4272: timer usually called every <param/ospf_proto/->tick second, <param/timer/->data
4273: point to <param/ospf_proto/
4274: </descrip>
4275: </function>
4276: <function><p><type>int</type>
4277: <funcdef>ospf_import_control</funcdef>
4278: (<type>struct proto *</type> <param>P</param>, <type>rte **</type> <param>new</param>, <type>ea_list **</type> <param>attrs</param>, <type>struct linpool *</type> <param>pool</param>) -- accept or reject new route from nest's routing table
4279:
4280: <funcsect>Arguments
4281: <p><descrip>
4282: <tagp><type>struct proto *</type> <param>P</param></tagp>
4283: OSPF protocol instance
4284: <tagp><type>rte **</type> <param>new</param></tagp>
4285: the new route
4286: <tagp><type>ea_list **</type> <param>attrs</param></tagp>
4287: list of attributes
4288: <tagp><type>struct linpool *</type> <param>pool</param></tagp>
4289: pool for allocation of attributes
4290: </descrip>
4291: <funcsect>Description
4292: <p>
4293: Its quite simple. It does not accept our own routes and leaves the decision on
4294: import to the filters.
4295: </function>
4296: <function><p><type>int</type>
4297: <funcdef>ospf_shutdown</funcdef>
4298: (<type>struct proto *</type> <param>P</param>) -- Finish of OSPF instance
4299:
4300: <funcsect>Arguments
4301: <p><descrip>
4302: <tagp><type>struct proto *</type> <param>P</param></tagp>
4303: OSPF protocol instance
4304: </descrip>
4305: <funcsect>Description
4306: <p>
4307: RFC does not define any action that should be taken before router
4308: shutdown. To make my neighbors react as fast as possible, I send
4309: them hello packet with empty neighbor list. They should start
4310: their neighbor state machine with event <const/NEIGHBOR_1WAY/.
4311: </function>
4312: <function><p><type>int</type>
4313: <funcdef>ospf_reconfigure</funcdef>
4314: (<type>struct proto *</type> <param>P</param>, <type>struct proto_config *</type> <param>c</param>) -- reconfiguration hook
4315:
4316: <funcsect>Arguments
4317: <p><descrip>
4318: <tagp><type>struct proto *</type> <param>P</param></tagp>
4319: current instance of protocol (with old configuration)
4320: <tagp><type>struct proto_config *</type> <param>c</param></tagp>
4321: new configuration requested by user
4322: </descrip>
4323: <funcsect>Description
4324: <p>
4325: This hook tries to be a little bit intelligent. Instance of OSPF
4326: will survive change of many constants like hello interval,
4327: password change, addition or deletion of some neighbor on
4328: nonbroadcast network, cost of interface, etc.
4329: </function>
4330: <function><p><type>struct top_hash_entry *</type>
4331: <funcdef>ospf_install_lsa</funcdef>
4332: (<type>struct ospf_proto *</type> <param>p</param>, <type>struct ospf_lsa_header *</type> <param>lsa</param>, <type>u32</type> <param>type</param>, <type>u32</type> <param>domain</param>, <type>void *</type> <param>body</param>) -- install new LSA into database
4333:
4334: <funcsect>Arguments
4335: <p><descrip>
4336: <tagp><type>struct ospf_proto *</type> <param>p</param></tagp>
4337: OSPF protocol instance
4338: <tagp><type>struct ospf_lsa_header *</type> <param>lsa</param></tagp>
4339: LSA header
4340: <tagp><type>u32</type> <param>type</param></tagp>
4341: type of LSA
4342: <tagp><type>u32</type> <param>domain</param></tagp>
4343: domain of LSA
4344: <tagp><type>void *</type> <param>body</param></tagp>
4345: pointer to LSA body
4346: </descrip>
4347: <funcsect>Description
4348: <p>
4349: This function ensures installing new LSA received in LS update into LSA
4350: database. Old instance is replaced. Several actions are taken to detect if
4351: new routing table calculation is necessary. This is described in 13.2 of RFC
4352: 2328. This function is for received LSA only, locally originated LSAs are
4353: installed by <func/ospf_originate_lsa()/.
4354: <p>
4355: The LSA body in <param/body/ is expected to be mb_allocated by the caller and its
4356: ownership is transferred to the LSA entry structure.
4357: </function>
4358: <function><p><type>void</type>
4359: <funcdef>ospf_advance_lsa</funcdef>
4360: (<type>struct ospf_proto *</type> <param>p</param>, <type>struct top_hash_entry *</type> <param>en</param>, <type>struct ospf_lsa_header *</type> <param>lsa</param>, <type>u32</type> <param>type</param>, <type>u32</type> <param>domain</param>, <type>void *</type> <param>body</param>) -- handle received unexpected self-originated LSA
4361:
4362: <funcsect>Arguments
4363: <p><descrip>
4364: <tagp><type>struct ospf_proto *</type> <param>p</param></tagp>
4365: OSPF protocol instance
4366: <tagp><type>struct top_hash_entry *</type> <param>en</param></tagp>
4367: current LSA entry or NULL
4368: <tagp><type>struct ospf_lsa_header *</type> <param>lsa</param></tagp>
4369: new LSA header
4370: <tagp><type>u32</type> <param>type</param></tagp>
4371: type of LSA
4372: <tagp><type>u32</type> <param>domain</param></tagp>
4373: domain of LSA
4374: <tagp><type>void *</type> <param>body</param></tagp>
4375: pointer to LSA body
4376: </descrip>
4377: <funcsect>Description
4378: <p>
4379: This function handles received unexpected self-originated LSA (<param/lsa/, <param/body/)
4380: by either advancing sequence number of the local LSA instance (<param/en/) and
4381: propagating it, or installing the received LSA and immediately flushing it
4382: (if there is no local LSA; i.e., <param/en/ is NULL or MaxAge).
4383: <p>
4384: The LSA body in <param/body/ is expected to be mb_allocated by the caller and its
4385: ownership is transferred to the LSA entry structure or it is freed.
4386: </function>
4387: <function><p><type>struct top_hash_entry *</type>
4388: <funcdef>ospf_originate_lsa</funcdef>
4389: (<type>struct ospf_proto *</type> <param>p</param>, <type>struct ospf_new_lsa *</type> <param>lsa</param>) -- originate new LSA
4390:
4391: <funcsect>Arguments
4392: <p><descrip>
4393: <tagp><type>struct ospf_proto *</type> <param>p</param></tagp>
4394: OSPF protocol instance
4395: <tagp><type>struct ospf_new_lsa *</type> <param>lsa</param></tagp>
4396: New LSA specification
4397: </descrip>
4398: <funcsect>Description
4399: <p>
4400: This function prepares a new LSA, installs it into the LSA database and
4401: floods it. If the new LSA cannot be originated now (because the old instance
4402: was originated within MinLSInterval, or because the LSA seqnum is currently
4403: wrapping), the origination is instead scheduled for later. If the new LSA is
4404: equivalent to the current LSA, the origination is skipped. In all cases, the
4405: corresponding LSA entry is returned. The new LSA is based on the LSA
4406: specification (<param/lsa/) and the LSA body from lsab buffer of <param/p/, which is
4407: emptied after the call. The opposite of this function is <func/ospf_flush_lsa()/.
4408: </function>
4409: <function><p><type>void</type>
4410: <funcdef>ospf_flush_lsa</funcdef>
4411: (<type>struct ospf_proto *</type> <param>p</param>, <type>struct top_hash_entry *</type> <param>en</param>) -- flush LSA from OSPF domain
4412:
4413: <funcsect>Arguments
4414: <p><descrip>
4415: <tagp><type>struct ospf_proto *</type> <param>p</param></tagp>
4416: OSPF protocol instance
4417: <tagp><type>struct top_hash_entry *</type> <param>en</param></tagp>
4418: LSA entry to flush
4419: </descrip>
4420: <funcsect>Description
4421: <p>
4422: This function flushes <param/en/ from the OSPF domain by setting its age to
4423: <const/LSA_MAXAGE/ and flooding it. That also triggers subsequent events in LSA
4424: lifecycle leading to removal of the LSA from the LSA database (e.g. the LSA
4425: content is freed when flushing is acknowledged by neighbors). The function
4426: does nothing if the LSA is already being flushed. LSA entries are not
4427: immediately removed when being flushed, the caller may assume that <param/en/ still
4428: exists after the call. The function is the opposite of <func/ospf_originate_lsa()/
4429: and is supposed to do the right thing even in cases of postponed
4430: origination.
4431: </function>
4432: <function><p><type>void</type>
4433: <funcdef>ospf_update_lsadb</funcdef>
4434: (<type>struct ospf_proto *</type> <param>p</param>) -- update LSA database
4435:
4436: <funcsect>Arguments
4437: <p><descrip>
4438: <tagp><type>struct ospf_proto *</type> <param>p</param></tagp>
4439: OSPF protocol instance
4440: </descrip>
4441: <funcsect>Description
4442: <p>
4443: This function is periodicaly invoked from <func/ospf_disp()/. It does some periodic
4444: or postponed processing related to LSA entries. It originates postponed LSAs
4445: scheduled by <func/ospf_originate_lsa()/, It continues in flushing processes started
4446: by <func/ospf_flush_lsa()/. It also periodically refreshs locally originated LSAs --
4447: when the current instance is older <const/LSREFRESHTIME/, a new instance is originated.
4448: Finally, it also ages stored LSAs and flushes ones that reached <const/LSA_MAXAGE/.
4449: <p>
4450: The RFC 2328 says that a router should periodically check checksums of all
4451: stored LSAs to detect hardware problems. This is not implemented.
4452: </function>
4453: <function><p><type>void</type>
4454: <funcdef>ospf_originate_ext_lsa</funcdef>
4455: (<type>struct ospf_proto *</type> <param>p</param>, <type>struct ospf_area *</type> <param>oa</param>, <type>ort *</type> <param>nf</param>, <type>u8</type> <param>mode</param>, <type>u32</type> <param>metric</param>, <type>u32</type> <param>ebit</param>, <type>ip_addr</type> <param>fwaddr</param>, <type>u32</type> <param>tag</param>, <type>int</type> <param>pbit</param>) -- new route received from nest and filters
4456:
4457: <funcsect>Arguments
4458: <p><descrip>
4459: <tagp><type>struct ospf_proto *</type> <param>p</param></tagp>
4460: OSPF protocol instance
4461: <tagp><type>struct ospf_area *</type> <param>oa</param></tagp>
4462: ospf_area for which LSA is originated
4463: <tagp><type>ort *</type> <param>nf</param></tagp>
4464: network prefix and mask
4465: <tagp><type>u8</type> <param>mode</param></tagp>
4466: the mode of the LSA (LSA_M_EXPORT or LSA_M_RTCALC)
4467: <tagp><type>u32</type> <param>metric</param></tagp>
4468: the metric of a route
4469: <tagp><type>u32</type> <param>ebit</param></tagp>
4470: E-bit for route metric (bool)
4471: <tagp><type>ip_addr</type> <param>fwaddr</param></tagp>
4472: the forwarding address
4473: <tagp><type>u32</type> <param>tag</param></tagp>
4474: the route tag
4475: <tagp><type>int</type> <param>pbit</param></tagp>
4476: P-bit for NSSA LSAs (bool), ignored for external LSAs
4477: </descrip>
4478: <funcsect>Description
4479: <p>
4480: If I receive a message that new route is installed, I try to originate an
4481: external LSA. If <param/oa/ is an NSSA area, NSSA-LSA is originated instead.
4482: <param/oa/ should not be a stub area. <param/src/ does not specify whether the LSA
4483: is external or NSSA, but it specifies the source of origination -
4484: the export from <func/ospf_rt_notify()/, or the NSSA-EXT translation.
4485: </function>
4486: <function><p><type>struct top_graph *</type>
4487: <funcdef>ospf_top_new</funcdef>
4488: (<type>struct ospf_proto *p UNUSED4</type> <param>UNUSED6</param>, <type>pool *</type> <param>pool</param>) -- allocated new topology database
4489:
4490: <funcsect>Arguments
4491: <p><descrip>
4492: <tagp><type>struct ospf_proto *p UNUSED4</type> <param>UNUSED6</param></tagp>
4493: -- undescribed --
4494: <tagp><type>pool *</type> <param>pool</param></tagp>
4495: pool for allocation
4496: </descrip>
4497: <funcsect>Description
4498: <p>
4499: This dynamically hashed structure is used for keeping LSAs. Mainly it is used
4500: for the LSA database of the OSPF protocol, but also for LSA retransmission
4501: and request lists of OSPF neighbors.
4502: </function>
4503: <function><p><type>void</type>
4504: <funcdef>ospf_neigh_chstate</funcdef>
4505: (<type>struct ospf_neighbor *</type> <param>n</param>, <type>u8</type> <param>state</param>) -- handles changes related to new or lod state of neighbor
4506:
4507: <funcsect>Arguments
4508: <p><descrip>
4509: <tagp><type>struct ospf_neighbor *</type> <param>n</param></tagp>
4510: OSPF neighbor
4511: <tagp><type>u8</type> <param>state</param></tagp>
4512: new state
4513: </descrip>
4514: <funcsect>Description
4515: <p>
4516: Many actions have to be taken acording to a change of state of a neighbor. It
4517: starts rxmt timers, call interface state machine etc.
4518: </function>
4519: <function><p><type>void</type>
4520: <funcdef>ospf_neigh_sm</funcdef>
4521: (<type>struct ospf_neighbor *</type> <param>n</param>, <type>int</type> <param>event</param>) -- ospf neighbor state machine
4522:
4523: <funcsect>Arguments
4524: <p><descrip>
4525: <tagp><type>struct ospf_neighbor *</type> <param>n</param></tagp>
4526: neighor
4527: <tagp><type>int</type> <param>event</param></tagp>
4528: actual event
4529: </descrip>
4530: <funcsect>Description
4531: <p>
4532: This part implements the neighbor state machine as described in 10.3 of
4533: RFC 2328. The only difference is that state <const/NEIGHBOR_ATTEMPT/ is not
4534: used. We discover neighbors on nonbroadcast networks in the
4535: same way as on broadcast networks. The only difference is in
4536: sending hello packets. These are sent to IPs listed in
4537: <param/ospf_iface/->nbma_list .
4538: </function>
4539: <function><p><type>void</type>
4540: <funcdef>ospf_dr_election</funcdef>
4541: (<type>struct ospf_iface *</type> <param>ifa</param>) -- (Backup) Designed Router election
4542:
4543: <funcsect>Arguments
4544: <p><descrip>
4545: <tagp><type>struct ospf_iface *</type> <param>ifa</param></tagp>
4546: actual interface
4547: </descrip>
4548: <funcsect>Description
4549: <p>
4550: When the wait timer fires, it is time to elect (Backup) Designated Router.
4551: Structure describing me is added to this list so every electing router has
4552: the same list. Backup Designated Router is elected before Designated
4553: Router. This process is described in 9.4 of RFC 2328. The function is
4554: supposed to be called only from <func/ospf_iface_sm()/ as a part of the interface
4555: state machine.
4556: </function>
4557: <function><p><type>void</type>
4558: <funcdef>ospf_iface_chstate</funcdef>
4559: (<type>struct ospf_iface *</type> <param>ifa</param>, <type>u8</type> <param>state</param>) -- handle changes of interface state
4560:
4561: <funcsect>Arguments
4562: <p><descrip>
4563: <tagp><type>struct ospf_iface *</type> <param>ifa</param></tagp>
4564: OSPF interface
4565: <tagp><type>u8</type> <param>state</param></tagp>
4566: new state
4567: </descrip>
4568: <funcsect>Description
4569: <p>
4570: Many actions must be taken according to interface state changes. New network
4571: LSAs must be originated, flushed, new multicast sockets to listen for messages for
4572: <const/ALLDROUTERS/ have to be opened, etc.
4573: </function>
4574: <function><p><type>void</type>
4575: <funcdef>ospf_iface_sm</funcdef>
4576: (<type>struct ospf_iface *</type> <param>ifa</param>, <type>int</type> <param>event</param>) -- OSPF interface state machine
4577:
4578: <funcsect>Arguments
4579: <p><descrip>
4580: <tagp><type>struct ospf_iface *</type> <param>ifa</param></tagp>
4581: OSPF interface
4582: <tagp><type>int</type> <param>event</param></tagp>
4583: event comming to state machine
4584: </descrip>
4585: <funcsect>Description
4586: <p>
4587: This fully respects 9.3 of RFC 2328 except we have slightly
4588: different handling of <const/DOWN/ and <const/LOOP/ state. We remove intefaces
4589: that are <const/DOWN/. <const/DOWN/ state is used when an interface is waiting
4590: for a lock. <const/LOOP/ state is used when an interface does not have a
4591: link.
4592: </function>
4593: <function><p><type>int</type>
4594: <funcdef>ospf_rx_hook</funcdef>
4595: (<type>sock *</type> <param>sk</param>, <type>uint</type> <param>len</param>)
4596: <funcsect>Arguments
4597: <p><descrip>
4598: <tagp><type>sock *</type> <param>sk</param></tagp>
4599: socket we received the packet.
4600: <tagp><type>uint</type> <param>len</param></tagp>
4601: size of the packet
4602: </descrip>
4603: <funcsect>Description
4604: <p>
4605: This is the entry point for messages from neighbors. Many checks (like
4606: authentication, checksums, size) are done before the packet is passed to
4607: non generic functions.
4608: </function>
4609: <function><p><type>int</type>
4610: <funcdef>lsa_validate</funcdef>
4611: (<type>struct ospf_lsa_header *</type> <param>lsa</param>, <type>u32</type> <param>lsa_type</param>, <type>int</type> <param>ospf2</param>, <type>void *</type> <param>body</param>) -- check whether given LSA is valid
4612:
4613: <funcsect>Arguments
4614: <p><descrip>
4615: <tagp><type>struct ospf_lsa_header *</type> <param>lsa</param></tagp>
4616: LSA header
4617: <tagp><type>u32</type> <param>lsa_type</param></tagp>
4618: one of <const/LSA_T_xxx/
4619: <tagp><type>int</type> <param>ospf2</param></tagp>
4620: <const/true/ means OSPF version 2, <const/false/ means OSPF version 3
4621: <tagp><type>void *</type> <param>body</param></tagp>
4622: pointer to LSA body
4623: </descrip>
4624: <funcsect>Description
4625: <p>
4626: Checks internal structure of given LSA body (minimal length,
4627: consistency). Returns true if valid.
4628: </function>
4629: <function><p><type>void</type>
4630: <funcdef>ospf_send_dbdes</funcdef>
4631: (<type>struct ospf_proto *</type> <param>p</param>, <type>struct ospf_neighbor *</type> <param>n</param>) -- transmit database description packet
4632:
4633: <funcsect>Arguments
4634: <p><descrip>
4635: <tagp><type>struct ospf_proto *</type> <param>p</param></tagp>
4636: OSPF protocol instance
4637: <tagp><type>struct ospf_neighbor *</type> <param>n</param></tagp>
4638: neighbor
4639: </descrip>
4640: <funcsect>Description
4641: <p>
4642: Sending of a database description packet is described in 10.8 of RFC 2328.
4643: Reception of each packet is acknowledged in the sequence number of another.
4644: When I send a packet to a neighbor I keep a copy in a buffer. If the neighbor
4645: does not reply, I don't create a new packet but just send the content
4646: of the buffer.
4647: </function>
4648: <function><p><type>void</type>
4649: <funcdef>ospf_rt_spf</funcdef>
4650: (<type>struct ospf_proto *</type> <param>p</param>) -- calculate internal routes
4651:
4652: <funcsect>Arguments
4653: <p><descrip>
4654: <tagp><type>struct ospf_proto *</type> <param>p</param></tagp>
4655: OSPF protocol instance
4656: </descrip>
4657: <funcsect>Description
4658: <p>
4659: Calculation of internal paths in an area is described in 16.1 of RFC 2328.
4660: It's based on Dijkstra's shortest path tree algorithms.
4661: This function is invoked from <func/ospf_disp()/.
4662: </function>
4663: <sect>Pipe
4664: <p>
4665: <p>
4666: The Pipe protocol is very simple. It just connects to two routing tables
4667: using <func/proto_add_announce_hook()/ and whenever it receives a <func/rt_notify()/
4668: about a change in one of the tables, it converts it to a <func/rte_update()/
4669: in the other one.
4670: <p>
4671: To avoid pipe loops, Pipe keeps a `being updated' flag in each routing
4672: table.
4673: <p>
4674: A pipe has two announce hooks, the first connected to the main
4675: table, the second connected to the peer table. When a new route is
4676: announced on the main table, it gets checked by an export filter in
4677: ahook 1, and, after that, it is announced to the peer table via
4678: <func/rte_update()/, an import filter in ahook 2 is called. When a new
4679: route is announced in the peer table, an export filter in ahook2
4680: and an import filter in ahook 1 are used. Oviously, there is no
4681: need in filtering the same route twice, so both import filters are
4682: set to accept, while user configured 'import' and 'export' filters
4683: are used as export filters in ahooks 2 and 1. Route limits are
4684: handled similarly, but on the import side of ahooks.
4685:
4686:
4687: <sect>Routing Information Protocol (RIP)
4688: <p>
4689: <p>
4690: The RIP protocol is implemented in two files: <tt>rip.c</tt> containing the protocol
4691: logic, route management and the protocol glue with BIRD core, and <tt>packets.c</tt>
4692: handling RIP packet processing, RX, TX and protocol sockets.
4693: <p>
4694: Each instance of RIP is described by a structure <struct/rip_proto/, which contains
4695: an internal RIP routing table, a list of protocol interfaces and the main
4696: timer responsible for RIP routing table cleanup.
4697: <p>
4698: RIP internal routing table contains incoming and outgoing routes. For each
4699: network (represented by structure <struct/rip_entry/) there is one outgoing route
4700: stored directly in <struct/rip_entry/ and an one-way linked list of incoming routes
4701: (structures <struct/rip_rte/). The list contains incoming routes from different RIP
4702: neighbors, but only routes with the lowest metric are stored (i.e., all
4703: stored incoming routes have the same metric).
4704: <p>
4705: Note that RIP itself does not select outgoing route, that is done by the core
4706: routing table. When a new incoming route is received, it is propagated to the
4707: RIP table by <func/rip_update_rte()/ and possibly stored in the list of incoming
4708: routes. Then the change may be propagated to the core by <func/rip_announce_rte()/.
4709: The core selects the best route and propagate it to RIP by <func/rip_rt_notify()/,
4710: which updates outgoing route part of <struct/rip_entry/ and possibly triggers route
4711: propagation by <func/rip_trigger_update()/.
4712: <p>
4713: RIP interfaces are represented by structures <struct/rip_iface/. A RIP interface
4714: contains a per-interface socket, a list of associated neighbors, interface
4715: configuration, and state information related to scheduled interface events
4716: and running update sessions. RIP interfaces are added and removed based on
4717: core interface notifications.
4718: <p>
4719: There are two RIP interface events - regular updates and triggered updates.
4720: Both are managed from the RIP interface timer (<func/rip_iface_timer()/). Regular
4721: updates are called at fixed interval and propagate the whole routing table,
4722: while triggered updates are scheduled by <func/rip_trigger_update()/ due to some
4723: routing table change and propagate only the routes modified since the time
4724: they were scheduled. There are also unicast-destined requested updates, but
4725: these are sent directly as a reaction to received RIP request message. The
4726: update session is started by <func/rip_send_table()/. There may be at most one
4727: active update session per interface, as the associated state (including the
4728: fib iterator) is stored directly in <struct/rip_iface/ structure.
4729: <p>
4730: RIP neighbors are represented by structures <struct/rip_neighbor/. Compared to
4731: neighbor handling in other routing protocols, RIP does not have explicit
4732: neighbor discovery and adjacency maintenance, which makes the <struct/rip_neighbor/
4733: related code a bit peculiar. RIP neighbors are interlinked with core neighbor
4734: structures (<struct/neighbor/) and use core neighbor notifications to ensure that RIP
4735: neighbors are timely removed. RIP neighbors are added based on received route
4736: notifications and removed based on core neighbor and RIP interface events.
4737: <p>
4738: RIP neighbors are linked by RIP routes and use counter to track the number of
4739: associated routes, but when these RIP routes timeout, associated RIP neighbor
4740: is still alive (with zero counter). When RIP neighbor is removed but still
4741: has some associated routes, it is not freed, just changed to detached state
4742: (core neighbors and RIP ifaces are unlinked), then during the main timer
4743: cleanup phase the associated routes are removed and the <struct/rip_neighbor/
4744: structure is finally freed.
4745: <p>
4746: Supported standards:
4747: - RFC 1058 - RIPv1
4748: - RFC 2453 - RIPv2
4749: - RFC 2080 - RIPng
4750: - RFC 4822 - RIP cryptographic authentication
4751:
4752:
4753: <function><p><type>void</type>
4754: <funcdef>rip_announce_rte</funcdef>
4755: (<type>struct rip_proto *</type> <param>p</param>, <type>struct rip_entry *</type> <param>en</param>) -- announce route from RIP routing table to the core
4756:
4757: <funcsect>Arguments
4758: <p><descrip>
4759: <tagp><type>struct rip_proto *</type> <param>p</param></tagp>
4760: RIP instance
4761: <tagp><type>struct rip_entry *</type> <param>en</param></tagp>
4762: related network
4763: </descrip>
4764: <funcsect>Description
4765: <p>
4766: The function takes a list of incoming routes from <param/en/, prepare appropriate
4767: <struct/rte/ for the core and propagate it by <func/rte_update()/.
4768: </function>
4769: <function><p><type>void</type>
4770: <funcdef>rip_update_rte</funcdef>
4771: (<type>struct rip_proto *</type> <param>p</param>, <type>ip_addr *</type> <param>prefix</param>, <type>int</type> <param>pxlen</param>, <type>struct rip_rte *</type> <param>new</param>) -- enter a route update to RIP routing table
4772:
4773: <funcsect>Arguments
4774: <p><descrip>
4775: <tagp><type>struct rip_proto *</type> <param>p</param></tagp>
4776: RIP instance
4777: <tagp><type>ip_addr *</type> <param>prefix</param></tagp>
4778: network prefix
4779: <tagp><type>int</type> <param>pxlen</param></tagp>
4780: network prefix length
4781: <tagp><type>struct rip_rte *</type> <param>new</param></tagp>
4782: a <struct/rip_rte/ representing the new route
4783: </descrip>
4784: <funcsect>Description
4785: <p>
4786: The function is called by the RIP packet processing code whenever it receives
4787: a reachable route. The appropriate routing table entry is found and the list
4788: of incoming routes is updated. Eventually, the change is also propagated to
4789: the core by <func/rip_announce_rte()/. Note that for unreachable routes,
4790: <func/rip_withdraw_rte()/ should be called instead of <func/rip_update_rte()/.
4791: </function>
4792: <function><p><type>void</type>
4793: <funcdef>rip_withdraw_rte</funcdef>
4794: (<type>struct rip_proto *</type> <param>p</param>, <type>ip_addr *</type> <param>prefix</param>, <type>int</type> <param>pxlen</param>, <type>struct rip_neighbor *</type> <param>from</param>) -- enter a route withdraw to RIP routing table
4795:
4796: <funcsect>Arguments
4797: <p><descrip>
4798: <tagp><type>struct rip_proto *</type> <param>p</param></tagp>
4799: RIP instance
4800: <tagp><type>ip_addr *</type> <param>prefix</param></tagp>
4801: network prefix
4802: <tagp><type>int</type> <param>pxlen</param></tagp>
4803: network prefix length
4804: <tagp><type>struct rip_neighbor *</type> <param>from</param></tagp>
4805: a <struct/rip_neighbor/ propagating the withdraw
4806: </descrip>
4807: <funcsect>Description
4808: <p>
4809: The function is called by the RIP packet processing code whenever it receives
4810: an unreachable route. The incoming route for given network from nbr <param/from/ is
4811: removed. Eventually, the change is also propagated by <func/rip_announce_rte()/.
4812: </function>
4813: <function><p><type>void</type>
4814: <funcdef>rip_timer</funcdef>
4815: (<type>timer *</type> <param>t</param>) -- RIP main timer hook
4816:
4817: <funcsect>Arguments
4818: <p><descrip>
4819: <tagp><type>timer *</type> <param>t</param></tagp>
4820: timer
4821: </descrip>
4822: <funcsect>Description
4823: <p>
4824: The RIP main timer is responsible for routing table maintenance. Invalid or
4825: expired routes (<struct/rip_rte/) are removed and garbage collection of stale routing
4826: table entries (<struct/rip_entry/) is done. Changes are propagated to core tables,
4827: route reload is also done here. Note that garbage collection uses a maximal
4828: GC time, while interfaces maintain an illusion of per-interface GC times in
4829: <func/rip_send_response()/.
4830: <p>
4831: Keeping incoming routes and the selected outgoing route are two independent
4832: functions, therefore after garbage collection some entries now considered
4833: invalid (RIP_ENTRY_DUMMY) still may have non-empty list of incoming routes,
4834: while some valid entries (representing an outgoing route) may have that list
4835: empty.
4836: <p>
4837: The main timer is not scheduled periodically but it uses the time of the
4838: current next event and the minimal interval of any possible event to compute
4839: the time of the next run.
4840: </function>
4841: <function><p><type>void</type>
4842: <funcdef>rip_iface_timer</funcdef>
4843: (<type>timer *</type> <param>t</param>) -- RIP interface timer hook
4844:
4845: <funcsect>Arguments
4846: <p><descrip>
4847: <tagp><type>timer *</type> <param>t</param></tagp>
4848: timer
4849: </descrip>
4850: <funcsect>Description
4851: <p>
4852: RIP interface timers are responsible for scheduling both regular and
4853: triggered updates. Fixed, delay-independent period is used for regular
4854: updates, while minimal separating interval is enforced for triggered updates.
4855: The function also ensures that a new update is not started when the old one
4856: is still running.
4857: </function>
4858: <function><p><type>void</type>
4859: <funcdef>rip_send_table</funcdef>
4860: (<type>struct rip_proto *</type> <param>p</param>, <type>struct rip_iface *</type> <param>ifa</param>, <type>ip_addr</type> <param>addr</param>, <type>bird_clock_t</type> <param>changed</param>) -- RIP interface timer hook
4861:
4862: <funcsect>Arguments
4863: <p><descrip>
4864: <tagp><type>struct rip_proto *</type> <param>p</param></tagp>
4865: RIP instance
4866: <tagp><type>struct rip_iface *</type> <param>ifa</param></tagp>
4867: RIP interface
4868: <tagp><type>ip_addr</type> <param>addr</param></tagp>
4869: destination IP address
4870: <tagp><type>bird_clock_t</type> <param>changed</param></tagp>
4871: time limit for triggered updates
4872: </descrip>
4873: <funcsect>Description
4874: <p>
4875: The function activates an update session and starts sending routing update
4876: packets (using <func/rip_send_response()/). The session may be finished during the
4877: call or may continue in <func/rip_tx_hook()/ until all appropriate routes are
4878: transmitted. Note that there may be at most one active update session per
4879: interface, the function will terminate the old active session before
4880: activating the new one.
4881: </function>
4882: <sect>Router Advertisements
4883: <p>
4884: <p>
4885: The RAdv protocol is implemented in two files: <tt>radv.c</tt> containing the
4886: interface with BIRD core and the protocol logic and <tt>packets.c</tt> handling low
4887: level protocol stuff (RX, TX and packet formats). The protocol does not
4888: export any routes.
4889: <p>
4890: The RAdv is structured in the usual way - for each handled interface there is
4891: a structure <struct/radv_iface/ that contains a state related to that interface
4892: together with its resources (a socket, a timer). There is also a prepared RA
4893: stored in a TX buffer of the socket associated with an iface. These iface
4894: structures are created and removed according to iface events from BIRD core
4895: handled by <func/radv_if_notify()/ callback.
4896: <p>
4897: The main logic of RAdv consists of two functions: <func/radv_iface_notify()/, which
4898: processes asynchronous events (specified by RA_EV_* codes), and <func/radv_timer()/,
4899: which triggers sending RAs and computes the next timeout.
4900: <p>
4901: The RAdv protocol could receive routes (through <func/radv_import_control()/ and
4902: <func/radv_rt_notify()/), but only the configured trigger route is tracked (in
4903: <struct/active/ var). When a radv protocol is reconfigured, the connected routing
4904: table is examined (in <func/radv_check_active()/) to have proper <struct/active/ value in
4905: case of the specified trigger prefix was changed.
4906: <p>
4907: Supported standards:
4908: - RFC 4861 - main RA standard
4909: - RFC 4191 - Default Router Preferences and More-Specific Routes
4910: - RFC 6106 - DNS extensions (RDDNS, DNSSL)
4911:
4912:
4913: <sect>Static
4914: <p>
4915: <p>
4916: The Static protocol is implemented in a straightforward way. It keeps
4917: two lists of static routes: one containing interface routes and one
4918: holding the remaining ones. Interface routes are inserted and removed according
4919: to interface events received from the core via the <func/if_notify()/ hook. Routes
4920: pointing to a neighboring router use a sticky node in the neighbor cache
4921: to be notified about gaining or losing the neighbor. Special
4922: routes like black holes or rejects are inserted all the time.
4923: <p>
4924: Multipath routes are tricky. Because these routes depends on
4925: several neighbors we need to integrate that to the neighbor
4926: notification handling, we use dummy static_route nodes, one for
4927: each nexthop. Therefore, a multipath route consists of a master
4928: static_route node (of dest RTD_MULTIPATH), which specifies prefix
4929: and is used in most circumstances, and a list of dummy static_route
4930: nodes (of dest RTD_NONE), which stores info about nexthops and are
4931: connected to neighbor entries and neighbor notifications. Dummy
4932: nodes are chained using mp_next, they aren't in other_routes list,
4933: and abuse some fields (masklen, if_name) for other purposes.
4934: <p>
4935: The only other thing worth mentioning is that when asked for reconfiguration,
4936: Static not only compares the two configurations, but it also calculates
4937: difference between the lists of static routes and it just inserts the
4938: newly added routes and removes the obsolete ones.
4939:
4940:
4941: <sect>Direct
4942: <p>
4943: <p>
4944: The Direct protocol works by converting all <func/ifa_notify()/ events it receives
4945: to <func/rte_update()/ calls for the corresponding network.
4946:
4947:
4948: <!--
4949: BIRD Programmer's Guide: Sysdeps
4950:
4951: (c) 2000 Martin Mares <mj@ucw.cz>
4952: -->
4953:
4954: <chapt>System dependent parts
4955:
4956: <sect>Introduction
4957:
4958: <p>We've tried to make BIRD as portable as possible, but unfortunately
4959: communication with the network stack differs from one OS to another,
4960: so we need at least some OS specific code. The good news is that this
4961: code is isolated in a small set of modules:
4962:
4963: <descrip>
4964: <tagp><tt/config.h/</tagp> is a header file with configuration information,
4965: definition of the standard set of types and so on.
4966: <tagp/Startup module/ controls BIRD startup. Common for a family of OS's (e.g.,
4967: for all Unices).
4968: <tagp/Logging module/ manages the system logs. [per OS family]
4969: <tagp/IO module/ gives an implementation of sockets, timers and the
4970: global event queue. [per OS family]
4971: <tagp/KRT module/ implements the Kernel and Device protocols. This
4972: is the most arcane part of the system dependent stuff and some
4973: functions differ even between various releases of a single OS.
4974: </descrip>
4975: <sect>Logging
4976: <p>
4977: <p>
4978: The Logging module offers a simple set of functions for writing
4979: messages to system logs and to the debug output. Message classes
4980: used by this module are described in <tt>birdlib.h</tt> and also in the
4981: user's manual.
4982:
4983:
4984: <function><p><type>void</type>
4985: <funcdef>log_commit</funcdef>
4986: (<type>int</type> <param>class</param>, <type>buffer *</type> <param>buf</param>) -- commit a log message
4987:
4988: <funcsect>Arguments
4989: <p><descrip>
4990: <tagp><type>int</type> <param>class</param></tagp>
4991: message class information (<const/L_DEBUG/ to <const/L_BUG/, see <tt>lib/birdlib.h</tt>)
4992: <tagp><type>buffer *</type> <param>buf</param></tagp>
4993: message to write
4994: </descrip>
4995: <funcsect>Description
4996: <p>
4997: This function writes a message prepared in the log buffer to the
4998: log file (as specified in the configuration). The log buffer is
4999: reset after that. The log message is a full line, <func/log_commit()/
5000: terminates it.
5001: <p>
5002: The message class is an integer, not a first char of a string like
5003: in <func/log()/, so it should be written like *L_INFO.
5004: </function>
5005: <function><p><type>void</type>
5006: <funcdef>log_msg</funcdef>
5007: (<type>const char *</type> <param>msg</param>, <type>...</type> <param>...</param>) -- log a message
5008:
5009: <funcsect>Arguments
5010: <p><descrip>
5011: <tagp><type>const char *</type> <param>msg</param></tagp>
5012: printf-like formatting string with message class information
5013: prepended (<const/L_DEBUG/ to <const/L_BUG/, see <tt>lib/birdlib.h</tt>)
5014: <tagp><type>...</type> <param>...</param></tagp>
5015: variable arguments
5016: </descrip>
5017: <funcsect>Description
5018: <p>
5019: This function formats a message according to the format string <param/msg/
5020: and writes it to the corresponding log file (as specified in the
5021: configuration). Please note that the message is automatically
5022: formatted as a full line, no need to include <tt>\n</tt> inside.
5023: It is essentially a sequence of <func/log_reset()/, <func/logn()/ and <func/log_commit()/.
5024: </function>
5025: <function><p><type>void</type>
5026: <funcdef>bug</funcdef>
5027: (<type>const char *</type> <param>msg</param>, <type>...</type> <param>...</param>) -- report an internal error
5028:
5029: <funcsect>Arguments
5030: <p><descrip>
5031: <tagp><type>const char *</type> <param>msg</param></tagp>
5032: a printf-like error message
5033: <tagp><type>...</type> <param>...</param></tagp>
5034: variable arguments
5035: </descrip>
5036: <funcsect>Description
5037: <p>
5038: This function logs an internal error and aborts execution
5039: of the program.
5040: </function>
5041: <function><p><type>void</type>
5042: <funcdef>die</funcdef>
5043: (<type>const char *</type> <param>msg</param>, <type>...</type> <param>...</param>) -- report a fatal error
5044:
5045: <funcsect>Arguments
5046: <p><descrip>
5047: <tagp><type>const char *</type> <param>msg</param></tagp>
5048: a printf-like error message
5049: <tagp><type>...</type> <param>...</param></tagp>
5050: variable arguments
5051: </descrip>
5052: <funcsect>Description
5053: <p>
5054: This function logs a fatal error and aborts execution
5055: of the program.
5056: </function>
5057: <function><p><type>void</type>
5058: <funcdef>debug</funcdef>
5059: (<type>const char *</type> <param>msg</param>, <type>...</type> <param>...</param>) -- write to debug output
5060:
5061: <funcsect>Arguments
5062: <p><descrip>
5063: <tagp><type>const char *</type> <param>msg</param></tagp>
5064: a printf-like message
5065: <tagp><type>...</type> <param>...</param></tagp>
5066: variable arguments
5067: </descrip>
5068: <funcsect>Description
5069: <p>
5070: This function formats the message <param/msg/ and prints it out
5071: to the debugging output. No newline character is appended.
5072: </function>
5073: <sect>Kernel synchronization
5074: <p>
5075: <p>
5076: This system dependent module implements the Kernel and Device protocol,
5077: that is synchronization of interface lists and routing tables with the
5078: OS kernel.
5079: <p>
5080: The whole kernel synchronization is a bit messy and touches some internals
5081: of the routing table engine, because routing table maintenance is a typical
5082: example of the proverbial compatibility between different Unices and we want
5083: to keep the overhead of our KRT business as low as possible and avoid maintaining
5084: a local routing table copy.
5085: <p>
5086: The kernel syncer can work in three different modes (according to system config header):
5087: Either with a single routing table and single KRT protocol [traditional UNIX]
5088: or with many routing tables and separate KRT protocols for all of them
5089: or with many routing tables, but every scan including all tables, so we start
5090: separate KRT protocols which cooperate with each other [Linux].
5091: In this case, we keep only a single scan timer.
5092: <p>
5093: We use FIB node flags in the routing table to keep track of route
5094: synchronization status. We also attach temporary <struct/rte/'s to the routing table,
5095: but it cannot do any harm to the rest of BIRD since table synchronization is
5096: an atomic process.
5097: <p>
5098: When starting up, we cheat by looking if there is another
5099: KRT instance to be initialized later and performing table scan
5100: only once for all the instances.
5101: <p>
5102: The code uses OS-dependent parts for kernel updates and scans. These parts are
5103: in more specific sysdep directories (e.g. sysdep/linux) in functions krt_sys_*
5104: and kif_sys_* (and some others like <func/krt_replace_rte()/) and krt-sys.h header file.
5105: This is also used for platform specific protocol options and route attributes.
5106: <p>
5107: There was also an old code that used traditional UNIX ioctls for these tasks.
5108: It was unmaintained and later removed. For reference, see sysdep/krt-* files
5109: in commit 396dfa9042305f62da1f56589c4b98fac57fc2f6
5110:
5111:
5112: <chapt>Library functions
5113: <sect>IP addresses
5114: <p>
5115: <p>
5116: BIRD uses its own abstraction of IP address in order to share the same
5117: code for both IPv4 and IPv6. IP addresses are represented as entities
5118: of type <struct/ip_addr/ which are never to be treated as numbers and instead
5119: they must be manipulated using the following functions and macros.
5120:
5121:
5122: <function><p><type>char *</type>
5123: <funcdef>ip_scope_text</funcdef>
5124: (<type>uint</type> <param>scope</param>) -- get textual representation of address scope
5125:
5126: <funcsect>Arguments
5127: <p><descrip>
5128: <tagp><type>uint</type> <param>scope</param></tagp>
5129: scope (<const/SCOPE_xxx/)
5130: </descrip>
5131: <funcsect>Description
5132: <p>
5133: Returns a pointer to a textual name of the scope given.
5134: </function>
5135: <function><p><type>int</type>
5136: <funcdef>ipa_equal</funcdef>
5137: (<type>ip_addr</type> <param>x</param>, <type>ip_addr</type> <param>y</param>) -- compare two IP addresses for equality
5138:
5139: <funcsect>Arguments
5140: <p><descrip>
5141: <tagp><type>ip_addr</type> <param>x</param></tagp>
5142: IP address
5143: <tagp><type>ip_addr</type> <param>y</param></tagp>
5144: IP address
5145: </descrip>
5146: <funcsect>Description
5147: <p>
5148: <func/ipa_equal()/ returns 1 if <param/x/ and <param/y/ represent the same IP address, else 0.
5149: </function>
5150: <function><p><type>int</type>
5151: <funcdef>ipa_nonzero</funcdef>
5152: (<type>ip_addr</type> <param>x</param>) -- test if an IP address is defined
5153:
5154: <funcsect>Arguments
5155: <p><descrip>
5156: <tagp><type>ip_addr</type> <param>x</param></tagp>
5157: IP address
5158: </descrip>
5159: <funcsect>Description
5160: <p>
5161: ipa_nonzero returns 1 if <param/x/ is a defined IP address (not all bits are zero),
5162: else 0.
5163: <p>
5164: The undefined all-zero address is reachable as a <tt>IPA_NONE</tt> macro.
5165: </function>
5166: <function><p><type>ip_addr</type>
5167: <funcdef>ipa_and</funcdef>
5168: (<type>ip_addr</type> <param>x</param>, <type>ip_addr</type> <param>y</param>) -- compute bitwise and of two IP addresses
5169:
5170: <funcsect>Arguments
5171: <p><descrip>
5172: <tagp><type>ip_addr</type> <param>x</param></tagp>
5173: IP address
5174: <tagp><type>ip_addr</type> <param>y</param></tagp>
5175: IP address
5176: </descrip>
5177: <funcsect>Description
5178: <p>
5179: This function returns a bitwise and of <param/x/ and <param/y/. It's primarily
5180: used for network masking.
5181: </function>
5182: <function><p><type>ip_addr</type>
5183: <funcdef>ipa_or</funcdef>
5184: (<type>ip_addr</type> <param>x</param>, <type>ip_addr</type> <param>y</param>) -- compute bitwise or of two IP addresses
5185:
5186: <funcsect>Arguments
5187: <p><descrip>
5188: <tagp><type>ip_addr</type> <param>x</param></tagp>
5189: IP address
5190: <tagp><type>ip_addr</type> <param>y</param></tagp>
5191: IP address
5192: </descrip>
5193: <funcsect>Description
5194: <p>
5195: This function returns a bitwise or of <param/x/ and <param/y/.
5196: </function>
5197: <function><p><type>ip_addr</type>
5198: <funcdef>ipa_xor</funcdef>
5199: (<type>ip_addr</type> <param>x</param>, <type>ip_addr</type> <param>y</param>) -- compute bitwise xor of two IP addresses
5200:
5201: <funcsect>Arguments
5202: <p><descrip>
5203: <tagp><type>ip_addr</type> <param>x</param></tagp>
5204: IP address
5205: <tagp><type>ip_addr</type> <param>y</param></tagp>
5206: IP address
5207: </descrip>
5208: <funcsect>Description
5209: <p>
5210: This function returns a bitwise xor of <param/x/ and <param/y/.
5211: </function>
5212: <function><p><type>ip_addr</type>
5213: <funcdef>ipa_not</funcdef>
5214: (<type>ip_addr</type> <param>x</param>) -- compute bitwise negation of two IP addresses
5215:
5216: <funcsect>Arguments
5217: <p><descrip>
5218: <tagp><type>ip_addr</type> <param>x</param></tagp>
5219: IP address
5220: </descrip>
5221: <funcsect>Description
5222: <p>
5223: This function returns a bitwise negation of <param/x/.
5224: </function>
5225: <function><p><type>ip_addr</type>
5226: <funcdef>ipa_mkmask</funcdef>
5227: (<type>int</type> <param>x</param>) -- create a netmask
5228:
5229: <funcsect>Arguments
5230: <p><descrip>
5231: <tagp><type>int</type> <param>x</param></tagp>
5232: prefix length
5233: </descrip>
5234: <funcsect>Description
5235: <p>
5236: This function returns an <struct/ip_addr/ corresponding of a netmask
5237: of an address prefix of size <param/x/.
5238: </function>
5239: <function><p><type>int</type>
5240: <funcdef>ipa_masklen</funcdef>
5241: (<type>ip_addr</type> <param>x</param>) -- calculate netmask length
5242:
5243: <funcsect>Arguments
5244: <p><descrip>
5245: <tagp><type>ip_addr</type> <param>x</param></tagp>
5246: IP address
5247: </descrip>
5248: <funcsect>Description
5249: <p>
5250: This function checks whether <param/x/ represents a valid netmask and
5251: returns the size of the associate network prefix or -1 for invalid
5252: mask.
5253: </function>
5254: <function><p><type>int</type>
5255: <funcdef>ipa_hash</funcdef>
5256: (<type>ip_addr</type> <param>x</param>) -- hash IP addresses
5257:
5258: <funcsect>Arguments
5259: <p><descrip>
5260: <tagp><type>ip_addr</type> <param>x</param></tagp>
5261: IP address
5262: </descrip>
5263: <funcsect>Description
5264: <p>
5265: <func/ipa_hash()/ returns a 16-bit hash value of the IP address <param/x/.
5266: </function>
5267: <function><p><type>void</type>
5268: <funcdef>ipa_hton</funcdef>
5269: (<type>ip_addr</type> <param>x</param>) -- convert IP address to network order
5270:
5271: <funcsect>Arguments
5272: <p><descrip>
5273: <tagp><type>ip_addr</type> <param>x</param></tagp>
5274: IP address
5275: </descrip>
5276: <funcsect>Description
5277: <p>
5278: Converts the IP address <param/x/ to the network byte order.
5279: <p>
5280: Beware, this is a macro and it alters the argument!
5281: </function>
5282: <function><p><type>void</type>
5283: <funcdef>ipa_ntoh</funcdef>
5284: (<type>ip_addr</type> <param>x</param>) -- convert IP address to host order
5285:
5286: <funcsect>Arguments
5287: <p><descrip>
5288: <tagp><type>ip_addr</type> <param>x</param></tagp>
5289: IP address
5290: </descrip>
5291: <funcsect>Description
5292: <p>
5293: Converts the IP address <param/x/ from the network byte order.
5294: <p>
5295: Beware, this is a macro and it alters the argument!
5296: </function>
5297: <function><p><type>int</type>
5298: <funcdef>ipa_classify</funcdef>
5299: (<type>ip_addr</type> <param>x</param>) -- classify an IP address
5300:
5301: <funcsect>Arguments
5302: <p><descrip>
5303: <tagp><type>ip_addr</type> <param>x</param></tagp>
5304: IP address
5305: </descrip>
5306: <funcsect>Description
5307: <p>
5308: <func/ipa_classify()/ returns an address class of <param/x/, that is a bitwise or
5309: of address type (<const/IADDR_INVALID/, <const/IADDR_HOST/, <const/IADDR_BROADCAST/, <const/IADDR_MULTICAST/)
5310: with address scope (<const/SCOPE_HOST/ to <const/SCOPE_UNIVERSE/) or -1 (<const/IADDR_INVALID/)
5311: for an invalid address.
5312: </function>
5313: <function><p><type>ip4_addr</type>
5314: <funcdef>ip4_class_mask</funcdef>
5315: (<type>ip4_addr</type> <param>x</param>) -- guess netmask according to address class
5316:
5317: <funcsect>Arguments
5318: <p><descrip>
5319: <tagp><type>ip4_addr</type> <param>x</param></tagp>
5320: IPv4 address
5321: </descrip>
5322: <funcsect>Description
5323: <p>
5324: This function (available in IPv4 version only) returns a
5325: network mask according to the address class of <param/x/. Although
5326: classful addressing is nowadays obsolete, there still live
5327: routing protocols transferring no prefix lengths nor netmasks
5328: and this function could be useful to them.
5329: </function>
5330: <function><p><type>u32</type>
5331: <funcdef>ipa_from_u32</funcdef>
5332: (<type>ip_addr</type> <param>x</param>) -- convert IPv4 address to an integer
5333:
5334: <funcsect>Arguments
5335: <p><descrip>
5336: <tagp><type>ip_addr</type> <param>x</param></tagp>
5337: IP address
5338: </descrip>
5339: <funcsect>Description
5340: <p>
5341: This function takes an IPv4 address and returns its numeric
5342: representation.
5343: </function>
5344: <function><p><type>ip_addr</type>
5345: <funcdef>ipa_to_u32</funcdef>
5346: (<type>u32</type> <param>x</param>) -- convert integer to IPv4 address
5347:
5348: <funcsect>Arguments
5349: <p><descrip>
5350: <tagp><type>u32</type> <param>x</param></tagp>
5351: a 32-bit integer
5352: </descrip>
5353: <funcsect>Description
5354: <p>
5355: <func/ipa_to_u32()/ takes a numeric representation of an IPv4 address
5356: and converts it to the corresponding <struct/ip_addr/.
5357: </function>
5358: <function><p><type>int</type>
5359: <funcdef>ipa_compare</funcdef>
5360: (<type>ip_addr</type> <param>x</param>, <type>ip_addr</type> <param>y</param>) -- compare two IP addresses for order
5361:
5362: <funcsect>Arguments
5363: <p><descrip>
5364: <tagp><type>ip_addr</type> <param>x</param></tagp>
5365: IP address
5366: <tagp><type>ip_addr</type> <param>y</param></tagp>
5367: IP address
5368: </descrip>
5369: <funcsect>Description
5370: <p>
5371: The <func/ipa_compare()/ function takes two IP addresses and returns
5372: -1 if <param/x/ is less than <param/y/ in canonical ordering (lexicographical
5373: order of the bit strings), 1 if <param/x/ is greater than <param/y/ and 0
5374: if they are the same.
5375: </function>
5376: <function><p><type>ip_addr</type>
5377: <funcdef>ipa_build6</funcdef>
5378: (<type>u32</type> <param>a1</param>, <type>u32</type> <param>a2</param>, <type>u32</type> <param>a3</param>, <type>u32</type> <param>a4</param>) -- build an IPv6 address from parts
5379:
5380: <funcsect>Arguments
5381: <p><descrip>
5382: <tagp><type>u32</type> <param>a1</param></tagp>
5383: part #1
5384: <tagp><type>u32</type> <param>a2</param></tagp>
5385: part #2
5386: <tagp><type>u32</type> <param>a3</param></tagp>
5387: part #3
5388: <tagp><type>u32</type> <param>a4</param></tagp>
5389: part #4
5390: </descrip>
5391: <funcsect>Description
5392: <p>
5393: <func/ipa_build()/ takes <param/a1/ to <param/a4/ and assembles them to a single IPv6
5394: address. It's used for example when a protocol wants to bind its
5395: socket to a hard-wired multicast address.
5396: </function>
5397: <function><p><type>char *</type>
5398: <funcdef>ip_ntop</funcdef>
5399: (<type>ip_addr</type> <param>a</param>, <type>char *</type> <param>buf</param>) -- convert IP address to textual representation
5400:
5401: <funcsect>Arguments
5402: <p><descrip>
5403: <tagp><type>ip_addr</type> <param>a</param></tagp>
5404: IP address
5405: <tagp><type>char *</type> <param>buf</param></tagp>
5406: buffer of size at least <const/STD_ADDRESS_P_LENGTH/
5407: </descrip>
5408: <funcsect>Description
5409: <p>
5410: This function takes an IP address and creates its textual
5411: representation for presenting to the user.
5412: </function>
5413: <function><p><type>char *</type>
5414: <funcdef>ip_ntox</funcdef>
5415: (<type>ip_addr</type> <param>a</param>, <type>char *</type> <param>buf</param>) -- convert IP address to hexadecimal representation
5416:
5417: <funcsect>Arguments
5418: <p><descrip>
5419: <tagp><type>ip_addr</type> <param>a</param></tagp>
5420: IP address
5421: <tagp><type>char *</type> <param>buf</param></tagp>
5422: buffer of size at least <const/STD_ADDRESS_P_LENGTH/
5423: </descrip>
5424: <funcsect>Description
5425: <p>
5426: This function takes an IP address and creates its hexadecimal
5427: textual representation. Primary use: debugging dumps.
5428: </function>
5429: <function><p><type>int</type>
5430: <funcdef>ip_pton</funcdef>
5431: (<type>char *</type> <param>a</param>, <type>ip_addr *</type> <param>o</param>) -- parse textual representation of IP address
5432:
5433: <funcsect>Arguments
5434: <p><descrip>
5435: <tagp><type>char *</type> <param>a</param></tagp>
5436: textual representation
5437: <tagp><type>ip_addr *</type> <param>o</param></tagp>
5438: where to put the resulting address
5439: </descrip>
5440: <funcsect>Description
5441: <p>
5442: This function parses a textual IP address representation and
5443: stores the decoded address to a variable pointed to by <param/o/.
5444: Returns 0 if a parse error has occurred, else 0.
5445: </function>
5446: <sect>Linked lists
5447: <p>
5448: <p>
5449: The BIRD library provides a set of functions for operating on linked
5450: lists. The lists are internally represented as standard doubly linked
5451: lists with synthetic head and tail which makes all the basic operations
5452: run in constant time and contain no extra end-of-list checks. Each list
5453: is described by a <struct/list/ structure, nodes can have any format as long
5454: as they start with a <struct/node/ structure. If you want your nodes to belong
5455: to multiple lists at once, you can embed multiple <struct/node/ structures in them
5456: and use the <func/SKIP_BACK()/ macro to calculate a pointer to the start of the
5457: structure from a <struct/node/ pointer, but beware of obscurity.
5458: <p>
5459: There also exist safe linked lists (<struct/slist/, <struct/snode/ and all functions
5460: being prefixed with <tt>s_</tt>) which support asynchronous walking very
5461: similar to that used in the <struct/fib/ structure.
5462:
5463:
5464: <function><p><type>LIST_INLINE void</type>
5465: <funcdef>add_tail</funcdef>
5466: (<type>list *</type> <param>l</param>, <type>node *</type> <param>n</param>) -- append a node to a list
5467:
5468: <funcsect>Arguments
5469: <p><descrip>
5470: <tagp><type>list *</type> <param>l</param></tagp>
5471: linked list
5472: <tagp><type>node *</type> <param>n</param></tagp>
5473: list node
5474: </descrip>
5475: <funcsect>Description
5476: <p>
5477: <func/add_tail()/ takes a node <param/n/ and appends it at the end of the list <param/l/.
5478: </function>
5479: <function><p><type>LIST_INLINE void</type>
5480: <funcdef>add_head</funcdef>
5481: (<type>list *</type> <param>l</param>, <type>node *</type> <param>n</param>) -- prepend a node to a list
5482:
5483: <funcsect>Arguments
5484: <p><descrip>
5485: <tagp><type>list *</type> <param>l</param></tagp>
5486: linked list
5487: <tagp><type>node *</type> <param>n</param></tagp>
5488: list node
5489: </descrip>
5490: <funcsect>Description
5491: <p>
5492: <func/add_head()/ takes a node <param/n/ and prepends it at the start of the list <param/l/.
5493: </function>
5494: <function><p><type>LIST_INLINE void</type>
5495: <funcdef>insert_node</funcdef>
5496: (<type>node *</type> <param>n</param>, <type>node *</type> <param>after</param>) -- insert a node to a list
5497:
5498: <funcsect>Arguments
5499: <p><descrip>
5500: <tagp><type>node *</type> <param>n</param></tagp>
5501: a new list node
5502: <tagp><type>node *</type> <param>after</param></tagp>
5503: a node of a list
5504: </descrip>
5505: <funcsect>Description
5506: <p>
5507: Inserts a node <param/n/ to a linked list after an already inserted
5508: node <param/after/.
5509: </function>
5510: <function><p><type>LIST_INLINE void</type>
5511: <funcdef>rem_node</funcdef>
5512: (<type>node *</type> <param>n</param>) -- remove a node from a list
5513:
5514: <funcsect>Arguments
5515: <p><descrip>
5516: <tagp><type>node *</type> <param>n</param></tagp>
5517: node to be removed
5518: </descrip>
5519: <funcsect>Description
5520: <p>
5521: Removes a node <param/n/ from the list it's linked in. Afterwards, node <param/n/ is cleared.
5522: </function>
5523: <function><p><type>LIST_INLINE void</type>
5524: <funcdef>replace_node</funcdef>
5525: (<type>node *</type> <param>old</param>, <type>node *</type> <param>new</param>) -- replace a node in a list with another one
5526:
5527: <funcsect>Arguments
5528: <p><descrip>
5529: <tagp><type>node *</type> <param>old</param></tagp>
5530: node to be removed
5531: <tagp><type>node *</type> <param>new</param></tagp>
5532: node to be inserted
5533: </descrip>
5534: <funcsect>Description
5535: <p>
5536: Replaces node <param/old/ in the list it's linked in with node <param/new/. Node
5537: <param/old/ may be a copy of the original node, which is not accessed
5538: through the list. The function could be called with <param/old/ == <param/new/,
5539: which just fixes neighbors' pointers in the case that the node
5540: was reallocated.
5541: </function>
5542: <function><p><type>LIST_INLINE void</type>
5543: <funcdef>init_list</funcdef>
5544: (<type>list *</type> <param>l</param>) -- create an empty list
5545:
5546: <funcsect>Arguments
5547: <p><descrip>
5548: <tagp><type>list *</type> <param>l</param></tagp>
5549: list
5550: </descrip>
5551: <funcsect>Description
5552: <p>
5553: <func/init_list()/ takes a <struct/list/ structure and initializes its
5554: fields, so that it represents an empty list.
5555: </function>
5556: <function><p><type>LIST_INLINE void</type>
5557: <funcdef>add_tail_list</funcdef>
5558: (<type>list *</type> <param>to</param>, <type>list *</type> <param>l</param>) -- concatenate two lists
5559:
5560: <funcsect>Arguments
5561: <p><descrip>
5562: <tagp><type>list *</type> <param>to</param></tagp>
5563: destination list
5564: <tagp><type>list *</type> <param>l</param></tagp>
5565: source list
5566: </descrip>
5567: <funcsect>Description
5568: <p>
5569: This function appends all elements of the list <param/l/ to
5570: the list <param/to/ in constant time.
5571: </function>
5572: <sect>Miscellaneous functions.
5573: <p>
5574:
5575:
5576: <function><p><type>int</type>
5577: <funcdef>ipsum_verify</funcdef>
5578: (<type>void *</type> <param>frag</param>, <type>uint</type> <param>len</param>, <type>...</type> <param>...</param>) -- verify an IP checksum
5579:
5580: <funcsect>Arguments
5581: <p><descrip>
5582: <tagp><type>void *</type> <param>frag</param></tagp>
5583: first packet fragment
5584: <tagp><type>uint</type> <param>len</param></tagp>
5585: length in bytes
5586: <tagp><type>...</type> <param>...</param></tagp>
5587: variable arguments
5588: </descrip>
5589: <funcsect>Description
5590: <p>
5591: This function verifies whether a given fragmented packet
5592: has correct one's complement checksum as used by the IP
5593: protocol.
5594: <p>
5595: It uses all the clever tricks described in RFC 1071 to speed
5596: up checksum calculation as much as possible.
5597: <funcsect>Result
5598: <p>
5599: 1 if the checksum is correct, 0 else.
5600: </function>
5601: <function><p><type>u16</type>
5602: <funcdef>ipsum_calculate</funcdef>
5603: (<type>void *</type> <param>frag</param>, <type>uint</type> <param>len</param>, <type>...</type> <param>...</param>) -- compute an IP checksum
5604:
5605: <funcsect>Arguments
5606: <p><descrip>
5607: <tagp><type>void *</type> <param>frag</param></tagp>
5608: first packet fragment
5609: <tagp><type>uint</type> <param>len</param></tagp>
5610: length in bytes
5611: <tagp><type>...</type> <param>...</param></tagp>
5612: variable arguments
5613: </descrip>
5614: <funcsect>Description
5615: <p>
5616: This function calculates a one's complement checksum of a given fragmented
5617: packet.
5618: <p>
5619: It uses all the clever tricks described in RFC 1071 to speed
5620: up checksum calculation as much as possible.
5621: </function>
5622: <function><p><type>u32</type>
5623: <funcdef>u32_mkmask</funcdef>
5624: (<type>uint</type> <param>n</param>) -- create a bit mask
5625:
5626: <funcsect>Arguments
5627: <p><descrip>
5628: <tagp><type>uint</type> <param>n</param></tagp>
5629: number of bits
5630: </descrip>
5631: <funcsect>Description
5632: <p>
5633: <func/u32_mkmask()/ returns an unsigned 32-bit integer which binary
5634: representation consists of <param/n/ ones followed by zeroes.
5635: </function>
5636: <function><p><type>int</type>
5637: <funcdef>u32_masklen</funcdef>
5638: (<type>u32</type> <param>x</param>) -- calculate length of a bit mask
5639:
5640: <funcsect>Arguments
5641: <p><descrip>
5642: <tagp><type>u32</type> <param>x</param></tagp>
5643: bit mask
5644: </descrip>
5645: <funcsect>Description
5646: <p>
5647: This function checks whether the given integer <param/x/ represents
5648: a valid bit mask (binary representation contains first ones, then
5649: zeroes) and returns the number of ones or -1 if the mask is invalid.
5650: </function>
5651: <function><p><type>u32</type>
5652: <funcdef>u32_log2</funcdef>
5653: (<type>u32</type> <param>v</param>) -- compute a binary logarithm.
5654:
5655: <funcsect>Arguments
5656: <p><descrip>
5657: <tagp><type>u32</type> <param>v</param></tagp>
5658: number
5659: </descrip>
5660: <funcsect>Description
5661: <p>
5662: This function computes a integral part of binary logarithm of given
5663: integer <param/v/ and returns it. The computed value is also an index of the
5664: most significant non-zero bit position.
5665: </function>
5666: <function><p><type>int</type>
5667: <funcdef>patmatch</funcdef>
5668: (<type>byte *</type> <param>p</param>, <type>byte *</type> <param>s</param>) -- match shell-like patterns
5669:
5670: <funcsect>Arguments
5671: <p><descrip>
5672: <tagp><type>byte *</type> <param>p</param></tagp>
5673: pattern
5674: <tagp><type>byte *</type> <param>s</param></tagp>
5675: string
5676: </descrip>
5677: <funcsect>Description
5678: <p>
5679: <func/patmatch()/ returns whether given string <param/s/ matches the given shell-like
5680: pattern <param/p/. The patterns consist of characters (which are matched literally),
5681: question marks which match any single character, asterisks which match any
5682: (possibly empty) string of characters and backslashes which are used to
5683: escape any special characters and force them to be treated literally.
5684: <p>
5685: The matching process is not optimized with respect to time, so please
5686: avoid using this function for complex patterns.
5687: </function>
5688: <function><p><type>int</type>
5689: <funcdef>bvsnprintf</funcdef>
5690: (<type>char *</type> <param>buf</param>, <type>int</type> <param>size</param>, <type>const char *</type> <param>fmt</param>, <type>va_list</type> <param>args</param>) -- BIRD's <func/vsnprintf()/
5691:
5692: <funcsect>Arguments
5693: <p><descrip>
5694: <tagp><type>char *</type> <param>buf</param></tagp>
5695: destination buffer
5696: <tagp><type>int</type> <param>size</param></tagp>
5697: size of the buffer
5698: <tagp><type>const char *</type> <param>fmt</param></tagp>
5699: format string
5700: <tagp><type>va_list</type> <param>args</param></tagp>
5701: a list of arguments to be formatted
5702: </descrip>
5703: <funcsect>Description
5704: <p>
5705: This functions acts like ordinary <func/sprintf()/ except that it checks
5706: available space to avoid buffer overflows and it allows some more
5707: <funcsect>format specifiers
5708: <p>
5709: <tt><const/I/</tt> for formatting of IP addresses (any non-zero
5710: width is automatically replaced by standard IP address width which
5711: depends on whether we use IPv4 or IPv6; <tt>%#I</tt> gives hexadecimal format),
5712: <tt><const/R/</tt> for Router / Network ID (u32 value printed as IPv4 address)
5713: <tt><const/lR/</tt> for 64bit Router / Network ID (u64 value printed as eight :-separated octets)
5714: and <tt><const/m/</tt> resp. <tt><const/M/</tt> for error messages (uses <func/strerror()/ to translate <param/errno/ code to
5715: message text). On the other hand, it doesn't support floating
5716: point numbers.
5717: <funcsect>Result
5718: <p>
5719: number of characters of the output string or -1 if
5720: the buffer space was insufficient.
5721: </function>
5722: <function><p><type>int</type>
5723: <funcdef>bvsprintf</funcdef>
5724: (<type>char *</type> <param>buf</param>, <type>const char *</type> <param>fmt</param>, <type>va_list</type> <param>args</param>) -- BIRD's <func/vsprintf()/
5725:
5726: <funcsect>Arguments
5727: <p><descrip>
5728: <tagp><type>char *</type> <param>buf</param></tagp>
5729: buffer
5730: <tagp><type>const char *</type> <param>fmt</param></tagp>
5731: format string
5732: <tagp><type>va_list</type> <param>args</param></tagp>
5733: a list of arguments to be formatted
5734: </descrip>
5735: <funcsect>Description
5736: <p>
5737: This function is equivalent to <func/bvsnprintf()/ with an infinite
5738: buffer size. Please use carefully only when you are absolutely
5739: sure the buffer won't overflow.
5740: </function>
5741: <function><p><type>int</type>
5742: <funcdef>bsprintf</funcdef>
5743: (<type>char *</type> <param>buf</param>, <type>const char *</type> <param>fmt</param>, <type>...</type> <param>...</param>) -- BIRD's <func/sprintf()/
5744:
5745: <funcsect>Arguments
5746: <p><descrip>
5747: <tagp><type>char *</type> <param>buf</param></tagp>
5748: buffer
5749: <tagp><type>const char *</type> <param>fmt</param></tagp>
5750: format string
5751: <tagp><type>...</type> <param>...</param></tagp>
5752: variable arguments
5753: </descrip>
5754: <funcsect>Description
5755: <p>
5756: This function is equivalent to <func/bvsnprintf()/ with an infinite
5757: buffer size and variable arguments instead of a <struct/va_list/.
5758: Please use carefully only when you are absolutely
5759: sure the buffer won't overflow.
5760: </function>
5761: <function><p><type>int</type>
5762: <funcdef>bsnprintf</funcdef>
5763: (<type>char *</type> <param>buf</param>, <type>int</type> <param>size</param>, <type>const char *</type> <param>fmt</param>, <type>...</type> <param>...</param>) -- BIRD's <func/snprintf()/
5764:
5765: <funcsect>Arguments
5766: <p><descrip>
5767: <tagp><type>char *</type> <param>buf</param></tagp>
5768: buffer
5769: <tagp><type>int</type> <param>size</param></tagp>
5770: buffer size
5771: <tagp><type>const char *</type> <param>fmt</param></tagp>
5772: format string
5773: <tagp><type>...</type> <param>...</param></tagp>
5774: variable arguments
5775: </descrip>
5776: <funcsect>Description
5777: <p>
5778: This function is equivalent to <func/bsnprintf()/ with variable arguments instead of a <struct/va_list/.
5779: </function>
5780: <function><p><type>void *</type>
5781: <funcdef>xmalloc</funcdef>
5782: (<type>uint</type> <param>size</param>) -- malloc with checking
5783:
5784: <funcsect>Arguments
5785: <p><descrip>
5786: <tagp><type>uint</type> <param>size</param></tagp>
5787: block size
5788: </descrip>
5789: <funcsect>Description
5790: <p>
5791: This function is equivalent to <func/malloc()/ except that in case of
5792: failure it calls <func/die()/ to quit the program instead of returning
5793: a <const/NULL/ pointer.
5794: <p>
5795: Wherever possible, please use the memory resources instead.
5796: </function>
5797: <function><p><type>void *</type>
5798: <funcdef>xrealloc</funcdef>
5799: (<type>void *</type> <param>ptr</param>, <type>uint</type> <param>size</param>) -- realloc with checking
5800:
5801: <funcsect>Arguments
5802: <p><descrip>
5803: <tagp><type>void *</type> <param>ptr</param></tagp>
5804: original memory block
5805: <tagp><type>uint</type> <param>size</param></tagp>
5806: block size
5807: </descrip>
5808: <funcsect>Description
5809: <p>
5810: This function is equivalent to <func/realloc()/ except that in case of
5811: failure it calls <func/die()/ to quit the program instead of returning
5812: a <const/NULL/ pointer.
5813: <p>
5814: Wherever possible, please use the memory resources instead.
5815: </function>
5816: <sect>Message authentication codes
5817: <p>
5818: <p>
5819: MAC algorithms are simple cryptographic tools for message authentication.
5820: They use shared a secret key a and message text to generate authentication
5821: code, which is then passed with the message to the other side, where the code
5822: is verified. There are multiple families of MAC algorithms based on different
5823: cryptographic primitives, BIRD implements two MAC families which use hash
5824: functions.
5825: <p>
5826: The first family is simply a cryptographic hash camouflaged as MAC algorithm.
5827: Originally supposed to be (m|k)-hash (message is concatenated with key, and
5828: that is hashed), but later it turned out that a raw hash is more practical.
5829: This is used for cryptographic authentication in OSPFv2, RIP and BFD.
5830: <p>
5831: The second family is the standard HMAC (RFC 2104), using inner and outer hash
5832: to process key and message. HMAC (with SHA) is used in advanced OSPF and RIP
5833: authentication (RFC 5709, RFC 4822).
5834:
5835:
5836: <function><p><type>void</type>
5837: <funcdef>mac_init</funcdef>
5838: (<type>struct mac_context *</type> <param>ctx</param>, <type>uint</type> <param>id</param>, <type>const byte *</type> <param>key</param>, <type>uint</type> <param>keylen</param>) -- initialize MAC algorithm
5839:
5840: <funcsect>Arguments
5841: <p><descrip>
5842: <tagp><type>struct mac_context *</type> <param>ctx</param></tagp>
5843: context to initialize
5844: <tagp><type>uint</type> <param>id</param></tagp>
5845: MAC algorithm ID
5846: <tagp><type>const byte *</type> <param>key</param></tagp>
5847: MAC key
5848: <tagp><type>uint</type> <param>keylen</param></tagp>
5849: MAC key length
5850: </descrip>
5851: <funcsect>Description
5852: <p>
5853: Initialize MAC context <param/ctx/ for algorithm <param/id/ (e.g., <const/ALG_HMAC_SHA1/), with
5854: key <param/key/ of length <param/keylen/. After that, message data could be added using
5855: <func/mac_update()/ function.
5856: </function>
5857: <function><p><type>void</type>
5858: <funcdef>mac_update</funcdef>
5859: (<type>struct mac_context *</type> <param>ctx</param>, <type>const byte *</type> <param>data</param>, <type>uint</type> <param>datalen</param>) -- add more data to MAC algorithm
5860:
5861: <funcsect>Arguments
5862: <p><descrip>
5863: <tagp><type>struct mac_context *</type> <param>ctx</param></tagp>
5864: MAC context
5865: <tagp><type>const byte *</type> <param>data</param></tagp>
5866: data to add
5867: <tagp><type>uint</type> <param>datalen</param></tagp>
5868: length of data
5869: </descrip>
5870: <funcsect>Description
5871: <p>
5872: Push another <param/datalen/ bytes of data pointed to by <param/data/ into the MAC
5873: algorithm currently in <param/ctx/. Can be called multiple times for the same MAC
5874: context. It has the same effect as concatenating all the data together and
5875: passing them at once.
5876: </function>
5877: <function><p><type>byte *</type>
5878: <funcdef>mac_final</funcdef>
5879: (<type>struct mac_context *</type> <param>ctx</param>) -- finalize MAC algorithm
5880:
5881: <funcsect>Arguments
5882: <p><descrip>
5883: <tagp><type>struct mac_context *</type> <param>ctx</param></tagp>
5884: MAC context
5885: </descrip>
5886: <funcsect>Description
5887: <p>
5888: Finish MAC computation and return a pointer to the result. No more
5889: <param/mac_update/() calls could be done, but the context may be reinitialized
5890: later.
5891: <p>
5892: Note that the returned pointer points into data in the <param/ctx/ context. If it
5893: ceases to exist, the pointer becomes invalid.
5894: </function>
5895: <function><p><type>void</type>
5896: <funcdef>mac_cleanup</funcdef>
5897: (<type>struct mac_context *</type> <param>ctx</param>) -- cleanup MAC context
5898:
5899: <funcsect>Arguments
5900: <p><descrip>
5901: <tagp><type>struct mac_context *</type> <param>ctx</param></tagp>
5902: MAC context
5903: </descrip>
5904: <funcsect>Description
5905: <p>
5906: Cleanup MAC context after computation (by filling with zeros). Not strictly
5907: necessary, just to erase sensitive data from stack. This also invalidates the
5908: pointer returned by <param/mac_final/().
5909: </function>
5910: <function><p><type>void</type>
5911: <funcdef>mac_fill</funcdef>
5912: (<type>uint</type> <param>id</param>, <type>const byte *</type> <param>key</param>, <type>uint</type> <param>keylen</param>, <type>const byte *</type> <param>data</param>, <type>uint</type> <param>datalen</param>, <type>byte *</type> <param>mac</param>) -- compute and fill MAC
5913:
5914: <funcsect>Arguments
5915: <p><descrip>
5916: <tagp><type>uint</type> <param>id</param></tagp>
5917: MAC algorithm ID
5918: <tagp><type>const byte *</type> <param>key</param></tagp>
5919: secret key
5920: <tagp><type>uint</type> <param>keylen</param></tagp>
5921: key length
5922: <tagp><type>const byte *</type> <param>data</param></tagp>
5923: message data
5924: <tagp><type>uint</type> <param>datalen</param></tagp>
5925: message length
5926: <tagp><type>byte *</type> <param>mac</param></tagp>
5927: place to fill MAC
5928: </descrip>
5929: <funcsect>Description
5930: <p>
5931: Compute MAC for specified key <param/key/ and message <param/data/ using algorithm <param/id/ and
5932: copy it to buffer <param/mac/. <func/mac_fill()/ is a shortcut function doing all usual
5933: steps for transmitted messages.
5934: </function>
5935: <function><p><type>int</type>
5936: <funcdef>mac_verify</funcdef>
5937: (<type>uint</type> <param>id</param>, <type>const byte *</type> <param>key</param>, <type>uint</type> <param>keylen</param>, <type>const byte *</type> <param>data</param>, <type>uint</type> <param>datalen</param>, <type>const byte *</type> <param>mac</param>) -- compute and verify MAC
5938:
5939: <funcsect>Arguments
5940: <p><descrip>
5941: <tagp><type>uint</type> <param>id</param></tagp>
5942: MAC algorithm ID
5943: <tagp><type>const byte *</type> <param>key</param></tagp>
5944: secret key
5945: <tagp><type>uint</type> <param>keylen</param></tagp>
5946: key length
5947: <tagp><type>const byte *</type> <param>data</param></tagp>
5948: message data
5949: <tagp><type>uint</type> <param>datalen</param></tagp>
5950: message length
5951: <tagp><type>const byte *</type> <param>mac</param></tagp>
5952: received MAC
5953: </descrip>
5954: <funcsect>Description
5955: <p>
5956: Compute MAC for specified key <param/key/ and message <param/data/ using algorithm <param/id/ and
5957: compare it with received <param/mac/, return whether they are the same. <func/mac_verify()/
5958: is a shortcut function doing all usual steps for received messages.
5959: </function>
5960: <!--
5961: BIRD Programmer's Guide: Resources
5962:
5963: (c) 2000 Martin Mares <mj@ucw.cz>
5964: -->
5965:
5966: <chapt>Resources
5967:
5968: <sect>Introduction
5969:
5970: <p>Most large software projects implemented in classical procedural
5971: programming languages usually end up with lots of code taking care
5972: of resource allocation and deallocation. Bugs in such code are often
5973: very difficult to find, because they cause only `resource leakage',
5974: that is keeping a lot of memory and other resources which nobody
5975: references to.
5976:
5977: <p>We've tried to solve this problem by employing a resource tracking
5978: system which keeps track of all the resources allocated by all the
5979: modules of BIRD, deallocates everything automatically when a module
5980: shuts down and it is able to print out the list of resources and
5981: the corresponding modules they are allocated by.
5982:
5983: <p>Each allocated resource (from now we'll speak about allocated
5984: resources only) is represented by a structure starting with a standard
5985: header (struct <struct/resource/) consisting of a list node (resources are
5986: often linked to various lists) and a pointer to <struct/resclass/ -- a resource
5987: class structure pointing to functions implementing generic resource
5988: operations (such as freeing of the resource) for the particular resource
5989: type.
5990:
5991: <p>There exist the following types of resources:
5992:
5993: <itemize>
5994: <item><it/Resource pools/ (<struct/pool/)
5995: <item><it/Memory blocks/
5996: <item><it/Linear memory pools/ (<struct/linpool/)
5997: <item><it/Slabs/ (<struct/slab/)
5998: <item><it/Events/ (<struct/event/)
5999: <item><it/Timers/ (<struct/timer/)
6000: <item><it/Sockets/ (<struct/socket/)
6001: </itemize>
6002: <sect>Resource pools
6003: <p>
6004: <p>
6005: Resource pools (<struct/pool/) are just containers holding a list of
6006: other resources. Freeing a pool causes all the listed resources
6007: to be freed as well. Each existing <struct/resource/ is linked to some pool
6008: except for a root pool which isn't linked anywhere, so all the
6009: resources form a tree structure with internal nodes corresponding
6010: to pools and leaves being the other resources.
6011: <p>
6012: Example: Almost all modules of BIRD have their private pool which
6013: is freed upon shutdown of the module.
6014:
6015:
6016: <function><p><type>pool *</type>
6017: <funcdef>rp_new</funcdef>
6018: (<type>pool *</type> <param>p</param>, <type>char *</type> <param>name</param>) -- create a resource pool
6019:
6020: <funcsect>Arguments
6021: <p><descrip>
6022: <tagp><type>pool *</type> <param>p</param></tagp>
6023: parent pool
6024: <tagp><type>char *</type> <param>name</param></tagp>
6025: pool name (to be included in debugging dumps)
6026: </descrip>
6027: <funcsect>Description
6028: <p>
6029: <func/rp_new()/ creates a new resource pool inside the specified
6030: parent pool.
6031: </function>
6032: <function><p><type>void</type>
6033: <funcdef>rmove</funcdef>
6034: (<type>void *</type> <param>res</param>, <type>pool *</type> <param>p</param>) -- move a resource
6035:
6036: <funcsect>Arguments
6037: <p><descrip>
6038: <tagp><type>void *</type> <param>res</param></tagp>
6039: resource
6040: <tagp><type>pool *</type> <param>p</param></tagp>
6041: pool to move the resource to
6042: </descrip>
6043: <funcsect>Description
6044: <p>
6045: <func/rmove()/ moves a resource from one pool to another.
6046: </function>
6047: <function><p><type>void</type>
6048: <funcdef>rfree</funcdef>
6049: (<type>void *</type> <param>res</param>) -- free a resource
6050:
6051: <funcsect>Arguments
6052: <p><descrip>
6053: <tagp><type>void *</type> <param>res</param></tagp>
6054: resource
6055: </descrip>
6056: <funcsect>Description
6057: <p>
6058: <func/rfree()/ frees the given resource and all information associated
6059: with it. In case it's a resource pool, it also frees all the objects
6060: living inside the pool.
6061: <p>
6062: It works by calling a class-specific freeing function.
6063: </function>
6064: <function><p><type>void</type>
6065: <funcdef>rdump</funcdef>
6066: (<type>void *</type> <param>res</param>) -- dump a resource
6067:
6068: <funcsect>Arguments
6069: <p><descrip>
6070: <tagp><type>void *</type> <param>res</param></tagp>
6071: resource
6072: </descrip>
6073: <funcsect>Description
6074: <p>
6075: This function prints out all available information about the given
6076: resource to the debugging output.
6077: <p>
6078: It works by calling a class-specific dump function.
6079: </function>
6080: <function><p><type>void *</type>
6081: <funcdef>ralloc</funcdef>
6082: (<type>pool *</type> <param>p</param>, <type>struct resclass *</type> <param>c</param>) -- create a resource
6083:
6084: <funcsect>Arguments
6085: <p><descrip>
6086: <tagp><type>pool *</type> <param>p</param></tagp>
6087: pool to create the resource in
6088: <tagp><type>struct resclass *</type> <param>c</param></tagp>
6089: class of the new resource
6090: </descrip>
6091: <funcsect>Description
6092: <p>
6093: This function is called by the resource classes to create a new
6094: resource of the specified class and link it to the given pool.
6095: Allocated memory is zeroed. Size of the resource structure is taken
6096: from the <param/size/ field of the <struct/resclass/.
6097: </function>
6098: <function><p><type>void</type>
6099: <funcdef>rlookup</funcdef>
6100: (<type>unsigned long</type> <param>a</param>) -- look up a memory location
6101:
6102: <funcsect>Arguments
6103: <p><descrip>
6104: <tagp><type>unsigned long</type> <param>a</param></tagp>
6105: memory address
6106: </descrip>
6107: <funcsect>Description
6108: <p>
6109: This function examines all existing resources to see whether
6110: the address <param/a/ is inside any resource. It's used for debugging
6111: purposes only.
6112: <p>
6113: It works by calling a class-specific lookup function for each
6114: resource.
6115: </function>
6116: <function><p><type>void</type>
6117: <funcdef>resource_init</funcdef>
6118: (<param>void</param>) -- initialize the resource manager
6119:
6120: <funcsect>Description
6121: <p>
6122: <p>
6123: This function is called during BIRD startup. It initializes
6124: all data structures of the resource manager and creates the
6125: root pool.
6126: </function>
6127: <sect>Memory blocks
6128: <p>
6129: <p>
6130: Memory blocks are pieces of contiguous allocated memory.
6131: They are a bit non-standard since they are represented not by a pointer
6132: to <struct/resource/, but by a void pointer to the start of data of the
6133: memory block. All memory block functions know how to locate the header
6134: given the data pointer.
6135: <p>
6136: Example: All "unique" data structures such as hash tables are allocated
6137: as memory blocks.
6138:
6139:
6140: <function><p><type>void *</type>
6141: <funcdef>mb_alloc</funcdef>
6142: (<type>pool *</type> <param>p</param>, <type>unsigned</type> <param>size</param>) -- allocate a memory block
6143:
6144: <funcsect>Arguments
6145: <p><descrip>
6146: <tagp><type>pool *</type> <param>p</param></tagp>
6147: pool
6148: <tagp><type>unsigned</type> <param>size</param></tagp>
6149: size of the block
6150: </descrip>
6151: <funcsect>Description
6152: <p>
6153: <func/mb_alloc()/ allocates memory of a given size and creates
6154: a memory block resource representing this memory chunk
6155: in the pool <param/p/.
6156: <p>
6157: Please note that <func/mb_alloc()/ returns a pointer to the memory
6158: chunk, not to the resource, hence you have to free it using
6159: <func/mb_free()/, not <func/rfree()/.
6160: </function>
6161: <function><p><type>void *</type>
6162: <funcdef>mb_allocz</funcdef>
6163: (<type>pool *</type> <param>p</param>, <type>unsigned</type> <param>size</param>) -- allocate and clear a memory block
6164:
6165: <funcsect>Arguments
6166: <p><descrip>
6167: <tagp><type>pool *</type> <param>p</param></tagp>
6168: pool
6169: <tagp><type>unsigned</type> <param>size</param></tagp>
6170: size of the block
6171: </descrip>
6172: <funcsect>Description
6173: <p>
6174: <func/mb_allocz()/ allocates memory of a given size, initializes it to
6175: zeroes and creates a memory block resource representing this memory
6176: chunk in the pool <param/p/.
6177: <p>
6178: Please note that <func/mb_allocz()/ returns a pointer to the memory
6179: chunk, not to the resource, hence you have to free it using
6180: <func/mb_free()/, not <func/rfree()/.
6181: </function>
6182: <function><p><type>void *</type>
6183: <funcdef>mb_realloc</funcdef>
6184: (<type>void *</type> <param>m</param>, <type>unsigned</type> <param>size</param>) -- reallocate a memory block
6185:
6186: <funcsect>Arguments
6187: <p><descrip>
6188: <tagp><type>void *</type> <param>m</param></tagp>
6189: memory block
6190: <tagp><type>unsigned</type> <param>size</param></tagp>
6191: new size of the block
6192: </descrip>
6193: <funcsect>Description
6194: <p>
6195: <func/mb_realloc()/ changes the size of the memory block <param/m/ to a given size.
6196: The contents will be unchanged to the minimum of the old and new sizes;
6197: newly allocated memory will be uninitialized. Contrary to <func/realloc()/
6198: behavior, <param/m/ must be non-NULL, because the resource pool is inherited
6199: from it.
6200: <p>
6201: Like <func/mb_alloc()/, <func/mb_realloc()/ also returns a pointer to the memory
6202: chunk, not to the resource, hence you have to free it using
6203: <func/mb_free()/, not <func/rfree()/.
6204: </function>
6205: <function><p><type>void</type>
6206: <funcdef>mb_free</funcdef>
6207: (<type>void *</type> <param>m</param>) -- free a memory block
6208:
6209: <funcsect>Arguments
6210: <p><descrip>
6211: <tagp><type>void *</type> <param>m</param></tagp>
6212: memory block
6213: </descrip>
6214: <funcsect>Description
6215: <p>
6216: <func/mb_free()/ frees all memory associated with the block <param/m/.
6217: </function>
6218: <sect>Linear memory pools
6219: <p>
6220: <p>
6221: Linear memory pools are collections of memory blocks which
6222: support very fast allocation of new blocks, but are able to free only
6223: the whole collection at once.
6224: <p>
6225: Example: Each configuration is described by a complex system of structures,
6226: linked lists and function trees which are all allocated from a single linear
6227: pool, thus they can be freed at once when the configuration is no longer used.
6228:
6229:
6230: <function><p><type>linpool *</type>
6231: <funcdef>lp_new</funcdef>
6232: (<type>pool *</type> <param>p</param>, <type>uint</type> <param>blk</param>) -- create a new linear memory pool
6233:
6234: <funcsect>Arguments
6235: <p><descrip>
6236: <tagp><type>pool *</type> <param>p</param></tagp>
6237: pool
6238: <tagp><type>uint</type> <param>blk</param></tagp>
6239: block size
6240: </descrip>
6241: <funcsect>Description
6242: <p>
6243: <func/lp_new()/ creates a new linear memory pool resource inside the pool <param/p/.
6244: The linear pool consists of a list of memory chunks of size at least
6245: <param/blk/.
6246: </function>
6247: <function><p><type>void *</type>
6248: <funcdef>lp_alloc</funcdef>
6249: (<type>linpool *</type> <param>m</param>, <type>uint</type> <param>size</param>) -- allocate memory from a <struct/linpool/
6250:
6251: <funcsect>Arguments
6252: <p><descrip>
6253: <tagp><type>linpool *</type> <param>m</param></tagp>
6254: linear memory pool
6255: <tagp><type>uint</type> <param>size</param></tagp>
6256: amount of memory
6257: </descrip>
6258: <funcsect>Description
6259: <p>
6260: <func/lp_alloc()/ allocates <param/size/ bytes of memory from a <struct/linpool/ <param/m/
6261: and it returns a pointer to the allocated memory.
6262: <p>
6263: It works by trying to find free space in the last memory chunk
6264: associated with the <struct/linpool/ and creating a new chunk of the standard
6265: size (as specified during <func/lp_new()/) if the free space is too small
6266: to satisfy the allocation. If <param/size/ is too large to fit in a standard
6267: size chunk, an "overflow" chunk is created for it instead.
6268: </function>
6269: <function><p><type>void *</type>
6270: <funcdef>lp_allocu</funcdef>
6271: (<type>linpool *</type> <param>m</param>, <type>uint</type> <param>size</param>) -- allocate unaligned memory from a <struct/linpool/
6272:
6273: <funcsect>Arguments
6274: <p><descrip>
6275: <tagp><type>linpool *</type> <param>m</param></tagp>
6276: linear memory pool
6277: <tagp><type>uint</type> <param>size</param></tagp>
6278: amount of memory
6279: </descrip>
6280: <funcsect>Description
6281: <p>
6282: <func/lp_allocu()/ allocates <param/size/ bytes of memory from a <struct/linpool/ <param/m/
6283: and it returns a pointer to the allocated memory. It doesn't
6284: attempt to align the memory block, giving a very efficient way
6285: how to allocate strings without any space overhead.
6286: </function>
6287: <function><p><type>void *</type>
6288: <funcdef>lp_allocz</funcdef>
6289: (<type>linpool *</type> <param>m</param>, <type>uint</type> <param>size</param>) -- allocate cleared memory from a <struct/linpool/
6290:
6291: <funcsect>Arguments
6292: <p><descrip>
6293: <tagp><type>linpool *</type> <param>m</param></tagp>
6294: linear memory pool
6295: <tagp><type>uint</type> <param>size</param></tagp>
6296: amount of memory
6297: </descrip>
6298: <funcsect>Description
6299: <p>
6300: This function is identical to <func/lp_alloc()/ except that it
6301: clears the allocated memory block.
6302: </function>
6303: <function><p><type>void</type>
6304: <funcdef>lp_flush</funcdef>
6305: (<type>linpool *</type> <param>m</param>) -- flush a linear memory pool
6306:
6307: <funcsect>Arguments
6308: <p><descrip>
6309: <tagp><type>linpool *</type> <param>m</param></tagp>
6310: linear memory pool
6311: </descrip>
6312: <funcsect>Description
6313: <p>
6314: This function frees the whole contents of the given <struct/linpool/ <param/m/,
6315: but leaves the pool itself.
6316: </function>
6317: <sect>Slabs
6318: <p>
6319: <p>
6320: Slabs are collections of memory blocks of a fixed size.
6321: They support very fast allocation and freeing of such blocks, prevent memory
6322: fragmentation and optimize L2 cache usage. Slabs have been invented by Jeff Bonwick
6323: and published in USENIX proceedings as `The Slab Allocator: An Object-Caching Kernel
6324: Memory Allocator'. Our implementation follows this article except that we don't use
6325: constructors and destructors.
6326: <p>
6327: When the <tt>DEBUGGING</tt> switch is turned on, we automatically fill all
6328: newly allocated and freed blocks with a special pattern to make detection
6329: of use of uninitialized or already freed memory easier.
6330: <p>
6331: Example: Nodes of a FIB are allocated from a per-FIB Slab.
6332:
6333:
6334: <function><p><type>slab *</type>
6335: <funcdef>sl_new</funcdef>
6336: (<type>pool *</type> <param>p</param>, <type>uint</type> <param>size</param>) -- create a new Slab
6337:
6338: <funcsect>Arguments
6339: <p><descrip>
6340: <tagp><type>pool *</type> <param>p</param></tagp>
6341: resource pool
6342: <tagp><type>uint</type> <param>size</param></tagp>
6343: block size
6344: </descrip>
6345: <funcsect>Description
6346: <p>
6347: This function creates a new Slab resource from which
6348: objects of size <param/size/ can be allocated.
6349: </function>
6350: <function><p><type>void *</type>
6351: <funcdef>sl_alloc</funcdef>
6352: (<type>slab *</type> <param>s</param>) -- allocate an object from Slab
6353:
6354: <funcsect>Arguments
6355: <p><descrip>
6356: <tagp><type>slab *</type> <param>s</param></tagp>
6357: slab
6358: </descrip>
6359: <funcsect>Description
6360: <p>
6361: <func/sl_alloc()/ allocates space for a single object from the
6362: Slab and returns a pointer to the object.
6363: </function>
6364: <function><p><type>void</type>
6365: <funcdef>sl_free</funcdef>
6366: (<type>slab *</type> <param>s</param>, <type>void *</type> <param>oo</param>) -- return a free object back to a Slab
6367:
6368: <funcsect>Arguments
6369: <p><descrip>
6370: <tagp><type>slab *</type> <param>s</param></tagp>
6371: slab
6372: <tagp><type>void *</type> <param>oo</param></tagp>
6373: object returned by <func/sl_alloc()/
6374: </descrip>
6375: <funcsect>Description
6376: <p>
6377: This function frees memory associated with the object <param/oo/
6378: and returns it back to the Slab <param/s/.
6379: </function>
6380: <sect>Events
6381: <p>
6382: <p>
6383: Events are there to keep track of deferred execution.
6384: Since BIRD is single-threaded, it requires long lasting tasks to be split to smaller
6385: parts, so that no module can monopolize the CPU. To split such a task, just create
6386: an <struct/event/ resource, point it to the function you want to have called and call <func/ev_schedule()/
6387: to ask the core to run the event when nothing more important requires attention.
6388: <p>
6389: You can also define your own event lists (the <struct/event_list/ structure), enqueue your
6390: events in them and explicitly ask to run them.
6391:
6392:
6393: <function><p><type>event *</type>
6394: <funcdef>ev_new</funcdef>
6395: (<type>pool *</type> <param>p</param>) -- create a new event
6396:
6397: <funcsect>Arguments
6398: <p><descrip>
6399: <tagp><type>pool *</type> <param>p</param></tagp>
6400: resource pool
6401: </descrip>
6402: <funcsect>Description
6403: <p>
6404: This function creates a new event resource. To use it,
6405: you need to fill the structure fields and call <func/ev_schedule()/.
6406: </function>
6407: <function><p><type>void</type>
6408: <funcdef>ev_run</funcdef>
6409: (<type>event *</type> <param>e</param>) -- run an event
6410:
6411: <funcsect>Arguments
6412: <p><descrip>
6413: <tagp><type>event *</type> <param>e</param></tagp>
6414: an event
6415: </descrip>
6416: <funcsect>Description
6417: <p>
6418: This function explicitly runs the event <param/e/ (calls its hook
6419: function) and removes it from an event list if it's linked to any.
6420: <p>
6421: From the hook function, you can call <func/ev_enqueue()/ or <func/ev_schedule()/
6422: to re-add the event.
6423: </function>
6424: <function><p><type>void</type>
6425: <funcdef>ev_enqueue</funcdef>
6426: (<type>event_list *</type> <param>l</param>, <type>event *</type> <param>e</param>) -- enqueue an event
6427:
6428: <funcsect>Arguments
6429: <p><descrip>
6430: <tagp><type>event_list *</type> <param>l</param></tagp>
6431: an event list
6432: <tagp><type>event *</type> <param>e</param></tagp>
6433: an event
6434: </descrip>
6435: <funcsect>Description
6436: <p>
6437: <func/ev_enqueue()/ stores the event <param/e/ to the specified event
6438: list <param/l/ which can be run by calling <func/ev_run_list()/.
6439: </function>
6440: <function><p><type>void</type>
6441: <funcdef>ev_schedule</funcdef>
6442: (<type>event *</type> <param>e</param>) -- schedule an event
6443:
6444: <funcsect>Arguments
6445: <p><descrip>
6446: <tagp><type>event *</type> <param>e</param></tagp>
6447: an event
6448: </descrip>
6449: <funcsect>Description
6450: <p>
6451: This function schedules an event by enqueueing it to a system-wide
6452: event list which is run by the platform dependent code whenever
6453: appropriate.
6454: </function>
6455: <function><p><type>int</type>
6456: <funcdef>ev_run_list</funcdef>
6457: (<type>event_list *</type> <param>l</param>) -- run an event list
6458:
6459: <funcsect>Arguments
6460: <p><descrip>
6461: <tagp><type>event_list *</type> <param>l</param></tagp>
6462: an event list
6463: </descrip>
6464: <funcsect>Description
6465: <p>
6466: This function calls <func/ev_run()/ for all events enqueued in the list <param/l/.
6467: </function>
6468: <sect>Timers
6469: <p>
6470: <p>
6471: Timers are resources which represent a wish of a module to call
6472: a function at the specified time. The platform dependent code
6473: doesn't guarantee exact timing, only that a timer function
6474: won't be called before the requested time.
6475: <p>
6476: In BIRD, time is represented by values of the <struct/bird_clock_t/ type
6477: which are integral numbers interpreted as a relative number of seconds since
6478: some fixed time point in past. The current time can be read
6479: from variable <param/now/ with reasonable accuracy and is monotonic. There is also
6480: a current 'absolute' time in variable <param/now_real/ reported by OS.
6481: <p>
6482: Each timer is described by a <struct/timer/ structure containing a pointer
6483: to the handler function (<param/hook/), data private to this function (<param/data/),
6484: time the function should be called at (<param/expires/, 0 for inactive timers),
6485: for the other fields see <tt>timer.h</tt>.
6486:
6487:
6488: <function><p><type>timer *</type>
6489: <funcdef>tm_new</funcdef>
6490: (<type>pool *</type> <param>p</param>) -- create a timer
6491:
6492: <funcsect>Arguments
6493: <p><descrip>
6494: <tagp><type>pool *</type> <param>p</param></tagp>
6495: pool
6496: </descrip>
6497: <funcsect>Description
6498: <p>
6499: This function creates a new timer resource and returns
6500: a pointer to it. To use the timer, you need to fill in
6501: the structure fields and call <func/tm_start()/ to start timing.
6502: </function>
6503: <function><p><type>void</type>
6504: <funcdef>tm_start</funcdef>
6505: (<type>timer *</type> <param>t</param>, <type>unsigned</type> <param>after</param>) -- start a timer
6506:
6507: <funcsect>Arguments
6508: <p><descrip>
6509: <tagp><type>timer *</type> <param>t</param></tagp>
6510: timer
6511: <tagp><type>unsigned</type> <param>after</param></tagp>
6512: number of seconds the timer should be run after
6513: </descrip>
6514: <funcsect>Description
6515: <p>
6516: This function schedules the hook function of the timer to
6517: be called after <param/after/ seconds. If the timer has been already
6518: started, it's <param/expire/ time is replaced by the new value.
6519: <p>
6520: You can have set the <param/randomize/ field of <param/t/, the timeout
6521: will be increased by a random number of seconds chosen
6522: uniformly from range 0 .. <param/randomize/.
6523: <p>
6524: You can call <func/tm_start()/ from the handler function of the timer
6525: to request another run of the timer. Also, you can set the <param/recurrent/
6526: field to have the timer re-added automatically with the same timeout.
6527: </function>
6528: <function><p><type>void</type>
6529: <funcdef>tm_stop</funcdef>
6530: (<type>timer *</type> <param>t</param>) -- stop a timer
6531:
6532: <funcsect>Arguments
6533: <p><descrip>
6534: <tagp><type>timer *</type> <param>t</param></tagp>
6535: timer
6536: </descrip>
6537: <funcsect>Description
6538: <p>
6539: This function stops a timer. If the timer is already stopped,
6540: nothing happens.
6541: </function>
6542: <function><p><type>bird_clock_t</type>
6543: <funcdef>tm_parse_datetime</funcdef>
6544: (<type>char *</type> <param>x</param>) -- parse a date and time
6545:
6546: <funcsect>Arguments
6547: <p><descrip>
6548: <tagp><type>char *</type> <param>x</param></tagp>
6549: datetime string
6550: </descrip>
6551: <funcsect>Description
6552: <p>
6553: <func/tm_parse_datetime()/ takes a textual representation of
6554: a date and time (dd-mm-yyyy hh:mm:ss)
6555: and converts it to the corresponding value of type <struct/bird_clock_t/.
6556: </function>
6557: <function><p><type>bird_clock_t</type>
6558: <funcdef>tm_parse_date</funcdef>
6559: (<type>char *</type> <param>x</param>) -- parse a date
6560:
6561: <funcsect>Arguments
6562: <p><descrip>
6563: <tagp><type>char *</type> <param>x</param></tagp>
6564: date string
6565: </descrip>
6566: <funcsect>Description
6567: <p>
6568: <func/tm_parse_date()/ takes a textual representation of a date (dd-mm-yyyy)
6569: and converts it to the corresponding value of type <struct/bird_clock_t/.
6570: </function>
6571: <function><p><type>void</type>
6572: <funcdef>tm_format_datetime</funcdef>
6573: (<type>char *</type> <param>x</param>, <type>struct timeformat *</type> <param>fmt_spec</param>, <type>bird_clock_t</type> <param>t</param>) -- convert date and time to textual representation
6574:
6575: <funcsect>Arguments
6576: <p><descrip>
6577: <tagp><type>char *</type> <param>x</param></tagp>
6578: destination buffer of size <const/TM_DATETIME_BUFFER_SIZE/
6579: <tagp><type>struct timeformat *</type> <param>fmt_spec</param></tagp>
6580: specification of resulting textual representation of the time
6581: <tagp><type>bird_clock_t</type> <param>t</param></tagp>
6582: time
6583: </descrip>
6584: <funcsect>Description
6585: <p>
6586: This function formats the given relative time value <param/t/ to a textual
6587: date/time representation (dd-mm-yyyy hh:mm:ss) in real time.
6588: </function>
6589: <sect>Sockets
6590: <p>
6591: <p>
6592: Socket resources represent network connections. Their data structure (<struct/socket/)
6593: contains a lot of fields defining the exact type of the socket, the local and
6594: remote addresses and ports, pointers to socket buffers and finally pointers to
6595: hook functions to be called when new data have arrived to the receive buffer
6596: (<param/rx_hook/), when the contents of the transmit buffer have been transmitted
6597: (<param/tx_hook/) and when an error or connection close occurs (<param/err_hook/).
6598: <p>
6599: Freeing of sockets from inside socket hooks is perfectly safe.
6600:
6601:
6602: <function><p><type>int</type>
6603: <funcdef>sk_setup_multicast</funcdef>
6604: (<type>sock *</type> <param>s</param>) -- enable multicast for given socket
6605:
6606: <funcsect>Arguments
6607: <p><descrip>
6608: <tagp><type>sock *</type> <param>s</param></tagp>
6609: socket
6610: </descrip>
6611: <funcsect>Description
6612: <p>
6613: Prepare transmission of multicast packets for given datagram socket.
6614: The socket must have defined <param/iface/.
6615: <funcsect>Result
6616: <p>
6617: 0 for success, -1 for an error.
6618: </function>
6619: <function><p><type>int</type>
6620: <funcdef>sk_join_group</funcdef>
6621: (<type>sock *</type> <param>s</param>, <type>ip_addr</type> <param>maddr</param>) -- join multicast group for given socket
6622:
6623: <funcsect>Arguments
6624: <p><descrip>
6625: <tagp><type>sock *</type> <param>s</param></tagp>
6626: socket
6627: <tagp><type>ip_addr</type> <param>maddr</param></tagp>
6628: multicast address
6629: </descrip>
6630: <funcsect>Description
6631: <p>
6632: Join multicast group for given datagram socket and associated interface.
6633: The socket must have defined <param/iface/.
6634: <funcsect>Result
6635: <p>
6636: 0 for success, -1 for an error.
6637: </function>
6638: <function><p><type>int</type>
6639: <funcdef>sk_leave_group</funcdef>
6640: (<type>sock *</type> <param>s</param>, <type>ip_addr</type> <param>maddr</param>) -- leave multicast group for given socket
6641:
6642: <funcsect>Arguments
6643: <p><descrip>
6644: <tagp><type>sock *</type> <param>s</param></tagp>
6645: socket
6646: <tagp><type>ip_addr</type> <param>maddr</param></tagp>
6647: multicast address
6648: </descrip>
6649: <funcsect>Description
6650: <p>
6651: Leave multicast group for given datagram socket and associated interface.
6652: The socket must have defined <param/iface/.
6653: <funcsect>Result
6654: <p>
6655: 0 for success, -1 for an error.
6656: </function>
6657: <function><p><type>int</type>
6658: <funcdef>sk_setup_broadcast</funcdef>
6659: (<type>sock *</type> <param>s</param>) -- enable broadcast for given socket
6660:
6661: <funcsect>Arguments
6662: <p><descrip>
6663: <tagp><type>sock *</type> <param>s</param></tagp>
6664: socket
6665: </descrip>
6666: <funcsect>Description
6667: <p>
6668: Allow reception and transmission of broadcast packets for given datagram
6669: socket. The socket must have defined <param/iface/. For transmission, packets should
6670: be send to <param/brd/ address of <param/iface/.
6671: <funcsect>Result
6672: <p>
6673: 0 for success, -1 for an error.
6674: </function>
6675: <function><p><type>int</type>
6676: <funcdef>sk_set_ttl</funcdef>
6677: (<type>sock *</type> <param>s</param>, <type>int</type> <param>ttl</param>) -- set transmit TTL for given socket
6678:
6679: <funcsect>Arguments
6680: <p><descrip>
6681: <tagp><type>sock *</type> <param>s</param></tagp>
6682: socket
6683: <tagp><type>int</type> <param>ttl</param></tagp>
6684: TTL value
6685: </descrip>
6686: <funcsect>Description
6687: <p>
6688: Set TTL for already opened connections when TTL was not set before. Useful
6689: for accepted connections when different ones should have different TTL.
6690: <funcsect>Result
6691: <p>
6692: 0 for success, -1 for an error.
6693: </function>
6694: <function><p><type>int</type>
6695: <funcdef>sk_set_min_ttl</funcdef>
6696: (<type>sock *</type> <param>s</param>, <type>int</type> <param>ttl</param>) -- set minimal accepted TTL for given socket
6697:
6698: <funcsect>Arguments
6699: <p><descrip>
6700: <tagp><type>sock *</type> <param>s</param></tagp>
6701: socket
6702: <tagp><type>int</type> <param>ttl</param></tagp>
6703: TTL value
6704: </descrip>
6705: <funcsect>Description
6706: <p>
6707: Set minimal accepted TTL for given socket. Can be used for TTL security.
6708: implementations.
6709: <funcsect>Result
6710: <p>
6711: 0 for success, -1 for an error.
6712: </function>
6713: <function><p><type>int</type>
6714: <funcdef>sk_set_md5_auth</funcdef>
6715: (<type>sock *</type> <param>s</param>, <type>ip_addr</type> <param>local</param>, <type>ip_addr</type> <param>remote</param>, <type>struct iface *</type> <param>ifa</param>, <type>char *</type> <param>passwd</param>, <type>int</type> <param>setkey</param>) -- add / remove MD5 security association for given socket
6716:
6717: <funcsect>Arguments
6718: <p><descrip>
6719: <tagp><type>sock *</type> <param>s</param></tagp>
6720: socket
6721: <tagp><type>ip_addr</type> <param>local</param></tagp>
6722: IP address of local side
6723: <tagp><type>ip_addr</type> <param>remote</param></tagp>
6724: IP address of remote side
6725: <tagp><type>struct iface *</type> <param>ifa</param></tagp>
6726: Interface for link-local IP address
6727: <tagp><type>char *</type> <param>passwd</param></tagp>
6728: Password used for MD5 authentication
6729: <tagp><type>int</type> <param>setkey</param></tagp>
6730: Update also system SA/SP database
6731: </descrip>
6732: <funcsect>Description
6733: <p>
6734: In TCP MD5 handling code in kernel, there is a set of security associations
6735: used for choosing password and other authentication parameters according to
6736: the local and remote address. This function is useful for listening socket,
6737: for active sockets it may be enough to set s->password field.
6738: <p>
6739: When called with passwd != NULL, the new pair is added,
6740: When called with passwd == NULL, the existing pair is removed.
6741: <p>
6742: Note that while in Linux, the MD5 SAs are specific to socket, in BSD they are
6743: stored in global SA/SP database (but the behavior also must be enabled on
6744: per-socket basis). In case of multiple sockets to the same neighbor, the
6745: socket-specific state must be configured for each socket while global state
6746: just once per src-dst pair. The <param/setkey/ argument controls whether the global
6747: state (SA/SP database) is also updated.
6748: <funcsect>Result
6749: <p>
6750: 0 for success, -1 for an error.
6751: </function>
6752: <function><p><type>int</type>
6753: <funcdef>sk_set_ipv6_checksum</funcdef>
6754: (<type>sock *</type> <param>s</param>, <type>int</type> <param>offset</param>) -- specify IPv6 checksum offset for given socket
6755:
6756: <funcsect>Arguments
6757: <p><descrip>
6758: <tagp><type>sock *</type> <param>s</param></tagp>
6759: socket
6760: <tagp><type>int</type> <param>offset</param></tagp>
6761: offset
6762: </descrip>
6763: <funcsect>Description
6764: <p>
6765: Specify IPv6 checksum field offset for given raw IPv6 socket. After that, the
6766: kernel will automatically fill it for outgoing packets and check it for
6767: incoming packets. Should not be used on ICMPv6 sockets, where the position is
6768: known to the kernel.
6769: <funcsect>Result
6770: <p>
6771: 0 for success, -1 for an error.
6772: </function>
6773: <function><p><type>sock *</type>
6774: <funcdef>sock_new</funcdef>
6775: (<type>pool *</type> <param>p</param>) -- create a socket
6776:
6777: <funcsect>Arguments
6778: <p><descrip>
6779: <tagp><type>pool *</type> <param>p</param></tagp>
6780: pool
6781: </descrip>
6782: <funcsect>Description
6783: <p>
6784: This function creates a new socket resource. If you want to use it,
6785: you need to fill in all the required fields of the structure and
6786: call <func/sk_open()/ to do the actual opening of the socket.
6787: <p>
6788: The real function name is <func/sock_new()/, <func/sk_new()/ is a macro wrapper
6789: to avoid collision with OpenSSL.
6790: </function>
6791: <function><p><type>int</type>
6792: <funcdef>sk_open</funcdef>
6793: (<type>sock *</type> <param>s</param>) -- open a socket
6794:
6795: <funcsect>Arguments
6796: <p><descrip>
6797: <tagp><type>sock *</type> <param>s</param></tagp>
6798: socket
6799: </descrip>
6800: <funcsect>Description
6801: <p>
6802: This function takes a socket resource created by <func/sk_new()/ and
6803: initialized by the user and binds a corresponding network connection
6804: to it.
6805: <funcsect>Result
6806: <p>
6807: 0 for success, -1 for an error.
6808: </function>
6809: <function><p><type>int</type>
6810: <funcdef>sk_send</funcdef>
6811: (<type>sock *</type> <param>s</param>, <type>unsigned</type> <param>len</param>) -- send data to a socket
6812:
6813: <funcsect>Arguments
6814: <p><descrip>
6815: <tagp><type>sock *</type> <param>s</param></tagp>
6816: socket
6817: <tagp><type>unsigned</type> <param>len</param></tagp>
6818: number of bytes to send
6819: </descrip>
6820: <funcsect>Description
6821: <p>
6822: This function sends <param/len/ bytes of data prepared in the
6823: transmit buffer of the socket <param/s/ to the network connection.
6824: If the packet can be sent immediately, it does so and returns
6825: 1, else it queues the packet for later processing, returns 0
6826: and calls the <param/tx_hook/ of the socket when the tranmission
6827: takes place.
6828: </function>
6829: <function><p><type>int</type>
6830: <funcdef>sk_send_to</funcdef>
6831: (<type>sock *</type> <param>s</param>, <type>unsigned</type> <param>len</param>, <type>ip_addr</type> <param>addr</param>, <type>unsigned</type> <param>port</param>) -- send data to a specific destination
6832:
6833: <funcsect>Arguments
6834: <p><descrip>
6835: <tagp><type>sock *</type> <param>s</param></tagp>
6836: socket
6837: <tagp><type>unsigned</type> <param>len</param></tagp>
6838: number of bytes to send
6839: <tagp><type>ip_addr</type> <param>addr</param></tagp>
6840: IP address to send the packet to
6841: <tagp><type>unsigned</type> <param>port</param></tagp>
6842: port to send the packet to
6843: </descrip>
6844: <funcsect>Description
6845: <p>
6846: This is a <func/sk_send()/ replacement for connection-less packet sockets
6847: which allows destination of the packet to be chosen dynamically.
6848: Raw IP sockets should use 0 for <param/port/.
6849: </function>
6850: <function><p><type>void</type>
6851: <funcdef>io_log_event</funcdef>
6852: (<type>void *</type> <param>hook</param>, <type>void *</type> <param>data</param>) -- mark approaching event into event log
6853:
6854: <funcsect>Arguments
6855: <p><descrip>
6856: <tagp><type>void *</type> <param>hook</param></tagp>
6857: event hook address
6858: <tagp><type>void *</type> <param>data</param></tagp>
6859: event data address
6860: </descrip>
6861: <funcsect>Description
6862: <p>
6863: Store info (hook, data, timestamp) about the following internal event into
6864: a circular event log (<param/event_log/). When latency tracking is enabled, the log
6865: entry is kept open (in <param/event_open/) so the duration can be filled later.
6866: </function>
6867:
6868: </book>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>