0

在 Open vSwitch 2.4.0 实现中,我们确实有以下内容:

#ifdef __CHECKER__
#define OVS_BITWISE __attribute__((bitwise))
#define OVS_FORCE __attribute__((force))
#else
#define OVS_BITWISE
#define OVS_FORCE
#endif

/* The ovs_be<N> types indicate that an object is in big-endian, not
 * native-endian, byte order.  They are otherwise equivalent to uint<N>_t. */

typedef uint16_t OVS_BITWISE ovs_be16;
typedef struct {
    ovs_be16 hi, lo;
} ovs_16aligned_be32;

我有以下变量:

ovs_16aligned_be32 srcIP;
ovs_be16 srcPort ;

我怎样才能转换srcIP成 axxx.yyy.zzz.ttt和 thesrcPort成 little-endian uint16_t

4

2 回答 2

1

已经有以下功能:

htonl()
htons()
ntohl()
ntohs()

原型在

#include <arpa/inet.h>

如果我正确理解您的问题,这些功能将满足您的需求。

于 2015-11-03T18:53:22.437 回答
0

好的,我不知道什么是 openvswitch,但我认为这应该可行:

ovs_16aligned_be32 ovs_16aligned_be32_to_littleEndian(ovs_16aligned_be32 a) {
    ovs_16aligned_be32 b.high = ovs_be16_toLittleEndian(a.low);
    b.low = ovs_be16_toLittleEndian(a.high);
    return b;
}

ovs_be16 ovs_be16_toLittleEndian(ovs_be16 srcPort a) {
   ovs_be16 srcPort b = (a >> 8) & 0x00ff;
   b |= a << 8;

   return b;
} 
于 2015-11-03T03:25:20.520 回答