//------------------------------------------------------------------------------ // Author: Andrey Kuznetsov // Description: Converters to LE for CIFS v2 constants. // Copyright (c) 2015 EPAM Systems //------------------------------------------------------------------------------ /* This file is part of Nfstrace. Nfstrace is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2 of the License. Nfstrace is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Nfstrace. If not, see . */ //------------------------------------------------------------------------------ #ifndef PC_TO_NET_H #define PC_TO_NET_H //------------------------------------------------------------------------------ #include //------------------------------------------------------------------------------ #if defined(__linux__) || defined(__GNU__) #include #define NFSTRACE_BYTE_ORDER __BYTE_ORDER #define NFSTRACE_BIG_ENDIAN __BIG_ENDIAN #define NFSTRACE_LITTLE_ENDIAN __LITTLE_ENDIAN #else #include #include #define NFSTRACE_BYTE_ORDER BYTE_ORDER #define NFSTRACE_BIG_ENDIAN BIG_ENDIAN #define NFSTRACE_LITTLE_ENDIAN LITTLE_ENDIAN #endif //------------------------------------------------------------------------------ namespace NST { namespace API { namespace SMBv2 { # if NFSTRACE_BYTE_ORDER == NFSTRACE_BIG_ENDIAN // TODO: rename this function template to LEconstant2host template constexpr T pc_to_net(T t) { static_assert(t == T{}, "try to not use pc_to_net w/o specialization"); return t; } template<> constexpr std::uint64_t pc_to_net(std::uint64_t t) { return ((t & 0xFF00000000000000) >> 56) | ((t & 0x00FF000000000000) >> 40) | ((t & 0x0000FF0000000000) >> 24) | ((t & 0x000000FF00000000) >> 8) | ((t & 0x00000000FF000000) << 8) | ((t & 0x0000000000FF0000) << 24) | ((t & 0x000000000000FF00) << 40) | ((t & 0x00000000000000FF) << 56); } template<> constexpr uint32_t pc_to_net(uint32_t t) { return ((t & 0xFF000000) >> 24) | ((t & 0x00FF0000) >> 8) | ((t & 0x0000FF00) << 8) | ((t & 0x000000FF) << 24); } template<> constexpr uint16_t pc_to_net(uint16_t t) { return ((t & 0xFF00) >> 8) | ((t & 0x00FF) << 8); } template<> constexpr std::uint8_t pc_to_net(std::uint8_t v) { return v; } template<> constexpr std::int64_t pc_to_net(std::int64_t v) { return pc_to_net((std::uint64_t)v); } template<> constexpr std::int32_t pc_to_net(std::int32_t v) { return pc_to_net((std::uint32_t)v); } template<> constexpr std::int16_t pc_to_net(std::int16_t v) { return pc_to_net((std::uint16_t)v); } template<> constexpr std::int8_t pc_to_net(std::int8_t v) { return pc_to_net((std::uint8_t)v); } # else # if NFSTRACE_BYTE_ORDER == NFSTRACE_LITTLE_ENDIAN /*! * Does nothing for Intel */ template constexpr T pc_to_net(T t) { return t; } # endif #endif } // SMBv2 } // API } // NST //------------------------------------------------------------------------------ #endif//PC_TO_NET_H //------------------------------------------------------------------------------