00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef ISC_NET_H
00021 #define ISC_NET_H 1
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #include <isc/platform.h>
00076
00077 #include <sys/types.h>
00078 #include <sys/socket.h>
00079
00080 #include <net/if.h>
00081
00082 #include <netinet/in.h>
00083 #include <arpa/inet.h>
00084 #ifdef ISC_PLATFORM_NEEDNETINETIN6H
00085 #include <netinet/in6.h>
00086 #endif
00087 #ifdef ISC_PLATFORM_NEEDNETINET6IN6H
00088 #include <netinet6/in6.h>
00089 #endif
00090
00091 #ifndef ISC_PLATFORM_HAVEIPV6
00092 #include <isc/ipv6.h>
00093 #endif
00094
00095 #include <isc/lang.h>
00096 #include <isc/types.h>
00097
00098 #ifdef ISC_PLATFORM_HAVEINADDR6
00099 #define in6_addr in_addr6
00100 #endif
00101
00102 #ifdef ISC_PLATFORM_HAVEIPV6
00103 #ifndef IN6ADDR_ANY_INIT
00104 #ifdef s6_addr
00105
00106
00107
00108
00109
00110
00111
00112 #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
00113 #else
00114 #define IN6ADDR_ANY_INIT { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } }
00115 #endif
00116 #endif
00117
00118 #ifndef IN6ADDR_LOOPBACK_INIT
00119 #ifdef s6_addr
00120
00121 #define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
00122 #else
00123 #define IN6ADDR_LOOPBACK_INIT { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } }
00124 #endif
00125 #endif
00126
00127 #ifndef IN6_IS_ADDR_V4MAPPED
00128
00129 #define IN6_IS_ADDR_V4MAPPED(x) \
00130 (memcmp((x)->s6_addr, in6addr_any.s6_addr, 10) == 0 && \
00131 (x)->s6_addr[10] == 0xff && (x)->s6_addr[11] == 0xff)
00132 #endif
00133
00134 #ifndef IN6_IS_ADDR_V4COMPAT
00135
00136 #define IN6_IS_ADDR_V4COMPAT(x) \
00137 (memcmp((x)->s6_addr, in6addr_any.s6_addr, 12) == 0 && \
00138 ((x)->s6_addr[12] != 0 || (x)->s6_addr[13] != 0 || \
00139 (x)->s6_addr[14] != 0 || \
00140 ((x)->s6_addr[15] != 0 && (x)->s6_addr[15] != 1)))
00141 #endif
00142
00143 #ifndef IN6_IS_ADDR_MULTICAST
00144
00145 #define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff)
00146 #endif
00147
00148 #ifndef IN6_IS_ADDR_LINKLOCAL
00149
00150 #define IN6_IS_ADDR_LINKLOCAL(a) \
00151 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
00152 #endif
00153
00154 #ifndef IN6_IS_ADDR_SITELOCAL
00155
00156 #define IN6_IS_ADDR_SITELOCAL(a) \
00157 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
00158 #endif
00159
00160
00161 #ifndef IN6_IS_ADDR_LOOPBACK
00162
00163 #define IN6_IS_ADDR_LOOPBACK(x) \
00164 (memcmp((x)->s6_addr, in6addr_loopback.s6_addr, 16) == 0)
00165 #endif
00166 #endif
00167
00168 #ifndef AF_INET6
00169
00170 #define AF_INET6 99
00171 #endif
00172
00173 #ifndef PF_INET6
00174
00175 #define PF_INET6 AF_INET6
00176 #endif
00177
00178 #ifndef INADDR_LOOPBACK
00179
00180 #define INADDR_LOOPBACK 0x7f000001UL
00181 #endif
00182
00183 #ifndef ISC_PLATFORM_HAVEIN6PKTINFO
00184
00185 struct in6_pktinfo {
00186 struct in6_addr ipi6_addr;
00187 unsigned int ipi6_ifindex;
00188 };
00189 #endif
00190
00191
00192 #ifndef ISC_PLATFORM_HAVESOCKADDRSTORAGE
00193 #define _SS_MAXSIZE 128
00194 #define _SS_ALIGNSIZE (sizeof (isc_uint64_t))
00195 #ifdef ISC_PLATFORM_HAVESALEN
00196 #define _SS_PAD1SIZE (_SS_ALIGNSIZE - (2 * sizeof(isc_uint8_t)))
00197 #define _SS_PAD2SIZE (_SS_MAXSIZE - (_SS_ALIGNSIZE + _SS_PAD1SIZE \
00198 + 2 * sizeof(isc_uint8_t)))
00199 #else
00200 #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(isc_uint16_t))
00201 #define _SS_PAD2SIZE (_SS_MAXSIZE - (_SS_ALIGNSIZE + _SS_PAD1SIZE \
00202 + sizeof(isc_uint16_t)))
00203 #endif
00204
00205 struct sockaddr_storage {
00206 #ifdef ISC_PLATFORM_HAVESALEN
00207 isc_uint8_t ss_len;
00208 isc_uint8_t ss_family;
00209 #else
00210 isc_uint16_t ss_family;
00211 #endif
00212 char __ss_pad1[_SS_PAD1SIZE];
00213 isc_uint64_t __ss_align;
00214 char __ss_pad2[_SS_PAD2SIZE];
00215 };
00216 #endif
00217
00218 #if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRANY)
00219 extern const struct in6_addr isc_net_in6addrany;
00220
00221
00222
00223 #define in6addr_any isc_net_in6addrany
00224 #endif
00225
00226 #if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRLOOPBACK)
00227 extern const struct in6_addr isc_net_in6addrloop;
00228 #define in6addr_loopback isc_net_in6addrloop
00229 #endif
00230
00231 #ifdef ISC_PLATFORM_FIXIN6ISADDR
00232 #undef IN6_IS_ADDR_GEOGRAPHIC
00233
00234
00235
00236
00237 #define IN6_IS_ADDR_GEOGRAPHIC(a) (((a)->S6_un.S6_l[0] & 0xE0) == 0x80)
00238 #undef IN6_IS_ADDR_IPX
00239 #define IN6_IS_ADDR_IPX(a) (((a)->S6_un.S6_l[0] & 0xFE) == 0x04)
00240 #undef IN6_IS_ADDR_LINKLOCAL
00241 #define IN6_IS_ADDR_LINKLOCAL(a) (((a)->S6_un.S6_l[0] & 0xC0FF) == 0x80FE)
00242 #undef IN6_IS_ADDR_MULTICAST
00243 #define IN6_IS_ADDR_MULTICAST(a) (((a)->S6_un.S6_l[0] & 0xFF) == 0xFF)
00244 #undef IN6_IS_ADDR_NSAP
00245 #define IN6_IS_ADDR_NSAP(a) (((a)->S6_un.S6_l[0] & 0xFE) == 0x02)
00246 #undef IN6_IS_ADDR_PROVIDER
00247 #define IN6_IS_ADDR_PROVIDER(a) (((a)->S6_un.S6_l[0] & 0xE0) == 0x40)
00248 #undef IN6_IS_ADDR_SITELOCAL
00249 #define IN6_IS_ADDR_SITELOCAL(a) (((a)->S6_un.S6_l[0] & 0xC0FF) == 0xC0FE)
00250 #endif
00251
00252 #ifdef ISC_PLATFORM_NEEDPORTT
00253
00254
00255
00256 typedef isc_uint16_t in_port_t;
00257 #endif
00258
00259 #ifndef MSG_TRUNC
00260
00261
00262
00263
00264
00265 #define ISC_PLATFORM_RECVOVERFLOW
00266 #endif
00267
00268
00269 #define ISC__IPADDR(x) ((isc_uint32_t)htonl((isc_uint32_t)(x)))
00270
00271
00272 #define ISC_IPADDR_ISMULTICAST(i) \
00273 (((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \
00274 == ISC__IPADDR(0xe0000000))
00275
00276 #define ISC_IPADDR_ISEXPERIMENTAL(i) \
00277 (((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \
00278 == ISC__IPADDR(0xf0000000))
00279
00280
00281
00282
00283
00284 ISC_LANG_BEGINDECLS
00285
00286 isc_result_t
00287 isc_net_probeipv4(void);
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299 isc_result_t
00300 isc_net_probeipv6(void);
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312 isc_result_t
00313 isc_net_probe_ipv6only(void);
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324 isc_result_t
00325 isc_net_probe_ipv6pktinfo(void);
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337 void
00338 isc_net_disableipv4(void);
00339
00340 void
00341 isc_net_disableipv6(void);
00342
00343 void
00344 isc_net_enableipv4(void);
00345
00346 void
00347 isc_net_enableipv6(void);
00348
00349 isc_result_t
00350 isc_net_probeunix(void);
00351
00352
00353
00354
00355 #define ISC_NET_DSCPRECVV4 0x01
00356 #define ISC_NET_DSCPRECVV6 0x02
00357 #define ISC_NET_DSCPSETV4 0x04
00358 #define ISC_NET_DSCPSETV6 0x08
00359 #define ISC_NET_DSCPPKTV4 0x10
00360 #define ISC_NET_DSCPPKTV6 0x20
00361 #define ISC_NET_DSCPALL 0x3f
00362
00363 unsigned int
00364 isc_net_probedscp(void);
00365
00366
00367
00368
00369
00370 isc_result_t
00371 isc_net_getudpportrange(int af, in_port_t *low, in_port_t *high);
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387 #ifdef ISC_PLATFORM_NEEDNTOP
00388 const char *
00389 isc_net_ntop(int af, const void *src, char *dst, size_t size);
00390 #define inet_ntop isc_net_ntop
00391 #endif
00392
00393 #ifdef ISC_PLATFORM_NEEDPTON
00394 int
00395 isc_net_pton(int af, const char *src, void *dst);
00396 #undef inet_pton
00397 #define inet_pton isc_net_pton
00398 #endif
00399
00400 int
00401 isc_net_aton(const char *cp, struct in_addr *addr);
00402 #undef inet_aton
00403 #define inet_aton isc_net_aton
00404
00405 ISC_LANG_ENDDECLS
00406
00407 #endif