blob: 6c4383a1ce1fe061d745f54903d99892db7882ea [file] [log] [blame]
Benny Prijono8ab968f2007-07-20 08:08:30 +00001/* $Id$ */
2/*
Benny Prijono32177c02008-06-20 22:44:47 +00003 * Copyright (C)2003-2008 Benny Prijono <benny@prijono.org>
Benny Prijono8ab968f2007-07-20 08:08:30 +00004 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19#include <pj/sock.h>
Benny Prijono62b86eb2007-12-01 08:52:57 +000020#include <pj/assert.h>
21#include <pj/errno.h>
22#include <pj/ip_helper.h>
23#include <pj/os.h>
24#include <pj/addr_resolv.h>
25#include <pj/string.h>
26#include <pj/compat/socket.h>
27
28
29/*
30 * Convert address string with numbers and dots to binary IP address.
31 */
32PJ_DEF(pj_in_addr) pj_inet_addr(const pj_str_t *cp)
33{
34 pj_in_addr addr;
35
36 pj_inet_aton(cp, &addr);
37 return addr;
38}
39
40/*
41 * Convert address string with numbers and dots to binary IP address.
42 */
43PJ_DEF(pj_in_addr) pj_inet_addr2(const char *cp)
44{
45 pj_str_t str = pj_str((char*)cp);
46 return pj_inet_addr(&str);
47}
48
49/*
Benny Prijono80025db2007-12-02 15:36:46 +000050 * Get text representation.
51 */
52PJ_DEF(char*) pj_inet_ntop2( int af, const void *src,
53 char *dst, int size)
54{
55 pj_status_t status;
56
57 status = pj_inet_ntop(af, src, dst, size);
58 return (status==PJ_SUCCESS)? dst : NULL;
59}
60
61/*
Benny Prijono40c26332007-12-03 14:33:39 +000062 * Print socket address.
63 */
64PJ_DEF(char*) pj_sockaddr_print( const pj_sockaddr_t *addr,
65 char *buf, int size,
66 unsigned flags)
67{
68 enum {
69 WITH_PORT = 1,
70 WITH_BRACKETS = 2
71 };
72
73 char txt[PJ_INET6_ADDRSTRLEN];
74 char port[32];
75 const pj_addr_hdr *h = (const pj_addr_hdr*)addr;
76 char *bquote, *equote;
77 pj_status_t status;
78
79 status = pj_inet_ntop(h->sa_family, pj_sockaddr_get_addr(addr),
80 txt, sizeof(txt));
81 if (status != PJ_SUCCESS)
82 return "";
83
84 if (h->sa_family != PJ_AF_INET6 || (flags & WITH_BRACKETS)==0) {
85 bquote = ""; equote = "";
86 } else {
87 bquote = "["; equote = "]";
88 }
89
90 if (flags & WITH_PORT) {
91 pj_ansi_snprintf(port, sizeof(port), ":%d",
92 pj_sockaddr_get_port(addr));
93 } else {
94 port[0] = '\0';
95 }
96
97 pj_ansi_snprintf(buf, size, "%s%s%s%s",
98 bquote, txt, equote, port);
99
100 return buf;
101}
102
103/*
Benny Prijono62b86eb2007-12-01 08:52:57 +0000104 * Set the IP address of an IP socket address from string address,
105 * with resolving the host if necessary. The string address may be in a
106 * standard numbers and dots notation or may be a hostname. If hostname
107 * is specified, then the function will resolve the host into the IP
108 * address.
109 */
110PJ_DEF(pj_status_t) pj_sockaddr_in_set_str_addr( pj_sockaddr_in *addr,
111 const pj_str_t *str_addr)
112{
113 PJ_CHECK_STACK();
114
115 PJ_ASSERT_RETURN(!str_addr || str_addr->slen < PJ_MAX_HOSTNAME,
116 (addr->sin_addr.s_addr=PJ_INADDR_NONE, PJ_EINVAL));
117
118 PJ_SOCKADDR_RESET_LEN(addr);
119 addr->sin_family = AF_INET;
120 pj_bzero(addr->sin_zero, sizeof(addr->sin_zero));
121
122 if (str_addr && str_addr->slen) {
123 addr->sin_addr = pj_inet_addr(str_addr);
124 if (addr->sin_addr.s_addr == PJ_INADDR_NONE) {
125 pj_hostent he;
126 pj_status_t rc;
127
128 rc = pj_gethostbyname(str_addr, &he);
129 if (rc == 0) {
130 addr->sin_addr.s_addr = *(pj_uint32_t*)he.h_addr;
131 } else {
132 addr->sin_addr.s_addr = PJ_INADDR_NONE;
133 return rc;
134 }
135 }
136
137 } else {
138 addr->sin_addr.s_addr = 0;
139 }
140
141 return PJ_SUCCESS;
142}
143
144/* Set address from a name */
145PJ_DEF(pj_status_t) pj_sockaddr_set_str_addr(int af,
146 pj_sockaddr *addr,
147 const pj_str_t *str_addr)
148{
149 pj_status_t status;
150
151 if (af == PJ_AF_INET) {
152 return pj_sockaddr_in_set_str_addr(&addr->ipv4, str_addr);
153 }
154
155 PJ_ASSERT_RETURN(af==PJ_AF_INET6, PJ_EAFNOTSUP);
156
157 /* IPv6 specific */
158
159 addr->ipv6.sin6_family = PJ_AF_INET6;
160 PJ_SOCKADDR_RESET_LEN(addr);
161
162 if (str_addr && str_addr->slen) {
163 status = pj_inet_pton(PJ_AF_INET6, str_addr, &addr->ipv6.sin6_addr);
164 if (status != PJ_SUCCESS) {
165 pj_addrinfo ai;
166 unsigned count = 1;
167
168 status = pj_getaddrinfo(PJ_AF_INET6, str_addr, &count, &ai);
169 if (status==PJ_SUCCESS) {
170 pj_memcpy(&addr->ipv6.sin6_addr, &ai.ai_addr.ipv6.sin6_addr,
171 sizeof(pj_sockaddr_in6));
172 }
173 }
174 } else {
175 status = PJ_SUCCESS;
176 }
177
178 return status;
179}
180
181/*
182 * Set the IP address and port of an IP socket address.
183 * The string address may be in a standard numbers and dots notation or
184 * may be a hostname. If hostname is specified, then the function will
185 * resolve the host into the IP address.
186 */
187PJ_DEF(pj_status_t) pj_sockaddr_in_init( pj_sockaddr_in *addr,
188 const pj_str_t *str_addr,
189 pj_uint16_t port)
190{
191 PJ_ASSERT_RETURN(addr, (addr->sin_addr.s_addr=PJ_INADDR_NONE, PJ_EINVAL));
192
193 PJ_SOCKADDR_RESET_LEN(addr);
194 addr->sin_family = PJ_AF_INET;
195 pj_bzero(addr->sin_zero, sizeof(addr->sin_zero));
196 pj_sockaddr_in_set_port(addr, port);
197 return pj_sockaddr_in_set_str_addr(addr, str_addr);
198}
199
200/*
201 * Initialize IP socket address based on the address and port info.
202 */
203PJ_DEF(pj_status_t) pj_sockaddr_init(int af,
204 pj_sockaddr *addr,
205 const pj_str_t *cp,
206 pj_uint16_t port)
207{
208 pj_status_t status;
209
210 if (af == PJ_AF_INET) {
211 return pj_sockaddr_in_init(&addr->ipv4, cp, port);
212 }
213
214 /* IPv6 specific */
215 PJ_ASSERT_RETURN(af==PJ_AF_INET6, PJ_EAFNOTSUP);
216
217 pj_bzero(addr, sizeof(pj_sockaddr_in6));
218 addr->addr.sa_family = PJ_AF_INET6;
219
220 status = pj_sockaddr_set_str_addr(af, addr, cp);
221 if (status != PJ_SUCCESS)
222 return status;
223
224 addr->ipv6.sin6_port = pj_htons(port);
225 return PJ_SUCCESS;
226}
227
228/*
Benny Prijono40c26332007-12-03 14:33:39 +0000229 * Compare two socket addresses.
230 */
231PJ_DEF(int) pj_sockaddr_cmp( const pj_sockaddr_t *addr1,
232 const pj_sockaddr_t *addr2)
233{
234 const pj_sockaddr *a1 = (const pj_sockaddr*) addr1;
235 const pj_sockaddr *a2 = (const pj_sockaddr*) addr2;
236 int port1, port2;
237 int result;
238
239 /* Compare address family */
240 if (a1->addr.sa_family < a2->addr.sa_family)
241 return -1;
242 else if (a1->addr.sa_family > a2->addr.sa_family)
243 return 1;
244
245 /* Compare addresses */
246 result = pj_memcmp(pj_sockaddr_get_addr(a1),
247 pj_sockaddr_get_addr(a2),
248 pj_sockaddr_get_addr_len(a1));
249 if (result != 0)
250 return result;
251
252 /* Compare port number */
253 port1 = pj_sockaddr_get_port(a1);
254 port2 = pj_sockaddr_get_port(a2);
255
256 if (port1 < port2)
257 return -1;
258 else if (port1 > port2)
259 return 1;
260
261 /* TODO:
262 * Do we need to compare flow label and scope id in IPv6?
263 */
264
265 /* Looks equal */
266 return 0;
267}
268
269/*
Benny Prijono62b86eb2007-12-01 08:52:57 +0000270 * Get first IP address associated with the hostname.
271 */
272PJ_DEF(pj_in_addr) pj_gethostaddr(void)
273{
274 pj_sockaddr_in addr;
275 const pj_str_t *hostname = pj_gethostname();
276
277 pj_sockaddr_in_set_str_addr(&addr, hostname);
278 return addr.sin_addr;
279}
280
281/*
282 * Get port number of a pj_sockaddr_in
283 */
284PJ_DEF(pj_uint16_t) pj_sockaddr_in_get_port(const pj_sockaddr_in *addr)
285{
286 return pj_ntohs(addr->sin_port);
287}
288
289/*
290 * Get the address part
291 */
292PJ_DEF(void*) pj_sockaddr_get_addr(const pj_sockaddr_t *addr)
293{
294 const pj_sockaddr *a = (const pj_sockaddr*)addr;
295
296 PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
297 a->addr.sa_family == PJ_AF_INET6, NULL);
298
299 if (a->addr.sa_family == PJ_AF_INET6)
300 return (void*) &a->ipv6.sin6_addr;
301 else
302 return (void*) &a->ipv4.sin_addr;
303}
304
305/*
306 * Check if sockaddr contains a non-zero address
307 */
308PJ_DEF(pj_bool_t) pj_sockaddr_has_addr(const pj_sockaddr_t *addr)
309{
310 const pj_sockaddr *a = (const pj_sockaddr*)addr;
311
Benny Prijonobb7b98e2007-12-12 17:13:34 +0000312 /* It's probably not wise to raise assertion here if
313 * the address doesn't contain a valid address family, and
314 * just return PJ_FALSE instead.
315 *
316 * The reason is because application may need to distinguish
317 * these three conditions with sockaddr:
318 * a) sockaddr is not initialized. This is by convention
319 * indicated by sa_family==0.
320 * b) sockaddr is initialized with zero address. This is
321 * indicated with the address field having zero address.
322 * c) sockaddr is initialized with valid address/port.
323 *
324 * If we enable this assertion, then application will loose
325 * the capability to specify condition a), since it will be
326 * forced to always initialize sockaddr (even with zero address).
327 * This may break some parts of upper layer libraries.
328 */
329 //PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
330 // a->addr.sa_family == PJ_AF_INET6, PJ_EAFNOTSUP);
Benny Prijono62b86eb2007-12-01 08:52:57 +0000331
Benny Prijonobb7b98e2007-12-12 17:13:34 +0000332 if (a->addr.sa_family!=PJ_AF_INET && a->addr.sa_family!=PJ_AF_INET6) {
333 return PJ_FALSE;
334 } else if (a->addr.sa_family == PJ_AF_INET6) {
Benny Prijono62b86eb2007-12-01 08:52:57 +0000335 pj_uint8_t zero[24];
336 pj_bzero(zero, sizeof(zero));
337 return pj_memcmp(a->ipv6.sin6_addr.s6_addr, zero,
338 sizeof(pj_in6_addr)) != 0;
339 } else
340 return a->ipv4.sin_addr.s_addr != PJ_INADDR_ANY;
341}
342
343/*
344 * Get port number
345 */
346PJ_DEF(pj_uint16_t) pj_sockaddr_get_port(const pj_sockaddr_t *addr)
347{
348 const pj_sockaddr *a = (const pj_sockaddr*) addr;
349
350 PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
351 a->addr.sa_family == PJ_AF_INET6, (pj_uint16_t)0xFFFF);
352
353 return pj_ntohs((pj_uint16_t)(a->addr.sa_family == PJ_AF_INET6 ?
354 a->ipv6.sin6_port : a->ipv4.sin_port));
355}
356
357/*
358 * Get the length of the address part.
359 */
360PJ_DEF(unsigned) pj_sockaddr_get_addr_len(const pj_sockaddr_t *addr)
361{
362 const pj_sockaddr *a = (const pj_sockaddr*) addr;
363 PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
364 a->addr.sa_family == PJ_AF_INET6, PJ_EAFNOTSUP);
365 return a->addr.sa_family == PJ_AF_INET6 ?
366 sizeof(pj_in6_addr) : sizeof(pj_in_addr);
367}
368
369/*
Benny Prijono80025db2007-12-02 15:36:46 +0000370 * Get socket address length.
371 */
372PJ_DEF(unsigned) pj_sockaddr_get_len(const pj_sockaddr_t *addr)
373{
374 const pj_sockaddr *a = (const pj_sockaddr*) addr;
375 PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
376 a->addr.sa_family == PJ_AF_INET6, PJ_EAFNOTSUP);
377 return a->addr.sa_family == PJ_AF_INET6 ?
378 sizeof(pj_sockaddr_in6) : sizeof(pj_sockaddr_in);
379}
380
381/*
Benny Prijono40c26332007-12-03 14:33:39 +0000382 * Copy only the address part (sin_addr/sin6_addr) of a socket address.
383 */
384PJ_DEF(void) pj_sockaddr_copy_addr( pj_sockaddr *dst,
385 const pj_sockaddr *src)
386{
Benny Prijono1243ffb2008-08-13 08:41:42 +0000387 /* Destination sockaddr might not be initialized */
388 const char *srcbuf = (char*)pj_sockaddr_get_addr(src);
389 char *dstbuf = ((char*)dst) + (srcbuf - (char*)src);
390 pj_memcpy(dstbuf, srcbuf, pj_sockaddr_get_addr_len(src));
Benny Prijono40c26332007-12-03 14:33:39 +0000391}
392
393/*
Benny Prijono842754c2008-05-11 18:11:32 +0000394 * Copy socket address.
395 */
396PJ_DEF(void) pj_sockaddr_cp(pj_sockaddr_t *dst, const pj_sockaddr_t *src)
397{
398 pj_memcpy(dst, src, pj_sockaddr_get_len(src));
399}
400
401/*
Benny Prijono62b86eb2007-12-01 08:52:57 +0000402 * Set port number of pj_sockaddr_in
403 */
404PJ_DEF(void) pj_sockaddr_in_set_port(pj_sockaddr_in *addr,
405 pj_uint16_t hostport)
406{
407 addr->sin_port = pj_htons(hostport);
408}
409
410/*
411 * Set port number of pj_sockaddr
412 */
413PJ_DEF(pj_status_t) pj_sockaddr_set_port(pj_sockaddr *addr,
414 pj_uint16_t hostport)
415{
416 int af = addr->addr.sa_family;
417
Benny Prijono80025db2007-12-02 15:36:46 +0000418 PJ_ASSERT_RETURN(af==PJ_AF_INET || af==PJ_AF_INET6, PJ_EINVAL);
Benny Prijono62b86eb2007-12-01 08:52:57 +0000419
420 if (af == PJ_AF_INET6)
421 addr->ipv6.sin6_port = pj_htons(hostport);
422 else
423 addr->ipv4.sin_port = pj_htons(hostport);
424
425 return PJ_SUCCESS;
426}
427
428/*
429 * Get IPv4 address
430 */
431PJ_DEF(pj_in_addr) pj_sockaddr_in_get_addr(const pj_sockaddr_in *addr)
432{
433 pj_in_addr in_addr;
434 in_addr.s_addr = pj_ntohl(addr->sin_addr.s_addr);
435 return in_addr;
436}
437
438/*
439 * Set IPv4 address
440 */
441PJ_DEF(void) pj_sockaddr_in_set_addr(pj_sockaddr_in *addr,
442 pj_uint32_t hostaddr)
443{
444 addr->sin_addr.s_addr = pj_htonl(hostaddr);
445}
446
447/* Resolve the IP address of local machine */
448PJ_DEF(pj_status_t) pj_gethostip(int af, pj_sockaddr *addr)
449{
450 unsigned count;
451 pj_addrinfo ai;
452 pj_status_t status;
453
454
455#ifdef _MSC_VER
456 /* Get rid of "uninitialized he variable" with MS compilers */
457 pj_bzero(&ai, sizeof(ai));
458#endif
459
460 addr->addr.sa_family = (pj_uint16_t)af;
461 PJ_SOCKADDR_RESET_LEN(addr);
462
463 /* Try with resolving local hostname first */
464 count = 1;
465 status = pj_getaddrinfo(af, pj_gethostname(), &count, &ai);
466 if (status == PJ_SUCCESS) {
Benny Prijono9db4bd62007-12-31 11:26:21 +0000467 pj_assert(ai.ai_addr.addr.sa_family == (pj_uint16_t)af);
468 pj_sockaddr_copy_addr(addr, &ai.ai_addr);
Benny Prijono62b86eb2007-12-01 08:52:57 +0000469 }
470
471
Benny Prijonob618d622008-06-09 10:07:11 +0000472 /* If we end up with 127.0.0.0/8 or 0.0.0.0/8, resolve the IP
473 * by getting the default interface to connect to some public host.
474 * The 0.0.0.0/8 is a special IP class that doesn't seem to be
475 * practically useful for our purpose.
Benny Prijono62b86eb2007-12-01 08:52:57 +0000476 */
477 if (status != PJ_SUCCESS || !pj_sockaddr_has_addr(addr) ||
Benny Prijonob618d622008-06-09 10:07:11 +0000478 (af==PJ_AF_INET && (pj_ntohl(addr->ipv4.sin_addr.s_addr)>>24)==127) ||
479 (af==PJ_AF_INET && (pj_ntohl(addr->ipv4.sin_addr.s_addr)>>24)==0))
Benny Prijono62b86eb2007-12-01 08:52:57 +0000480 {
Benny Prijono9db4bd62007-12-31 11:26:21 +0000481 status = pj_getdefaultipinterface(af, addr);
Benny Prijono62b86eb2007-12-01 08:52:57 +0000482 }
483
484 /* If failed, get the first available interface */
485 if (status != PJ_SUCCESS) {
Benny Prijono9db4bd62007-12-31 11:26:21 +0000486 pj_sockaddr itf[1];
487 unsigned count = PJ_ARRAY_SIZE(itf);
488
489 status = pj_enum_ip_interface(af, &count, itf);
490 if (status == PJ_SUCCESS) {
491 pj_assert(itf[0].addr.sa_family == (pj_uint16_t)af);
492 pj_sockaddr_copy_addr(addr, &itf[0]);
493 }
Benny Prijono62b86eb2007-12-01 08:52:57 +0000494 }
495
496 /* If else fails, returns loopback interface as the last resort */
497 if (status != PJ_SUCCESS) {
Benny Prijono9db4bd62007-12-31 11:26:21 +0000498 if (af==PJ_AF_INET) {
499 addr->ipv4.sin_addr.s_addr = pj_htonl (0x7f000001);
500 } else {
501 pj_in6_addr *s6_addr;
502
503 s6_addr = (pj_in6_addr*) pj_sockaddr_get_addr(addr);
504 pj_bzero(s6_addr, sizeof(pj_in6_addr));
505 s6_addr->s6_addr[15] = 1;
506 }
507 status = PJ_SUCCESS;
Benny Prijono62b86eb2007-12-01 08:52:57 +0000508 }
509
510 return status;
511}
512
513/* Get the default IP interface */
514PJ_DEF(pj_status_t) pj_getdefaultipinterface(int af, pj_sockaddr *addr)
515{
516 pj_sock_t fd;
517 pj_str_t cp;
518 pj_sockaddr a;
519 int len;
520 pj_uint8_t zero[64];
521 pj_status_t status;
522
523 addr->addr.sa_family = (pj_uint16_t)af;
524
525 status = pj_sock_socket(af, pj_SOCK_DGRAM(), 0, &fd);
526 if (status != PJ_SUCCESS) {
527 return status;
528 }
529
530 if (af == PJ_AF_INET) {
531 cp = pj_str("1.1.1.1");
532 } else {
533 cp = pj_str("1::1");
534 }
535 status = pj_sockaddr_init(af, &a, &cp, 53);
536 if (status != PJ_SUCCESS) {
537 pj_sock_close(fd);
538 return status;
539 }
540
541 status = pj_sock_connect(fd, &a, sizeof(a));
542 if (status != PJ_SUCCESS) {
543 pj_sock_close(fd);
544 return status;
545 }
546
547 len = sizeof(a);
548 status = pj_sock_getsockname(fd, &a, &len);
549 if (status != PJ_SUCCESS) {
550 pj_sock_close(fd);
551 return status;
552 }
553
554 pj_sock_close(fd);
555
556 /* Check that the address returned is not zero */
557 pj_bzero(zero, sizeof(zero));
558 if (pj_memcmp(pj_sockaddr_get_addr(&a), zero,
559 pj_sockaddr_get_addr_len(&a))==0)
560 {
561 return PJ_ENOTFOUND;
562 }
563
Benny Prijono9db4bd62007-12-31 11:26:21 +0000564 pj_sockaddr_copy_addr(addr, &a);
Benny Prijono62b86eb2007-12-01 08:52:57 +0000565
566 /* Success */
567 return PJ_SUCCESS;
568}
569
570
571/* Only need to implement these in DLL build */
572#if defined(PJ_DLL)
Benny Prijono8ab968f2007-07-20 08:08:30 +0000573
Benny Prijonoc16c6e32007-11-18 14:53:47 +0000574PJ_DEF(pj_uint16_t) pj_AF_UNSPEC(void)
575{
576 return PJ_AF_UNSPEC;
577}
578
Benny Prijono8ab968f2007-07-20 08:08:30 +0000579PJ_DEF(pj_uint16_t) pj_AF_UNIX(void)
580{
581 return PJ_AF_UNIX;
582}
583
584PJ_DEF(pj_uint16_t) pj_AF_INET(void)
585{
586 return PJ_AF_INET;
587}
588
589PJ_DEF(pj_uint16_t) pj_AF_INET6(void)
590{
591 return PJ_AF_INET6;
592}
593
594PJ_DEF(pj_uint16_t) pj_AF_PACKET(void)
595{
596 return PJ_AF_PACKET;
597}
598
599PJ_DEF(pj_uint16_t) pj_AF_IRDA(void)
600{
601 return PJ_AF_IRDA;
602}
603
604PJ_DEF(int) pj_SOCK_STREAM(void)
605{
606 return PJ_SOCK_STREAM;
607}
608
609PJ_DEF(int) pj_SOCK_DGRAM(void)
610{
611 return PJ_SOCK_DGRAM;
612}
613
614PJ_DEF(int) pj_SOCK_RAW(void)
615{
616 return PJ_SOCK_RAW;
617}
618
619PJ_DEF(int) pj_SOCK_RDM(void)
620{
621 return PJ_SOCK_RDM;
622}
623
624PJ_DEF(pj_uint16_t) pj_SOL_SOCKET(void)
625{
626 return PJ_SOL_SOCKET;
627}
628
629PJ_DEF(pj_uint16_t) pj_SOL_IP(void)
630{
631 return PJ_SOL_IP;
632}
633
634PJ_DEF(pj_uint16_t) pj_SOL_TCP(void)
635{
636 return PJ_SOL_TCP;
637}
638
639PJ_DEF(pj_uint16_t) pj_SOL_UDP(void)
640{
641 return PJ_SOL_UDP;
642}
643
644PJ_DEF(pj_uint16_t) pj_SOL_IPV6(void)
645{
646 return PJ_SOL_IPV6;
647}
648
649PJ_DEF(int) pj_IP_TOS(void)
650{
651 return PJ_IP_TOS;
652}
653
654PJ_DEF(int) pj_IPTOS_LOWDELAY(void)
655{
656 return PJ_IPTOS_LOWDELAY;
657}
658
659PJ_DEF(int) pj_IPTOS_THROUGHPUT(void)
660{
661 return PJ_IPTOS_THROUGHPUT;
662}
663
664PJ_DEF(int) pj_IPTOS_RELIABILITY(void)
665{
666 return PJ_IPTOS_RELIABILITY;
667}
668
669PJ_DEF(int) pj_IPTOS_MINCOST(void)
670{
671 return PJ_IPTOS_MINCOST;
672}
673
674PJ_DEF(pj_uint16_t) pj_SO_TYPE(void)
675{
676 return PJ_SO_TYPE;
677}
678
679PJ_DEF(pj_uint16_t) pj_SO_RCVBUF(void)
680{
681 return PJ_SO_RCVBUF;
682}
683
684PJ_DEF(pj_uint16_t) pj_SO_SNDBUF(void)
685{
686 return PJ_SO_SNDBUF;
687}
688
Nanang Izzuddinb76154e2008-09-16 16:11:44 +0000689PJ_DEF(pj_uint16_t) pj_IP_MULTICAST_IF(void)
690{
691 return PJ_IP_MULTICAST_IF;
692}
693
694PJ_DEF(pj_uint16_t) pj_IP_MULTICAST_TTL(void)
695{
696 return PJ_IP_MULTICAST_TTL;
697}
698
699PJ_DEF(pj_uint16_t) pj_IP_MULTICAST_LOOP(void)
700{
701 return PJ_IP_MULTICAST_LOOP;
702}
703
704PJ_DEF(pj_uint16_t) pj_IP_ADD_MEMBERSHIP(void)
705{
706 return PJ_IP_ADD_MEMBERSHIP;
707}
708
709PJ_DEF(pj_uint16_t) pj_IP_DROP_MEMBERSHIP(void)
710{
711 return PJ_IP_DROP_MEMBERSHIP;
712}
713
Benny Prijono8ab968f2007-07-20 08:08:30 +0000714PJ_DEF(int) pj_MSG_OOB(void)
715{
716 return PJ_MSG_OOB;
717}
718
719PJ_DEF(int) pj_MSG_PEEK(void)
720{
721 return PJ_MSG_PEEK;
722}
723
724PJ_DEF(int) pj_MSG_DONTROUTE(void)
725{
726 return PJ_MSG_DONTROUTE;
727}
728
Benny Prijono62b86eb2007-12-01 08:52:57 +0000729#endif /* PJ_DLL */
730