1/* 2 * local version of endian.h - byte order defines 3 * 4 * Copyright 2007, Broadcom Corporation 5 * All Rights Reserved. 6 * 7 * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY 8 * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM 9 * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS 10 * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. 11 * 12 * $Id: bcmendian.h,v 1.1.1.1 2008/10/15 03:25:54 james26_jang Exp $ 13*/ 14 15#ifndef _BCMENDIAN_H_ 16#define _BCMENDIAN_H_ 17 18#include <typedefs.h> 19 20/* Byte swap a 16 bit value */ 21#define BCMSWAP16(val) \ 22 ((uint16)(\ 23 (((uint16)(val) & (uint16)0x00ffU) << 8) | \ 24 (((uint16)(val) & (uint16)0xff00U) >> 8))) 25 26/* Byte swap a 32 bit value */ 27#define BCMSWAP32(val) \ 28 ((uint32)(\ 29 (((uint32)(val) & (uint32)0x000000ffUL) << 24) | \ 30 (((uint32)(val) & (uint32)0x0000ff00UL) << 8) | \ 31 (((uint32)(val) & (uint32)0x00ff0000UL) >> 8) | \ 32 (((uint32)(val) & (uint32)0xff000000UL) >> 24))) 33 34/* 2 Byte swap a 32 bit value */ 35#define BCMSWAP32BY16(val) \ 36 ((uint32)(\ 37 (((uint32)(val) & (uint32)0x0000ffffUL) << 16) | \ 38 (((uint32)(val) & (uint32)0xffff0000UL) >> 16))) 39 40 41static INLINE uint16 42bcmswap16(uint16 val) 43{ 44 return BCMSWAP16(val); 45} 46 47static INLINE uint32 48bcmswap32(uint32 val) 49{ 50 return BCMSWAP32(val); 51} 52 53static INLINE uint32 54bcmswap32by16(uint32 val) 55{ 56 return BCMSWAP32BY16(val); 57} 58 59/* buf - start of buffer of shorts to swap */ 60/* len - byte length of buffer */ 61static INLINE void 62bcmswap16_buf(uint16 *buf, uint len) 63{ 64 len = len/2; 65 66 while (len--) { 67 *buf = bcmswap16(*buf); 68 buf++; 69 } 70} 71 72#ifndef hton16 73#ifndef IL_BIGENDIAN 74#define HTON16(i) BCMSWAP16(i) 75#define hton16(i) bcmswap16(i) 76#define hton32(i) bcmswap32(i) 77#define ntoh16(i) bcmswap16(i) 78#define ntoh32(i) bcmswap32(i) 79#define ltoh16(i) (i) 80#define ltoh32(i) (i) 81#define htol16(i) (i) 82#define htol32(i) (i) 83#else 84#define HTON16(i) (i) 85#define hton16(i) (i) 86#define hton32(i) (i) 87#define ntoh16(i) (i) 88#define ntoh32(i) (i) 89#define ltoh16(i) bcmswap16(i) 90#define ltoh32(i) bcmswap32(i) 91#define htol16(i) bcmswap16(i) 92#define htol32(i) bcmswap32(i) 93#endif /* IL_BIGENDIAN */ 94#endif /* hton16 */ 95 96#ifndef IL_BIGENDIAN 97#define ltoh16_buf(buf, i) 98#define htol16_buf(buf, i) 99#else 100#define ltoh16_buf(buf, i) bcmswap16_buf((uint16*)buf, i) 101#define htol16_buf(buf, i) bcmswap16_buf((uint16*)buf, i) 102#endif /* IL_BIGENDIAN */ 103 104/* 105* store 16-bit value to unaligned little endian byte array. 106*/ 107static INLINE void 108htol16_ua_store(uint16 val, uint8 *bytes) 109{ 110 bytes[0] = val&0xff; 111 bytes[1] = val>>8; 112} 113 114/* 115* store 32-bit value to unaligned little endian byte array. 116*/ 117static INLINE void 118htol32_ua_store(uint32 val, uint8 *bytes) 119{ 120 bytes[0] = val&0xff; 121 bytes[1] = (val>>8)&0xff; 122 bytes[2] = (val>>16)&0xff; 123 bytes[3] = val>>24; 124} 125 126/* 127* store 16-bit value to unaligned network(big) endian byte array. 128*/ 129static INLINE void 130hton16_ua_store(uint16 val, uint8 *bytes) 131{ 132 bytes[1] = val&0xff; 133 bytes[0] = val>>8; 134} 135 136/* 137* store 32-bit value to unaligned network(big) endian byte array. 138*/ 139static INLINE void 140hton32_ua_store(uint32 val, uint8 *bytes) 141{ 142 bytes[3] = val&0xff; 143 bytes[2] = (val>>8)&0xff; 144 bytes[1] = (val>>16)&0xff; 145 bytes[0] = val>>24; 146} 147 148/* 149* load 16-bit value from unaligned little endian byte array. 150*/ 151static INLINE uint16 152ltoh16_ua(void *bytes) 153{ 154 return (((uint8*)bytes)[1]<<8)+((uint8 *)bytes)[0]; 155} 156 157/* 158* load 32-bit value from unaligned little endian byte array. 159*/ 160static INLINE uint32 161ltoh32_ua(void *bytes) 162{ 163 return (((uint8*)bytes)[3]<<24)+(((uint8*)bytes)[2]<<16)+ 164 (((uint8*)bytes)[1]<<8)+((uint8*)bytes)[0]; 165} 166 167/* 168* load 16-bit value from unaligned big(network) endian byte array. 169*/ 170static INLINE uint16 171ntoh16_ua(void *bytes) 172{ 173 return (((uint8*)bytes)[0]<<8)+((uint8*)bytes)[1]; 174} 175 176/* 177* load 32-bit value from unaligned big(network) endian byte array. 178*/ 179static INLINE uint32 180ntoh32_ua(void *bytes) 181{ 182 return (((uint8*)bytes)[0]<<24)+(((uint8*)bytes)[1]<<16)+ 183 (((uint8*)bytes)[2]<<8)+((uint8*)bytes)[3]; 184} 185 186#define ltoh_ua(ptr) (\ 187 sizeof(*(ptr)) == sizeof(uint8) ? *(uint8 *)ptr : \ 188 sizeof(*(ptr)) == sizeof(uint16) ? (((uint8 *)ptr)[1]<<8)+((uint8 *)ptr)[0] : \ 189 (((uint8 *)ptr)[3]<<24)+(((uint8 *)ptr)[2]<<16)+(((uint8 *)ptr)[1]<<8)+((uint8 *)ptr)[0] \ 190) 191 192#define ntoh_ua(ptr) (\ 193 sizeof(*(ptr)) == sizeof(uint8) ? *(uint8 *)ptr : \ 194 sizeof(*(ptr)) == sizeof(uint16) ? (((uint8 *)ptr)[0]<<8)+((uint8 *)ptr)[1] : \ 195 (((uint8 *)ptr)[0]<<24)+(((uint8 *)ptr)[1]<<16)+(((uint8 *)ptr)[2]<<8)+((uint8 *)ptr)[3] \ 196) 197 198#endif /* _BCMENDIAN_H_ */ 199