pack.h (3672B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * File: pack.h 8 * Purpose: Pack and unpack macros using Big-Endian (network byte order). 9 * 10 * Pack and unpack macros: 11 * _SHR_PACK_U8 : Packs a uint8, advances pointer 12 * _SHR_UNPACK_U8 : Unpacks a uint8, advances pointer 13 * _SHR_PACK_U16 : Packs a uint16, advances pointer 14 * _SHR_UNPACK_U16 : Unpacks a uint16, advances pointer 15 * _SHR_PACK_U32 : Packs a uint32, advances pointer 16 * _SHR_UNPACK_U32 : Unpacks a uint32, advances pointer 17 * 18 * The pack/unpack macros take (_buf, _var) 19 * where, 20 * _buf - is a pointer to buffer where to pack or unpack value; 21 * should be of type 'uint8 *', or 'char *'. 22 * _var - is the variable with value to pack, or to unpack to. 23 * 24 * NOTE: 25 * All above macros increment the given buffer pointer based 26 * on the corresponding type size. 27 * 28 * Avoid expressions in these macros (side effects). 29 */ 30 31 #ifndef _SHR_PACK_H_ 32 #define _SHR_PACK_H_ 33 34 /* Type length in bytes */ 35 #define _SHR_PACKLEN_U8 1 36 #define _SHR_PACKLEN_U16 2 37 #define _SHR_PACKLEN_U32 4 38 #define _SHR_PACKLEN_U64 8 39 40 #define _SHR_PACK_U8(_buf, _var) \ 41 *_buf++ = (_var) & 0xff 42 43 #define _SHR_UNPACK_U8(_buf, _var) \ 44 _var = *_buf++ 45 46 #define _SHR_PACK_U16(_buf, _var) \ 47 do { \ 48 (_buf)[0] = ((_var) >> 8) & 0xff; \ 49 (_buf)[1] = (_var) & 0xff; \ 50 (_buf) += _SHR_PACKLEN_U16; \ 51 } while (0) 52 53 #define _SHR_UNPACK_U16(_buf, _var) \ 54 do { \ 55 (_var) = (((_buf)[0] << 8) | \ 56 (_buf)[1]); \ 57 (_buf) += _SHR_PACKLEN_U16; \ 58 } while (0) 59 60 #define _SHR_PACK_U32(_buf, _var) \ 61 do { \ 62 (_buf)[0] = ((_var) >> 24) & 0xff; \ 63 (_buf)[1] = ((_var) >> 16) & 0xff; \ 64 (_buf)[2] = ((_var) >> 8) & 0xff; \ 65 (_buf)[3] = (_var) & 0xff; \ 66 (_buf) += _SHR_PACKLEN_U32; \ 67 } while (0) 68 69 #define _SHR_UNPACK_U32(_buf, _var) \ 70 do { \ 71 (_var) = (((_buf)[0] << 24) | \ 72 ((_buf)[1] << 16) | \ 73 ((_buf)[2] << 8) | \ 74 (_buf)[3]); \ 75 (_buf) += _SHR_PACKLEN_U32; \ 76 } while (0) 77 78 #define _SHR_PACK_U64(_buf, _var) \ 79 do { \ 80 (_buf)[0] = ((_var) >> 56) & 0xff; \ 81 (_buf)[1] = ((_var) >> 48) & 0xff; \ 82 (_buf)[2] = ((_var) >> 40) & 0xff; \ 83 (_buf)[3] = ((_var) >> 32) & 0xff; \ 84 (_buf)[4] = ((_var) >> 24) & 0xff; \ 85 (_buf)[5] = ((_var) >> 16) & 0xff; \ 86 (_buf)[6] = ((_var) >> 8) & 0xff; \ 87 (_buf)[7] = (_var) & 0xff; \ 88 (_buf) += _SHR_PACKLEN_U64; \ 89 } while (0) 90 91 #define _SHR_UNPACK_U64(_buf, _var) \ 92 do { \ 93 (_var) = (((_buf)[0] << 56) | \ 94 ((_buf)[1] << 48) | \ 95 ((_buf)[2] << 40) | \ 96 ((_buf)[3] << 32) | \ 97 ((_buf)[4] << 24) | \ 98 ((_buf)[5] << 16) | \ 99 ((_buf)[6] << 8) | \ 100 (_buf)[7]); \ 101 (_buf) += _SHR_PACKLEN_U64; \ 102 } while (0) 103 104 #endif /* _SHR_PACK_H_ */