Annotation of embedaddon/bird/doc/prog-8.html, revision 1.1
1.1 ! misho 1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
! 2: <HTML>
! 3: <HEAD>
! 4: <META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 1.0.9">
! 5: <TITLE>BIRD Programmer's Documentation: 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->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>