www.pudn.com > uCOSII上实现的tcpip.rar > zipv4.h


#ifndef _ZIPV4_H
#define _ZIPV4_H

#include "zarch.h"
#include "zdef.h"
#include "zbuffer.h"
#include "znetif.h"

#define ETH_HEAD_LEN 14
#define IP_HEAD_LEN	20

#define IP_PROTO_ICMP 1
#define IP_PROTO_UDP 17
#define IP_PROTO_UDPLITE 170
#define IP_PROTO_TCP 6

#define IP_OFFMASK 0x1fff   /* mask for fragmenting bits */
#define IP_MF 0x2000        /* more fragments flag */
#define IP_DF 0x4000        /* dont fragment flag */



STRUCT_BEGIN
typedef struct _ip_header 
{
	u16_t 		_v_hl_tos;
	u16_t 		_len;

	/* identification */
	u16_t _id;

	/* fragment offset field */
	u16_t _offset;

   	/* time to live / protocol*/
	u16_t _ttl_proto;

	/* checksum */
	u16_t _chksum;
	/* source and destination IP addresses */
	ipaddr_t src_ipaddr;
	ipaddr_t dest_ipaddr;

}ip_header_t;
STRUCT_END


#define NTOHS	
#define HTONS

#define IPH_V(hdr)  (NTOHS((hdr)->_v_hl_tos) >> 12)
#define IPH_HL(hdr) ((NTOHS((hdr)->_v_hl_tos) >> 8) & 0x0f)
#define IPH_TOS(hdr) HTONS((NTOHS((hdr)->_v_hl_tos) & 0xff))
#define IPH_LEN(hdr) ((hdr)->_len)
#define IPH_ID(hdr) ((hdr)->_id)
#define IPH_OFFSET(hdr) ((hdr)->_offset)
#define IPH_TTL(hdr) (NTOHS((hdr)->_ttl_proto) >> 8)
#define IPH_PROTO(hdr) (NTOHS((hdr)->_ttl_proto) & 0xff)
#define IPH_CHKSUM(hdr) ((hdr)->_chksum)
#define IPH_VHLTOS_SET(hdr, v, hl, tos) (hdr)->_v_hl_tos = HTONS(((v) << 12) | ((hl) << 8) | (tos))
#define IPH_LEN_SET(hdr, len) (hdr)->_len = (len)
#define IPH_ID_SET(hdr, id) (hdr)->_id = (id)
#define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off)
#define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl_proto = HTONS(IPH_PROTO(hdr) | ((ttl) << 8))
#define IPH_PROTO_SET(hdr, proto) (hdr)->_ttl_proto = HTONS((proto) | (IPH_TTL(hdr) << 8))
#define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum)


#define ip_addr_maskcmp(addr1, addr2, mask) (((addr1) & \
						(mask)) == \
				((addr2) & \
				 (mask)))
		
#define ip_addr_isbroadcast(addr1, mask) (((((addr1)) & ~((mask))) == \
						(0xffffffff & ~((mask)))) || \
				((addr1) == 0xffffffff) || \
				((addr1) == 0x00000000))


#define ip_addr_ismulticast(addr1) (((addr1) & ntohl(0xf0000000)) == ntohl(0xe0000000))


extern u8_t 	ip_input(znetif_t *pnetif, zbuffer_t *pbuffer);
extern u16_t	inet_chksum(void *pdata, u16_t len);
extern u16_t 	inet_chksum_pseudo(zbuffer_t *, ipaddr_t *, ipaddr_t *, u8_t, u16_t);
extern u16_t	ip_id;
#endif