00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef DNET_IP_H
00012 #define DNET_IP_H
00013
00014 #define IP_ADDR_LEN 4
00015 #define IP_ADDR_BITS 32
00016
00017 #define IP_HDR_LEN 20
00018 #define IP_OPT_LEN 2
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
00034
00035 struct ip_hdr {
00036 #if DNET_BYTESEX == DNET_BIG_ENDIAN
00037 uint8_t ip_v:4,
00038 ip_hl:4;
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;
00046 uint16_t ip_len;
00047 uint16_t ip_id;
00048 uint16_t ip_off;
00049 uint8_t ip_ttl;
00050 uint8_t ip_p;
00051 uint16_t ip_sum;
00052 ip_addr_t ip_src;
00053 ip_addr_t ip_dst;
00054 };
00055
00056
00057
00058
00059 #define IP_TOS_DEFAULT 0x00
00060 #define IP_TOS_LOWDELAY 0x10
00061 #define IP_TOS_THROUGHPUT 0x08
00062 #define IP_TOS_RELIABILITY 0x04
00063 #define IP_TOS_LOWCOST 0x02
00064 #define IP_TOS_ECT 0x02
00065 #define IP_TOS_CE 0x01
00066
00067
00068
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
00081
00082 #define IP_RF 0x8000
00083 #define IP_DF 0x4000
00084 #define IP_MF 0x2000
00085 #define IP_OFFMASK 0x1fff
00086
00087
00088
00089
00090 #define IP_TTL_DEFAULT 64
00091 #define IP_TTL_MAX 255
00092
00093
00094
00095
00096 #define IP_PROTO_IP 0
00097 #define IP_PROTO_HOPOPTS IP_PROTO_IP
00098 #define IP_PROTO_ICMP 1
00099 #define IP_PROTO_IGMP 2
00100 #define IP_PROTO_GGP 3
00101 #define IP_PROTO_IPIP 4
00102 #define IP_PROTO_ST 5
00103 #define IP_PROTO_TCP 6
00104 #define IP_PROTO_CBT 7
00105 #define IP_PROTO_EGP 8
00106 #define IP_PROTO_IGP 9
00107 #define IP_PROTO_BBNRCC 10
00108 #define IP_PROTO_NVP 11
00109 #define IP_PROTO_PUP 12
00110 #define IP_PROTO_ARGUS 13
00111 #define IP_PROTO_EMCON 14
00112 #define IP_PROTO_XNET 15
00113 #define IP_PROTO_CHAOS 16
00114 #define IP_PROTO_UDP 17
00115 #define IP_PROTO_MUX 18
00116 #define IP_PROTO_DCNMEAS 19
00117 #define IP_PROTO_HMP 20
00118 #define IP_PROTO_PRM 21
00119 #define IP_PROTO_IDP 22
00120 #define IP_PROTO_TRUNK1 23
00121 #define IP_PROTO_TRUNK2 24
00122 #define IP_PROTO_LEAF1 25
00123 #define IP_PROTO_LEAF2 26
00124 #define IP_PROTO_RDP 27
00125 #define IP_PROTO_IRTP 28
00126 #define IP_PROTO_TP 29
00127 #define IP_PROTO_NETBLT 30
00128 #define IP_PROTO_MFPNSP 31
00129 #define IP_PROTO_MERITINP 32
00130 #define IP_PROTO_SEP 33
00131 #define IP_PROTO_3PC 34
00132 #define IP_PROTO_IDPR 35
00133 #define IP_PROTO_XTP 36
00134 #define IP_PROTO_DDP 37
00135 #define IP_PROTO_CMTP 38
00136 #define IP_PROTO_TPPP 39
00137 #define IP_PROTO_IL 40
00138 #define IP_PROTO_IPV6 41
00139 #define IP_PROTO_SDRP 42
00140 #define IP_PROTO_ROUTING 43
00141 #define IP_PROTO_FRAGMENT 44
00142 #define IP_PROTO_RSVP 46
00143 #define IP_PROTO_GRE 47
00144 #define IP_PROTO_MHRP 48
00145 #define IP_PROTO_ENA 49
00146 #define IP_PROTO_ESP 50
00147 #define IP_PROTO_AH 51
00148 #define IP_PROTO_INLSP 52
00149 #define IP_PROTO_SWIPE 53
00150 #define IP_PROTO_NARP 54
00151 #define IP_PROTO_MOBILE 55
00152 #define IP_PROTO_TLSP 56
00153 #define IP_PROTO_SKIP 57
00154 #define IP_PROTO_ICMPV6 58
00155 #define IP_PROTO_NONE 59
00156 #define IP_PROTO_DSTOPTS 60
00157 #define IP_PROTO_ANYHOST 61
00158 #define IP_PROTO_CFTP 62
00159 #define IP_PROTO_ANYNET 63
00160 #define IP_PROTO_EXPAK 64
00161 #define IP_PROTO_KRYPTOLAN 65
00162 #define IP_PROTO_RVD 66
00163 #define IP_PROTO_IPPC 67
00164 #define IP_PROTO_DISTFS 68
00165 #define IP_PROTO_SATMON 69
00166 #define IP_PROTO_VISA 70
00167 #define IP_PROTO_IPCV 71
00168 #define IP_PROTO_CPNX 72
00169 #define IP_PROTO_CPHB 73
00170 #define IP_PROTO_WSN 74
00171 #define IP_PROTO_PVP 75
00172 #define IP_PROTO_BRSATMON 76
00173 #define IP_PROTO_SUNND 77
00174 #define IP_PROTO_WBMON 78
00175 #define IP_PROTO_WBEXPAK 79
00176 #define IP_PROTO_EON 80
00177 #define IP_PROTO_VMTP 81
00178 #define IP_PROTO_SVMTP 82
00179 #define IP_PROTO_VINES 83
00180 #define IP_PROTO_TTP 84
00181 #define IP_PROTO_NSFIGP 85
00182 #define IP_PROTO_DGP 86
00183 #define IP_PROTO_TCF 87
00184 #define IP_PROTO_EIGRP 88
00185 #define IP_PROTO_OSPF 89
00186 #define IP_PROTO_SPRITERPC 90
00187 #define IP_PROTO_LARP 91
00188 #define IP_PROTO_MTP 92
00189 #define IP_PROTO_AX25 93
00190 #define IP_PROTO_IPIPENCAP 94
00191 #define IP_PROTO_MICP 95
00192 #define IP_PROTO_SCCSP 96
00193 #define IP_PROTO_ETHERIP 97
00194 #define IP_PROTO_ENCAP 98
00195 #define IP_PROTO_ANYENC 99
00196 #define IP_PROTO_GMTP 100
00197 #define IP_PROTO_IFMP 101
00198 #define IP_PROTO_PNNI 102
00199 #define IP_PROTO_PIM 103
00200 #define IP_PROTO_ARIS 104
00201 #define IP_PROTO_SCPS 105
00202 #define IP_PROTO_QNX 106
00203 #define IP_PROTO_AN 107
00204 #define IP_PROTO_IPCOMP 108
00205 #define IP_PROTO_SNP 109
00206 #define IP_PROTO_COMPAQPEER 110
00207 #define IP_PROTO_IPXIP 111
00208 #define IP_PROTO_VRRP 112
00209 #define IP_PROTO_PGM 113
00210 #define IP_PROTO_ANY0HOP 114
00211 #define IP_PROTO_L2TP 115
00212 #define IP_PROTO_DDX 116
00213 #define IP_PROTO_IATP 117
00214 #define IP_PROTO_STP 118
00215 #define IP_PROTO_SRP 119
00216 #define IP_PROTO_UTI 120
00217 #define IP_PROTO_SMP 121
00218 #define IP_PROTO_SM 122
00219 #define IP_PROTO_PTP 123
00220 #define IP_PROTO_ISIS 124
00221 #define IP_PROTO_FIRE 125
00222 #define IP_PROTO_CRTP 126
00223 #define IP_PROTO_CRUDP 127
00224 #define IP_PROTO_SSCOPMCE 128
00225 #define IP_PROTO_IPLT 129
00226 #define IP_PROTO_SPS 130
00227 #define IP_PROTO_PIPE 131
00228 #define IP_PROTO_SCTP 132
00229 #define IP_PROTO_FC 133
00230 #define IP_PROTO_RSVPIGN 134
00231 #define IP_PROTO_RAW 255
00232 #define IP_PROTO_RESERVED IP_PROTO_RAW
00233 #define IP_PROTO_MAX 255
00234
00235
00236
00237
00238 #define IP_OPT_CONTROL 0x00
00239 #define IP_OPT_DEBMEAS 0x40
00240 #define IP_OPT_COPY 0x80
00241 #define IP_OPT_RESERVED1 0x20
00242 #define IP_OPT_RESERVED2 0x60
00243
00244 #define IP_OPT_EOL 0
00245 #define IP_OPT_NOP 1
00246 #define IP_OPT_SEC (2|IP_OPT_COPY)
00247 #define IP_OPT_LSRR (3|IP_OPT_COPY)
00248 #define IP_OPT_TS (4|IP_OPT_DEBMEAS)
00249 #define IP_OPT_ESEC (5|IP_OPT_COPY)
00250 #define IP_OPT_CIPSO (6|IP_OPT_COPY)
00251 #define IP_OPT_RR 7
00252 #define IP_OPT_SATID (8|IP_OPT_COPY)
00253 #define IP_OPT_SSRR (9|IP_OPT_COPY)
00254 #define IP_OPT_ZSU 10
00255 #define IP_OPT_MTUP 11
00256 #define IP_OPT_MTUR 12
00257 #define IP_OPT_FINN (13|IP_OPT_COPY|IP_OPT_DEBMEAS)
00258 #define IP_OPT_VISA (14|IP_OPT_COPY)
00259 #define IP_OPT_ENCODE 15
00260 #define IP_OPT_IMITD (16|IP_OPT_COPY)
00261 #define IP_OPT_EIP (17|IP_OPT_COPY)
00262 #define IP_OPT_TR (18|IP_OPT_DEBMEAS)
00263 #define IP_OPT_ADDEXT (19|IP_OPT_COPY)
00264 #define IP_OPT_RTRALT (20|IP_OPT_COPY)
00265 #define IP_OPT_SDB (21|IP_OPT_COPY)
00266 #define IP_OPT_NSAPA (22|IP_OPT_COPY)
00267 #define IP_OPT_DPS (23|IP_OPT_COPY)
00268 #define IP_OPT_UMP (24|IP_OPT_COPY)
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
00278
00279 struct ip_opt_data_sec {
00280 uint16_t s;
00281 uint16_t c;
00282 uint16_t h;
00283 uint8_t tcc[3];
00284 } __attribute__((__packed__));
00285
00286 #define IP_OPT_SEC_UNCLASS 0x0000
00287 #define IP_OPT_SEC_CONFID 0xf135
00288 #define IP_OPT_SEC_EFTO 0x789a
00289 #define IP_OPT_SEC_MMMM 0xbc4d
00290 #define IP_OPT_SEC_PROG 0x5e26
00291 #define IP_OPT_SEC_RESTR 0xaf13
00292 #define IP_OPT_SEC_SECRET 0xd788
00293 #define IP_OPT_SEC_TOPSECRET 0x6bc5
00294
00295
00296
00297
00298 struct ip_opt_data_rr {
00299 uint8_t ptr;
00300 uint32_t iplist __flexarr;
00301 } __attribute__((__packed__));
00302
00303
00304
00305
00306 struct ip_opt_data_ts {
00307 uint8_t ptr;
00308 #if DNET_BYTESEX == DNET_BIG_ENDIAN
00309 uint8_t oflw:4,
00310 flg:4;
00311 #elif DNET_BYTESEX == DNET_LIL_ENDIAN
00312 uint8_t flg:4,
00313 oflw:4;
00314 #endif
00315 uint32_t ipts __flexarr;
00316 } __attribute__((__packed__));
00317
00318 #define IP_OPT_TS_TSONLY 0
00319 #define IP_OPT_TS_TSADDR 1
00320 #define IP_OPT_TS_PRESPEC 3
00321
00322
00323
00324
00325 struct ip_opt_data_tr {
00326 uint16_t id;
00327 uint16_t ohc;
00328 uint16_t rhc;
00329 uint32_t origip;
00330 } __attribute__((__packed__));
00331
00332
00333
00334
00335 struct ip_opt {
00336 uint8_t opt_type;
00337 uint8_t opt_len;
00338 union ip_opt_data {
00339 struct ip_opt_data_sec sec;
00340 struct ip_opt_data_rr rr;
00341 struct ip_opt_data_ts ts;
00342 uint16_t satid;
00343 uint16_t mtu;
00344 struct ip_opt_data_tr tr;
00345 uint32_t addext[2];
00346 uint16_t rtralt;
00347 uint32_t sdb[9];
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
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
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
00395
00396 #define IP_ADDR_ANY (htonl(0x00000000))
00397 #define IP_ADDR_BROADCAST (htonl(0xffffffff))
00398 #define IP_ADDR_LOOPBACK (htonl(0x7f000001))
00399 #define IP_ADDR_MCAST_ALL (htonl(0xe0000001))
00400 #define IP_ADDR_MCAST_LOCAL (htonl(0xe00000ff))
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