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

📄 ip.h

📁 基于nucleus操作系统的GPRS无线数据传输终端全套源文件。包括支持ARM7的BSP,操作系统
💻 H
字号:
/**************************************************************************
*                                                                          
*      Copyright (c) 1993 - 2001 by Accelerated Technology, Inc.           
*                                                                          
* PROPRIETARY RIGHTS of Accelerated Technology are involved in the subject 
* matter of this material.  All manufacturing, reproduction, use and sales 
* rights pertaining to this subject matter are governed by the license     
* agreement.  The recipient of this software implicity accepts the terms   
* of the license.                                                          
*                                                                          
****************************************************************************/
/**************************************************************************
*                                                                          
* FILENAME                                         VERSION                         
*                                                                                  
*      IP.H                                          4.4                           
*                                                                                  
* DESCRIPTION                                                              
*                                                                          
*      This include file will handle defines relating to the IP layer.     
*                                                                          
* DATA STRUCTURES                                                          
*                                                                          
*      IP_LAYER
*      PSEUDOTCP
*      IP_FRAG
*      IP_QUEUE_ELEMENT                                                    
*      IP_QUEUE                                                            
*      _IP_MULTI                                                           
*      _IP_MULTI_OPTIONS                                                   
*                                                                          
* DEPENDENCIES                                                             
*                                                                          
*      No other file dependencies                                          
*                                                                          
****************************************************************************/
#ifndef IP_H
#define IP_H

#include "net\inc\rtab.h"
#include "net\inc\mem_defs.h"

