Annotation of embedaddon/bird/doc/prog-7.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: 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>