1 /* 2 * ip.h 3 * 4 * Internet Protocol (RFC 791). 5 * 6 * Copyright (c) 2000 Dug Song <dugsong@monkey.org> 7 * 8 * $Id: ip.h 594 2005-02-16 22:02:45Z dugsong $ 9 */ 10 11 #ifndef DNET_IP_H 12 #define DNET_IP_H 13 14 #define IP_ADDR_LEN 4 /* IP address length */ 15 #define IP_ADDR_BITS 32 /* IP address bits */ 16 17 #define IP_HDR_LEN 20 /* base IP header length */ 18 #define IP_OPT_LEN 2 /* base IP option length */ 19 #define IP_OPT_LEN_MAX 40 20 #define IP_HDR_LEN_MAX (IP_HDR_LEN + IP_OPT_LEN_MAX) 21 22 #define IP_LEN_MAX 65535 23 #define IP_LEN_MIN IP_HDR_LEN 24 25 typedef uint32_t ip_addr_t; 26 27 #ifndef __GNUC__ 28 #ifndef __attribute__ 29 # define __attribute__(x) 30 #endif 31 # pragma pack(1) 32 #endif 33 34 /* 35 * IP header, without options 36 */ 37 struct ip_hdr { 38 #if DNET_BYTESEX == DNET_BIG_ENDIAN 39 uint8_t ip_v:4, /* version */ 40 ip_hl:4; /* header length (incl any options) */ 41 #elif DNET_BYTESEX == DNET_LIL_ENDIAN 42 uint8_t ip_hl:4, 43 ip_v:4; 44 #else 45 # error "need to include <dnet.h>" 46 #endif 47 uint8_t ip_tos; /* type of service */ 48 uint16_t ip_len; /* total length (incl header) */ 49 uint16_t ip_id; /* identification */ 50 uint16_t ip_off; /* fragment offset and flags */ 51 uint8_t ip_ttl; /* time to live */ 52 uint8_t ip_p; /* protocol */ 53 uint16_t ip_sum; /* checksum */ 54 ip_addr_t ip_src; /* source address */ 55 ip_addr_t ip_dst; /* destination address */ 56 }; 57 58 /* 59 * Type of service (ip_tos), RFC 1349 ("obsoleted by RFC 2474") 60 */ 61 #define IP_TOS_DEFAULT 0x00 /* default */ 62 #define IP_TOS_LOWDELAY 0x10 /* low delay */ 63 #define IP_TOS_THROUGHPUT 0x08 /* high throughput */ 64 #define IP_TOS_RELIABILITY 0x04 /* high reliability */ 65 #define IP_TOS_LOWCOST 0x02 /* low monetary cost - XXX */ 66 #define IP_TOS_ECT 0x02 /* ECN-capable transport */ 67 #define IP_TOS_CE 0x01 /* congestion experienced */ 68 69 /* 70 * IP precedence (high 3 bits of ip_tos), hopefully unused 71 */ 72 #define IP_TOS_PREC_ROUTINE 0x00 73 #define IP_TOS_PREC_PRIORITY 0x20 74 #define IP_TOS_PREC_IMMEDIATE 0x40 75 #define IP_TOS_PREC_FLASH 0x60 76 #define IP_TOS_PREC_FLASHOVERRIDE 0x80 77 #define IP_TOS_PREC_CRITIC_ECP 0xa0 78 #define IP_TOS_PREC_INTERNETCONTROL 0xc0 79 #define IP_TOS_PREC_NETCONTROL 0xe0 80 81 /* 82 * Fragmentation flags (ip_off) 83 */ 84 #define IP_RF 0x8000 /* reserved */ 85 #define IP_DF 0x4000 /* don't fragment */ 86 #define IP_MF 0x2000 /* more fragments (not last frag) */ 87 #define IP_OFFMASK 0x1fff /* mask for fragment offset */ 88 89 /* 90 * Time-to-live (ip_ttl), seconds 91 */ 92 #define IP_TTL_DEFAULT 64 /* default ttl, RFC 1122, RFC 1340 */ 93 #define IP_TTL_MAX 255 /* maximum ttl */ 94 95 /* 96 * Protocol (ip_p) - http://www.iana.org/assignments/protocol-numbers 97 */ 98 #define IP_PROTO_IP 0 /* dummy for IP */ 99 #define IP_PROTO_HOPOPTS IP_PROTO_IP /* IPv6 hop-by-hop options */ 100 #define IP_PROTO_ICMP 1 /* ICMP */ 101 #define IP_PROTO_IGMP 2 /* IGMP */ 102 #define IP_PROTO_GGP 3 /* gateway-gateway protocol */ 103 #define IP_PROTO_IPIP 4 /* IP in IP */ 104 #define IP_PROTO_ST 5 /* ST datagram mode */ 105 #define IP_PROTO_TCP 6 /* TCP */ 106 #define IP_PROTO_CBT 7 /* CBT */ 107 #define IP_PROTO_EGP 8 /* exterior gateway protocol */ 108 #define IP_PROTO_IGP 9 /* interior gateway protocol */ 109 #define IP_PROTO_BBNRCC 10 /* BBN RCC monitoring */ 110 #define IP_PROTO_NVP 11 /* Network Voice Protocol */ 111 #define IP_PROTO_PUP 12 /* PARC universal packet */ 112 #define IP_PROTO_ARGUS 13 /* ARGUS */ 113 #define IP_PROTO_EMCON 14 /* EMCON */ 114 #define IP_PROTO_XNET 15 /* Cross Net Debugger */ 115 #define IP_PROTO_CHAOS 16 /* Chaos */ 116 #define IP_PROTO_UDP 17 /* UDP */ 117 #define IP_PROTO_MUX 18 /* multiplexing */ 118 #define IP_PROTO_DCNMEAS 19 /* DCN measurement */ 119 #define IP_PROTO_HMP 20 /* Host Monitoring Protocol */ 120 #define IP_PROTO_PRM 21 /* Packet Radio Measurement */ 121 #define IP_PROTO_IDP 22 /* Xerox NS IDP */ 122 #define IP_PROTO_TRUNK1 23 /* Trunk-1 */ 123 #define IP_PROTO_TRUNK2 24 /* Trunk-2 */ 124 #define IP_PROTO_LEAF1 25 /* Leaf-1 */ 125 #define IP_PROTO_LEAF2 26 /* Leaf-2 */ 126 #define IP_PROTO_RDP 27 /* "Reliable Datagram" proto */ 127 #define IP_PROTO_IRTP 28 /* Inet Reliable Transaction */ 128 #define IP_PROTO_TP 29 /* ISO TP class 4 */ 129 #define IP_PROTO_NETBLT 30 /* Bulk Data Transfer */ 130 #define IP_PROTO_MFPNSP 31 /* MFE Network Services */ 131 #define IP_PROTO_MERITINP 32 /* Merit Internodal Protocol */ 132 #define IP_PROTO_SEP 33 /* Sequential Exchange proto */ 133 #define IP_PROTO_3PC 34 /* Third Party Connect proto */ 134 #define IP_PROTO_IDPR 35 /* Interdomain Policy Route */ 135 #define IP_PROTO_XTP 36 /* Xpress Transfer Protocol */ 136 #define IP_PROTO_DDP 37 /* Datagram Delivery Proto */ 137 #define IP_PROTO_CMTP 38 /* IDPR Ctrl Message Trans */ 138 #define IP_PROTO_TPPP 39 /* TP++ Transport Protocol */ 139 #define IP_PROTO_IL 40 /* IL Transport Protocol */ 140 #define IP_PROTO_IPV6 41 /* IPv6 */ 141 #define IP_PROTO_SDRP 42 /* Source Demand Routing */ 142 #define IP_PROTO_ROUTING 43 /* IPv6 routing header */ 143 #define IP_PROTO_FRAGMENT 44 /* IPv6 fragmentation header */ 144 #define IP_PROTO_RSVP 46 /* Reservation protocol */ 145 #define IP_PROTO_GRE 47 /* General Routing Encap */ 146 #define IP_PROTO_MHRP 48 /* Mobile Host Routing */ 147 #define IP_PROTO_ENA 49 /* ENA */ 148 #define IP_PROTO_ESP 50 /* Encap Security Payload */ 149 #define IP_PROTO_AH 51 /* Authentication Header */ 150 #define IP_PROTO_INLSP 52 /* Integated Net Layer Sec */ 151 #define IP_PROTO_SWIPE 53 /* SWIPE */ 152 #define IP_PROTO_NARP 54 /* NBMA Address Resolution */ 153 #define IP_PROTO_MOBILE 55 /* Mobile IP, RFC 2004 */ 154 #define IP_PROTO_TLSP 56 /* Transport Layer Security */ 155 #define IP_PROTO_SKIP 57 /* SKIP */ 156 #define IP_PROTO_ICMPV6 58 /* ICMP for IPv6 */ 157 #define IP_PROTO_NONE 59 /* IPv6 no next header */ 158 #define IP_PROTO_DSTOPTS 60 /* IPv6 destination options */ 159 #define IP_PROTO_ANYHOST 61 /* any host internal proto */ 160 #define IP_PROTO_CFTP 62 /* CFTP */ 161 #define IP_PROTO_ANYNET 63 /* any local network */ 162 #define IP_PROTO_EXPAK 64 /* SATNET and Backroom EXPAK */ 163 #define IP_PROTO_KRYPTOLAN 65 /* Kryptolan */ 164 #define IP_PROTO_RVD 66 /* MIT Remote Virtual Disk */ 165 #define IP_PROTO_IPPC 67 /* Inet Pluribus Packet Core */ 166 #define IP_PROTO_DISTFS 68 /* any distributed fs */ 167 #define IP_PROTO_SATMON 69 /* SATNET Monitoring */ 168 #define IP_PROTO_VISA 70 /* VISA Protocol */ 169 #define IP_PROTO_IPCV 71 /* Inet Packet Core Utility */ 170 #define IP_PROTO_CPNX 72 /* Comp Proto Net Executive */ 171 #define IP_PROTO_CPHB 73 /* Comp Protocol Heart Beat */ 172 #define IP_PROTO_WSN 74 /* Wang Span Network */ 173 #define IP_PROTO_PVP 75 /* Packet Video Protocol */ 174 #define IP_PROTO_BRSATMON 76 /* Backroom SATNET Monitor */ 175 #define IP_PROTO_SUNND 77 /* SUN ND Protocol */ 176 #define IP_PROTO_WBMON 78 /* WIDEBAND Monitoring */ 177 #define IP_PROTO_WBEXPAK 79 /* WIDEBAND EXPAK */ 178 #define IP_PROTO_EON 80 /* ISO CNLP */ 179 #define IP_PROTO_VMTP 81 /* Versatile Msg Transport*/ 180 #define IP_PROTO_SVMTP 82 /* Secure VMTP */ 181 #define IP_PROTO_VINES 83 /* VINES */ 182 #define IP_PROTO_TTP 84 /* TTP */ 183 #define IP_PROTO_NSFIGP 85 /* NSFNET-IGP */ 184 #define IP_PROTO_DGP 86 /* Dissimilar Gateway Proto */ 185 #define IP_PROTO_TCF 87 /* TCF */ 186 #define IP_PROTO_EIGRP 88 /* EIGRP */ 187 #define IP_PROTO_OSPF 89 /* Open Shortest Path First */ 188 #define IP_PROTO_SPRITERPC 90 /* Sprite RPC Protocol */ 189 #define IP_PROTO_LARP 91 /* Locus Address Resolution */ 190 #define IP_PROTO_MTP 92 /* Multicast Transport Proto */ 191 #define IP_PROTO_AX25 93 /* AX.25 Frames */ 192 #define IP_PROTO_IPIPENCAP 94 /* yet-another IP encap */ 193 #define IP_PROTO_MICP 95 /* Mobile Internet Ctrl */ 194 #define IP_PROTO_SCCSP 96 /* Semaphore Comm Sec Proto */ 195 #define IP_PROTO_ETHERIP 97 /* Ethernet in IPv4 */ 196 #define IP_PROTO_ENCAP 98 /* encapsulation header */ 197 #define IP_PROTO_ANYENC 99 /* private encryption scheme */ 198 #define IP_PROTO_GMTP 100 /* GMTP */ 199 #define IP_PROTO_IFMP 101 /* Ipsilon Flow Mgmt Proto */ 200 #define IP_PROTO_PNNI 102 /* PNNI over IP */ 201 #define IP_PROTO_PIM 103 /* Protocol Indep Multicast */ 202 #define IP_PROTO_ARIS 104 /* ARIS */ 203 #define IP_PROTO_SCPS 105 /* SCPS */ 204 #define IP_PROTO_QNX 106 /* QNX */ 205 #define IP_PROTO_AN 107 /* Active Networks */ 206 #define IP_PROTO_IPCOMP 108 /* IP Payload Compression */ 207 #define IP_PROTO_SNP 109 /* Sitara Networks Protocol */ 208 #define IP_PROTO_COMPAQPEER 110 /* Compaq Peer Protocol */ 209 #define IP_PROTO_IPXIP 111 /* IPX in IP */ 210 #define IP_PROTO_VRRP 112 /* Virtual Router Redundancy */ 211 #define IP_PROTO_PGM 113 /* PGM Reliable Transport */ 212 #define IP_PROTO_ANY0HOP 114 /* 0-hop protocol */ 213 #define IP_PROTO_L2TP 115 /* Layer 2 Tunneling Proto */ 214 #define IP_PROTO_DDX 116 /* D-II Data Exchange (DDX) */ 215 #define IP_PROTO_IATP 117 /* Interactive Agent Xfer */ 216 #define IP_PROTO_STP 118 /* Schedule Transfer Proto */ 217 #define IP_PROTO_SRP 119 /* SpectraLink Radio Proto */ 218 #define IP_PROTO_UTI 120 /* UTI */ 219 #define IP_PROTO_SMP 121 /* Simple Message Protocol */ 220 #define IP_PROTO_SM 122 /* SM */ 221 #define IP_PROTO_PTP 123 /* Performance Transparency */ 222 #define IP_PROTO_ISIS 124 /* ISIS over IPv4 */ 223 #define IP_PROTO_FIRE 125 /* FIRE */ 224 #define IP_PROTO_CRTP 126 /* Combat Radio Transport */ 225 #define IP_PROTO_CRUDP 127 /* Combat Radio UDP */ 226 #define IP_PROTO_SSCOPMCE 128 /* SSCOPMCE */ 227 #define IP_PROTO_IPLT 129 /* IPLT */ 228 #define IP_PROTO_SPS 130 /* Secure Packet Shield */ 229 #define IP_PROTO_PIPE 131 /* Private IP Encap in IP */ 230 #define IP_PROTO_SCTP 132 /* Stream Ctrl Transmission */ 231 #define IP_PROTO_FC 133 /* Fibre Channel */ 232 #define IP_PROTO_RSVPIGN 134 /* RSVP-E2E-IGNORE */ 233 #define IP_PROTO_RAW 255 /* Raw IP packets */ 234 #define IP_PROTO_RESERVED IP_PROTO_RAW /* Reserved */ 235 #define IP_PROTO_MAX 255 236 237 /* 238 * Option types (opt_type) - http://www.iana.org/assignments/ip-parameters 239 */ 240 #define IP_OPT_CONTROL 0x00 /* control */ 241 #define IP_OPT_DEBMEAS 0x40 /* debugging & measurement */ 242 #define IP_OPT_COPY 0x80 /* copy into all fragments */ 243 #define IP_OPT_RESERVED1 0x20 244 #define IP_OPT_RESERVED2 0x60 245 246 #define IP_OPT_EOL 0 /* end of option list */ 247 #define IP_OPT_NOP 1 /* no operation */ 248 #define IP_OPT_SEC (2|IP_OPT_COPY) /* DoD basic security */ 249 #define IP_OPT_LSRR (3|IP_OPT_COPY) /* loose source route */ 250 #define IP_OPT_TS (4|IP_OPT_DEBMEAS) /* timestamp */ 251 #define IP_OPT_ESEC (5|IP_OPT_COPY) /* DoD extended security */ 252 #define IP_OPT_CIPSO (6|IP_OPT_COPY) /* commercial security */ 253 #define IP_OPT_RR 7 /* record route */ 254 #define IP_OPT_SATID (8|IP_OPT_COPY) /* stream ID (obsolete) */ 255 #define IP_OPT_SSRR (9|IP_OPT_COPY) /* strict source route */ 256 #define IP_OPT_ZSU 10 /* experimental measurement */ 257 #define IP_OPT_MTUP 11 /* MTU probe */ 258 #define IP_OPT_MTUR 12 /* MTU reply */ 259 #define IP_OPT_FINN (13|IP_OPT_COPY|IP_OPT_DEBMEAS) /* exp flow control */ 260 #define IP_OPT_VISA (14|IP_OPT_COPY) /* exp access control */ 261 #define IP_OPT_ENCODE 15 /* ??? */ 262 #define IP_OPT_IMITD (16|IP_OPT_COPY) /* IMI traffic descriptor */ 263 #define IP_OPT_EIP (17|IP_OPT_COPY) /* extended IP, RFC 1385 */ 264 #define IP_OPT_TR (18|IP_OPT_DEBMEAS) /* traceroute */ 265 #define IP_OPT_ADDEXT (19|IP_OPT_COPY) /* IPv7 ext addr, RFC 1475 */ 266 #define IP_OPT_RTRALT (20|IP_OPT_COPY) /* router alert, RFC 2113 */ 267 #define IP_OPT_SDB (21|IP_OPT_COPY) /* directed bcast, RFC 1770 */ 268 #define IP_OPT_NSAPA (22|IP_OPT_COPY) /* NSAP addresses */ 269 #define IP_OPT_DPS (23|IP_OPT_COPY) /* dynamic packet state */ 270 #define IP_OPT_UMP (24|IP_OPT_COPY) /* upstream multicast */ 271 #define IP_OPT_MAX 25 272 273 #define IP_OPT_COPIED(o) ((o) & 0x80) 274 #define IP_OPT_CLASS(o) ((o) & 0x60) 275 #define IP_OPT_NUMBER(o) ((o) & 0x1f) 276 #define IP_OPT_TYPEONLY(o) ((o) == IP_OPT_EOL || (o) == IP_OPT_NOP) 277 278 /* 279 * Security option data - RFC 791, 3.1 280 */ 281 struct ip_opt_data_sec { 282 uint16_t s; /* security */ 283 uint16_t c; /* compartments */ 284 uint16_t h; /* handling restrictions */ 285 uint8_t tcc[3]; /* transmission control code */ 286 } __attribute__((__packed__)); 287 288 #define IP_OPT_SEC_UNCLASS 0x0000 /* unclassified */ 289 #define IP_OPT_SEC_CONFID 0xf135 /* confidential */ 290 #define IP_OPT_SEC_EFTO 0x789a /* EFTO */ 291 #define IP_OPT_SEC_MMMM 0xbc4d /* MMMM */ 292 #define IP_OPT_SEC_PROG 0x5e26 /* PROG */ 293 #define IP_OPT_SEC_RESTR 0xaf13 /* restricted */ 294 #define IP_OPT_SEC_SECRET 0xd788 /* secret */ 295 #define IP_OPT_SEC_TOPSECRET 0x6bc5 /* top secret */ 296 297 /* 298 * {Loose Source, Record, Strict Source} Route option data - RFC 791, 3.1 299 */ 300 struct ip_opt_data_rr { 301 uint8_t ptr; /* from start of option, >= 4 */ 302 uint32_t iplist __flexarr; /* list of IP addresses */ 303 } __attribute__((__packed__)); 304 305 /* 306 * Timestamp option data - RFC 791, 3.1 307 */ 308 struct ip_opt_data_ts { 309 uint8_t ptr; /* from start of option, >= 5 */ 310 #if DNET_BYTESEX == DNET_BIG_ENDIAN 311 uint8_t oflw:4, /* number of IPs skipped */ 312 flg:4; /* address[ / timestamp] flag */ 313 #elif DNET_BYTESEX == DNET_LIL_ENDIAN 314 uint8_t flg:4, 315 oflw:4; 316 #endif 317 uint32_t ipts __flexarr; /* IP address [/ timestamp] pairs */ 318 } __attribute__((__packed__)); 319 320 #define IP_OPT_TS_TSONLY 0 /* timestamps only */ 321 #define IP_OPT_TS_TSADDR 1 /* IP address / timestamp pairs */ 322 #define IP_OPT_TS_PRESPEC 3 /* IP address / zero timestamp pairs */ 323 324 /* 325 * Traceroute option data - RFC 1393, 2.2 326 */ 327 struct ip_opt_data_tr { 328 uint16_t id; /* ID number */ 329 uint16_t ohc; /* outbound hop count */ 330 uint16_t rhc; /* return hop count */ 331 uint32_t origip; /* originator IP address */ 332 } __attribute__((__packed__)); 333 334 /* 335 * IP option (following IP header) 336 */ 337 struct ip_opt { 338 uint8_t opt_type; /* option type */ 339 uint8_t opt_len; /* option length >= IP_OPT_LEN */ 340 union ip_opt_data { 341 struct ip_opt_data_sec sec; /* IP_OPT_SEC */ 342 struct ip_opt_data_rr rr; /* IP_OPT_{L,S}RR */ 343 struct ip_opt_data_ts ts; /* IP_OPT_TS */ 344 uint16_t satid; /* IP_OPT_SATID */ 345 uint16_t mtu; /* IP_OPT_MTU{P,R} */ 346 struct ip_opt_data_tr tr; /* IP_OPT_TR */ 347 uint32_t addext[2]; /* IP_OPT_ADDEXT */ 348 uint16_t rtralt; /* IP_OPT_RTRALT */ 349 uint32_t sdb[9]; /* IP_OPT_SDB */ 350 uint8_t data8[IP_OPT_LEN_MAX - IP_OPT_LEN]; 351 } opt_data; 352 } __attribute__((__packed__)); 353 354 #ifndef __GNUC__ 355 # pragma pack() 356 #endif 357 358 /* 359 * Classful addressing 360 */ 361 #define IP_CLASSA(i) (((uint32_t)(i) & htonl(0x80000000)) == \ 362 htonl(0x00000000)) 363 #define IP_CLASSA_NET (htonl(0xff000000)) 364 #define IP_CLASSA_NSHIFT 24 365 #define IP_CLASSA_HOST (htonl(0x00ffffff)) 366 #define IP_CLASSA_MAX 128 367 368 #define IP_CLASSB(i) (((uint32_t)(i) & htonl(0xc0000000)) == \ 369 htonl(0x80000000)) 370 #define IP_CLASSB_NET (htonl(0xffff0000)) 371 #define IP_CLASSB_NSHIFT 16 372 #define IP_CLASSB_HOST (htonl(0x0000ffff)) 373 #define IP_CLASSB_MAX 65536 374 375 #define IP_CLASSC(i) (((uint32_t)(i) & htonl(0xe0000000)) == \ 376 htonl(0xc0000000)) 377 #define IP_CLASSC_NET (htonl(0xffffff00)) 378 #define IP_CLASSC_NSHIFT 8 379 #define IP_CLASSC_HOST (htonl(0x000000ff)) 380 381 #define IP_CLASSD(i) (((uint32_t)(i) & htonl(0xf0000000)) == \ 382 htonl(0xe0000000)) 383 /* These ones aren't really net and host fields, but routing needn't know. */ 384 #define IP_CLASSD_NET (htonl(0xf0000000)) 385 #define IP_CLASSD_NSHIFT 28 386 #define IP_CLASSD_HOST (htonl(0x0fffffff)) 387 #define IP_MULTICAST(i) IP_CLASSD(i) 388 389 #define IP_EXPERIMENTAL(i) (((uint32_t)(i) & htonl(0xf0000000)) == \ 390 htonl(0xf0000000)) 391 #define IP_BADCLASS(i) (((uint32_t)(i) & htonl(0xf0000000)) == \ 392 htonl(0xf0000000)) 393 #define IP_LOCAL_GROUP(i) (((uint32_t)(i) & htonl(0xffffff00)) == \ 394 htonl(0xe0000000)) 395 /* 396 * Reserved addresses 397 */ 398 #define IP_ADDR_ANY (htonl(0x00000000)) /* 0.0.0.0 */ 399 #define IP_ADDR_BROADCAST (htonl(0xffffffff)) /* 255.255.255.255 */ 400 #define IP_ADDR_LOOPBACK (htonl(0x7f000001)) /* 127.0.0.1 */ 401 #define IP_ADDR_MCAST_ALL (htonl(0xe0000001)) /* 224.0.0.1 */ 402 #define IP_ADDR_MCAST_LOCAL (htonl(0xe00000ff)) /* 224.0.0.255 */ 403 404 #define ip_pack_hdr(hdr, tos, len, id, off, ttl, p, src, dst) do { \ 405 struct ip_hdr *ip_pack_p = (struct ip_hdr *)(hdr); \ 406 ip_pack_p->ip_v = 4; ip_pack_p->ip_hl = 5; \ 407 ip_pack_p->ip_tos = tos; ip_pack_p->ip_len = htons(len); \ 408 ip_pack_p->ip_id = htons(id); ip_pack_p->ip_off = htons(off); \ 409 ip_pack_p->ip_ttl = ttl; ip_pack_p->ip_p = p; \ 410 ip_pack_p->ip_src = src; ip_pack_p->ip_dst = dst; \ 411 } while (0) 412 413 typedef struct ip_handle ip_t; 414 415 __BEGIN_DECLS 416 ip_t *ip_open(void); 417 ssize_t ip_send(ip_t *i, const void *buf, size_t len); 418 ip_t *ip_close(ip_t *i); 419 420 char *ip_ntop(const ip_addr_t *ip, char *dst, size_t len); 421 int ip_pton(const char *src, ip_addr_t *dst); 422 char *ip_ntoa(const ip_addr_t *ip); 423 #define ip_aton ip_pton 424 425 ssize_t ip_add_option(void *buf, size_t len, 426 int proto, const void *optbuf, size_t optlen); 427 void ip_checksum(void *buf, size_t len); 428 429 int ip_cksum_add(const void *buf, size_t len, int cksum); 430 #define ip_cksum_carry(x) \ 431 (x = (x >> 16) + (x & 0xffff), (~(x + (x >> 16)) & 0xffff)) 432 __END_DECLS 433 434 #endif /* DNET_IP_H */ 435