Main Page | Modules | Class List | Directories | File List | Class Members | File Members | Related Pages

ip.h

Go to the documentation of this file.
00001 /*
00002  * ip.h
00003  *
00004  * Internet Protocol (RFC 791).
00005  *
00006  * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
00007  *
00008  * $Id: ip.h,v 1.25 2005/02/16 22:02:45 dugsong Exp $
00009  */
00010 
00011 #ifndef DNET_IP_H
00012 #define DNET_IP_H
00013 
00014 #define IP_ADDR_LEN     4               /* IP address length */
00015 #define IP_ADDR_BITS    32              /* IP address bits */
00016 
00017 #define IP_HDR_LEN      20              /* base IP header length */
00018 #define IP_OPT_LEN      2               /* base IP option length */
00019 #define IP_OPT_LEN_MAX  40
00020 #define IP_HDR_LEN_MAX  (IP_HDR_LEN + IP_OPT_LEN_MAX)
00021 
00022 #define IP_LEN_MAX      65535
00023 #define IP_LEN_MIN      IP_HDR_LEN
00024 
00025 typedef uint32_t        ip_addr_t;
00026 
00027 #ifndef __GNUC__
00028 # define __attribute__(x)
00029 # pragma pack(1)
00030 #endif
00031 
00032 /*
00033  * IP header, without options
00034  */
00035 struct ip_hdr {
00036 #if DNET_BYTESEX == DNET_BIG_ENDIAN
00037         uint8_t         ip_v:4,         /* version */
00038                         ip_hl:4;        /* header length (incl any options) */
00039 #elif DNET_BYTESEX == DNET_LIL_ENDIAN
00040         uint8_t         ip_hl:4,
00041                         ip_v:4;
00042 #else
00043 # error "need to include <dnet.h>"      
00044 #endif
00045         uint8_t         ip_tos;         /* type of service */
00046         uint16_t        ip_len;         /* total length (incl header) */
00047         uint16_t        ip_id;          /* identification */
00048         uint16_t        ip_off;         /* fragment offset and flags */
00049         uint8_t         ip_ttl;         /* time to live */
00050         uint8_t         ip_p;           /* protocol */
00051         uint16_t        ip_sum;         /* checksum */
00052         ip_addr_t       ip_src;         /* source address */
00053         ip_addr_t       ip_dst;         /* destination address */
00054 };
00055 
00056 /*
00057  * Type of service (ip_tos), RFC 1349 ("obsoleted by RFC 2474")
00058  */
00059 #define IP_TOS_DEFAULT          0x00    /* default */
00060 #define IP_TOS_LOWDELAY         0x10    /* low delay */
00061 #define IP_TOS_THROUGHPUT       0x08    /* high throughput */
00062 #define IP_TOS_RELIABILITY      0x04    /* high reliability */
00063 #define IP_TOS_LOWCOST          0x02    /* low monetary cost - XXX */
00064 #define IP_TOS_ECT              0x02    /* ECN-capable transport */
00065 #define IP_TOS_CE               0x01    /* congestion experienced */
00066 
00067 /*
00068  * IP precedence (high 3 bits of ip_tos), hopefully unused
00069  */
00070 #define IP_TOS_PREC_ROUTINE             0x00
00071 #define IP_TOS_PREC_PRIORITY            0x20
00072 #define IP_TOS_PREC_IMMEDIATE           0x40
00073 #define IP_TOS_PREC_FLASH               0x60
00074 #define IP_TOS_PREC_FLASHOVERRIDE       0x80
00075 #define IP_TOS_PREC_CRITIC_ECP          0xa0
00076 #define IP_TOS_PREC_INTERNETCONTROL     0xc0
00077 #define IP_TOS_PREC_NETCONTROL          0xe0
00078 
00079 /*
00080  * Fragmentation flags (ip_off)
00081  */
00082 #define IP_RF           0x8000          /* reserved */
00083 #define IP_DF           0x4000          /* don't fragment */
00084 #define IP_MF           0x2000          /* more fragments (not last frag) */
00085 #define IP_OFFMASK      0x1fff          /* mask for fragment offset */
00086 
00087 /*
00088  * Time-to-live (ip_ttl), seconds
00089  */
00090 #define IP_TTL_DEFAULT  64              /* default ttl, RFC 1122, RFC 1340 */
00091 #define IP_TTL_MAX      255             /* maximum ttl */
00092 
00093 /*
00094  * Protocol (ip_p) - http://www.iana.org/assignments/protocol-numbers
00095  */
00096 #define IP_PROTO_IP             0               /* dummy for IP */
00097 #define IP_PROTO_HOPOPTS        IP_PROTO_IP     /* IPv6 hop-by-hop options */
00098 #define IP_PROTO_ICMP           1               /* ICMP */
00099 #define IP_PROTO_IGMP           2               /* IGMP */
00100 #define IP_PROTO_GGP            3               /* gateway-gateway protocol */
00101 #define IP_PROTO_IPIP           4               /* IP in IP */
00102 #define IP_PROTO_ST             5               /* ST datagram mode */
00103 #define IP_PROTO_TCP            6               /* TCP */
00104 #define IP_PROTO_CBT            7               /* CBT */
00105 #define IP_PROTO_EGP            8               /* exterior gateway protocol */
00106 #define IP_PROTO_IGP            9               /* interior gateway protocol */
00107 #define IP_PROTO_BBNRCC         10              /* BBN RCC monitoring */
00108 #define IP_PROTO_NVP            11              /* Network Voice Protocol */
00109 #define IP_PROTO_PUP            12              /* PARC universal packet */
00110 #define IP_PROTO_ARGUS          13              /* ARGUS */
00111 #define IP_PROTO_EMCON          14              /* EMCON */
00112 #define IP_PROTO_XNET           15              /* Cross Net Debugger */
00113 #define IP_PROTO_CHAOS          16              /* Chaos */
00114 #define IP_PROTO_UDP            17              /* UDP */
00115 #define IP_PROTO_MUX            18              /* multiplexing */
00116 #define IP_PROTO_DCNMEAS        19              /* DCN measurement */
00117 #define IP_PROTO_HMP            20              /* Host Monitoring Protocol */
00118 #define IP_PROTO_PRM            21              /* Packet Radio Measurement */
00119 #define IP_PROTO_IDP            22              /* Xerox NS IDP */
00120 #define IP_PROTO_TRUNK1         23              /* Trunk-1 */
00121 #define IP_PROTO_TRUNK2         24              /* Trunk-2 */
00122 #define IP_PROTO_LEAF1          25              /* Leaf-1 */
00123 #define IP_PROTO_LEAF2          26              /* Leaf-2 */
00124 #define IP_PROTO_RDP            27              /* "Reliable Datagram" proto */
00125 #define IP_PROTO_IRTP           28              /* Inet Reliable Transaction */
00126 #define IP_PROTO_TP             29              /* ISO TP class 4 */
00127 #define IP_PROTO_NETBLT         30              /* Bulk Data Transfer */
00128 #define IP_PROTO_MFPNSP         31              /* MFE Network Services */
00129 #define IP_PROTO_MERITINP       32              /* Merit Internodal Protocol */
00130 #define IP_PROTO_SEP            33              /* Sequential Exchange proto */
00131 #define IP_PROTO_3PC            34              /* Third Party Connect proto */
00132 #define IP_PROTO_IDPR           35              /* Interdomain Policy Route */
00133 #define IP_PROTO_XTP            36              /* Xpress Transfer Protocol */
00134 #define IP_PROTO_DDP            37              /* Datagram Delivery Proto */
00135 #define IP_PROTO_CMTP           38              /* IDPR Ctrl Message Trans */
00136 #define IP_PROTO_TPPP           39              /* TP++ Transport Protocol */
00137 #define IP_PROTO_IL             40              /* IL Transport Protocol */
00138 #define IP_PROTO_IPV6           41              /* IPv6 */
00139 #define IP_PROTO_SDRP           42              /* Source Demand Routing */
00140 #define IP_PROTO_ROUTING        43              /* IPv6 routing header */
00141 #define IP_PROTO_FRAGMENT       44              /* IPv6 fragmentation header */
00142 #define IP_PROTO_RSVP           46              /* Reservation protocol */
00143 #define IP_PROTO_GRE            47              /* General Routing Encap */
00144 #define IP_PROTO_MHRP           48              /* Mobile Host Routing */
00145 #define IP_PROTO_ENA            49              /* ENA */
00146 #define IP_PROTO_ESP            50              /* Encap Security Payload */
00147 #define IP_PROTO_AH             51              /* Authentication Header */
00148 #define IP_PROTO_INLSP          52              /* Integated Net Layer Sec */
00149 #define IP_PROTO_SWIPE          53              /* SWIPE */
00150 #define IP_PROTO_NARP           54              /* NBMA Address Resolution */
00151 #define IP_PROTO_MOBILE         55              /* Mobile IP, RFC 2004 */
00152 #define IP_PROTO_TLSP           56              /* Transport Layer Security */
00153 #define IP_PROTO_SKIP           57              /* SKIP */
00154 #define IP_PROTO_ICMPV6         58              /* ICMP for IPv6 */
00155 #define IP_PROTO_NONE           59              /* IPv6 no next header */
00156 #define IP_PROTO_DSTOPTS        60              /* IPv6 destination options */
00157 #define IP_PROTO_ANYHOST        61              /* any host internal proto */
00158 #define IP_PROTO_CFTP           62              /* CFTP */
00159 #define IP_PROTO_ANYNET         63              /* any local network */
00160 #define IP_PROTO_EXPAK          64              /* SATNET and Backroom EXPAK */
00161 #define IP_PROTO_KRYPTOLAN      65              /* Kryptolan */
00162 #define IP_PROTO_RVD            66              /* MIT Remote Virtual Disk */
00163 #define IP_PROTO_IPPC           67              /* Inet Pluribus Packet Core */
00164 #define IP_PROTO_DISTFS         68              /* any distributed fs */
00165 #define IP_PROTO_SATMON         69              /* SATNET Monitoring */
00166 #define IP_PROTO_VISA           70              /* VISA Protocol */
00167 #define IP_PROTO_IPCV           71              /* Inet Packet Core Utility */
00168 #define IP_PROTO_CPNX           72              /* Comp Proto Net Executive */
00169 #define IP_PROTO_CPHB           73              /* Comp Protocol Heart Beat */
00170 #define IP_PROTO_WSN            74              /* Wang Span Network */
00171 #define IP_PROTO_PVP            75              /* Packet Video Protocol */
00172 #define IP_PROTO_BRSATMON       76              /* Backroom SATNET Monitor */
00173 #define IP_PROTO_SUNND          77              /* SUN ND Protocol */
00174 #define IP_PROTO_WBMON          78              /* WIDEBAND Monitoring */
00175 #define IP_PROTO_WBEXPAK        79              /* WIDEBAND EXPAK */
00176 #define IP_PROTO_EON            80              /* ISO CNLP */
00177 #define IP_PROTO_VMTP           81              /* Versatile Msg Transport*/
00178 #define IP_PROTO_SVMTP          82              /* Secure VMTP */
00179 #define IP_PROTO_VINES          83              /* VINES */
00180 #define IP_PROTO_TTP            84              /* TTP */
00181 #define IP_PROTO_NSFIGP         85              /* NSFNET-IGP */
00182 #define IP_PROTO_DGP            86              /* Dissimilar Gateway Proto */
00183 #define IP_PROTO_TCF            87              /* TCF */
00184 #define IP_PROTO_EIGRP          88              /* EIGRP */
00185 #define IP_PROTO_OSPF           89              /* Open Shortest Path First */
00186 #define IP_PROTO_SPRITERPC      90              /* Sprite RPC Protocol */
00187 #define IP_PROTO_LARP           91              /* Locus Address Resolution */
00188 #define IP_PROTO_MTP            92              /* Multicast Transport Proto */
00189 #define IP_PROTO_AX25           93              /* AX.25 Frames */
00190 #define IP_PROTO_IPIPENCAP      94              /* yet-another IP encap */
00191 #define IP_PROTO_MICP           95              /* Mobile Internet Ctrl */
00192 #define IP_PROTO_SCCSP          96              /* Semaphore Comm Sec Proto */
00193 #define IP_PROTO_ETHERIP        97              /* Ethernet in IPv4 */
00194 #define IP_PROTO_ENCAP          98              /* encapsulation header */
00195 #define IP_PROTO_ANYENC         99              /* private encryption scheme */
00196 #define IP_PROTO_GMTP           100             /* GMTP */
00197 #define IP_PROTO_IFMP           101             /* Ipsilon Flow Mgmt Proto */
00198 #define IP_PROTO_PNNI           102             /* PNNI over IP */
00199 #define IP_PROTO_PIM            103             /* Protocol Indep Multicast */
00200 #define IP_PROTO_ARIS           104             /* ARIS */
00201 #define IP_PROTO_SCPS           105             /* SCPS */
00202 #define IP_PROTO_QNX            106             /* QNX */
00203 #define IP_PROTO_AN             107             /* Active Networks */
00204 #define IP_PROTO_IPCOMP         108             /* IP Payload Compression */
00205 #define IP_PROTO_SNP            109             /* Sitara Networks Protocol */
00206 #define IP_PROTO_COMPAQPEER     110             /* Compaq Peer Protocol */
00207 #define IP_PROTO_IPXIP          111             /* IPX in IP */
00208 #define IP_PROTO_VRRP           112             /* Virtual Router Redundancy */
00209 #define IP_PROTO_PGM            113             /* PGM Reliable Transport */
00210 #define IP_PROTO_ANY0HOP        114             /* 0-hop protocol */
00211 #define IP_PROTO_L2TP           115             /* Layer 2 Tunneling Proto */
00212 #define IP_PROTO_DDX            116             /* D-II Data Exchange (DDX) */
00213 #define IP_PROTO_IATP           117             /* Interactive Agent Xfer */
00214 #define IP_PROTO_STP            118             /* Schedule Transfer Proto */
00215 #define IP_PROTO_SRP            119             /* SpectraLink Radio Proto */
00216 #define IP_PROTO_UTI            120             /* UTI */
00217 #define IP_PROTO_SMP            121             /* Simple Message Protocol */
00218 #define IP_PROTO_SM             122             /* SM */
00219 #define IP_PROTO_PTP            123             /* Performance Transparency */
00220 #define IP_PROTO_ISIS           124             /* ISIS over IPv4 */
00221 #define IP_PROTO_FIRE           125             /* FIRE */
00222 #define IP_PROTO_CRTP           126             /* Combat Radio Transport */
00223 #define IP_PROTO_CRUDP          127             /* Combat Radio UDP */
00224 #define IP_PROTO_SSCOPMCE       128             /* SSCOPMCE */
00225 #define IP_PROTO_IPLT           129             /* IPLT */
00226 #define IP_PROTO_SPS            130             /* Secure Packet Shield */
00227 #define IP_PROTO_PIPE           131             /* Private IP Encap in IP */
00228 #define IP_PROTO_SCTP           132             /* Stream Ctrl Transmission */
00229 #define IP_PROTO_FC             133             /* Fibre Channel */
00230 #define IP_PROTO_RSVPIGN        134             /* RSVP-E2E-IGNORE */
00231 #define IP_PROTO_RAW            255             /* Raw IP packets */
00232 #define IP_PROTO_RESERVED       IP_PROTO_RAW    /* Reserved */
00233 #define IP_PROTO_MAX            255
00234 
00235 /*
00236  * Option types (opt_type) - http://www.iana.org/assignments/ip-parameters
00237  */
00238 #define IP_OPT_CONTROL          0x00            /* control */
00239 #define IP_OPT_DEBMEAS          0x40            /* debugging & measurement */
00240 #define IP_OPT_COPY             0x80            /* copy into all fragments */
00241 #define IP_OPT_RESERVED1        0x20
00242 #define IP_OPT_RESERVED2        0x60
00243 
00244 #define IP_OPT_EOL        0                     /* end of option list */
00245 #define IP_OPT_NOP        1                     /* no operation */
00246 #define IP_OPT_SEC       (2|IP_OPT_COPY)        /* DoD basic security */
00247 #define IP_OPT_LSRR      (3|IP_OPT_COPY)        /* loose source route */
00248 #define IP_OPT_TS        (4|IP_OPT_DEBMEAS)     /* timestamp */
00249 #define IP_OPT_ESEC      (5|IP_OPT_COPY)        /* DoD extended security */
00250 #define IP_OPT_CIPSO     (6|IP_OPT_COPY)        /* commercial security */
00251 #define IP_OPT_RR         7                     /* record route */
00252 #define IP_OPT_SATID     (8|IP_OPT_COPY)        /* stream ID (obsolete) */
00253 #define IP_OPT_SSRR      (9|IP_OPT_COPY)        /* strict source route */
00254 #define IP_OPT_ZSU       10                     /* experimental measurement */
00255 #define IP_OPT_MTUP      11                     /* MTU probe */
00256 #define IP_OPT_MTUR      12                     /* MTU reply */
00257 #define IP_OPT_FINN     (13|IP_OPT_COPY|IP_OPT_DEBMEAS) /* exp flow control */
00258 #define IP_OPT_VISA     (14|IP_OPT_COPY)        /* exp access control */
00259 #define IP_OPT_ENCODE    15                     /* ??? */
00260 #define IP_OPT_IMITD    (16|IP_OPT_COPY)        /* IMI traffic descriptor */
00261 #define IP_OPT_EIP      (17|IP_OPT_COPY)        /* extended IP, RFC 1385 */
00262 #define IP_OPT_TR       (18|IP_OPT_DEBMEAS)     /* traceroute */
00263 #define IP_OPT_ADDEXT   (19|IP_OPT_COPY)        /* IPv7 ext addr, RFC 1475 */
00264 #define IP_OPT_RTRALT   (20|IP_OPT_COPY)        /* router alert, RFC 2113 */
00265 #define IP_OPT_SDB      (21|IP_OPT_COPY)        /* directed bcast, RFC 1770 */
00266 #define IP_OPT_NSAPA    (22|IP_OPT_COPY)        /* NSAP addresses */
00267 #define IP_OPT_DPS      (23|IP_OPT_COPY)        /* dynamic packet state */
00268 #define IP_OPT_UMP      (24|IP_OPT_COPY)        /* upstream multicast */
00269 #define IP_OPT_MAX       25
00270 
00271 #define IP_OPT_COPIED(o)        ((o) & 0x80)
00272 #define IP_OPT_CLASS(o)         ((o) & 0x60)
00273 #define IP_OPT_NUMBER(o)        ((o) & 0x1f)
00274 #define IP_OPT_TYPEONLY(o)      ((o) == IP_OPT_EOL || (o) == IP_OPT_NOP)
00275 
00276 /*
00277  * Security option data - RFC 791, 3.1
00278  */
00279 struct ip_opt_data_sec {
00280         uint16_t        s;              /* security */
00281         uint16_t        c;              /* compartments */
00282         uint16_t        h;              /* handling restrictions */
00283         uint8_t         tcc[3];         /* transmission control code */
00284 } __attribute__((__packed__));
00285 
00286 #define IP_OPT_SEC_UNCLASS      0x0000  /* unclassified */
00287 #define IP_OPT_SEC_CONFID       0xf135  /* confidential */
00288 #define IP_OPT_SEC_EFTO         0x789a  /* EFTO */
00289 #define IP_OPT_SEC_MMMM         0xbc4d  /* MMMM */
00290 #define IP_OPT_SEC_PROG         0x5e26  /* PROG */
00291 #define IP_OPT_SEC_RESTR        0xaf13  /* restricted */
00292 #define IP_OPT_SEC_SECRET       0xd788  /* secret */
00293 #define IP_OPT_SEC_TOPSECRET    0x6bc5  /* top secret */
00294 
00295 /*
00296  * {Loose Source, Record, Strict Source} Route option data - RFC 791, 3.1
00297  */
00298 struct ip_opt_data_rr {
00299         uint8_t         ptr;            /* from start of option, >= 4 */
00300         uint32_t        iplist __flexarr; /* list of IP addresses */
00301 } __attribute__((__packed__));
00302 
00303 /*
00304  * Timestamp option data - RFC 791, 3.1
00305  */
00306 struct ip_opt_data_ts {
00307         uint8_t         ptr;            /* from start of option, >= 5 */
00308 #if DNET_BYTESEX == DNET_BIG_ENDIAN
00309         uint8_t         oflw:4,         /* number of IPs skipped */
00310                         flg:4;          /* address[ / timestamp] flag */
00311 #elif DNET_BYTESEX == DNET_LIL_ENDIAN
00312         uint8_t         flg:4,
00313                         oflw:4;
00314 #endif
00315         uint32_t        ipts __flexarr; /* IP address [/ timestamp] pairs */
00316 } __attribute__((__packed__));
00317 
00318 #define IP_OPT_TS_TSONLY        0       /* timestamps only */
00319 #define IP_OPT_TS_TSADDR        1       /* IP address / timestamp pairs */
00320 #define IP_OPT_TS_PRESPEC       3       /* IP address / zero timestamp pairs */
00321 
00322 /*
00323  * Traceroute option data - RFC 1393, 2.2
00324  */
00325 struct ip_opt_data_tr {
00326         uint16_t        id;             /* ID number */
00327         uint16_t        ohc;            /* outbound hop count */
00328         uint16_t        rhc;            /* return hop count */
00329         uint32_t        origip;         /* originator IP address */
00330 } __attribute__((__packed__));
00331 
00332 /*
00333  * IP option (following IP header)
00334  */
00335 struct ip_opt {
00336         uint8_t         opt_type;       /* option type */
00337         uint8_t         opt_len;        /* option length >= IP_OPT_LEN */
00338         union ip_opt_data {
00339                 struct ip_opt_data_sec  sec;       /* IP_OPT_SEC */
00340                 struct ip_opt_data_rr   rr;        /* IP_OPT_{L,S}RR */
00341                 struct ip_opt_data_ts   ts;        /* IP_OPT_TS */
00342                 uint16_t                satid;     /* IP_OPT_SATID */
00343                 uint16_t                mtu;       /* IP_OPT_MTU{P,R} */
00344                 struct ip_opt_data_tr   tr;        /* IP_OPT_TR */
00345                 uint32_t                addext[2]; /* IP_OPT_ADDEXT */
00346                 uint16_t                rtralt;    /* IP_OPT_RTRALT */
00347                 uint32_t                sdb[9];    /* IP_OPT_SDB */
00348                 uint8_t                 data8[IP_OPT_LEN_MAX - IP_OPT_LEN];
00349         } opt_data;
00350 } __attribute__((__packed__));
00351 
00352 #ifndef __GNUC__
00353 # pragma pack()
00354 #endif
00355 
00356 /*
00357  * Classful addressing
00358  */
00359 #define IP_CLASSA(i)            (((uint32_t)(i) & htonl(0x80000000)) == \
00360                                  htonl(0x00000000))
00361 #define IP_CLASSA_NET           (htonl(0xff000000))
00362 #define IP_CLASSA_NSHIFT        24
00363 #define IP_CLASSA_HOST          (htonl(0x00ffffff))
00364 #define IP_CLASSA_MAX           128
00365 
00366 #define IP_CLASSB(i)            (((uint32_t)(i) & htonl(0xc0000000)) == \
00367                                  htonl(0x80000000))
00368 #define IP_CLASSB_NET           (htonl(0xffff0000))
00369 #define IP_CLASSB_NSHIFT        16
00370 #define IP_CLASSB_HOST          (htonl(0x0000ffff))
00371 #define IP_CLASSB_MAX           65536
00372 
00373 #define IP_CLASSC(i)            (((uint32_t)(i) & htonl(0xe0000000)) == \
00374                                  htonl(0xc0000000))
00375 #define IP_CLASSC_NET           (htonl(0xffffff00))
00376 #define IP_CLASSC_NSHIFT        8
00377 #define IP_CLASSC_HOST          (htonl(0x000000ff))
00378 
00379 #define IP_CLASSD(i)            (((uint32_t)(i) & htonl(0xf0000000)) == \
00380                                  htonl(0xe0000000))
00381 /* These ones aren't really net and host fields, but routing needn't know. */
00382 #define IP_CLASSD_NET           (htonl(0xf0000000))
00383 #define IP_CLASSD_NSHIFT        28
00384 #define IP_CLASSD_HOST          (htonl(0x0fffffff))
00385 #define IP_MULTICAST(i)         IP_CLASSD(i)
00386 
00387 #define IP_EXPERIMENTAL(i)      (((uint32_t)(i) & htonl(0xf0000000)) == \
00388                                  htonl(0xf0000000))
00389 #define IP_BADCLASS(i)          (((uint32_t)(i) & htonl(0xf0000000)) == \
00390                                  htonl(0xf0000000))
00391 #define IP_LOCAL_GROUP(i)       (((uint32_t)(i) & htonl(0xffffff00)) == \
00392                                  htonl(0xe0000000))
00393 /*
00394  * Reserved addresses
00395  */
00396 #define IP_ADDR_ANY             (htonl(0x00000000))     /* 0.0.0.0 */
00397 #define IP_ADDR_BROADCAST       (htonl(0xffffffff))     /* 255.255.255.255 */
00398 #define IP_ADDR_LOOPBACK        (htonl(0x7f000001))     /* 127.0.0.1 */
00399 #define IP_ADDR_MCAST_ALL       (htonl(0xe0000001))     /* 224.0.0.1 */
00400 #define IP_ADDR_MCAST_LOCAL     (htonl(0xe00000ff))     /* 224.0.0.255 */
00401 
00402 #define ip_pack_hdr(hdr, tos, len, id, off, ttl, p, src, dst) do {      \
00403         struct ip_hdr *ip_pack_p = (struct ip_hdr *)(hdr);              \
00404         ip_pack_p->ip_v = 4; ip_pack_p->ip_hl = 5;                      \
00405         ip_pack_p->ip_tos = tos; ip_pack_p->ip_len = htons(len);        \
00406         ip_pack_p->ip_id = htons(id); ip_pack_p->ip_off = htons(off);   \
00407         ip_pack_p->ip_ttl = ttl; ip_pack_p->ip_p = p;                   \
00408         ip_pack_p->ip_src = src; ip_pack_p->ip_dst = dst;               \
00409 } while (0)
00410 
00411 typedef struct ip_handle ip_t;
00412 
00413 __BEGIN_DECLS
00414 ip_t    *ip_open(void);
00415 ssize_t  ip_send(ip_t *i, const void *buf, size_t len);
00416 ip_t    *ip_close(ip_t *i);
00417 
00418 char    *ip_ntop(const ip_addr_t *ip, char *dst, size_t len);
00419 int      ip_pton(const char *src, ip_addr_t *dst);
00420 char    *ip_ntoa(const ip_addr_t *ip);
00421 #define  ip_aton ip_pton
00422 
00423 ssize_t  ip_add_option(void *buf, size_t len,
00424             int proto, const void *optbuf, size_t optlen);
00425 void     ip_checksum(void *buf, size_t len);
00426 
00427 int      ip_cksum_add(const void *buf, size_t len, int cksum);
00428 #define  ip_cksum_carry(x) \
00429             (x = (x >> 16) + (x & 0xffff), (~(x + (x >> 16)) & 0xffff))
00430 __END_DECLS
00431 
00432 #endif /* DNET_IP_H */

Generated on Sun May 14 14:51:10 2006 by  doxygen 1.4.2