annotate src/core/ngx_inet.h @ 6536:f7849bfb6d21

Improved EPOLLRDHUP handling. When it's known that the kernel supports EPOLLRDHUP, there is no need in additional recv() call to get EOF or error when the flag is absent in the event generated by the kernel. A special runtime test is done at startup to detect if EPOLLRDHUP is actually supported by the kernel because epoll_ctl() silently ignores unknown flags. With this knowledge it's now possible to drop the "ready" flag for partial read. Previously, the "ready" flag was kept until the recv() returned EOF or error. In particular, this change allows the lingering close heuristics (which relies on the "ready" flag state) to actually work on Linux, and not wait for more data in most cases. The "available" flag is now used in the read event with the semantics similar to the corresponding counter in kqueue.
author Valentin Bartenev <vbart@nginx.com>
date Fri, 13 May 2016 17:19:23 +0300
parents 6d3a60a909c8
children adf25b8d0431
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 340
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 340
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3276
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 340
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 340
diff changeset
6
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 340
diff changeset
7
26
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #ifndef _NGX_INET_H_INCLUDED_
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #define _NGX_INET_H_INCLUDED_
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
12 #include <ngx_config.h>
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
13 #include <ngx_core.h>
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
14
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
15
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
16 /*
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
17 * TODO: autoconfigure NGX_SOCKADDRLEN and NGX_SOCKADDR_STRLEN as
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
18 * sizeof(struct sockaddr_storage)
2521
119ab57ffaa1 fix NGX_SOCKADDRLEN, introduced in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2512
diff changeset
19 * sizeof(struct sockaddr_un)
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
20 * sizeof(struct sockaddr_in6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
21 * sizeof(struct sockaddr_in)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
22 */
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
23
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
24 #define NGX_INET_ADDRSTRLEN (sizeof("255.255.255.255") - 1)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
25 #define NGX_INET6_ADDRSTRLEN \
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
26 (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
27 #define NGX_UNIX_ADDRSTRLEN \
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
28 (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path))
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
29
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
30 #if (NGX_HAVE_UNIX_DOMAIN)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
31 #define NGX_SOCKADDR_STRLEN (sizeof("unix:") - 1 + NGX_UNIX_ADDRSTRLEN)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
32 #else
4944
ab7a21ce8778 Fixed the NGX_SOCKADDR_STRLEN macro definition.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
33 #define NGX_SOCKADDR_STRLEN (NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1)
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
34 #endif
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
35
2521
119ab57ffaa1 fix NGX_SOCKADDRLEN, introduced in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2512
diff changeset
36 #if (NGX_HAVE_UNIX_DOMAIN)
119ab57ffaa1 fix NGX_SOCKADDRLEN, introduced in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2512
diff changeset
37 #define NGX_SOCKADDRLEN sizeof(struct sockaddr_un)
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
38 #else
2521
119ab57ffaa1 fix NGX_SOCKADDRLEN, introduced in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2512
diff changeset
39 #define NGX_SOCKADDRLEN 512
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
40 #endif
2197
74477ea8074f *) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents: 1671
diff changeset
41
74477ea8074f *) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents: 1671
diff changeset
42
340
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
43 typedef struct {
2538
c5bbb6164630 fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
44 in_addr_t addr;
c5bbb6164630 fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
45 in_addr_t mask;
c5bbb6164630 fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
46 } ngx_in_cidr_t;
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
47
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
48
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
49 #if (NGX_HAVE_INET6)
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
50
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
51 typedef struct {
2538
c5bbb6164630 fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
52 struct in6_addr addr;
c5bbb6164630 fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
53 struct in6_addr mask;
c5bbb6164630 fix the previous commit
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
54 } ngx_in6_cidr_t;
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
55
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
56 #endif
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
57
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
58
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
59 typedef struct {
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
60 ngx_uint_t family;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
61 union {
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
62 ngx_in_cidr_t in;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
63 #if (NGX_HAVE_INET6)
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
64 ngx_in6_cidr_t in6;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
65 #endif
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
66 } u;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
67 } ngx_cidr_t;
340
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
68
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
69
804
472cd9768ac2 now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
70 typedef struct {
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
71 struct sockaddr *sockaddr;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
72 socklen_t socklen;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
73 ngx_str_t name;
3269
f0d596e84634 rename ngx_peer_addr_t to ngx_addr_t
Igor Sysoev <igor@sysoev.ru>
parents: 3265
diff changeset
74 } ngx_addr_t;
804
472cd9768ac2 now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
75
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
76
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
77 typedef struct {
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
78 ngx_str_t url;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
79 ngx_str_t host;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
80 ngx_str_t port_text;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
81 ngx_str_t uri;
804
472cd9768ac2 now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
82
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
83 in_port_t port;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
84 in_port_t default_port;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
85 int family;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
86
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
87 unsigned listen:1;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
88 unsigned uri_part:1;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
89 unsigned no_resolve:1;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
90
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
91 unsigned no_port:1;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
92 unsigned wildcard:1;
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
93
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
94 socklen_t socklen;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
95 u_char sockaddr[NGX_SOCKADDRLEN];
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
96
3269
f0d596e84634 rename ngx_peer_addr_t to ngx_addr_t
Igor Sysoev <igor@sysoev.ru>
parents: 3265
diff changeset
97 ngx_addr_t *addrs;
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
98 ngx_uint_t naddrs;
804
472cd9768ac2 now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
99
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
100 char *err;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
101 } ngx_url_t;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
102
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
103
1647
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
104 in_addr_t ngx_inet_addr(u_char *text, size_t len);
3265
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3264
diff changeset
105 #if (NGX_HAVE_INET6)
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3264
diff changeset
106 ngx_int_t ngx_inet6_addr(u_char *p, size_t len, u_char *addr);
3276
beaf94f2f265 make ngx_inet6_ntop() non-static
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
107 size_t ngx_inet6_ntop(u_char *p, u_char *text, size_t len);
3265
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3264
diff changeset
108 #endif
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 4971
diff changeset
109 size_t ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text,
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 4971
diff changeset
110 size_t len, ngx_uint_t port);
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
111 size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len);
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2521
diff changeset
112 ngx_int_t ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr);
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
113 ngx_int_t ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text,
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
114 size_t len);
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
115 ngx_int_t ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u);
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
116 ngx_int_t ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u);
5473
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5263
diff changeset
117 ngx_int_t ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1,
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5263
diff changeset
118 struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port);
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
119
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
120
26
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 #endif /* _NGX_INET_H_INCLUDED_ */