1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#ifndef _NGX_CONNECTION_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_CONNECTION_H_INCLUDED_
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#include <ngx_config.h>
13e18a033bSKonstantin Ananyev#include <ngx_core.h>
14e18a033bSKonstantin Ananyev
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyevtypedef struct ngx_listening_s  ngx_listening_t;
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyevstruct ngx_listening_s {
19e18a033bSKonstantin Ananyev    ngx_socket_t        fd;
20e18a033bSKonstantin Ananyev
21e18a033bSKonstantin Ananyev    struct sockaddr    *sockaddr;
22e18a033bSKonstantin Ananyev    socklen_t           socklen;    /* size of sockaddr */
23e18a033bSKonstantin Ananyev    size_t              addr_text_max_len;
24e18a033bSKonstantin Ananyev    ngx_str_t           addr_text;
25e18a033bSKonstantin Ananyev
26e18a033bSKonstantin Ananyev    int                 type;
27e18a033bSKonstantin Ananyev
28e18a033bSKonstantin Ananyev    int                 backlog;
29e18a033bSKonstantin Ananyev    int                 rcvbuf;
30e18a033bSKonstantin Ananyev    int                 sndbuf;
31e18a033bSKonstantin Ananyev#if (NGX_HAVE_KEEPALIVE_TUNABLE)
32e18a033bSKonstantin Ananyev    int                 keepidle;
33e18a033bSKonstantin Ananyev    int                 keepintvl;
34e18a033bSKonstantin Ananyev    int                 keepcnt;
35e18a033bSKonstantin Ananyev#endif
36e18a033bSKonstantin Ananyev
37e18a033bSKonstantin Ananyev    /* handler of accepted connection */
38e18a033bSKonstantin Ananyev    ngx_connection_handler_pt   handler;
39e18a033bSKonstantin Ananyev
40e18a033bSKonstantin Ananyev    void               *servers;  /* array of ngx_http_in_addr_t, for example */
41e18a033bSKonstantin Ananyev
42e18a033bSKonstantin Ananyev    ngx_log_t           log;
43e18a033bSKonstantin Ananyev    ngx_log_t          *logp;
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyev    size_t              pool_size;
46e18a033bSKonstantin Ananyev    /* should be here because of the AcceptEx() preread */
47e18a033bSKonstantin Ananyev    size_t              post_accept_buffer_size;
48e18a033bSKonstantin Ananyev    /* should be here because of the deferred accept */
49e18a033bSKonstantin Ananyev    ngx_msec_t          post_accept_timeout;
50e18a033bSKonstantin Ananyev
51e18a033bSKonstantin Ananyev    ngx_listening_t    *previous;
52e18a033bSKonstantin Ananyev    ngx_connection_t   *connection;
53e18a033bSKonstantin Ananyev
54e18a033bSKonstantin Ananyev    ngx_uint_t          worker;
55e18a033bSKonstantin Ananyev
56e18a033bSKonstantin Ananyev    unsigned            open:1;
57e18a033bSKonstantin Ananyev    unsigned            remain:1;
58e18a033bSKonstantin Ananyev    unsigned            ignore:1;
59e18a033bSKonstantin Ananyev
60e18a033bSKonstantin Ananyev    unsigned            bound:1;       /* already bound */
61e18a033bSKonstantin Ananyev    unsigned            inherited:1;   /* inherited from previous process */
62e18a033bSKonstantin Ananyev    unsigned            nonblocking_accept:1;
63e18a033bSKonstantin Ananyev    unsigned            listen:1;
64e18a033bSKonstantin Ananyev    unsigned            nonblocking:1;
65e18a033bSKonstantin Ananyev    unsigned            shared:1;    /* shared between threads or processes */
66e18a033bSKonstantin Ananyev    unsigned            addr_ntop:1;
67e18a033bSKonstantin Ananyev    unsigned            wildcard:1;
68e18a033bSKonstantin Ananyev
69e18a033bSKonstantin Ananyev#if (NGX_HAVE_INET6)
70e18a033bSKonstantin Ananyev    unsigned            ipv6only:1;
71e18a033bSKonstantin Ananyev#endif
72e18a033bSKonstantin Ananyev    unsigned            reuseport:1;
73e18a033bSKonstantin Ananyev    unsigned            add_reuseport:1;
74e18a033bSKonstantin Ananyev    unsigned            keepalive:2;
75e18a033bSKonstantin Ananyev
76e18a033bSKonstantin Ananyev    unsigned            deferred_accept:1;
77e18a033bSKonstantin Ananyev    unsigned            delete_deferred:1;
78e18a033bSKonstantin Ananyev    unsigned            add_deferred:1;
79e18a033bSKonstantin Ananyev#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
80e18a033bSKonstantin Ananyev    char               *accept_filter;
81e18a033bSKonstantin Ananyev#endif
82e18a033bSKonstantin Ananyev#if (NGX_HAVE_SETFIB)
83e18a033bSKonstantin Ananyev    int                 setfib;
84e18a033bSKonstantin Ananyev#endif
85e18a033bSKonstantin Ananyev
86e18a033bSKonstantin Ananyev#if (NGX_HAVE_TCP_FASTOPEN)
87e18a033bSKonstantin Ananyev    int                 fastopen;
88e18a033bSKonstantin Ananyev#endif
89e18a033bSKonstantin Ananyev
90e18a033bSKonstantin Ananyev};
91e18a033bSKonstantin Ananyev
92e18a033bSKonstantin Ananyev
93e18a033bSKonstantin Ananyevtypedef enum {
94e18a033bSKonstantin Ananyev    NGX_ERROR_ALERT = 0,
95e18a033bSKonstantin Ananyev    NGX_ERROR_ERR,
96e18a033bSKonstantin Ananyev    NGX_ERROR_INFO,
97e18a033bSKonstantin Ananyev    NGX_ERROR_IGNORE_ECONNRESET,
98e18a033bSKonstantin Ananyev    NGX_ERROR_IGNORE_EINVAL
99e18a033bSKonstantin Ananyev} ngx_connection_log_error_e;
100e18a033bSKonstantin Ananyev
101e18a033bSKonstantin Ananyev
102e18a033bSKonstantin Ananyevtypedef enum {
103e18a033bSKonstantin Ananyev    NGX_TCP_NODELAY_UNSET = 0,
104e18a033bSKonstantin Ananyev    NGX_TCP_NODELAY_SET,
105e18a033bSKonstantin Ananyev    NGX_TCP_NODELAY_DISABLED
106e18a033bSKonstantin Ananyev} ngx_connection_tcp_nodelay_e;
107e18a033bSKonstantin Ananyev
108e18a033bSKonstantin Ananyev
109e18a033bSKonstantin Ananyevtypedef enum {
110e18a033bSKonstantin Ananyev    NGX_TCP_NOPUSH_UNSET = 0,
111e18a033bSKonstantin Ananyev    NGX_TCP_NOPUSH_SET,
112e18a033bSKonstantin Ananyev    NGX_TCP_NOPUSH_DISABLED
113e18a033bSKonstantin Ananyev} ngx_connection_tcp_nopush_e;
114e18a033bSKonstantin Ananyev
115e18a033bSKonstantin Ananyev
116e18a033bSKonstantin Ananyev#define NGX_LOWLEVEL_BUFFERED  0x0f
117e18a033bSKonstantin Ananyev#define NGX_SSL_BUFFERED       0x01
118e18a033bSKonstantin Ananyev#define NGX_HTTP_V2_BUFFERED   0x02
119e18a033bSKonstantin Ananyev
120e18a033bSKonstantin Ananyev
121e18a033bSKonstantin Ananyevstruct ngx_connection_s {
122e18a033bSKonstantin Ananyev    void               *data;
123e18a033bSKonstantin Ananyev    ngx_event_t        *read;
124e18a033bSKonstantin Ananyev    ngx_event_t        *write;
125e18a033bSKonstantin Ananyev
126e18a033bSKonstantin Ananyev    ngx_socket_t        fd;
127e18a033bSKonstantin Ananyev
128e18a033bSKonstantin Ananyev    ngx_recv_pt         recv;
129e18a033bSKonstantin Ananyev    ngx_send_pt         send;
130e18a033bSKonstantin Ananyev    ngx_recv_chain_pt   recv_chain;
131e18a033bSKonstantin Ananyev    ngx_send_chain_pt   send_chain;
132e18a033bSKonstantin Ananyev
133e18a033bSKonstantin Ananyev    ngx_listening_t    *listening;
134e18a033bSKonstantin Ananyev
135e18a033bSKonstantin Ananyev    off_t               sent;
136e18a033bSKonstantin Ananyev
137e18a033bSKonstantin Ananyev    ngx_log_t          *log;
138e18a033bSKonstantin Ananyev
139e18a033bSKonstantin Ananyev    ngx_pool_t         *pool;
140e18a033bSKonstantin Ananyev
141e18a033bSKonstantin Ananyev    int                 type;
142e18a033bSKonstantin Ananyev
143e18a033bSKonstantin Ananyev    struct sockaddr    *sockaddr;
144e18a033bSKonstantin Ananyev    socklen_t           socklen;
145e18a033bSKonstantin Ananyev    ngx_str_t           addr_text;
146e18a033bSKonstantin Ananyev
147e18a033bSKonstantin Ananyev    ngx_str_t           proxy_protocol_addr;
148e18a033bSKonstantin Ananyev    in_port_t           proxy_protocol_port;
149e18a033bSKonstantin Ananyev
150e18a033bSKonstantin Ananyev#if (NGX_SSL || NGX_COMPAT)
151e18a033bSKonstantin Ananyev    ngx_ssl_connection_t  *ssl;
152e18a033bSKonstantin Ananyev#endif
153e18a033bSKonstantin Ananyev
154e18a033bSKonstantin Ananyev    struct sockaddr    *local_sockaddr;
155e18a033bSKonstantin Ananyev    socklen_t           local_socklen;
156e18a033bSKonstantin Ananyev
157e18a033bSKonstantin Ananyev    ngx_buf_t          *buffer;
158e18a033bSKonstantin Ananyev
159e18a033bSKonstantin Ananyev    ngx_queue_t         queue;
160e18a033bSKonstantin Ananyev
161e18a033bSKonstantin Ananyev    ngx_atomic_uint_t   number;
162e18a033bSKonstantin Ananyev
163e18a033bSKonstantin Ananyev    ngx_uint_t          requests;
164e18a033bSKonstantin Ananyev
165e18a033bSKonstantin Ananyev    unsigned            buffered:8;
166e18a033bSKonstantin Ananyev
167e18a033bSKonstantin Ananyev    unsigned            log_error:3;     /* ngx_connection_log_error_e */
168e18a033bSKonstantin Ananyev
169e18a033bSKonstantin Ananyev    unsigned            timedout:1;
170e18a033bSKonstantin Ananyev    unsigned            error:1;
171e18a033bSKonstantin Ananyev    unsigned            destroyed:1;
172e18a033bSKonstantin Ananyev
173e18a033bSKonstantin Ananyev    unsigned            idle:1;
174e18a033bSKonstantin Ananyev    unsigned            reusable:1;
175e18a033bSKonstantin Ananyev    unsigned            close:1;
176e18a033bSKonstantin Ananyev    unsigned            shared:1;
177e18a033bSKonstantin Ananyev
178e18a033bSKonstantin Ananyev    unsigned            sendfile:1;
179e18a033bSKonstantin Ananyev    unsigned            sndlowat:1;
180e18a033bSKonstantin Ananyev    unsigned            tcp_nodelay:2;   /* ngx_connection_tcp_nodelay_e */
181e18a033bSKonstantin Ananyev    unsigned            tcp_nopush:2;    /* ngx_connection_tcp_nopush_e */
182e18a033bSKonstantin Ananyev
183e18a033bSKonstantin Ananyev    unsigned            need_last_buf:1;
184e18a033bSKonstantin Ananyev
185e18a033bSKonstantin Ananyev#if (NGX_HAVE_AIO_SENDFILE || NGX_COMPAT)
186e18a033bSKonstantin Ananyev    unsigned            busy_count:2;
187e18a033bSKonstantin Ananyev#endif
188e18a033bSKonstantin Ananyev
189e18a033bSKonstantin Ananyev#if (NGX_THREADS || NGX_COMPAT)
190e18a033bSKonstantin Ananyev    ngx_thread_task_t  *sendfile_task;
191e18a033bSKonstantin Ananyev#endif
192e18a033bSKonstantin Ananyev};
193e18a033bSKonstantin Ananyev
194e18a033bSKonstantin Ananyev
195e18a033bSKonstantin Ananyev#define ngx_set_connection_log(c, l)                                         \
196e18a033bSKonstantin Ananyev                                                                             \
197e18a033bSKonstantin Ananyev    c->log->file = l->file;                                                  \
198e18a033bSKonstantin Ananyev    c->log->next = l->next;                                                  \
199e18a033bSKonstantin Ananyev    c->log->writer = l->writer;                                              \
200e18a033bSKonstantin Ananyev    c->log->wdata = l->wdata;                                                \
201e18a033bSKonstantin Ananyev    if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {                   \
202e18a033bSKonstantin Ananyev        c->log->log_level = l->log_level;                                    \
203e18a033bSKonstantin Ananyev    }
204e18a033bSKonstantin Ananyev
205e18a033bSKonstantin Ananyev
206e18a033bSKonstantin Ananyevngx_listening_t *ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr,
207e18a033bSKonstantin Ananyev    socklen_t socklen);
208e18a033bSKonstantin Ananyevngx_int_t ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls);
209e18a033bSKonstantin Ananyevngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle);
210e18a033bSKonstantin Ananyevngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle);
211e18a033bSKonstantin Ananyevvoid ngx_configure_listening_sockets(ngx_cycle_t *cycle);
212e18a033bSKonstantin Ananyevvoid ngx_close_listening_sockets(ngx_cycle_t *cycle);
213e18a033bSKonstantin Ananyevvoid ngx_close_connection(ngx_connection_t *c);
214e18a033bSKonstantin Ananyevvoid ngx_close_idle_connections(ngx_cycle_t *cycle);
215e18a033bSKonstantin Ananyevngx_int_t ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,
216e18a033bSKonstantin Ananyev    ngx_uint_t port);
217e18a033bSKonstantin Ananyevngx_int_t ngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text);
218e18a033bSKonstantin Ananyev
219e18a033bSKonstantin Ananyevngx_connection_t *ngx_get_connection(ngx_socket_t s, ngx_log_t *log);
220e18a033bSKonstantin Ananyevvoid ngx_free_connection(ngx_connection_t *c);
221e18a033bSKonstantin Ananyev
222e18a033bSKonstantin Ananyevvoid ngx_reusable_connection(ngx_connection_t *c, ngx_uint_t reusable);
223e18a033bSKonstantin Ananyev
224e18a033bSKonstantin Ananyev#endif /* _NGX_CONNECTION_H_INCLUDED_ */
225