⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inet.h

📁 LInux BootLoader的说明文档
💻 H
字号:
#ifndef INET_H
#define INET_H

#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
#include <net/ethernet.h>
#include <netinet/ether.h>

#ifndef __USE_BSD
#define __USE_BSD
#endif

#include <netinet/ip.h>

#ifndef __FAVOR_BSD
#define __FAVOR_BSD
#endif
#include <netinet/tcp.h>

#include <netinet/udp.h>


#define ETHERTYPE_8021Q 0x8100

/*****************************************************************************/

#define _ETHER_HDR(ether) \
	((struct ether_header *)ether)

#define ETHER_TYPE(ether) \
	ntohs(_ETHER_HDR(ether)->ether_type)

#define ETHER_TYPE_8021Q(ether) \
	(ETHER_TYPE(ether) == ETHERTYPE_8021Q)

#define E8021Q_PACKET(packet)\
	((char *)packet + sizeof(struct ether_header))

#define E8021Q_TYPE_IP(e8021q_packet) \
	( ntohs(*((int *)((char *)e8021q_packet + 2 ))) == ETHERTYPE_IP )

#define ETHER_TYPE_IP(ether) \
	(ETHER_TYPE(ether) == ETHERTYPE_IP)

#define ETHER_TYPE_ARP(ether) \
	(ETHER_TYPE(ether) == ETHERTYPE_ARP)

#define ETHER_TYPE_RARP(ether) \
	(ETHER_TYPE(ether) == ETHERTYPE_REVARP)

#define ETHER_SADDR(ether) \
	(_ETHER_HDR(ether)->ether_shost)

#define ETHER_DADDR(ether) \
	(_ETHER_HDR(ether)->ether_dhost)

/*
	MAC地址的格式化输出,对应的格式字符串如下:
	"%2X:%2X:%2X:%2X:%2X:%2X" 
*/
#define _ETHER_ADDR_FORMAT(addr) \
	addr[0] , addr[1] , addr[2] , addr[3] , addr[4] , addr[5]

#define ETHER_SADDR_FORMAT(ether) \
	_ETHER_ADDR_FORMAT(ETHER_SADDR(ether))

#define ETHER_DADDR_FORMAT(ether) \
	_ETHER_ADDR_FORMAT(ETHER_DADDR(ether))


/*****************************************************************************/

/*
	调用之前,应该确保ETHER_TYPE_IP(packet)为真
*/

#define IP_PACKET(packet) \
	((char *)(packet) + sizeof(struct ether_header))

#define IP_HDR(ip_packet) \
	((struct ip *)ip_packet)

#define	IP_HDR_LEN(ip_packet) \
	((IP_HDR(ip_packet)->ip_hl)<<2)

#define	IP_VERSION(ip_packet) \
	(IP_HDR(ip_packet)->ip_v)

#define	IP_TOTAL_LEN(ip_packet) \
	ntohs(IP_HDR(ip_packet)->ip_len)

#define IP_SADDR(ip_packet) \
	((IP_HDR(ip_packet)->ip_src).s_addr)

#define IP_DADDR(ip_packet) \
	((IP_HDR(ip_packet)->ip_dst).s_addr)

/*
	IP地址格式化输出,对应的格式化字符串如下:
	"%d.%d.%d.%d"
*/
#define _IP_ADDR_FORMAT(addr) \
	 (0x000000FF & (addr)), ((0x0000FF00 & (addr))>>8),  \
	 ((0x00FF0000 & (addr))>>16) ,((0xFF000000 & (addr))>>24) 

#define IP_SADDR_FORMAT(ip_packet) \
	_IP_ADDR_FORMAT(IP_SADDR(ip_packet))

#define IP_DADDR_FORMAT(ip_packet) \
	_IP_ADDR_FORMAT(IP_DADDR(ip_packet))

#define IP_ID(ip_packet) \
	(IP_HDR(ip_packet)->ip_id)

#define _IP_FRAG_OFF(ip_packet) \
	(IP_HDR(ip_packet)->ip_off)


#define IP_FRAG_OFF(ip_packet) \
	(ntohs(_IP_FRAG_OFF(ip_packet)) & IP_OFFMASK)

#define IP_FRAG_DONT(ip_packet) \
	((_IP_FRAG_OFF(ip_packet) & IP_DF) == IP_DF)