#ifdef          __cplusplus
extern  "C" {                               /* C declarations in C++     */
#endif /* _cplusplus */

/***********************************************************************/
/*   Internet protocol
*
*/
typedef struct iph
{
    UINT8  ip_versionandhdrlen; /* I prefer to OR them myself */
                                /* each half is four bits */
    UINT8  ip_service;          /* type of service for IP */
    UINT16 ip_tlen;             /* total length of IP packet */
    UINT16 ip_ident;            /* these are all BYTE-SWAPPED! */
    UINT16 ip_frags;            /* combination of flags and value */
    UINT8  ip_ttl;              /* time to live */
    UINT8  ip_protocol;         /* higher level protocol type */
    UINT16 ip_check;            /* header checksum, byte-swapped */
    UINT32 ip_src;              /* IP source address */
    UINT32 ip_dest;             /* IP destination address */
} IPLAYER;

/*
*  used for computing checksums in TCP
*/
struct pseudotcp
{
    UINT32  source;     /* Source IP address. */
    UINT32  dest;       /* Destination IP address. */
    UINT8   z;          /* zero */
    UINT8   proto;      /* protocol number */
    UINT16  tcplen;     /* byte-swapped length field */
};


typedef struct IP_FRAG_STRUCT {
    UINT8                   ipf_hl;        /* version and header length */
    UINT8                   ipf_mff;       /* overlays IP TOS: use low bit to 
                                              avoid destroying tos; copied from
                                              (ip service & IP_MF) */
    UINT16                  ipf_tlen;         
    UINT16                  ipf_id;         
    UINT16                  ipf_off;       /* Contains only the fragment offset,
                                              unlike the normal IP field which 
                                              contains offset and flags fields. 
                                            */
    UINT8                   ipf_ttl;
    UINT8                   ipf_buf_offset; /* The protocol field is used to 
                                               store the offset of the IP layer 
                                               from the start of the memory 
                                               buffer.
                                            */
    UINT16                  ipf_check;
    struct IP_FRAG_STRUCT   *ipf_next;
    struct IP_FRAG_STRUCT   *ipf_prev;
} HUGE IP_FRAG;

typedef struct _IP_QUEUE_ELEMENT {
    struct _IP_QUEUE_ELEMENT    *ipq_next;
    struct _IP_QUEUE_ELEMENT    *ipq_prev;
    IP_FRAG                     *ipq_first_frag;
    UINT32                      ipq_source;
    UINT32                      ipq_dest;
    UINT16                      ipq_id;
    UINT8                       ipq_protocol;
    UINT8                       ipq_pad;  /* The pad is added to make this
                                             structure an even number of long
                                             words.
                                           */
} IP_QUEUE_ELEMENT;

typedef struct _IP_QUEUE
{
     IP_QUEUE_ELEMENT       *ipq_head;
     IP_QUEUE_ELEMENT       *ipq_tail;
} IP_QUEUE;



struct _IP_MULTI
{
    UINT32              ipm_addr;
    DV_DEVICE_ENTRY     *ipm_device;
    UINT32              ipm_refcount;
    UINT32              ipm_timer;
    IP_MULTI            *ipm_next;
};

#define     IP_MAX_MEMBERSHIPS          10

struct _IP_MULTI_OPTIONS
{
    DV_DEVICE_ENTRY     *ipo_device;
    IP_MULTI            *ipo_membership[IP_MAX_MEMBERSHIPS];
    UINT8               ipo_ttl;
    UINT8               ipo_loop;
    UINT8               ipo_num_mem;
    UINT8               pad1;
};


/* Define the MAX size of data that can be contained in one IP packet. */
#define IP_MAX_DATA_SIZE                65496


/* Multicast definitions. */
#define IP_DEFAULT_MULTICAST_TTL        1  /* By default keep multicast packets
                                              on the local segment. */
#define IP_DEFAULT_MULTICAST_LOOP       0  /* Loop back is not yet supported. */


/* RFC 1122 recommends a default ttl for fragments of 60 to 120 seconds. */
#define IP_FRAG_TTL     ((UINT32)(SCK_Ticks_Per_Second * 60))


/* The following macro returns a pointer to the IP header within a buffer. */
#define IP_BUFF_TO_IP(buff_ptr) \
        (IPLAYER *)(buff_ptr->data_ptr - sizeof(IPLAYER))


#define IP_FORWARDING       (1<<0)
#define IP_RAWOUTPUT        (1<<1)
#define IP_ROUTETOIF        (1<<2)
#define IP_ALLOWBROADCAST   (1<<3)


#define IP_VERSION      0x4

#define IP_DF           0x4000      /* don't fragment flag */
#define IP_MF           0x2000      /* more fragments flag */

#define IP_ADDR_ANY             0x0UL
#define IP_ADDR_BROADCAST       0xFFFFFFFFUL

#define IP_TIME_TO_LIVE     30
#define IP_TYPE_OF_SERVICE  0

/* Length of IP address in bytes */
#define IP_ADDR_LEN        4

#define IP_CLASSA_ADDR(i)        (((long)(i) & 0x80000000ul) == 0)
#define IP_CLASSB_ADDR(i)        (((long)(i) & 0xc0000000ul) == 0x80000000ul)
#define IP_CLASSC_ADDR(i)        (((long)(i) & 0xe0000000ul) == 0xc0000000ul)
#define IP_CLASSD_ADDR(i)        (((long)(i) & 0xf0000000ul) == 0xe0000000ul)
#define IP_MULTICAST_ADDR(i)     IP_CLASSD_ADDR(i)
#define IP_EXPERIMENTAL_ADDR(i)  (((long)(i) & 0xf0000000ul) == 0xf0000000ul)

#define IP_ADDR(a)  TLS_IP_Address(a)
#define IP_ADDR_COPY(dest, src)  ((UINT8 *)(dest))[0] = ((UINT8 *)(src))[0]; \
                                 ((UINT8 *)(dest))[1] = ((UINT8 *)(src))[1]; \
                                 ((UINT8 *)(dest))[2] = ((UINT8 *)(src))[2]; \
                                 ((UINT8 *)(dest))[3] = ((UINT8 *)(src))[3]

#define IP_HEADER_COPY(dest, src)                                           \
        /* Copy the IP header over. We will do this 32 bits at a time. */   \
                                                                            \
        /* Version, header length, TOS, and Total Length. */                \
        PUT32 ((UINT8 *) dest, IP_VERSIONANDHDRLEN_OFFSET,                  \
                    GET32 ((UINT8 *)src, IP_VERSIONANDHDRLEN_OFFSET));      \
                                                                            \
        /* ID, Flags, and Fragments */                                      \
        PUT32 ((UINT8 *)dest, IP_IDENT_OFFSET,                              \
                    GET32 ((UINT8 *)src, IP_IDENT_OFFSET));                 \
                                                                            \
        /* Time To Live, Protocol, and Header checksum. */                  \
        PUT32 ((UINT8 *)dest, IP_TTL_OFFSET,                                \
                    GET32 ((UINT8 *)src, IP_TTL_OFFSET));                   \
                                                                            \
        /* Source Address. */                                               \
        PUT32 ((UINT8 *)dest, IP_SRC_OFFSET,                                \
                    GET32 ((UINT8 *)src, IP_SRC_OFFSET));                   \
                                                                            \
        /* Destination Address. */                                          \
        PUT32 ((UINT8 *)dest, IP_DEST_OFFSET,                               \
                    GET32 ((UINT8 *)src, IP_DEST_OFFSET));

/* The Standard protocol types for IP packets. */
#define IP_UDP_PROT     17
#define IP_TCP_PROT     6
#define IP_ICMP_PROT    1
#define IP_IGMP_PROT    2
#define IP_RAW_PROT     255
#define IP_HELLO_PROT   63
#define IP_OSPF_PROT    89

/*
 * Definitions for options.
 */
#define IP_OPT_COPIED(o)        ((o)&0x80)
#define IP_OPT_CLASS(o)         ((o)&0x60)
#define IP_OPT_NUMBER(o)        ((o)&0x1f)

#define IP_OPT_CONTROL      0x00
#define IP_OPT_RESERVED1    0x20
#define IP_OPT_DEBMEAS      0x40
#define IP_OPT_RESERVED2    0x60

#define IP_OPT_EOL          0       /* end of option list */
#define IP_OPT_NOP          1       /* no operation */

#define IP_OPT_RR           7       /* record packet route */
#define IP_OPT_TS           68      /* timestamp */
#define IP_OPT_SECURITY     130     /* provide s,c,h,tcc */
#define IP_OPT_LSRR         131     /* loose source route */
#define IP_OPT_SATID        136     /* satnet id */
#define IP_OPT_SSRR         137     /* strict source route */

/*
 * Offsets to fields in options other than EOL and NOP.
 */
#define IP_OPT_OPTVAL       0       /* option ID */
#define IP_OPT_OLEN         1       /* option length */
#define IP_OPT_OFFSET       2       /* offset within option */
#define IP_OPT_MINOFF       4       /* min value of above */


/* External declarations. */
extern UINT8 IP_Brd_Cast[IP_ADDR_LEN];
extern UINT8 IP_Null[IP_ADDR_LEN];
extern const UINT8   IP_A_Mask[4];
extern const UINT8   IP_B_Mask[4];
extern const UINT8   IP_C_Mask[4];

/* Function prototypes. */
VOID   IP_Initialize(VOID);
STATUS IP_Interpret (IPLAYER *p, DV_DEVICE_ENTRY *device, NET_BUFFER *buf_ptr);
STATUS IP_Send(NET_BUFFER *buf_ptr, RTAB_ROUTE *ro, UINT32 dest_ip, UINT32 src_ip,
               INT32 flags, INT ttl, INT protocol, INT tos, 
               IP_MULTI_OPTIONS *mopt);
VOID   IP_Find_Route(RTAB_ROUTE *ro);
STATUS IP_Forward(NET_BUFFER *buf_ptr);
STATUS IP_Canforward(UINT32 dest);
STATUS IP_Get_Net_Mask(UINT8 *ip_addr, UINT8 *mask);
NET_BUFFER *IP_Reassembly(IP_FRAG *, IP_QUEUE_ELEMENT *, NET_BUFFER *);
VOID IP_Reassembly_Event(IP_QUEUE_ELEMENT *);
VOID IP_Free_Queue_Element(IP_QUEUE_ELEMENT *);
VOID IP_Insert_Frag(IP_FRAG *ip, IP_QUEUE_ELEMENT *);
VOID IP_Remove_Frag(IP_FRAG *ip, IP_QUEUE_ELEMENT *);
INT  IP_Broadcast_Addr(UINT32 dest, DV_DEVICE_ENTRY *int_face);
STATUS IP_Fragment (NET_BUFFER *, IPLAYER *, DV_DEVICE_ENTRY *, 
                    SCK_SOCKADDR_IP *, RTAB_ROUTE *);
INT IP_Option_Copy (IPLAYER *dip, IPLAYER *sip);

STATUS   IP_Set_Opt (INT, INT, void *, INT);
STATUS IP_Set_IP_Opt(INT socketd, INT optname, VOID *optval, INT optlen);
STATUS IP_Set_Raw_Opt(INT socketd, INT optname, void *optval, INT optlen);
IP_MULTI *IP_Lookup_Multi(UINT32 m_addr, DEV_IF_ADDRESS *if_addr);
STATUS   IP_Set_Multi_Opt(INT, INT, void *, INT);
IP_MULTI *IP_Add_Multi(UINT32 m_addr, DV_DEVICE_ENTRY *dev);
STATUS   IP_Delete_Multi(IP_MULTI *ipm);
STATUS   IP_Get_Multi_Opt(INT, INT, void *, INT *);
STATUS   IP_Get_IP_Opt(INT, INT, void *, INT *);
STATUS   IP_Get_Opt (INT, INT, void *, INT *);
INT      IP_Localaddr(UINT32 ip_addr);


#define RTFREE(x)

#define IP_VERSIONANDHDRLEN_OFFSET  0
#define IP_SERVICE_OFFSET           1
#define IP_TLEN_OFFSET              2
#define IP_IDENT_OFFSET             4
#define IP_FRAGS_OFFSET             6
#define IP_TTL_OFFSET               8
#define IP_PROTOCOL_OFFSET          9
#define IP_CHECK_OFFSET             10
#define IP_SRC_OFFSET               12
#define IP_DEST_OFFSET              16

#define IPF_HL_OFFSET               0
#define IPF_MFF_OFFSET              1
#define IPF_TLEN_OFFSET             2
#define IPF_ID_OFFSET               4
#define IPF_OFF_OFFSET              6
#define IPF_TTL_OFFSET              8
#define IPF_BUF_OFFSET              9
#define IPF_CHECK_OFFSET            10
#define IPF_NEXT_OFFSET             12
#define IPF_PREV_OFFSET             16

#ifdef          __cplusplus
}
#endif /* _cplusplus */

#endif /* IP_H */

⌨️ 快捷键说明

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