TCP/IPメモ一:サブネットタイプを判断するいくつかのマクロ


最近、「TCP/IPでインターネット接続を行う」と「TCP/IP詳細」を見て、TCP/IPのいくつかのオープンソースの実現:Xinu実現、BSD実現、lwIP実現、uIP実現、いくつかの小さなメモをします.
次に、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)