#define IP_FRAG_MORE(ip_packet) \
	((_IP_FRAG_OFF(ip_packet) & IP_MF) == IP_MF)

/*	未分片	*/
#define IP_FRAG_NO(ip_packet) \
	((IP_FRAG_OFF(ip_packet) == 0) && (IP_FRAG_MORE(ip_packet) == 0))
	
#define _IP_PROTO(ip_packet) \
	(IP_HDR(ip_packet)->ip_p)	

#define IP_PROTO_UDP(ip_packet) \
	((_IP_PROTO(ip_packet)) == IPPROTO_UDP)

#define IP_PROTO_TCP(ip_packet) \
	((_IP_PROTO(ip_packet)) == IPPROTO_TCP)

#define IP_PROTO_ICMP(ip_packet) \
    ((_IP_PROTO(ip_packet)) == IPPROTO_ICMP)

#define IP_PROTO_IGMP(ip_packet) \
    ((_IP_PROTO(ip_packet)) == IPPROTO_IGMP)

/*****************************************************************************/


/*
	调用之前,应该确保
	ETHER_TYPE_IP(packet),
	IP_PROTO_UDP(IP_HDR(IP_PACKET(packet)),
	IP_FRAG_OFF(IP_PACKET(packet)) == 0
	为真
*/
#define UDP_PACKET(packet) \
	((char *)(IP_PACKET(packet)) + IP_HDR_LEN(IP_PACKET(packet)))

#define UDP_HDR(udp_packet) \
	((struct udphdr *)(udp_packet))
	
#define UDP_SPORT(udp_packet) \
	ntohs(UDP_HDR(udp_packet)->uh_sport)
	
#define UDP_DPORT(udp_packet) \
	ntohs(UDP_HDR(udp_packet)->uh_dport)
	
#define UDP_LEN(udp_packet) \
	ntohs(UDP_HDR(udp_packet)->uh_ulen)


/*****************************************************************************/
	
/*
	调用之前,应该确保
	ETHER_TYPE_IP(packet),
	IP_PROTO_TCP(IP_HDR(IP_PACKET(packet)),
	IP_FRAG_OFF(IP_PACKET(packet)) == 0 
	为真
*/

#define TCP_PACKET(packet) \
	((char *)(IP_PACKET(packet)) + IP_HDR_LEN(IP_PACKET(packet)))

#define TCP_PACKET_FROMIP(ip_packet) \
	((char *)(ip_packet + IP_HDR_LEN(ip_packet)))


#define TCP_HDR(tcp_packet)	\
	((struct tcphdr *)(tcp_packet))
	
#define	TCP_SPORT(tcp_packet)	\
	ntohs(TCP_HDR(tcp_packet)->th_sport)

#define	TCP_DPORT(tcp_packet)	\
	ntohs(TCP_HDR(tcp_packet)->th_dport)

#define	TCP_SEQ(tcp_packet)	\
	ntohl(TCP_HDR(tcp_packet)->th_seq)
	
#define	TCP_SEQ_ACK(tcp_packet)	\
	ntohl(TCP_HDR(tcp_packet)->th_ack)
	
#define	TCP_ACK(tcp_packet)	\
	ntohl(TCP_HDR(tcp_packet)->th_ack)

#define	TCP_HDR_LEN(tcp_packet) \
	((TCP_HDR(tcp_packet)->th_off)<<2)

#define TCP_FLAGS(tcp_packet) \
	(TCP_HDR(tcp_packet)->th_flags)

#define _TCP_FLAG_SET(tcp_packet , flag) \
	((TCP_FLAGS(tcp_packet) & flag) == (flag))

#define	TCP_FLAG_ACK(tcp_packet) \
	(_TCP_FLAG_SET(tcp_packet , TH_ACK))
	
#define	TCP_FLAG_PSH(tcp_packet) \
	(_TCP_FLAG_SET(tcp_packet , TH_PUSH))
	
#define	TCP_FLAG_RST(tcp_packet) \
	(_TCP_FLAG_SET(tcp_packet , TH_RST))
	
#define	TCP_FLAG_SYN(tcp_packet) \
	(_TCP_FLAG_SET(tcp_packet , TH_SYN))
	
#define	TCP_FLAG_FIN(tcp_packet)	\
	(_TCP_FLAG_SET(tcp_packet , TH_FIN))

#endif		/*	#ifndef INET_H	*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -