Annotation of embedaddon/bird/doc/prog-8.html, revision 1.1.1.1

1.1       misho       1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
                      2: <HTML>
                      3: <HEAD>
                      4:  <META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 1.0.9">
                      5:  <TITLE>BIRD Programmer's Documentation: Resources</TITLE>
                      6:  <LINK HREF="prog-7.html" REL=previous>
                      7:  <LINK HREF="prog.html#toc8" REL=contents>
                      8: </HEAD>
                      9: <BODY>
                     10: Next
                     11: <A HREF="prog-7.html">Previous</A>
                     12: <A HREF="prog.html#toc8">Contents</A>
                     13: <HR>
                     14: <H2><A NAME="s8">8.</A> <A HREF="prog.html#toc8">Resources</A></H2>
                     15: 
                     16: <H2><A NAME="ss8.1">8.1</A> <A HREF="prog.html#toc8.1">Introduction</A>
                     17: </H2>
                     18: 
                     19: <P>Most large software projects implemented in classical procedural
                     20: programming languages usually end up with lots of code taking care
                     21: of resource allocation and deallocation. Bugs in such code are often
                     22: very difficult to find, because they cause only `resource leakage',
                     23: that is keeping a lot of memory and other resources which nobody
                     24: references to.
                     25: <P>
                     26: <P>We've tried to solve this problem by employing a resource tracking
                     27: system which keeps track of all the resources allocated by all the
                     28: modules of BIRD, deallocates everything automatically when a module
                     29: shuts down and it is able to print out the list of resources and
                     30: the corresponding modules they are allocated by.
                     31: <P>
                     32: <P>Each allocated resource (from now we'll speak about allocated
                     33: resources only) is represented by a structure starting with a standard
                     34: header (struct <I>resource</I>) consisting of a list node (resources are
                     35: often linked to various lists) and a pointer to <I>resclass</I> -- a resource
                     36: class structure pointing to functions implementing generic resource
                     37: operations (such as freeing of the resource) for the particular resource
                     38: type.
                     39: <P>
                     40: <P>There exist the following types of resources:
                     41: <P>
                     42: <UL>
                     43: <LI><I>Resource pools</I> (<I>pool</I>)</LI>
                     44: <LI><I>Memory blocks</I></LI>
                     45: <LI><I>Linear memory pools</I> (<I>linpool</I>)</LI>
                     46: <LI><I>Slabs</I> (<I>slab</I>)</LI>
                     47: <LI><I>Events</I> (<I>event</I>) </LI>
                     48: <LI><I>Timers</I> (<I>timer</I>) </LI>
                     49: <LI><I>Sockets</I> (<I>socket</I>) </LI>
                     50: </UL>
                     51: <H2><A NAME="ss8.2">8.2</A> <A HREF="prog.html#toc8.2">Resource pools</A>
                     52: </H2>
                     53: 
                     54: <P>
                     55: <P>Resource pools (<I>pool</I>) are just containers holding a list of
                     56: other resources. Freeing a pool causes all the listed resources
                     57: to be freed as well. Each existing <I>resource</I> is linked to some pool
                     58: except for a root pool which isn't linked anywhere, so all the
                     59: resources form a tree structure with internal nodes corresponding
                     60: to pools and leaves being the other resources.
                     61: <P>Example: Almost all modules of BIRD have their private pool which
                     62: is freed upon shutdown of the module.
                     63: <P>
                     64: <P><HR><H3>Function</H3>
                     65: <P><I>pool *</I>
                     66: <B>rp_new</B>
                     67: (<I>pool *</I> <B>p</B>, <I>char *</I> <B>name</B>) --     create a resource pool
                     68: <P>
                     69: <H3>Arguments</H3>
                     70: <P>
                     71: <DL>
                     72: <DT><I>pool *</I> <B>p</B><DD><P>parent pool
                     73: <DT><I>char *</I> <B>name</B><DD><P>pool name (to be included in debugging dumps)
                     74: </DL>
                     75: <H3>Description</H3>
                     76: <P><B>rp_new()</B> creates a new resource pool inside the specified
                     77: parent pool.
                     78: 
                     79: 
                     80: <HR><H3>Function</H3>
                     81: <P><I>void</I>
                     82: <B>rmove</B>
                     83: (<I>void *</I> <B>res</B>, <I>pool *</I> <B>p</B>) --     move a resource
                     84: <P>
                     85: <H3>Arguments</H3>
                     86: <P>
                     87: <DL>
                     88: <DT><I>void *</I> <B>res</B><DD><P>resource
                     89: <DT><I>pool *</I> <B>p</B><DD><P>pool to move the resource to
                     90: </DL>
                     91: <H3>Description</H3>
                     92: <P><B>rmove()</B> moves a resource from one pool to another.
                     93: 
                     94: 
                     95: <HR><H3>Function</H3>
                     96: <P><I>void</I>
                     97: <B>rfree</B>
                     98: (<I>void *</I> <B>res</B>) --     free a resource
                     99: <P>
                    100: <H3>Arguments</H3>
                    101: <P>
                    102: <DL>
                    103: <DT><I>void *</I> <B>res</B><DD><P>resource
                    104: </DL>
                    105: <H3>Description</H3>
                    106: <P><B>rfree()</B> frees the given resource and all information associated
                    107: with it. In case it's a resource pool, it also frees all the objects
                    108: living inside the pool.
                    109: <P>It works by calling a class-specific freeing function.
                    110: 
                    111: 
                    112: <HR><H3>Function</H3>
                    113: <P><I>void</I>
                    114: <B>rdump</B>
                    115: (<I>void *</I> <B>res</B>) --     dump a resource
                    116: <P>
                    117: <H3>Arguments</H3>
                    118: <P>
                    119: <DL>
                    120: <DT><I>void *</I> <B>res</B><DD><P>resource
                    121: </DL>
                    122: <H3>Description</H3>
                    123: <P>This function prints out all available information about the given
                    124: resource to the debugging output.
                    125: <P>It works by calling a class-specific dump function.
                    126: 
                    127: 
                    128: <HR><H3>Function</H3>
                    129: <P><I>void *</I>
                    130: <B>ralloc</B>
                    131: (<I>pool *</I> <B>p</B>, <I>struct resclass *</I> <B>c</B>) --     create a resource
                    132: <P>
                    133: <H3>Arguments</H3>
                    134: <P>
                    135: <DL>
                    136: <DT><I>pool *</I> <B>p</B><DD><P>pool to create the resource in
                    137: <DT><I>struct resclass *</I> <B>c</B><DD><P>class of the new resource
                    138: </DL>
                    139: <H3>Description</H3>
                    140: <P>This function is called by the resource classes to create a new
                    141: resource of the specified class and link it to the given pool.
                    142: Allocated memory is zeroed. Size of the resource structure is taken
                    143: from the <B>size</B> field of the <I>resclass</I>.
                    144: 
                    145: 
                    146: <HR><H3>Function</H3>
                    147: <P><I>void</I>
                    148: <B>rlookup</B>
                    149: (<I>unsigned long</I> <B>a</B>) --     look up a memory location
                    150: <P>
                    151: <H3>Arguments</H3>
                    152: <P>
                    153: <DL>
                    154: <DT><I>unsigned long</I> <B>a</B><DD><P>memory address
                    155: </DL>
                    156: <H3>Description</H3>
                    157: <P>This function examines all existing resources to see whether
                    158: the address <B>a</B> is inside any resource. It's used for debugging
                    159: purposes only.
                    160: <P>It works by calling a class-specific lookup function for each
                    161: resource.
                    162: 
                    163: 
                    164: <HR><H3>Function</H3>
                    165: <P><I>void</I>
                    166: <B>resource_init</B>
                    167: (<B>void</B>) --     initialize the resource manager
                    168: <P>
                    169: <H3>Description</H3>
                    170: <P>
                    171: <P>This function is called during BIRD startup. It initializes
                    172: all data structures of the resource manager and creates the
                    173: root pool.
                    174: 
                    175: <H2><A NAME="ss8.3">8.3</A> <A HREF="prog.html#toc8.3">Memory blocks</A>
                    176: </H2>
                    177: 
                    178: <P>
                    179: <P>Memory blocks are pieces of contiguous allocated memory.
                    180: They are a bit non-standard since they are represented not by a pointer
                    181: to <I>resource</I>, but by a void pointer to the start of data of the
                    182: memory block. All memory block functions know how to locate the header
                    183: given the data pointer.
                    184: <P>Example: All "unique" data structures such as hash tables are allocated
                    185: as memory blocks.
                    186: <P>
                    187: <P><HR><H3>Function</H3>
                    188: <P><I>void *</I>
                    189: <B>mb_alloc</B>
                    190: (<I>pool *</I> <B>p</B>, <I>unsigned</I> <B>size</B>) --     allocate a memory block
                    191: <P>
                    192: <H3>Arguments</H3>
                    193: <P>
                    194: <DL>
                    195: <DT><I>pool *</I> <B>p</B><DD><P>pool
                    196: <DT><I>unsigned</I> <B>size</B><DD><P>size of the block
                    197: </DL>
                    198: <H3>Description</H3>
                    199: <P><B>mb_alloc()</B> allocates memory of a given size and creates
                    200: a memory block resource representing this memory chunk
                    201: in the pool <B>p</B>.
                    202: <P>Please note that <B>mb_alloc()</B> returns a pointer to the memory
                    203: chunk, not to the resource, hence you have to free it using
                    204: <B>mb_free()</B>, not <B>rfree()</B>.
                    205: 
                    206: 
                    207: <HR><H3>Function</H3>
                    208: <P><I>void *</I>
                    209: <B>mb_allocz</B>
                    210: (<I>pool *</I> <B>p</B>, <I>unsigned</I> <B>size</B>) --     allocate and clear a memory block
                    211: <P>
                    212: <H3>Arguments</H3>
                    213: <P>
                    214: <DL>
                    215: <DT><I>pool *</I> <B>p</B><DD><P>pool
                    216: <DT><I>unsigned</I> <B>size</B><DD><P>size of the block
                    217: </DL>
                    218: <H3>Description</H3>
                    219: <P><B>mb_allocz()</B> allocates memory of a given size, initializes it to
                    220: zeroes and creates a memory block resource representing this memory
                    221: chunk in the pool <B>p</B>.
                    222: <P>Please note that <B>mb_allocz()</B> returns a pointer to the memory
                    223: chunk, not to the resource, hence you have to free it using
                    224: <B>mb_free()</B>, not <B>rfree()</B>.
                    225: 
                    226: 
                    227: <HR><H3>Function</H3>
                    228: <P><I>void *</I>
                    229: <B>mb_realloc</B>
                    230: (<I>void *</I> <B>m</B>, <I>unsigned</I> <B>size</B>) --     reallocate a memory block
                    231: <P>
                    232: <H3>Arguments</H3>
                    233: <P>
                    234: <DL>
                    235: <DT><I>void *</I> <B>m</B><DD><P>memory block
                    236: <DT><I>unsigned</I> <B>size</B><DD><P>new size of the block
                    237: </DL>
                    238: <H3>Description</H3>
                    239: <P><B>mb_realloc()</B> changes the size of the memory block <B>m</B> to a given size.
                    240: The contents will be unchanged to the minimum of the old and new sizes;
                    241: newly allocated memory will be uninitialized. Contrary to <B>realloc()</B>
                    242: behavior, <B>m</B> must be non-NULL, because the resource pool is inherited
                    243: from it.
                    244: <P>Like <B>mb_alloc()</B>, <B>mb_realloc()</B> also returns a pointer to the memory
                    245: chunk, not to the resource, hence you have to free it using
                    246: <B>mb_free()</B>, not <B>rfree()</B>.
                    247: 
                    248: 
                    249: <HR><H3>Function</H3>
                    250: <P><I>void</I>
                    251: <B>mb_free</B>
                    252: (<I>void *</I> <B>m</B>) --     free a memory block
                    253: <P>
                    254: <H3>Arguments</H3>
                    255: <P>
                    256: <DL>
                    257: <DT><I>void *</I> <B>m</B><DD><P>memory block
                    258: </DL>
                    259: <H3>Description</H3>
                    260: <P><B>mb_free()</B> frees all memory associated with the block <B>m</B>.
                    261: 
                    262: <H2><A NAME="ss8.4">8.4</A> <A HREF="prog.html#toc8.4">Linear memory pools</A>
                    263: </H2>
                    264: 
                    265: <P>
                    266: <P>Linear memory pools are collections of memory blocks which
                    267: support very fast allocation of new blocks, but are able to free only
                    268: the whole collection at once.
                    269: <P>Example: Each configuration is described by a complex system of structures,
                    270: linked lists and function trees which are all allocated from a single linear
                    271: pool, thus they can be freed at once when the configuration is no longer used.
                    272: <P>
                    273: <P><HR><H3>Function</H3>
                    274: <P><I>linpool *</I>
                    275: <B>lp_new</B>
                    276: (<I>pool *</I> <B>p</B>, <I>uint</I> <B>blk</B>) --     create a new linear memory pool
                    277: <P>
                    278: <H3>Arguments</H3>
                    279: <P>
                    280: <DL>
                    281: <DT><I>pool *</I> <B>p</B><DD><P>pool
                    282: <DT><I>uint</I> <B>blk</B><DD><P>block size
                    283: </DL>
                    284: <H3>Description</H3>
                    285: <P><B>lp_new()</B> creates a new linear memory pool resource inside the pool <B>p</B>.
                    286: The linear pool consists of a list of memory chunks of size at least
                    287: <B>blk</B>.
                    288: 
                    289: 
                    290: <HR><H3>Function</H3>
                    291: <P><I>void *</I>
                    292: <B>lp_alloc</B>
                    293: (<I>linpool *</I> <B>m</B>, <I>uint</I> <B>size</B>) --     allocate memory from a <I>linpool</I>
                    294: <P>
                    295: <H3>Arguments</H3>
                    296: <P>
                    297: <DL>
                    298: <DT><I>linpool *</I> <B>m</B><DD><P>linear memory pool
                    299: <DT><I>uint</I> <B>size</B><DD><P>amount of memory
                    300: </DL>
                    301: <H3>Description</H3>
                    302: <P><B>lp_alloc()</B> allocates <B>size</B> bytes of memory from a <I>linpool</I> <B>m</B>
                    303: and it returns a pointer to the allocated memory.
                    304: <P>It works by trying to find free space in the last memory chunk
                    305: associated with the <I>linpool</I> and creating a new chunk of the standard
                    306: size (as specified during <B>lp_new()</B>) if the free space is too small
                    307: to satisfy the allocation. If <B>size</B> is too large to fit in a standard
                    308: size chunk, an "overflow" chunk is created for it instead.
                    309: 
                    310: 
                    311: <HR><H3>Function</H3>
                    312: <P><I>void *</I>
                    313: <B>lp_allocu</B>
                    314: (<I>linpool *</I> <B>m</B>, <I>uint</I> <B>size</B>) --     allocate unaligned memory from a <I>linpool</I>
                    315: <P>
                    316: <H3>Arguments</H3>
                    317: <P>
                    318: <DL>
                    319: <DT><I>linpool *</I> <B>m</B><DD><P>linear memory pool
                    320: <DT><I>uint</I> <B>size</B><DD><P>amount of memory
                    321: </DL>
                    322: <H3>Description</H3>
                    323: <P><B>lp_allocu()</B> allocates <B>size</B> bytes of memory from a <I>linpool</I> <B>m</B>
                    324: and it returns a pointer to the allocated memory. It doesn't
                    325: attempt to align the memory block, giving a very efficient way
                    326: how to allocate strings without any space overhead.
                    327: 
                    328: 
                    329: <HR><H3>Function</H3>
                    330: <P><I>void *</I>
                    331: <B>lp_allocz</B>
                    332: (<I>linpool *</I> <B>m</B>, <I>uint</I> <B>size</B>) --     allocate cleared memory from a <I>linpool</I>
                    333: <P>
                    334: <H3>Arguments</H3>
                    335: <P>
                    336: <DL>
                    337: <DT><I>linpool *</I> <B>m</B><DD><P>linear memory pool
                    338: <DT><I>uint</I> <B>size</B><DD><P>amount of memory
                    339: </DL>
                    340: <H3>Description</H3>
                    341: <P>This function is identical to <B>lp_alloc()</B> except that it
                    342: clears the allocated memory block.
                    343: 
                    344: 
                    345: <HR><H3>Function</H3>
                    346: <P><I>void</I>
                    347: <B>lp_flush</B>
                    348: (<I>linpool *</I> <B>m</B>) --     flush a linear memory pool
                    349: <P>
                    350: <H3>Arguments</H3>
                    351: <P>
                    352: <DL>
                    353: <DT><I>linpool *</I> <B>m</B><DD><P>linear memory pool
                    354: </DL>
                    355: <H3>Description</H3>
                    356: <P>This function frees the whole contents of the given <I>linpool</I> <B>m</B>,
                    357: but leaves the pool itself.
                    358: 
                    359: <H2><A NAME="ss8.5">8.5</A> <A HREF="prog.html#toc8.5">Slabs</A>
                    360: </H2>
                    361: 
                    362: <P>
                    363: <P>Slabs are collections of memory blocks of a fixed size.
                    364: They support very fast allocation and freeing of such blocks, prevent memory
                    365: fragmentation and optimize L2 cache usage. Slabs have been invented by Jeff Bonwick
                    366: and published in USENIX proceedings as `The Slab Allocator: An Object-Caching Kernel
                    367: Memory Allocator'. Our implementation follows this article except that we don't use
                    368: constructors and destructors.
                    369: <P>When the <CODE>DEBUGGING</CODE> switch is turned on, we automatically fill all
                    370: newly allocated and freed blocks with a special pattern to make detection
                    371: of use of uninitialized or already freed memory easier.
                    372: <P>Example: Nodes of a FIB are allocated from a per-FIB Slab.
                    373: <P>
                    374: <P><HR><H3>Function</H3>
                    375: <P><I>slab *</I>
                    376: <B>sl_new</B>
                    377: (<I>pool *</I> <B>p</B>, <I>uint</I> <B>size</B>) --     create a new Slab
                    378: <P>
                    379: <H3>Arguments</H3>
                    380: <P>
                    381: <DL>
                    382: <DT><I>pool *</I> <B>p</B><DD><P>resource pool
                    383: <DT><I>uint</I> <B>size</B><DD><P>block size
                    384: </DL>
                    385: <H3>Description</H3>
                    386: <P>This function creates a new Slab resource from which
                    387: objects of size <B>size</B> can be allocated.
                    388: 
                    389: 
                    390: <HR><H3>Function</H3>
                    391: <P><I>void *</I>
                    392: <B>sl_alloc</B>
                    393: (<I>slab *</I> <B>s</B>) --     allocate an object from Slab
                    394: <P>
                    395: <H3>Arguments</H3>
                    396: <P>
                    397: <DL>
                    398: <DT><I>slab *</I> <B>s</B><DD><P>slab
                    399: </DL>
                    400: <H3>Description</H3>
                    401: <P><B>sl_alloc()</B> allocates space for a single object from the
                    402: Slab and returns a pointer to the object.
                    403: 
                    404: 
                    405: <HR><H3>Function</H3>
                    406: <P><I>void</I>
                    407: <B>sl_free</B>
                    408: (<I>slab *</I> <B>s</B>, <I>void *</I> <B>oo</B>) --     return a free object back to a Slab
                    409: <P>
                    410: <H3>Arguments</H3>
                    411: <P>
                    412: <DL>
                    413: <DT><I>slab *</I> <B>s</B><DD><P>slab
                    414: <DT><I>void *</I> <B>oo</B><DD><P>object returned by <B>sl_alloc()</B>
                    415: </DL>
                    416: <H3>Description</H3>
                    417: <P>This function frees memory associated with the object <B>oo</B>
                    418: and returns it back to the Slab <B>s</B>.
                    419: 
                    420: <H2><A NAME="ss8.6">8.6</A> <A HREF="prog.html#toc8.6">Events</A>
                    421: </H2>
                    422: 
                    423: <P>
                    424: <P>Events are there to keep track of deferred execution.
                    425: Since BIRD is single-threaded, it requires long lasting tasks to be split to smaller
                    426: parts, so that no module can monopolize the CPU. To split such a task, just create
                    427: an <I>event</I> resource, point it to the function you want to have called and call <B>ev_schedule()</B>
                    428: to ask the core to run the event when nothing more important requires attention.
                    429: <P>You can also define your own event lists (the <I>event_list</I> structure), enqueue your
                    430: events in them and explicitly ask to run them.
                    431: <P>
                    432: <P><HR><H3>Function</H3>
                    433: <P><I>event *</I>
                    434: <B>ev_new</B>
                    435: (<I>pool *</I> <B>p</B>) --     create a new event
                    436: <P>
                    437: <H3>Arguments</H3>
                    438: <P>
                    439: <DL>
                    440: <DT><I>pool *</I> <B>p</B><DD><P>resource pool
                    441: </DL>
                    442: <H3>Description</H3>
                    443: <P>This function creates a new event resource. To use it,
                    444: you need to fill the structure fields and call <B>ev_schedule()</B>.
                    445: 
                    446: 
                    447: <HR><H3>Function</H3>
                    448: <P><I>void</I>
                    449: <B>ev_run</B>
                    450: (<I>event *</I> <B>e</B>) --     run an event
                    451: <P>
                    452: <H3>Arguments</H3>
                    453: <P>
                    454: <DL>
                    455: <DT><I>event *</I> <B>e</B><DD><P>an event
                    456: </DL>
                    457: <H3>Description</H3>
                    458: <P>This function explicitly runs the event <B>e</B> (calls its hook
                    459: function) and removes it from an event list if it's linked to any.
                    460: <P>From the hook function, you can call <B>ev_enqueue()</B> or <B>ev_schedule()</B>
                    461: to re-add the event.
                    462: 
                    463: 
                    464: <HR><H3>Function</H3>
                    465: <P><I>void</I>
                    466: <B>ev_enqueue</B>
                    467: (<I>event_list *</I> <B>l</B>, <I>event *</I> <B>e</B>) --     enqueue an event
                    468: <P>
                    469: <H3>Arguments</H3>
                    470: <P>
                    471: <DL>
                    472: <DT><I>event_list *</I> <B>l</B><DD><P>an event list
                    473: <DT><I>event *</I> <B>e</B><DD><P>an event
                    474: </DL>
                    475: <H3>Description</H3>
                    476: <P><B>ev_enqueue()</B> stores the event <B>e</B> to the specified event
                    477: list <B>l</B> which can be run by calling <B>ev_run_list()</B>.
                    478: 
                    479: 
                    480: <HR><H3>Function</H3>
                    481: <P><I>void</I>
                    482: <B>ev_schedule</B>
                    483: (<I>event *</I> <B>e</B>) --     schedule an event
                    484: <P>
                    485: <H3>Arguments</H3>
                    486: <P>
                    487: <DL>
                    488: <DT><I>event *</I> <B>e</B><DD><P>an event
                    489: </DL>
                    490: <H3>Description</H3>
                    491: <P>This function schedules an event by enqueueing it to a system-wide
                    492: event list which is run by the platform dependent code whenever
                    493: appropriate.
                    494: 
                    495: 
                    496: <HR><H3>Function</H3>
                    497: <P><I>int</I>
                    498: <B>ev_run_list</B>
                    499: (<I>event_list *</I> <B>l</B>) --     run an event list
                    500: <P>
                    501: <H3>Arguments</H3>
                    502: <P>
                    503: <DL>
                    504: <DT><I>event_list *</I> <B>l</B><DD><P>an event list
                    505: </DL>
                    506: <H3>Description</H3>
                    507: <P>This function calls <B>ev_run()</B> for all events enqueued in the list <B>l</B>.
                    508: 
                    509: <H2><A NAME="ss8.7">8.7</A> <A HREF="prog.html#toc8.7">Timers</A>
                    510: </H2>
                    511: 
                    512: <P>
                    513: <P>Timers are resources which represent a wish of a module to call
                    514: a function at the specified time. The platform dependent code
                    515: doesn't guarantee exact timing, only that a timer function
                    516: won't be called before the requested time.
                    517: <P>In BIRD, time is represented by values of the <I>bird_clock_t</I> type
                    518: which are integral numbers interpreted as a relative number of seconds since
                    519: some fixed time point in past. The current time can be read
                    520: from variable <B>now</B> with reasonable accuracy and is monotonic. There is also
                    521: a current 'absolute' time in variable <B>now_real</B> reported by OS.
                    522: <P>Each timer is described by a <I>timer</I> structure containing a pointer
                    523: to the handler function (<B>hook</B>), data private to this function (<B>data</B>),
                    524: time the function should be called at (<B>expires</B>, 0 for inactive timers),
                    525: for the other fields see <CODE>timer.h</CODE>.
                    526: <P>
                    527: <P><HR><H3>Function</H3>
                    528: <P><I>timer *</I>
                    529: <B>tm_new</B>
                    530: (<I>pool *</I> <B>p</B>) --     create a timer
                    531: <P>
                    532: <H3>Arguments</H3>
                    533: <P>
                    534: <DL>
                    535: <DT><I>pool *</I> <B>p</B><DD><P>pool
                    536: </DL>
                    537: <H3>Description</H3>
                    538: <P>This function creates a new timer resource and returns
                    539: a pointer to it. To use the timer, you need to fill in
                    540: the structure fields and call <B>tm_start()</B> to start timing.
                    541: 
                    542: 
                    543: <HR><H3>Function</H3>
                    544: <P><I>void</I>
                    545: <B>tm_start</B>
                    546: (<I>timer *</I> <B>t</B>, <I>unsigned</I> <B>after</B>) --     start a timer
                    547: <P>
                    548: <H3>Arguments</H3>
                    549: <P>
                    550: <DL>
                    551: <DT><I>timer *</I> <B>t</B><DD><P>timer
                    552: <DT><I>unsigned</I> <B>after</B><DD><P>number of seconds the timer should be run after
                    553: </DL>
                    554: <H3>Description</H3>
                    555: <P>This function schedules the hook function of the timer to
                    556: be called after <B>after</B> seconds. If the timer has been already
                    557: started, it's <B>expire</B> time is replaced by the new value.
                    558: <P>You can have set the <B>randomize</B> field of <B>t</B>, the timeout
                    559: will be increased by a random number of seconds chosen
                    560: uniformly from range 0 .. <B>randomize</B>.
                    561: <P>You can call <B>tm_start()</B> from the handler function of the timer
                    562: to request another run of the timer. Also, you can set the <B>recurrent</B>
                    563: field to have the timer re-added automatically with the same timeout.
                    564: 
                    565: 
                    566: <HR><H3>Function</H3>
                    567: <P><I>void</I>
                    568: <B>tm_stop</B>
                    569: (<I>timer *</I> <B>t</B>) --     stop a timer
                    570: <P>
                    571: <H3>Arguments</H3>
                    572: <P>
                    573: <DL>
                    574: <DT><I>timer *</I> <B>t</B><DD><P>timer
                    575: </DL>
                    576: <H3>Description</H3>
                    577: <P>This function stops a timer. If the timer is already stopped,
                    578: nothing happens.
                    579: 
                    580: 
                    581: <HR><H3>Function</H3>
                    582: <P><I>bird_clock_t</I>
                    583: <B>tm_parse_datetime</B>
                    584: (<I>char *</I> <B>x</B>) --     parse a date and time
                    585: <P>
                    586: <H3>Arguments</H3>
                    587: <P>
                    588: <DL>
                    589: <DT><I>char *</I> <B>x</B><DD><P>datetime string
                    590: </DL>
                    591: <H3>Description</H3>
                    592: <P><B>tm_parse_datetime()</B> takes a textual representation of
                    593: a date and time (dd-mm-yyyy hh:mm:ss)
                    594: and converts it to the corresponding value of type <I>bird_clock_t</I>.
                    595: 
                    596: 
                    597: <HR><H3>Function</H3>
                    598: <P><I>bird_clock_t</I>
                    599: <B>tm_parse_date</B>
                    600: (<I>char *</I> <B>x</B>) --     parse a date
                    601: <P>
                    602: <H3>Arguments</H3>
                    603: <P>
                    604: <DL>
                    605: <DT><I>char *</I> <B>x</B><DD><P>date string
                    606: </DL>
                    607: <H3>Description</H3>
                    608: <P><B>tm_parse_date()</B> takes a textual representation of a date (dd-mm-yyyy)
                    609: and converts it to the corresponding value of type <I>bird_clock_t</I>.
                    610: 
                    611: 
                    612: <HR><H3>Function</H3>
                    613: <P><I>void</I>
                    614: <B>tm_format_datetime</B>
                    615: (<I>char *</I> <B>x</B>, <I>struct timeformat *</I> <B>fmt_spec</B>, <I>bird_clock_t</I> <B>t</B>) --     convert date and time to textual representation
                    616: <P>
                    617: <H3>Arguments</H3>
                    618: <P>
                    619: <DL>
                    620: <DT><I>char *</I> <B>x</B><DD><P>destination buffer of size <I>TM_DATETIME_BUFFER_SIZE</I>
                    621: <DT><I>struct timeformat *</I> <B>fmt_spec</B><DD><P>specification of resulting textual representation of the time
                    622: <DT><I>bird_clock_t</I> <B>t</B><DD><P>time
                    623: </DL>
                    624: <H3>Description</H3>
                    625: <P>This function formats the given relative time value <B>t</B> to a textual
                    626: date/time representation (dd-mm-yyyy hh:mm:ss) in real time.
                    627: 
                    628: <H2><A NAME="ss8.8">8.8</A> <A HREF="prog.html#toc8.8">Sockets</A>
                    629: </H2>
                    630: 
                    631: <P>
                    632: <P>Socket resources represent network connections. Their data structure (<I>socket</I>)
                    633: contains a lot of fields defining the exact type of the socket, the local and
                    634: remote addresses and ports, pointers to socket buffers and finally pointers to
                    635: hook functions to be called when new data have arrived to the receive buffer
                    636: (<B>rx_hook</B>), when the contents of the transmit buffer have been transmitted
                    637: (<B>tx_hook</B>) and when an error or connection close occurs (<B>err_hook</B>).
                    638: <P>Freeing of sockets from inside socket hooks is perfectly safe.
                    639: <P>
                    640: <P><HR><H3>Function</H3>
                    641: <P><I>int</I>
                    642: <B>sk_setup_multicast</B>
                    643: (<I>sock *</I> <B>s</B>) --     enable multicast for given socket
                    644: <P>
                    645: <H3>Arguments</H3>
                    646: <P>
                    647: <DL>
                    648: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    649: </DL>
                    650: <H3>Description</H3>
                    651: <P>Prepare transmission of multicast packets for given datagram socket.
                    652: The socket must have defined <B>iface</B>.
                    653: <H3>Result</H3>
                    654: <P>0 for success, -1 for an error.
                    655: 
                    656: 
                    657: <HR><H3>Function</H3>
                    658: <P><I>int</I>
                    659: <B>sk_join_group</B>
                    660: (<I>sock *</I> <B>s</B>, <I>ip_addr</I> <B>maddr</B>) --     join multicast group for given socket
                    661: <P>
                    662: <H3>Arguments</H3>
                    663: <P>
                    664: <DL>
                    665: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    666: <DT><I>ip_addr</I> <B>maddr</B><DD><P>multicast address
                    667: </DL>
                    668: <H3>Description</H3>
                    669: <P>Join multicast group for given datagram socket and associated interface.
                    670: The socket must have defined <B>iface</B>.
                    671: <H3>Result</H3>
                    672: <P>0 for success, -1 for an error.
                    673: 
                    674: 
                    675: <HR><H3>Function</H3>
                    676: <P><I>int</I>
                    677: <B>sk_leave_group</B>
                    678: (<I>sock *</I> <B>s</B>, <I>ip_addr</I> <B>maddr</B>) --     leave multicast group for given socket
                    679: <P>
                    680: <H3>Arguments</H3>
                    681: <P>
                    682: <DL>
                    683: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    684: <DT><I>ip_addr</I> <B>maddr</B><DD><P>multicast address
                    685: </DL>
                    686: <H3>Description</H3>
                    687: <P>Leave multicast group for given datagram socket and associated interface.
                    688: The socket must have defined <B>iface</B>.
                    689: <H3>Result</H3>
                    690: <P>0 for success, -1 for an error.
                    691: 
                    692: 
                    693: <HR><H3>Function</H3>
                    694: <P><I>int</I>
                    695: <B>sk_setup_broadcast</B>
                    696: (<I>sock *</I> <B>s</B>) --     enable broadcast for given socket
                    697: <P>
                    698: <H3>Arguments</H3>
                    699: <P>
                    700: <DL>
                    701: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    702: </DL>
                    703: <H3>Description</H3>
                    704: <P>Allow reception and transmission of broadcast packets for given datagram
                    705: socket. The socket must have defined <B>iface</B>. For transmission, packets should
                    706: be send to <B>brd</B> address of <B>iface</B>.
                    707: <H3>Result</H3>
                    708: <P>0 for success, -1 for an error.
                    709: 
                    710: 
                    711: <HR><H3>Function</H3>
                    712: <P><I>int</I>
                    713: <B>sk_set_ttl</B>
                    714: (<I>sock *</I> <B>s</B>, <I>int</I> <B>ttl</B>) --     set transmit TTL for given socket
                    715: <P>
                    716: <H3>Arguments</H3>
                    717: <P>
                    718: <DL>
                    719: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    720: <DT><I>int</I> <B>ttl</B><DD><P>TTL value
                    721: </DL>
                    722: <H3>Description</H3>
                    723: <P>Set TTL for already opened connections when TTL was not set before. Useful
                    724: for accepted connections when different ones should have different TTL.
                    725: <H3>Result</H3>
                    726: <P>0 for success, -1 for an error.
                    727: 
                    728: 
                    729: <HR><H3>Function</H3>
                    730: <P><I>int</I>
                    731: <B>sk_set_min_ttl</B>
                    732: (<I>sock *</I> <B>s</B>, <I>int</I> <B>ttl</B>) --     set minimal accepted TTL for given socket
                    733: <P>
                    734: <H3>Arguments</H3>
                    735: <P>
                    736: <DL>
                    737: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    738: <DT><I>int</I> <B>ttl</B><DD><P>TTL value
                    739: </DL>
                    740: <H3>Description</H3>
                    741: <P>Set minimal accepted TTL for given socket. Can be used for TTL security.
                    742: implementations.
                    743: <H3>Result</H3>
                    744: <P>0 for success, -1 for an error.
                    745: 
                    746: 
                    747: <HR><H3>Function</H3>
                    748: <P><I>int</I>
                    749: <B>sk_set_md5_auth</B>
                    750: (<I>sock *</I> <B>s</B>, <I>ip_addr</I> <B>local</B>, <I>ip_addr</I> <B>remote</B>, <I>struct iface *</I> <B>ifa</B>, <I>char *</I> <B>passwd</B>, <I>int</I> <B>setkey</B>) --     add / remove MD5 security association for given socket
                    751: <P>
                    752: <H3>Arguments</H3>
                    753: <P>
                    754: <DL>
                    755: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    756: <DT><I>ip_addr</I> <B>local</B><DD><P>IP address of local side
                    757: <DT><I>ip_addr</I> <B>remote</B><DD><P>IP address of remote side
                    758: <DT><I>struct iface *</I> <B>ifa</B><DD><P>Interface for link-local IP address
                    759: <DT><I>char *</I> <B>passwd</B><DD><P>Password used for MD5 authentication
                    760: <DT><I>int</I> <B>setkey</B><DD><P>Update also system SA/SP database
                    761: </DL>
                    762: <H3>Description</H3>
                    763: <P>In TCP MD5 handling code in kernel, there is a set of security associations
                    764: used for choosing password and other authentication parameters according to
                    765: the local and remote address. This function is useful for listening socket,
                    766: for active sockets it may be enough to set s-&gt;password field.
                    767: <P>When called with passwd != NULL, the new pair is added,
                    768: When called with passwd == NULL, the existing pair is removed.
                    769: <P>Note that while in Linux, the MD5 SAs are specific to socket, in BSD they are
                    770: stored in global SA/SP database (but the behavior also must be enabled on
                    771: per-socket basis). In case of multiple sockets to the same neighbor, the
                    772: socket-specific state must be configured for each socket while global state
                    773: just once per src-dst pair. The <B>setkey</B> argument controls whether the global
                    774: state (SA/SP database) is also updated.
                    775: <H3>Result</H3>
                    776: <P>0 for success, -1 for an error.
                    777: 
                    778: 
                    779: <HR><H3>Function</H3>
                    780: <P><I>int</I>
                    781: <B>sk_set_ipv6_checksum</B>
                    782: (<I>sock *</I> <B>s</B>, <I>int</I> <B>offset</B>) --     specify IPv6 checksum offset for given socket
                    783: <P>
                    784: <H3>Arguments</H3>
                    785: <P>
                    786: <DL>
                    787: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    788: <DT><I>int</I> <B>offset</B><DD><P>offset
                    789: </DL>
                    790: <H3>Description</H3>
                    791: <P>Specify IPv6 checksum field offset for given raw IPv6 socket. After that, the
                    792: kernel will automatically fill it for outgoing packets and check it for
                    793: incoming packets. Should not be used on ICMPv6 sockets, where the position is
                    794: known to the kernel.
                    795: <H3>Result</H3>
                    796: <P>0 for success, -1 for an error.
                    797: 
                    798: 
                    799: <HR><H3>Function</H3>
                    800: <P><I>sock *</I>
                    801: <B>sock_new</B>
                    802: (<I>pool *</I> <B>p</B>) --     create a socket
                    803: <P>
                    804: <H3>Arguments</H3>
                    805: <P>
                    806: <DL>
                    807: <DT><I>pool *</I> <B>p</B><DD><P>pool
                    808: </DL>
                    809: <H3>Description</H3>
                    810: <P>This function creates a new socket resource. If you want to use it,
                    811: you need to fill in all the required fields of the structure and
                    812: call <B>sk_open()</B> to do the actual opening of the socket.
                    813: <P>The real function name is <B>sock_new()</B>, <B>sk_new()</B> is a macro wrapper
                    814: to avoid collision with OpenSSL.
                    815: 
                    816: 
                    817: <HR><H3>Function</H3>
                    818: <P><I>int</I>
                    819: <B>sk_open</B>
                    820: (<I>sock *</I> <B>s</B>) --     open a socket
                    821: <P>
                    822: <H3>Arguments</H3>
                    823: <P>
                    824: <DL>
                    825: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    826: </DL>
                    827: <H3>Description</H3>
                    828: <P>This function takes a socket resource created by <B>sk_new()</B> and
                    829: initialized by the user and binds a corresponding network connection
                    830: to it.
                    831: <H3>Result</H3>
                    832: <P>0 for success, -1 for an error.
                    833: 
                    834: 
                    835: <HR><H3>Function</H3>
                    836: <P><I>int</I>
                    837: <B>sk_send</B>
                    838: (<I>sock *</I> <B>s</B>, <I>unsigned</I> <B>len</B>) --     send data to a socket
                    839: <P>
                    840: <H3>Arguments</H3>
                    841: <P>
                    842: <DL>
                    843: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    844: <DT><I>unsigned</I> <B>len</B><DD><P>number of bytes to send
                    845: </DL>
                    846: <H3>Description</H3>
                    847: <P>This function sends <B>len</B> bytes of data prepared in the
                    848: transmit buffer of the socket <B>s</B> to the network connection.
                    849: If the packet can be sent immediately, it does so and returns
                    850: 1, else it queues the packet for later processing, returns 0
                    851: and calls the <B>tx_hook</B> of the socket when the tranmission
                    852: takes place.
                    853: 
                    854: 
                    855: <HR><H3>Function</H3>
                    856: <P><I>int</I>
                    857: <B>sk_send_to</B>
                    858: (<I>sock *</I> <B>s</B>, <I>unsigned</I> <B>len</B>, <I>ip_addr</I> <B>addr</B>, <I>unsigned</I> <B>port</B>) --     send data to a specific destination
                    859: <P>
                    860: <H3>Arguments</H3>
                    861: <P>
                    862: <DL>
                    863: <DT><I>sock *</I> <B>s</B><DD><P>socket
                    864: <DT><I>unsigned</I> <B>len</B><DD><P>number of bytes to send
                    865: <DT><I>ip_addr</I> <B>addr</B><DD><P>IP address to send the packet to
                    866: <DT><I>unsigned</I> <B>port</B><DD><P>port to send the packet to
                    867: </DL>
                    868: <H3>Description</H3>
                    869: <P>This is a <B>sk_send()</B> replacement for connection-less packet sockets
                    870: which allows destination of the packet to be chosen dynamically.
                    871: Raw IP sockets should use 0 for <B>port</B>.
                    872: 
                    873: 
                    874: <HR><H3>Function</H3>
                    875: <P><I>void</I>
                    876: <B>io_log_event</B>
                    877: (<I>void *</I> <B>hook</B>, <I>void *</I> <B>data</B>) --     mark approaching event into event log
                    878: <P>
                    879: <H3>Arguments</H3>
                    880: <P>
                    881: <DL>
                    882: <DT><I>void *</I> <B>hook</B><DD><P>event hook address
                    883: <DT><I>void *</I> <B>data</B><DD><P>event data address
                    884: </DL>
                    885: <H3>Description</H3>
                    886: <P>Store info (hook, data, timestamp) about the following internal event into
                    887: a circular event log (<B>event_log</B>). When latency tracking is enabled, the log
                    888: entry is kept open (in <B>event_open</B>) so the duration can be filled later.
                    889: 
                    890: <P>
                    891: <HR>
                    892: Next
                    893: <A HREF="prog-7.html">Previous</A>
                    894: <A HREF="prog.html#toc8">Contents</A>
                    895: </BODY>
                    896: </HTML>

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