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