home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / SLAX 6.0.8 / slax-6.0.8.iso / slax / base / 006-devel.lzm / usr / include / pppd / eui64.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-06-29  |  3.3 KB  |  115 lines

  1. /*
  2.  * eui64.h - EUI64 routines for IPv6CP.
  3.  *
  4.  * Copyright (c) 1999 Tommi Komulainen.  All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  *
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  *
  18.  * 3. The name(s) of the authors of this software must not be used to
  19.  *    endorse or promote products derived from this software without
  20.  *    prior written permission.
  21.  *
  22.  * 4. Redistributions of any form whatsoever must retain the following
  23.  *    acknowledgment:
  24.  *    "This product includes software developed by Tommi Komulainen
  25.  *     <Tommi.Komulainen@iki.fi>".
  26.  *
  27.  * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
  28.  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  29.  * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
  30.  * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  31.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
  32.  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
  33.  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  34.  *
  35.  * $Id: eui64.h,v 1.6 2002/12/04 23:03:32 paulus Exp $
  36. */
  37.  
  38. #ifndef __EUI64_H__
  39. #define __EUI64_H__
  40.  
  41. #if !defined(INET6)
  42. #error    "this file should only be included when INET6 is defined"
  43. #endif /* not defined(INET6) */
  44.  
  45. #if defined(SOL2)
  46. #include <netinet/in.h>
  47.  
  48. typedef union {
  49.     uint8_t    e8[8];        /* lower 64-bit IPv6 address */
  50.     uint32_t    e32[2];        /* lower 64-bit IPv6 address */
  51. } eui64_t;
  52.  
  53. /*
  54.  * Declare the two below, since in.h only defines them when _KERNEL
  55.  * is declared - which shouldn't be true when dealing with user-land programs
  56.  */
  57. #define    s6_addr8    _S6_un._S6_u8
  58. #define    s6_addr32    _S6_un._S6_u32
  59.  
  60. #else /* else if not defined(SOL2) */
  61.  
  62. /*
  63.  * TODO:
  64.  *
  65.  * Maybe this should be done by processing struct in6_addr directly...
  66.  */
  67. typedef union
  68. {
  69.     u_int8_t e8[8];
  70.     u_int16_t e16[4];
  71.     u_int32_t e32[2];
  72. } eui64_t;
  73.  
  74. #endif /* defined(SOL2) */
  75.  
  76. #define eui64_iszero(e)        (((e).e32[0] | (e).e32[1]) == 0)
  77. #define eui64_equals(e, o)    (((e).e32[0] == (o).e32[0]) && \
  78.                 ((e).e32[1] == (o).e32[1]))
  79. #define eui64_zero(e)        (e).e32[0] = (e).e32[1] = 0;
  80.  
  81. #define eui64_copy(s, d)    memcpy(&(d), &(s), sizeof(eui64_t))
  82.  
  83. #define eui64_magic(e)        do {            \
  84.                 (e).e32[0] = magic();    \
  85.                 (e).e32[1] = magic();    \
  86.                 (e).e8[0] &= ~2;    \
  87.                 } while (0)
  88. #define eui64_magic_nz(x)    do {                \
  89.                 eui64_magic(x);            \
  90.                 } while (eui64_iszero(x))
  91. #define eui64_magic_ne(x, y)    do {                \
  92.                 eui64_magic(x);            \
  93.                 } while (eui64_equals(x, y))
  94.  
  95. #define eui64_get(ll, cp)    do {                \
  96.                 eui64_copy((*cp), (ll));    \
  97.                 (cp) += sizeof(eui64_t);    \
  98.                 } while (0)
  99.  
  100. #define eui64_put(ll, cp)    do {                \
  101.                 eui64_copy((ll), (*cp));    \
  102.                 (cp) += sizeof(eui64_t);    \
  103.                 } while (0)
  104.  
  105. #define eui64_set32(e, l)    do {            \
  106.                 (e).e32[0] = 0;        \
  107.                 (e).e32[1] = htonl(l);    \
  108.                 } while (0)
  109. #define eui64_setlo32(e, l)    eui64_set32(e, l)
  110.  
  111. char *eui64_ntoa __P((eui64_t));    /* Returns ascii representation of id */
  112.  
  113. #endif /* __EUI64_H__ */
  114.  
  115.