16ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
26ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * integers.h
36ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
46ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * defines integer types (or refers to their definitions)
56ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
66ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * David A. McGrew
76ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Cisco Systems, Inc.
86ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
96ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Copyright (c) 2001-2006, Cisco Systems, Inc.
136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * All rights reserved.
146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Redistribution and use in source and binary forms, with or without
166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * modification, are permitted provided that the following conditions
176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * are met:
186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Redistributions of source code must retain the above copyright
206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   notice, this list of conditions and the following disclaimer.
216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Redistributions in binary form must reproduce the above
236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   copyright notice, this list of conditions and the following
246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   disclaimer in the documentation and/or other materials provided
256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   with the distribution.
266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Neither the name of the Cisco Systems, Inc. nor the names of its
286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   contributors may be used to endorse or promote products derived
296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   from this software without specific prior written permission.
306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * OF THE POSSIBILITY OF SUCH DAMAGE.
436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef INTEGERS_H
486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define INTEGERS_H
496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "config.h"	/* configuration file, using autoconf          */
516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef SRTP_KERNEL
536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "kernel_compat.h"
556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#else /* SRTP_KERNEL */
576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* use standard integer definitions, if they're available  */
596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef HAVE_STDLIB_H
606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <stdlib.h>
616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef HAVE_STDINT_H
636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <stdint.h>
646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef HAVE_INTTYPES_H
666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <inttypes.h>
676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef HAVE_SYS_TYPES_H
696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <sys/types.h>
706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef HAVE_SYS_INT_TYPES_H
726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <sys/int_types.h>    /* this exists on Sun OS */
736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef HAVE_MACHINE_TYPES_H
756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# include <machine/types.h>
766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* Can we do 64 bit integers? */
796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef HAVE_UINT64_T
806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# if SIZEOF_UNSIGNED_LONG == 8
816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef unsigned long		uint64_t;
826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# elif SIZEOF_UNSIGNED_LONG_LONG == 8
836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef unsigned long long	uint64_t;
846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# else
856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#  define NO_64BIT_MATH 1
866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org# endif
876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* Reasonable defaults for 32 bit machines - you may need to
906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * edit these definitions for your own machine. */
916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef HAVE_UINT8_T
926ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef unsigned char		uint8_t;
936ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
946ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef HAVE_UINT16_T
956ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef unsigned short int	uint16_t;
966ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
976ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef HAVE_UINT32_T
986ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef unsigned int		uint32_t;
996ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
1006ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1016ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1026ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef NO_64BIT_MATH
1036ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef double uint64_t;
1046ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* assert that sizeof(double) == 8 */
1056ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgextern uint64_t make64(uint32_t high, uint32_t low);
1066ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgextern uint32_t high32(uint64_t value);
1076ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgextern uint32_t low32(uint64_t value);
1086ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
1096ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* SRTP_KERNEL */
1116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* These macros are to load and store 32-bit values from un-aligned
1136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org   addresses.  This is required for processors that do not allow unaligned
1146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org   loads. */
1156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef ALIGNMENT_32BIT_REQUIRED
1166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* Note that if it's in a variable, you can memcpy it */
1176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifdef WORDS_BIGENDIAN
1186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define PUT_32(addr,value) \
1196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    { \
1206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        ((unsigned char *) (addr))[0] = (value >> 24); \
1216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        ((unsigned char *) (addr))[1] = (value >> 16) & 0xff; \
1226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        ((unsigned char *) (addr))[2] = (value >> 8) & 0xff; \
1236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        ((unsigned char *) (addr))[3] = (value)      & 0xff; \
1246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    }
1256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define GET_32(addr) ((((unsigned char *) (addr))[0] << 24) |  \
1266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                      (((unsigned char *) (addr))[1] << 16) |  \
1276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                      (((unsigned char *) (addr))[2] << 8)  |  \
1286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                      (((unsigned char *) (addr))[3]))
1296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#else
1306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define PUT_32(addr,value) \
1316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    { \
1326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        ((unsigned char *) (addr))[3] = (value >> 24); \
1336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        ((unsigned char *) (addr))[2] = (value >> 16) & 0xff; \
1346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        ((unsigned char *) (addr))[1] = (value >> 8) & 0xff; \
1356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org        ((unsigned char *) (addr))[0] = (value)      & 0xff; \
1366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org    }
1376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define GET_32(addr) ((((unsigned char *) (addr))[3] << 24) |  \
1386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                      (((unsigned char *) (addr))[2] << 16) |  \
1396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                      (((unsigned char *) (addr))[1] << 8)  |  \
1406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org                      (((unsigned char *) (addr))[0]))
1416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif // WORDS_BIGENDIAN
1426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#else
1436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define PUT_32(addr,value) *(((uint32_t *) (addr)) = (value)
1446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define GET_32(addr) (*(((uint32_t *) (addr)))
1456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif
1466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
1476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* INTEGERS_H */
148