openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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_ */