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_STREAM_UPSTREAM_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_STREAM_UPSTREAM_H_INCLUDED_
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#include <ngx_config.h>
13e18a033bSKonstantin Ananyev#include <ngx_core.h>
14e18a033bSKonstantin Ananyev#include <ngx_stream.h>
15e18a033bSKonstantin Ananyev#include <ngx_event_connect.h>
16e18a033bSKonstantin Ananyev
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyev#define NGX_STREAM_UPSTREAM_CREATE        0x0001
19e18a033bSKonstantin Ananyev#define NGX_STREAM_UPSTREAM_WEIGHT        0x0002
20e18a033bSKonstantin Ananyev#define NGX_STREAM_UPSTREAM_MAX_FAILS     0x0004
21e18a033bSKonstantin Ananyev#define NGX_STREAM_UPSTREAM_FAIL_TIMEOUT  0x0008
22e18a033bSKonstantin Ananyev#define NGX_STREAM_UPSTREAM_DOWN          0x0010
23e18a033bSKonstantin Ananyev#define NGX_STREAM_UPSTREAM_BACKUP        0x0020
24e18a033bSKonstantin Ananyev#define NGX_STREAM_UPSTREAM_MAX_CONNS     0x0100
25e18a033bSKonstantin Ananyev
26e18a033bSKonstantin Ananyev
27e18a033bSKonstantin Ananyev#define NGX_STREAM_UPSTREAM_NOTIFY_CONNECT     0x1
28e18a033bSKonstantin Ananyev
29e18a033bSKonstantin Ananyev
30e18a033bSKonstantin Ananyevtypedef struct {
31e18a033bSKonstantin Ananyev    ngx_array_t                        upstreams;
32e18a033bSKonstantin Ananyev                                           /* ngx_stream_upstream_srv_conf_t */
33e18a033bSKonstantin Ananyev} ngx_stream_upstream_main_conf_t;
34e18a033bSKonstantin Ananyev
35e18a033bSKonstantin Ananyev
36e18a033bSKonstantin Ananyevtypedef struct ngx_stream_upstream_srv_conf_s  ngx_stream_upstream_srv_conf_t;
37e18a033bSKonstantin Ananyev
38e18a033bSKonstantin Ananyev
39e18a033bSKonstantin Ananyevtypedef ngx_int_t (*ngx_stream_upstream_init_pt)(ngx_conf_t *cf,
40e18a033bSKonstantin Ananyev    ngx_stream_upstream_srv_conf_t *us);
41e18a033bSKonstantin Ananyevtypedef ngx_int_t (*ngx_stream_upstream_init_peer_pt)(ngx_stream_session_t *s,
42e18a033bSKonstantin Ananyev    ngx_stream_upstream_srv_conf_t *us);
43e18a033bSKonstantin Ananyev
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyevtypedef struct {
46e18a033bSKonstantin Ananyev    ngx_stream_upstream_init_pt        init_upstream;
47e18a033bSKonstantin Ananyev    ngx_stream_upstream_init_peer_pt   init;
48e18a033bSKonstantin Ananyev    void                              *data;
49e18a033bSKonstantin Ananyev} ngx_stream_upstream_peer_t;
50e18a033bSKonstantin Ananyev
51e18a033bSKonstantin Ananyev
52e18a033bSKonstantin Ananyevtypedef struct {
53e18a033bSKonstantin Ananyev    ngx_str_t                          name;
54e18a033bSKonstantin Ananyev    ngx_addr_t                        *addrs;
55e18a033bSKonstantin Ananyev    ngx_uint_t                         naddrs;
56e18a033bSKonstantin Ananyev    ngx_uint_t                         weight;
57e18a033bSKonstantin Ananyev    ngx_uint_t                         max_conns;
58e18a033bSKonstantin Ananyev    ngx_uint_t                         max_fails;
59e18a033bSKonstantin Ananyev    time_t                             fail_timeout;
60e18a033bSKonstantin Ananyev    ngx_msec_t                         slow_start;
61e18a033bSKonstantin Ananyev
62e18a033bSKonstantin Ananyev    unsigned                           down:1;
63e18a033bSKonstantin Ananyev    unsigned                           backup:1;
64e18a033bSKonstantin Ananyev
65e18a033bSKonstantin Ananyev    NGX_COMPAT_BEGIN(4)
66e18a033bSKonstantin Ananyev    NGX_COMPAT_END
67e18a033bSKonstantin Ananyev} ngx_stream_upstream_server_t;
68e18a033bSKonstantin Ananyev
69e18a033bSKonstantin Ananyev
70e18a033bSKonstantin Ananyevstruct ngx_stream_upstream_srv_conf_s {
71e18a033bSKonstantin Ananyev    ngx_stream_upstream_peer_t         peer;
72e18a033bSKonstantin Ananyev    void                             **srv_conf;
73e18a033bSKonstantin Ananyev
74e18a033bSKonstantin Ananyev    ngx_array_t                       *servers;
75e18a033bSKonstantin Ananyev                                              /* ngx_stream_upstream_server_t */
76e18a033bSKonstantin Ananyev
77e18a033bSKonstantin Ananyev    ngx_uint_t                         flags;
78e18a033bSKonstantin Ananyev    ngx_str_t                          host;
79e18a033bSKonstantin Ananyev    u_char                            *file_name;
80e18a033bSKonstantin Ananyev    ngx_uint_t                         line;
81e18a033bSKonstantin Ananyev    in_port_t                          port;
82e18a033bSKonstantin Ananyev    ngx_uint_t                         no_port;  /* unsigned no_port:1 */
83e18a033bSKonstantin Ananyev
84e18a033bSKonstantin Ananyev#if (NGX_STREAM_UPSTREAM_ZONE)
85e18a033bSKonstantin Ananyev    ngx_shm_zone_t                    *shm_zone;
86e18a033bSKonstantin Ananyev#endif
87e18a033bSKonstantin Ananyev};
88e18a033bSKonstantin Ananyev
89e18a033bSKonstantin Ananyev
90e18a033bSKonstantin Ananyevtypedef struct {
91e18a033bSKonstantin Ananyev    ngx_msec_t                         response_time;
92e18a033bSKonstantin Ananyev    ngx_msec_t                         connect_time;
93e18a033bSKonstantin Ananyev    ngx_msec_t                         first_byte_time;
94e18a033bSKonstantin Ananyev    off_t                              bytes_sent;
95e18a033bSKonstantin Ananyev    off_t                              bytes_received;
96e18a033bSKonstantin Ananyev
97e18a033bSKonstantin Ananyev    ngx_str_t                         *peer;
98e18a033bSKonstantin Ananyev} ngx_stream_upstream_state_t;
99e18a033bSKonstantin Ananyev
100e18a033bSKonstantin Ananyev
101e18a033bSKonstantin Ananyevtypedef struct {
102e18a033bSKonstantin Ananyev    ngx_str_t                          host;
103e18a033bSKonstantin Ananyev    in_port_t                          port;
104e18a033bSKonstantin Ananyev    ngx_uint_t                         no_port; /* unsigned no_port:1 */
105e18a033bSKonstantin Ananyev
106e18a033bSKonstantin Ananyev    ngx_uint_t                         naddrs;
107e18a033bSKonstantin Ananyev    ngx_resolver_addr_t               *addrs;
108e18a033bSKonstantin Ananyev
109e18a033bSKonstantin Ananyev    struct sockaddr                   *sockaddr;
110e18a033bSKonstantin Ananyev    socklen_t                          socklen;
111e18a033bSKonstantin Ananyev    ngx_str_t                          name;
112e18a033bSKonstantin Ananyev
113e18a033bSKonstantin Ananyev    ngx_resolver_ctx_t                *ctx;
114e18a033bSKonstantin Ananyev} ngx_stream_upstream_resolved_t;
115e18a033bSKonstantin Ananyev
116e18a033bSKonstantin Ananyev
117e18a033bSKonstantin Ananyevtypedef struct {
118e18a033bSKonstantin Ananyev    ngx_peer_connection_t              peer;
119e18a033bSKonstantin Ananyev
120e18a033bSKonstantin Ananyev    ngx_buf_t                          downstream_buf;
121e18a033bSKonstantin Ananyev    ngx_buf_t                          upstream_buf;
122e18a033bSKonstantin Ananyev
123e18a033bSKonstantin Ananyev    ngx_chain_t                       *free;
124e18a033bSKonstantin Ananyev    ngx_chain_t                       *upstream_out;
125e18a033bSKonstantin Ananyev    ngx_chain_t                       *upstream_busy;
126e18a033bSKonstantin Ananyev    ngx_chain_t                       *downstream_out;
127e18a033bSKonstantin Ananyev    ngx_chain_t                       *downstream_busy;
128e18a033bSKonstantin Ananyev
129e18a033bSKonstantin Ananyev    off_t                              received;
130e18a033bSKonstantin Ananyev    time_t                             start_sec;
131e18a033bSKonstantin Ananyev    ngx_uint_t                         responses;
132e18a033bSKonstantin Ananyev
133e18a033bSKonstantin Ananyev    ngx_str_t                          ssl_name;
134e18a033bSKonstantin Ananyev
135e18a033bSKonstantin Ananyev    ngx_stream_upstream_srv_conf_t    *upstream;
136e18a033bSKonstantin Ananyev    ngx_stream_upstream_resolved_t    *resolved;
137e18a033bSKonstantin Ananyev    ngx_stream_upstream_state_t       *state;
138e18a033bSKonstantin Ananyev    unsigned                           connected:1;
139e18a033bSKonstantin Ananyev    unsigned                           proxy_protocol:1;
140e18a033bSKonstantin Ananyev} ngx_stream_upstream_t;
141e18a033bSKonstantin Ananyev
142e18a033bSKonstantin Ananyev
143e18a033bSKonstantin Ananyevngx_stream_upstream_srv_conf_t *ngx_stream_upstream_add(ngx_conf_t *cf,
144e18a033bSKonstantin Ananyev    ngx_url_t *u, ngx_uint_t flags);
145e18a033bSKonstantin Ananyev
146e18a033bSKonstantin Ananyev
147e18a033bSKonstantin Ananyev#define ngx_stream_conf_upstream_srv_conf(uscf, module)                       \
148e18a033bSKonstantin Ananyev    uscf->srv_conf[module.ctx_index]
149e18a033bSKonstantin Ananyev
150e18a033bSKonstantin Ananyev
151e18a033bSKonstantin Ananyevextern ngx_module_t  ngx_stream_upstream_module;
152e18a033bSKonstantin Ananyev
153e18a033bSKonstantin Ananyev
154e18a033bSKonstantin Ananyev#endif /* _NGX_STREAM_UPSTREAM_H_INCLUDED_ */
155