Annotation of embedaddon/bird/doc/prog-7.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: Library functions</TITLE>
                      6:  <LINK HREF="prog-8.html" REL=next>
                      7:  <LINK HREF="prog-6.html" REL=previous>
                      8:  <LINK HREF="prog.html#toc7" REL=contents>
                      9: </HEAD>
                     10: <BODY>
                     11: <A HREF="prog-8.html">Next</A>
                     12: <A HREF="prog-6.html">Previous</A>
                     13: <A HREF="prog.html#toc7">Contents</A>
                     14: <HR>
                     15: <H2><A NAME="s7">7.</A> <A HREF="prog.html#toc7">Library functions</A></H2>
                     16: 
                     17: <H2><A NAME="ss7.1">7.1</A> <A HREF="prog.html#toc7.1">IP addresses</A>
                     18: </H2>
                     19: 
                     20: <P>
                     21: <P>BIRD uses its own abstraction of IP address in order to share the same
                     22: code for both IPv4 and IPv6. IP addresses are represented as entities
                     23: of type <I>ip_addr</I> which are never to be treated as numbers and instead
                     24: they must be manipulated using the following functions and macros.
                     25: <P>
                     26: <P><HR><H3>Function</H3>
                     27: <P><I>char *</I>
                     28: <B>ip_scope_text</B>
                     29: (<I>uint</I> <B>scope</B>) --     get textual representation of address scope
                     30: <P>
                     31: <H3>Arguments</H3>
                     32: <P>
                     33: <DL>
                     34: <DT><I>uint</I> <B>scope</B><DD><P>scope (<I>SCOPE_xxx</I>)
                     35: </DL>
                     36: <H3>Description</H3>
                     37: <P>Returns a pointer to a textual name of the scope given.
                     38: 
                     39: 
                     40: <HR><H3>Function</H3>
                     41: <P><I>int</I>
                     42: <B>ipa_equal</B>
                     43: (<I>ip_addr</I> <B>x</B>, <I>ip_addr</I> <B>y</B>) --     compare two IP addresses for equality
                     44: <P>
                     45: <H3>Arguments</H3>
                     46: <P>
                     47: <DL>
                     48: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                     49: <DT><I>ip_addr</I> <B>y</B><DD><P>IP address
                     50: </DL>
                     51: <H3>Description</H3>
                     52: <P><B>ipa_equal()</B> returns 1 if <B>x</B> and <B>y</B> represent the same IP address, else 0.
                     53: 
                     54: 
                     55: <HR><H3>Function</H3>
                     56: <P><I>int</I>
                     57: <B>ipa_nonzero</B>
                     58: (<I>ip_addr</I> <B>x</B>) --     test if an IP address is defined
                     59: <P>
                     60: <H3>Arguments</H3>
                     61: <P>
                     62: <DL>
                     63: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                     64: </DL>
                     65: <H3>Description</H3>
                     66: <P>ipa_nonzero returns 1 if <B>x</B> is a defined IP address (not all bits are zero),
                     67: else 0.
                     68: <P>The undefined all-zero address is reachable as a <CODE>IPA_NONE</CODE> macro.
                     69: 
                     70: 
                     71: <HR><H3>Function</H3>
                     72: <P><I>ip_addr</I>
                     73: <B>ipa_and</B>
                     74: (<I>ip_addr</I> <B>x</B>, <I>ip_addr</I> <B>y</B>) --     compute bitwise and of two IP addresses
                     75: <P>
                     76: <H3>Arguments</H3>
                     77: <P>
                     78: <DL>
                     79: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                     80: <DT><I>ip_addr</I> <B>y</B><DD><P>IP address
                     81: </DL>
                     82: <H3>Description</H3>
                     83: <P>This function returns a bitwise and of <B>x</B> and <B>y</B>. It's primarily
                     84: used for network masking.
                     85: 
                     86: 
                     87: <HR><H3>Function</H3>
                     88: <P><I>ip_addr</I>
                     89: <B>ipa_or</B>
                     90: (<I>ip_addr</I> <B>x</B>, <I>ip_addr</I> <B>y</B>) --     compute bitwise or of two IP addresses
                     91: <P>
                     92: <H3>Arguments</H3>
                     93: <P>
                     94: <DL>
                     95: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                     96: <DT><I>ip_addr</I> <B>y</B><DD><P>IP address
                     97: </DL>
                     98: <H3>Description</H3>
                     99: <P>This function returns a bitwise or of <B>x</B> and <B>y</B>.
                    100: 
                    101: 
                    102: <HR><H3>Function</H3>
                    103: <P><I>ip_addr</I>
                    104: <B>ipa_xor</B>
                    105: (<I>ip_addr</I> <B>x</B>, <I>ip_addr</I> <B>y</B>) --     compute bitwise xor of two IP addresses
                    106: <P>
                    107: <H3>Arguments</H3>
                    108: <P>
                    109: <DL>
                    110: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                    111: <DT><I>ip_addr</I> <B>y</B><DD><P>IP address
                    112: </DL>
                    113: <H3>Description</H3>
                    114: <P>This function returns a bitwise xor of <B>x</B> and <B>y</B>.
                    115: 
                    116: 
                    117: <HR><H3>Function</H3>
                    118: <P><I>ip_addr</I>
                    119: <B>ipa_not</B>
                    120: (<I>ip_addr</I> <B>x</B>) --     compute bitwise negation of two IP addresses
                    121: <P>
                    122: <H3>Arguments</H3>
                    123: <P>
                    124: <DL>
                    125: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                    126: </DL>
                    127: <H3>Description</H3>
                    128: <P>This function returns a bitwise negation of <B>x</B>.
                    129: 
                    130: 
                    131: <HR><H3>Function</H3>
                    132: <P><I>ip_addr</I>
                    133: <B>ipa_mkmask</B>
                    134: (<I>int</I> <B>x</B>) --     create a netmask
                    135: <P>
                    136: <H3>Arguments</H3>
                    137: <P>
                    138: <DL>
                    139: <DT><I>int</I> <B>x</B><DD><P>prefix length
                    140: </DL>
                    141: <H3>Description</H3>
                    142: <P>This function returns an <I>ip_addr</I> corresponding of a netmask
                    143: of an address prefix of size <B>x</B>.
                    144: 
                    145: 
                    146: <HR><H3>Function</H3>
                    147: <P><I>int</I>
                    148: <B>ipa_masklen</B>
                    149: (<I>ip_addr</I> <B>x</B>) --     calculate netmask length
                    150: <P>
                    151: <H3>Arguments</H3>
                    152: <P>
                    153: <DL>
                    154: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                    155: </DL>
                    156: <H3>Description</H3>
                    157: <P>This function checks whether <B>x</B> represents a valid netmask and
                    158: returns the size of the associate network prefix or -1 for invalid
                    159: mask.
                    160: 
                    161: 
                    162: <HR><H3>Function</H3>
                    163: <P><I>int</I>
                    164: <B>ipa_hash</B>
                    165: (<I>ip_addr</I> <B>x</B>) --     hash IP addresses
                    166: <P>
                    167: <H3>Arguments</H3>
                    168: <P>
                    169: <DL>
                    170: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                    171: </DL>
                    172: <H3>Description</H3>
                    173: <P><B>ipa_hash()</B> returns a 16-bit hash value of the IP address <B>x</B>.
                    174: 
                    175: 
                    176: <HR><H3>Function</H3>
                    177: <P><I>void</I>
                    178: <B>ipa_hton</B>
                    179: (<I>ip_addr</I> <B>x</B>) --     convert IP address to network order
                    180: <P>
                    181: <H3>Arguments</H3>
                    182: <P>
                    183: <DL>
                    184: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                    185: </DL>
                    186: <H3>Description</H3>
                    187: <P>Converts the IP address <B>x</B> to the network byte order.
                    188: <P>Beware, this is a macro and it alters the argument!
                    189: 
                    190: 
                    191: <HR><H3>Function</H3>
                    192: <P><I>void</I>
                    193: <B>ipa_ntoh</B>
                    194: (<I>ip_addr</I> <B>x</B>) --     convert IP address to host order
                    195: <P>
                    196: <H3>Arguments</H3>
                    197: <P>
                    198: <DL>
                    199: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                    200: </DL>
                    201: <H3>Description</H3>
                    202: <P>Converts the IP address <B>x</B> from the network byte order.
                    203: <P>Beware, this is a macro and it alters the argument!
                    204: 
                    205: 
                    206: <HR><H3>Function</H3>
                    207: <P><I>int</I>
                    208: <B>ipa_classify</B>
                    209: (<I>ip_addr</I> <B>x</B>) --     classify an IP address
                    210: <P>
                    211: <H3>Arguments</H3>
                    212: <P>
                    213: <DL>
                    214: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                    215: </DL>
                    216: <H3>Description</H3>
                    217: <P><B>ipa_classify()</B> returns an address class of <B>x</B>, that is a bitwise or
                    218: of address type (<I>IADDR_INVALID</I>, <I>IADDR_HOST</I>, <I>IADDR_BROADCAST</I>, <I>IADDR_MULTICAST</I>)
                    219: with address scope (<I>SCOPE_HOST</I> to <I>SCOPE_UNIVERSE</I>) or -1 (<I>IADDR_INVALID</I>)
                    220: for an invalid address.
                    221: 
                    222: 
                    223: <HR><H3>Function</H3>
                    224: <P><I>ip4_addr</I>
                    225: <B>ip4_class_mask</B>
                    226: (<I>ip4_addr</I> <B>x</B>) --     guess netmask according to address class
                    227: <P>
                    228: <H3>Arguments</H3>
                    229: <P>
                    230: <DL>
                    231: <DT><I>ip4_addr</I> <B>x</B><DD><P>IPv4 address
                    232: </DL>
                    233: <H3>Description</H3>
                    234: <P>This function (available in IPv4 version only) returns a
                    235: network mask according to the address class of <B>x</B>. Although
                    236: classful addressing is nowadays obsolete, there still live
                    237: routing protocols transferring no prefix lengths nor netmasks
                    238: and this function could be useful to them.
                    239: 
                    240: 
                    241: <HR><H3>Function</H3>
                    242: <P><I>u32</I>
                    243: <B>ipa_from_u32</B>
                    244: (<I>ip_addr</I> <B>x</B>) --     convert IPv4 address to an integer
                    245: <P>
                    246: <H3>Arguments</H3>
                    247: <P>
                    248: <DL>
                    249: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                    250: </DL>
                    251: <H3>Description</H3>
                    252: <P>This function takes an IPv4 address and returns its numeric
                    253: representation.
                    254: 
                    255: 
                    256: <HR><H3>Function</H3>
                    257: <P><I>ip_addr</I>
                    258: <B>ipa_to_u32</B>
                    259: (<I>u32</I> <B>x</B>) --     convert integer to IPv4 address
                    260: <P>
                    261: <H3>Arguments</H3>
                    262: <P>
                    263: <DL>
                    264: <DT><I>u32</I> <B>x</B><DD><P>a 32-bit integer
                    265: </DL>
                    266: <H3>Description</H3>
                    267: <P><B>ipa_to_u32()</B> takes a numeric representation of an IPv4 address
                    268: and converts it to the corresponding <I>ip_addr</I>.
                    269: 
                    270: 
                    271: <HR><H3>Function</H3>
                    272: <P><I>int</I>
                    273: <B>ipa_compare</B>
                    274: (<I>ip_addr</I> <B>x</B>, <I>ip_addr</I> <B>y</B>) --     compare two IP addresses for order
                    275: <P>
                    276: <H3>Arguments</H3>
                    277: <P>
                    278: <DL>
                    279: <DT><I>ip_addr</I> <B>x</B><DD><P>IP address
                    280: <DT><I>ip_addr</I> <B>y</B><DD><P>IP address
                    281: </DL>
                    282: <H3>Description</H3>
                    283: <P>The <B>ipa_compare()</B> function takes two IP addresses and returns
                    284: -1 if <B>x</B> is less than <B>y</B> in canonical ordering (lexicographical
                    285: order of the bit strings), 1 if <B>x</B> is greater than <B>y</B> and 0
                    286: if they are the same.
                    287: 
                    288: 
                    289: <HR><H3>Function</H3>
                    290: <P><I>ip_addr</I>
                    291: <B>ipa_build6</B>
                    292: (<I>u32</I> <B>a1</B>, <I>u32</I> <B>a2</B>, <I>u32</I> <B>a3</B>, <I>u32</I> <B>a4</B>) --     build an IPv6 address from parts
                    293: <P>
                    294: <H3>Arguments</H3>
                    295: <P>
                    296: <DL>
                    297: <DT><I>u32</I> <B>a1</B><DD><P>part #1
                    298: <DT><I>u32</I> <B>a2</B><DD><P>part #2
                    299: <DT><I>u32</I> <B>a3</B><DD><P>part #3
                    300: <DT><I>u32</I> <B>a4</B><DD><P>part #4
                    301: </DL>
                    302: <H3>Description</H3>
                    303: <P><B>ipa_build()</B> takes <B>a1</B> to <B>a4</B> and assembles them to a single IPv6
                    304: address. It's used for example when a protocol wants to bind its
                    305: socket to a hard-wired multicast address.
                    306: 
                    307: 
                    308: <HR><H3>Function</H3>
                    309: <P><I>char *</I>
                    310: <B>ip_ntop</B>
                    311: (<I>ip_addr</I> <B>a</B>, <I>char *</I> <B>buf</B>) --     convert IP address to textual representation
                    312: <P>
                    313: <H3>Arguments</H3>
                    314: <P>
                    315: <DL>
                    316: <DT><I>ip_addr</I> <B>a</B><DD><P>IP address
                    317: <DT><I>char *</I> <B>buf</B><DD><P>buffer of size at least <I>STD_ADDRESS_P_LENGTH</I>
                    318: </DL>
                    319: <H3>Description</H3>
                    320: <P>This function takes an IP address and creates its textual
                    321: representation for presenting to the user.
                    322: 
                    323: 
                    324: <HR><H3>Function</H3>
                    325: <P><I>char *</I>
                    326: <B>ip_ntox</B>
                    327: (<I>ip_addr</I> <B>a</B>, <I>char *</I> <B>buf</B>) --     convert IP address to hexadecimal representation
                    328: <P>
                    329: <H3>Arguments</H3>
                    330: <P>
                    331: <DL>
                    332: <DT><I>ip_addr</I> <B>a</B><DD><P>IP address
                    333: <DT><I>char *</I> <B>buf</B><DD><P>buffer of size at least <I>STD_ADDRESS_P_LENGTH</I>
                    334: </DL>
                    335: <H3>Description</H3>
                    336: <P>This function takes an IP address and creates its hexadecimal
                    337: textual representation. Primary use: debugging dumps.
                    338: 
                    339: 
                    340: <HR><H3>Function</H3>
                    341: <P><I>int</I>
                    342: <B>ip_pton</B>
                    343: (<I>char *</I> <B>a</B>, <I>ip_addr *</I> <B>o</B>) --     parse textual representation of IP address
                    344: <P>
                    345: <H3>Arguments</H3>
                    346: <P>
                    347: <DL>
                    348: <DT><I>char *</I> <B>a</B><DD><P>textual representation
                    349: <DT><I>ip_addr *</I> <B>o</B><DD><P>where to put the resulting address
                    350: </DL>
                    351: <H3>Description</H3>
                    352: <P>This function parses a textual IP address representation and
                    353: stores the decoded address to a variable pointed to by <B>o</B>.
                    354: Returns 0 if a parse error has occurred, else 0.
                    355: 
                    356: <H2><A NAME="ss7.2">7.2</A> <A HREF="prog.html#toc7.2">Linked lists</A>
                    357: </H2>
                    358: 
                    359: <P>
                    360: <P>The BIRD library provides a set of functions for operating on linked
                    361: lists. The lists are internally represented as standard doubly linked
                    362: lists with synthetic head and tail which makes all the basic operations
                    363: run in constant time and contain no extra end-of-list checks. Each list
                    364: is described by a <I>list</I> structure, nodes can have any format as long
                    365: as they start with a <I>node</I> structure. If you want your nodes to belong
                    366: to multiple lists at once, you can embed multiple <I>node</I> structures in them
                    367: and use the <B>SKIP_BACK()</B> macro to calculate a pointer to the start of the
                    368: structure from a <I>node</I> pointer, but beware of obscurity.
                    369: <P>There also exist safe linked lists (<I>slist</I>, <I>snode</I> and all functions
                    370: being prefixed with <CODE>s_</CODE>) which support asynchronous walking very
                    371: similar to that used in the <I>fib</I> structure.
                    372: <P>
                    373: <P><HR><H3>Function</H3>
                    374: <P><I>LIST_INLINE void</I>
                    375: <B>add_tail</B>
                    376: (<I>list *</I> <B>l</B>, <I>node *</I> <B>n</B>) --     append a node to a list
                    377: <P>
                    378: <H3>Arguments</H3>
                    379: <P>
                    380: <DL>
                    381: <DT><I>list *</I> <B>l</B><DD><P>linked list
                    382: <DT><I>node *</I> <B>n</B><DD><P>list node
                    383: </DL>
                    384: <H3>Description</H3>
                    385: <P><B>add_tail()</B> takes a node <B>n</B> and appends it at the end of the list <B>l</B>.
                    386: 
                    387: 
                    388: <HR><H3>Function</H3>
                    389: <P><I>LIST_INLINE void</I>
                    390: <B>add_head</B>
                    391: (<I>list *</I> <B>l</B>, <I>node *</I> <B>n</B>) --     prepend a node to a list
                    392: <P>
                    393: <H3>Arguments</H3>
                    394: <P>
                    395: <DL>
                    396: <DT><I>list *</I> <B>l</B><DD><P>linked list
                    397: <DT><I>node *</I> <B>n</B><DD><P>list node
                    398: </DL>
                    399: <H3>Description</H3>
                    400: <P><B>add_head()</B> takes a node <B>n</B> and prepends it at the start of the list <B>l</B>.
                    401: 
                    402: 
                    403: <HR><H3>Function</H3>
                    404: <P><I>LIST_INLINE void</I>
                    405: <B>insert_node</B>
                    406: (<I>node *</I> <B>n</B>, <I>node *</I> <B>after</B>) --     insert a node to a list
                    407: <P>
                    408: <H3>Arguments</H3>
                    409: <P>
                    410: <DL>
                    411: <DT><I>node *</I> <B>n</B><DD><P>a new list node
                    412: <DT><I>node *</I> <B>after</B><DD><P>a node of a list
                    413: </DL>
                    414: <H3>Description</H3>
                    415: <P>Inserts a node <B>n</B> to a linked list after an already inserted
                    416: node <B>after</B>.
                    417: 
                    418: 
                    419: <HR><H3>Function</H3>
                    420: <P><I>LIST_INLINE void</I>
                    421: <B>rem_node</B>
                    422: (<I>node *</I> <B>n</B>) --     remove a node from a list
                    423: <P>
                    424: <H3>Arguments</H3>
                    425: <P>
                    426: <DL>
                    427: <DT><I>node *</I> <B>n</B><DD><P>node to be removed
                    428: </DL>
                    429: <H3>Description</H3>
                    430: <P>Removes a node <B>n</B> from the list it's linked in. Afterwards, node <B>n</B> is cleared.
                    431: 
                    432: 
                    433: <HR><H3>Function</H3>
                    434: <P><I>LIST_INLINE void</I>
                    435: <B>replace_node</B>
                    436: (<I>node *</I> <B>old</B>, <I>node *</I> <B>new</B>) --     replace a node in a list with another one
                    437: <P>
                    438: <H3>Arguments</H3>
                    439: <P>
                    440: <DL>
                    441: <DT><I>node *</I> <B>old</B><DD><P>node to be removed
                    442: <DT><I>node *</I> <B>new</B><DD><P>node to be inserted
                    443: </DL>
                    444: <H3>Description</H3>
                    445: <P>Replaces node <B>old</B> in the list it's linked in with node <B>new</B>.  Node
                    446: <B>old</B> may be a copy of the original node, which is not accessed
                    447: through the list. The function could be called with <B>old</B> == <B>new</B>,
                    448: which just fixes neighbors' pointers in the case that the node
                    449: was reallocated.
                    450: 
                    451: 
                    452: <HR><H3>Function</H3>
                    453: <P><I>LIST_INLINE void</I>
                    454: <B>init_list</B>
                    455: (<I>list *</I> <B>l</B>) --     create an empty list
                    456: <P>
                    457: <H3>Arguments</H3>
                    458: <P>
                    459: <DL>
                    460: <DT><I>list *</I> <B>l</B><DD><P>list
                    461: </DL>
                    462: <H3>Description</H3>
                    463: <P><B>init_list()</B> takes a <I>list</I> structure and initializes its
                    464: fields, so that it represents an empty list.
                    465: 
                    466: 
                    467: <HR><H3>Function</H3>
                    468: <P><I>LIST_INLINE void</I>
                    469: <B>add_tail_list</B>
                    470: (<I>list *</I> <B>to</B>, <I>list *</I> <B>l</B>) --     concatenate two lists
                    471: <P>
                    472: <H3>Arguments</H3>
                    473: <P>
                    474: <DL>
                    475: <DT><I>list *</I> <B>to</B><DD><P>destination list
                    476: <DT><I>list *</I> <B>l</B><DD><P>source list
                    477: </DL>
                    478: <H3>Description</H3>
                    479: <P>This function appends all elements of the list <B>l</B> to
                    480: the list <B>to</B> in constant time.
                    481: 
                    482: <H2><A NAME="ss7.3">7.3</A> <A HREF="prog.html#toc7.3">Miscellaneous functions.</A>
                    483: </H2>
                    484: 
                    485: <P>
                    486: <P>
                    487: <P><HR><H3>Function</H3>
                    488: <P><I>int</I>
                    489: <B>ipsum_verify</B>
                    490: (<I>void *</I> <B>frag</B>, <I>uint</I> <B>len</B>, <I>...</I> <B>...</B>) --     verify an IP checksum
                    491: <P>
                    492: <H3>Arguments</H3>
                    493: <P>
                    494: <DL>
                    495: <DT><I>void *</I> <B>frag</B><DD><P>first packet fragment
                    496: <DT><I>uint</I> <B>len</B><DD><P>length in bytes
                    497: <DT><I>...</I> <B>...</B><DD><P>variable arguments
                    498: </DL>
                    499: <H3>Description</H3>
                    500: <P>This function verifies whether a given fragmented packet
                    501: has correct one's complement checksum as used by the IP
                    502: protocol.
                    503: <P>It uses all the clever tricks described in RFC 1071 to speed
                    504: up checksum calculation as much as possible.
                    505: <H3>Result</H3>
                    506: <P>1 if the checksum is correct, 0 else.
                    507: 
                    508: 
                    509: <HR><H3>Function</H3>
                    510: <P><I>u16</I>
                    511: <B>ipsum_calculate</B>
                    512: (<I>void *</I> <B>frag</B>, <I>uint</I> <B>len</B>, <I>...</I> <B>...</B>) --     compute an IP checksum
                    513: <P>
                    514: <H3>Arguments</H3>
                    515: <P>
                    516: <DL>
                    517: <DT><I>void *</I> <B>frag</B><DD><P>first packet fragment
                    518: <DT><I>uint</I> <B>len</B><DD><P>length in bytes
                    519: <DT><I>...</I> <B>...</B><DD><P>variable arguments
                    520: </DL>
                    521: <H3>Description</H3>
                    522: <P>This function calculates a one's complement checksum of a given fragmented
                    523: packet.
                    524: <P>It uses all the clever tricks described in RFC 1071 to speed
                    525: up checksum calculation as much as possible.
                    526: 
                    527: 
                    528: <HR><H3>Function</H3>
                    529: <P><I>u32</I>
                    530: <B>u32_mkmask</B>
                    531: (<I>uint</I> <B>n</B>) --     create a bit mask
                    532: <P>
                    533: <H3>Arguments</H3>
                    534: <P>
                    535: <DL>
                    536: <DT><I>uint</I> <B>n</B><DD><P>number of bits
                    537: </DL>
                    538: <H3>Description</H3>
                    539: <P><B>u32_mkmask()</B> returns an unsigned 32-bit integer which binary
                    540: representation consists of <B>n</B> ones followed by zeroes.
                    541: 
                    542: 
                    543: <HR><H3>Function</H3>
                    544: <P><I>int</I>
                    545: <B>u32_masklen</B>
                    546: (<I>u32</I> <B>x</B>) --     calculate length of a bit mask
                    547: <P>
                    548: <H3>Arguments</H3>
                    549: <P>
                    550: <DL>
                    551: <DT><I>u32</I> <B>x</B><DD><P>bit mask
                    552: </DL>
                    553: <H3>Description</H3>
                    554: <P>This function checks whether the given integer <B>x</B> represents
                    555: a valid bit mask (binary representation contains first ones, then
                    556: zeroes) and returns the number of ones or -1 if the mask is invalid.
                    557: 
                    558: 
                    559: <HR><H3>Function</H3>
                    560: <P><I>u32</I>
                    561: <B>u32_log2</B>
                    562: (<I>u32</I> <B>v</B>) --     compute a binary logarithm.
                    563: <P>
                    564: <H3>Arguments</H3>
                    565: <P>
                    566: <DL>
                    567: <DT><I>u32</I> <B>v</B><DD><P>number
                    568: </DL>
                    569: <H3>Description</H3>
                    570: <P>This function computes a integral part of binary logarithm of given
                    571: integer <B>v</B> and returns it. The computed value is also an index of the
                    572: most significant non-zero bit position.
                    573: 
                    574: 
                    575: <HR><H3>Function</H3>
                    576: <P><I>int</I>
                    577: <B>patmatch</B>
                    578: (<I>byte *</I> <B>p</B>, <I>byte *</I> <B>s</B>) --     match shell-like patterns
                    579: <P>
                    580: <H3>Arguments</H3>
                    581: <P>
                    582: <DL>
                    583: <DT><I>byte *</I> <B>p</B><DD><P>pattern
                    584: <DT><I>byte *</I> <B>s</B><DD><P>string
                    585: </DL>
                    586: <H3>Description</H3>
                    587: <P><B>patmatch()</B> returns whether given string <B>s</B> matches the given shell-like
                    588: pattern <B>p</B>. The patterns consist of characters (which are matched literally),
                    589: question marks which match any single character, asterisks which match any
                    590: (possibly empty) string of characters and backslashes which are used to
                    591: escape any special characters and force them to be treated literally.
                    592: <P>The matching process is not optimized with respect to time, so please
                    593: avoid using this function for complex patterns.
                    594: 
                    595: 
                    596: <HR><H3>Function</H3>
                    597: <P><I>int</I>
                    598: <B>bvsnprintf</B>
                    599: (<I>char *</I> <B>buf</B>, <I>int</I> <B>size</B>, <I>const char *</I> <B>fmt</B>, <I>va_list</I> <B>args</B>) --     BIRD's <B>vsnprintf()</B>
                    600: <P>
                    601: <H3>Arguments</H3>
                    602: <P>
                    603: <DL>
                    604: <DT><I>char *</I> <B>buf</B><DD><P>destination buffer
                    605: <DT><I>int</I> <B>size</B><DD><P>size of the buffer
                    606: <DT><I>const char *</I> <B>fmt</B><DD><P>format string
                    607: <DT><I>va_list</I> <B>args</B><DD><P>a list of arguments to be formatted
                    608: </DL>
                    609: <H3>Description</H3>
                    610: <P>This functions acts like ordinary <B>sprintf()</B> except that it checks
                    611: available space to avoid buffer overflows and it allows some more
                    612: <H3>format specifiers</H3>
                    613: <P><CODE><I>I</I></CODE> for formatting of IP addresses (any non-zero
                    614: width is automatically replaced by standard IP address width which
                    615: depends on whether we use IPv4 or IPv6; <CODE>%#I</CODE> gives hexadecimal format),
                    616: <CODE><I>R</I></CODE> for Router / Network ID (u32 value printed as IPv4 address)
                    617: <CODE><I>lR</I></CODE> for 64bit Router / Network ID (u64 value printed as eight :-separated octets)
                    618: and <CODE><I>m</I></CODE> resp. <CODE><I>M</I></CODE> for error messages (uses <B>strerror()</B> to translate <B>errno</B> code to
                    619: message text). On the other hand, it doesn't support floating
                    620: point numbers.
                    621: <H3>Result</H3>
                    622: <P>number of characters of the output string or -1 if
                    623: the buffer space was insufficient.
                    624: 
                    625: 
                    626: <HR><H3>Function</H3>
                    627: <P><I>int</I>
                    628: <B>bvsprintf</B>
                    629: (<I>char *</I> <B>buf</B>, <I>const char *</I> <B>fmt</B>, <I>va_list</I> <B>args</B>) --     BIRD's <B>vsprintf()</B>
                    630: <P>
                    631: <H3>Arguments</H3>
                    632: <P>
                    633: <DL>
                    634: <DT><I>char *</I> <B>buf</B><DD><P>buffer
                    635: <DT><I>const char *</I> <B>fmt</B><DD><P>format string
                    636: <DT><I>va_list</I> <B>args</B><DD><P>a list of arguments to be formatted
                    637: </DL>
                    638: <H3>Description</H3>
                    639: <P>This function is equivalent to <B>bvsnprintf()</B> with an infinite
                    640: buffer size. Please use carefully only when you are absolutely
                    641: sure the buffer won't overflow.
                    642: 
                    643: 
                    644: <HR><H3>Function</H3>
                    645: <P><I>int</I>
                    646: <B>bsprintf</B>
                    647: (<I>char *</I> <B>buf</B>, <I>const char *</I> <B>fmt</B>, <I>...</I> <B>...</B>) --     BIRD's <B>sprintf()</B>
                    648: <P>
                    649: <H3>Arguments</H3>
                    650: <P>
                    651: <DL>
                    652: <DT><I>char *</I> <B>buf</B><DD><P>buffer
                    653: <DT><I>const char *</I> <B>fmt</B><DD><P>format string
                    654: <DT><I>...</I> <B>...</B><DD><P>variable arguments
                    655: </DL>
                    656: <H3>Description</H3>
                    657: <P>This function is equivalent to <B>bvsnprintf()</B> with an infinite
                    658: buffer size and variable arguments instead of a <I>va_list</I>.
                    659: Please use carefully only when you are absolutely
                    660: sure the buffer won't overflow.
                    661: 
                    662: 
                    663: <HR><H3>Function</H3>
                    664: <P><I>int</I>
                    665: <B>bsnprintf</B>
                    666: (<I>char *</I> <B>buf</B>, <I>int</I> <B>size</B>, <I>const char *</I> <B>fmt</B>, <I>...</I> <B>...</B>) --     BIRD's <B>snprintf()</B>
                    667: <P>
                    668: <H3>Arguments</H3>
                    669: <P>
                    670: <DL>
                    671: <DT><I>char *</I> <B>buf</B><DD><P>buffer
                    672: <DT><I>int</I> <B>size</B><DD><P>buffer size
                    673: <DT><I>const char *</I> <B>fmt</B><DD><P>format string
                    674: <DT><I>...</I> <B>...</B><DD><P>variable arguments
                    675: </DL>
                    676: <H3>Description</H3>
                    677: <P>This function is equivalent to <B>bsnprintf()</B> with variable arguments instead of a <I>va_list</I>.
                    678: 
                    679: 
                    680: <HR><H3>Function</H3>
                    681: <P><I>void *</I>
                    682: <B>xmalloc</B>
                    683: (<I>uint</I> <B>size</B>) --     malloc with checking
                    684: <P>
                    685: <H3>Arguments</H3>
                    686: <P>
                    687: <DL>
                    688: <DT><I>uint</I> <B>size</B><DD><P>block size
                    689: </DL>
                    690: <H3>Description</H3>
                    691: <P>This function is equivalent to <B>malloc()</B> except that in case of
                    692: failure it calls <B>die()</B> to quit the program instead of returning
                    693: a <I>NULL</I> pointer.
                    694: <P>Wherever possible, please use the memory resources instead.
                    695: 
                    696: 
                    697: <HR><H3>Function</H3>
                    698: <P><I>void *</I>
                    699: <B>xrealloc</B>
                    700: (<I>void *</I> <B>ptr</B>, <I>uint</I> <B>size</B>) --     realloc with checking
                    701: <P>
                    702: <H3>Arguments</H3>
                    703: <P>
                    704: <DL>
                    705: <DT><I>void *</I> <B>ptr</B><DD><P>original memory block
                    706: <DT><I>uint</I> <B>size</B><DD><P>block size
                    707: </DL>
                    708: <H3>Description</H3>
                    709: <P>This function is equivalent to <B>realloc()</B> except that in case of
                    710: failure it calls <B>die()</B> to quit the program instead of returning
                    711: a <I>NULL</I> pointer.
                    712: <P>Wherever possible, please use the memory resources instead.
                    713: 
                    714: <H2><A NAME="ss7.4">7.4</A> <A HREF="prog.html#toc7.4">Message authentication codes</A>
                    715: </H2>
                    716: 
                    717: <P>
                    718: <P>MAC algorithms are simple cryptographic tools for message authentication.
                    719: They use shared a secret key a and message text to generate authentication
                    720: code, which is then passed with the message to the other side, where the code
                    721: is verified. There are multiple families of MAC algorithms based on different
                    722: cryptographic primitives, BIRD implements two MAC families which use hash
                    723: functions.
                    724: <P>The first family is simply a cryptographic hash camouflaged as MAC algorithm.
                    725: Originally supposed to be (m|k)-hash (message is concatenated with key, and
                    726: that is hashed), but later it turned out that a raw hash is more practical.
                    727: This is used for cryptographic authentication in OSPFv2, RIP and BFD.
                    728: <P>The second family is the standard HMAC (RFC 2104), using inner and outer hash
                    729: to process key and message. HMAC (with SHA) is used in advanced OSPF and RIP
                    730: authentication (RFC 5709, RFC 4822).
                    731: <P>
                    732: <P><HR><H3>Function</H3>
                    733: <P><I>void</I>
                    734: <B>mac_init</B>
                    735: (<I>struct mac_context *</I> <B>ctx</B>, <I>uint</I> <B>id</B>, <I>const byte *</I> <B>key</B>, <I>uint</I> <B>keylen</B>) --     initialize MAC algorithm
                    736: <P>
                    737: <H3>Arguments</H3>
                    738: <P>
                    739: <DL>
                    740: <DT><I>struct mac_context *</I> <B>ctx</B><DD><P>context to initialize
                    741: <DT><I>uint</I> <B>id</B><DD><P>MAC algorithm ID
                    742: <DT><I>const byte *</I> <B>key</B><DD><P>MAC key
                    743: <DT><I>uint</I> <B>keylen</B><DD><P>MAC key length
                    744: </DL>
                    745: <H3>Description</H3>
                    746: <P>Initialize MAC context <B>ctx</B> for algorithm <B>id</B> (e.g., <I>ALG_HMAC_SHA1</I>), with
                    747: key <B>key</B> of length <B>keylen</B>. After that, message data could be added using
                    748: <B>mac_update()</B> function.
                    749: 
                    750: 
                    751: <HR><H3>Function</H3>
                    752: <P><I>void</I>
                    753: <B>mac_update</B>
                    754: (<I>struct mac_context *</I> <B>ctx</B>, <I>const byte *</I> <B>data</B>, <I>uint</I> <B>datalen</B>) --     add more data to MAC algorithm
                    755: <P>
                    756: <H3>Arguments</H3>
                    757: <P>
                    758: <DL>
                    759: <DT><I>struct mac_context *</I> <B>ctx</B><DD><P>MAC context
                    760: <DT><I>const byte *</I> <B>data</B><DD><P>data to add
                    761: <DT><I>uint</I> <B>datalen</B><DD><P>length of data
                    762: </DL>
                    763: <H3>Description</H3>
                    764: <P>Push another <B>datalen</B> bytes of data pointed to by <B>data</B> into the MAC
                    765: algorithm currently in <B>ctx</B>. Can be called multiple times for the same MAC
                    766: context. It has the same effect as concatenating all the data together and
                    767: passing them at once.
                    768: 
                    769: 
                    770: <HR><H3>Function</H3>
                    771: <P><I>byte *</I>
                    772: <B>mac_final</B>
                    773: (<I>struct mac_context *</I> <B>ctx</B>) --     finalize MAC algorithm
                    774: <P>
                    775: <H3>Arguments</H3>
                    776: <P>
                    777: <DL>
                    778: <DT><I>struct mac_context *</I> <B>ctx</B><DD><P>MAC context
                    779: </DL>
                    780: <H3>Description</H3>
                    781: <P>Finish MAC computation and return a pointer to the result. No more
                    782: <B>mac_update</B>() calls could be done, but the context may be reinitialized
                    783: later.
                    784: <P>Note that the returned pointer points into data in the <B>ctx</B> context. If it
                    785: ceases to exist, the pointer becomes invalid.
                    786: 
                    787: 
                    788: <HR><H3>Function</H3>
                    789: <P><I>void</I>
                    790: <B>mac_cleanup</B>
                    791: (<I>struct mac_context *</I> <B>ctx</B>) --     cleanup MAC context
                    792: <P>
                    793: <H3>Arguments</H3>
                    794: <P>
                    795: <DL>
                    796: <DT><I>struct mac_context *</I> <B>ctx</B><DD><P>MAC context
                    797: </DL>
                    798: <H3>Description</H3>
                    799: <P>Cleanup MAC context after computation (by filling with zeros). Not strictly
                    800: necessary, just to erase sensitive data from stack. This also invalidates the
                    801: pointer returned by <B>mac_final</B>().
                    802: 
                    803: 
                    804: <HR><H3>Function</H3>
                    805: <P><I>void</I>
                    806: <B>mac_fill</B>
                    807: (<I>uint</I> <B>id</B>, <I>const byte *</I> <B>key</B>, <I>uint</I> <B>keylen</B>, <I>const byte *</I> <B>data</B>, <I>uint</I> <B>datalen</B>, <I>byte *</I> <B>mac</B>) --     compute and fill MAC
                    808: <P>
                    809: <H3>Arguments</H3>
                    810: <P>
                    811: <DL>
                    812: <DT><I>uint</I> <B>id</B><DD><P>MAC algorithm ID
                    813: <DT><I>const byte *</I> <B>key</B><DD><P>secret key
                    814: <DT><I>uint</I> <B>keylen</B><DD><P>key length
                    815: <DT><I>const byte *</I> <B>data</B><DD><P>message data
                    816: <DT><I>uint</I> <B>datalen</B><DD><P>message length
                    817: <DT><I>byte *</I> <B>mac</B><DD><P>place to fill MAC
                    818: </DL>
                    819: <H3>Description</H3>
                    820: <P>Compute MAC for specified key <B>key</B> and message <B>data</B> using algorithm <B>id</B> and
                    821: copy it to buffer <B>mac</B>. <B>mac_fill()</B> is a shortcut function doing all usual
                    822: steps for transmitted messages.
                    823: 
                    824: 
                    825: <HR><H3>Function</H3>
                    826: <P><I>int</I>
                    827: <B>mac_verify</B>
                    828: (<I>uint</I> <B>id</B>, <I>const byte *</I> <B>key</B>, <I>uint</I> <B>keylen</B>, <I>const byte *</I> <B>data</B>, <I>uint</I> <B>datalen</B>, <I>const byte *</I> <B>mac</B>) --     compute and verify MAC
                    829: <P>
                    830: <H3>Arguments</H3>
                    831: <P>
                    832: <DL>
                    833: <DT><I>uint</I> <B>id</B><DD><P>MAC algorithm ID
                    834: <DT><I>const byte *</I> <B>key</B><DD><P>secret key
                    835: <DT><I>uint</I> <B>keylen</B><DD><P>key length
                    836: <DT><I>const byte *</I> <B>data</B><DD><P>message data
                    837: <DT><I>uint</I> <B>datalen</B><DD><P>message length
                    838: <DT><I>const byte *</I> <B>mac</B><DD><P>received MAC
                    839: </DL>
                    840: <H3>Description</H3>
                    841: <P>Compute MAC for specified key <B>key</B> and message <B>data</B> using algorithm <B>id</B> and
                    842: compare it with received <B>mac</B>, return whether they are the same. <B>mac_verify()</B>
                    843: is a shortcut function doing all usual steps for received messages.
                    844: 
                    845: <P>
                    846: <HR>
                    847: <A HREF="prog-8.html">Next</A>
                    848: <A HREF="prog-6.html">Previous</A>
                    849: <A HREF="prog.html#toc7">Contents</A>
                    850: </BODY>
                    851: </HTML>

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