TCP/IPメモ一:サブネットタイプを判断するいくつかのマクロ
最近、「TCP/IPでインターネット接続を行う」と「TCP/IP詳細」を見て、TCP/IPのいくつかのオープンソースの実現:Xinu実現、BSD実現、lwIP実現、uIP実現、いくつかの小さなメモをします.
次に、Xinuでサブネットタイプを判断するマクロをいくつか示します.
また、ローカル/ネットワークバイトの順序変換を処理するビット操作支援マクロもいくつかあります.
次に、Xinuでサブネットタイプを判断するマクロをいくつか示します.
#if BYTE_ORDER == BIG_ENDIAN
#define IP_CLASSA(x) (((x) & 0x80000000) == 0) /* IP Class A */
#define IP_CLASSB(x) (((x) & 0xc0000000) == 0x80000000) /* IP Class B */
#define IP_CLASSC(x) (((x) & 0xe0000000) == 0xc0000000) /* IP Class C */
#define IP_CLASSD(x) (((x) & 0xf0000000) == 0xe0000000) /* IP Class D */
#define IP_CLASSE(x) (((x) & 0xf8000000) == 0xf0000000) /* IP Class E */
#else /* BYTE_ORDER */
#define v(x) (((x) & 0x80) == 0x00) /* IP Class A address */
#define IP_CLASSB(x) (((x) & 0xc0) == 0x80) /* IP Class B address */
#define IP_CLASSC(x) (((x) & 0xe0) == 0xc0) /* IP Class C address */
#define IP_CLASSD(x) (((x) & 0xf0) == 0xe0) /* IP Class D address */
#define IP_CLASSE(x) (((x) & 0xf8) == 0xf0) /* IP Class E address */
#endif /* BYTE_ORDER */
また、ローカル/ネットワークバイトの順序変換を処理するビット操作支援マクロもいくつかあります.
#if BYTE_ORDER == LITTLE_ENDIAN
#define hs2net(x) (unsigned) ((((x)>>8) &0xff) | (((x) & 0xff)<<8))
#define net2hs(x) hs2net(x)
#define hl2net(x) (((((x)& 0xff)<<24) | ((x)>>24) & 0xff) | \
(((x) & 0xff0000)>>8) | (((x) & 0xff00)<<8))
#define net2hl(x) hl2net(x)
#endif
#if BYTE_ORDER == BIG_ENDIAN
#define hs2net(x) (x)
#define net2hs(x) (x)
#define hl2net(x) (x)
#define net2hl(x) (x)
#endif
/* network macros */
#define hi8(x) (unsigned char) (((long) (x) >> 16) & 0x00ff)
#define low16(x) (unsigned short) ((long) (x) & 0xffff)