annotate src/stream/ngx_stream_limit_conn_module.c @ 6230:2a621245f4cf

Win32: MSVC 2015 compatibility. Resolved warnings about declarations that hide previous local declarations. Warnings about WSASocketA() being deprecated resolved by explicit use of WSASocketW() instead of WSASocket(). When compiling without IPv6 support, WinSock deprecated warnings are disabled to allow use of gethostbyname().
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 17 Aug 2015 18:09:17 +0300
parents 0dcef374b8bb
children f01ab2dbcfdc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6197
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5 */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_stream.h>
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 typedef struct {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14 u_char color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15 u_char len;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16 u_short conn;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17 u_char data[1];
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18 } ngx_stream_limit_conn_node_t;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21 typedef struct {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22 ngx_shm_zone_t *shm_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23 ngx_rbtree_node_t *node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 } ngx_stream_limit_conn_cleanup_t;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27 typedef struct {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 ngx_rbtree_t *rbtree;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 } ngx_stream_limit_conn_ctx_t;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32 typedef struct {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33 ngx_shm_zone_t *shm_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34 ngx_uint_t conn;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 } ngx_stream_limit_conn_limit_t;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 typedef struct {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 ngx_array_t limits;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 ngx_uint_t log_level;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41 } ngx_stream_limit_conn_conf_t;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44 static ngx_rbtree_node_t *ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45 ngx_str_t *key, uint32_t hash);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 static void ngx_stream_limit_conn_cleanup(void *data);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47 static ngx_inline void ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49 static void *ngx_stream_limit_conn_create_conf(ngx_conf_t *cf);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 static char *ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 void *child);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 static char *ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 void *conf);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 static char *ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 void *conf);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 static ngx_int_t ngx_stream_limit_conn_init(ngx_conf_t *cf);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 static ngx_conf_enum_t ngx_stream_limit_conn_log_levels[] = {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 { ngx_string("info"), NGX_LOG_INFO },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 { ngx_string("notice"), NGX_LOG_NOTICE },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 { ngx_string("warn"), NGX_LOG_WARN },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 { ngx_string("error"), NGX_LOG_ERR },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 { ngx_null_string, 0 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65 };
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 static ngx_command_t ngx_stream_limit_conn_commands[] = {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 { ngx_string("limit_conn_zone"),
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE2,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 ngx_stream_limit_conn_zone,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 NULL },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 { ngx_string("limit_conn"),
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 ngx_stream_limit_conn,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80 NGX_STREAM_SRV_CONF_OFFSET,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 NULL },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84 { ngx_string("limit_conn_log_level"),
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 ngx_conf_set_enum_slot,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 NGX_STREAM_SRV_CONF_OFFSET,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88 offsetof(ngx_stream_limit_conn_conf_t, log_level),
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 &ngx_stream_limit_conn_log_levels },
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91 ngx_null_command
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 };
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 static ngx_stream_module_t ngx_stream_limit_conn_module_ctx = {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 ngx_stream_limit_conn_init, /* postconfiguration */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 NULL, /* create main configuration */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 NULL, /* init main configuration */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 ngx_stream_limit_conn_create_conf, /* create server configuration */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 ngx_stream_limit_conn_merge_conf, /* merge server configuration */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 };
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 ngx_module_t ngx_stream_limit_conn_module = {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 NGX_MODULE_V1,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 &ngx_stream_limit_conn_module_ctx, /* module context */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109 ngx_stream_limit_conn_commands, /* module directives */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110 NGX_STREAM_MODULE, /* module type */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 NULL, /* init master */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 NULL, /* init module */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 NULL, /* init process */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114 NULL, /* init thread */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 NULL, /* exit thread */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 NULL, /* exit process */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 NULL, /* exit master */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 NGX_MODULE_V1_PADDING
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 };
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 static ngx_int_t
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123 ngx_stream_limit_conn_handler(ngx_stream_session_t *s)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 size_t n;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126 uint32_t hash;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 ngx_str_t key;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 ngx_uint_t i;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 ngx_slab_pool_t *shpool;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 ngx_rbtree_node_t *node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 ngx_pool_cleanup_t *cln;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 struct sockaddr_in *sin;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 #if (NGX_HAVE_INET6)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 struct sockaddr_in6 *sin6;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 #endif
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 ngx_stream_limit_conn_ctx_t *ctx;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 ngx_stream_limit_conn_node_t *lc;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138 ngx_stream_limit_conn_conf_t *lccf;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 ngx_stream_limit_conn_limit_t *limits;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 ngx_stream_limit_conn_cleanup_t *lccln;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 switch (s->connection->sockaddr->sa_family) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 case AF_INET:
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145 sin = (struct sockaddr_in *) s->connection->sockaddr;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147 key.len = sizeof(in_addr_t);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 key.data = (u_char *) &sin->sin_addr;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 break;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 #if (NGX_HAVE_INET6)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 case AF_INET6:
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154 sin6 = (struct sockaddr_in6 *) s->connection->sockaddr;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 key.len = sizeof(struct in6_addr);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 key.data = sin6->sin6_addr.s6_addr;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 break;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 #endif
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 default:
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 return NGX_DECLINED;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 hash = ngx_crc32_short(key.data, key.len);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 lccf = ngx_stream_get_module_srv_conf(s, ngx_stream_limit_conn_module);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 limits = lccf->limits.elts;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171 for (i = 0; i < lccf->limits.nelts; i++) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 ctx = limits[i].shm_zone->data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 shpool = (ngx_slab_pool_t *) limits[i].shm_zone->shm.addr;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 ngx_shmtx_lock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 node = ngx_stream_limit_conn_lookup(ctx->rbtree, &key, hash);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 if (node == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 n = offsetof(ngx_rbtree_node_t, color)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 + offsetof(ngx_stream_limit_conn_node_t, data)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184 + key.len;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 node = ngx_slab_alloc_locked(shpool, n);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 if (node == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 ngx_shmtx_unlock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190 ngx_stream_limit_conn_cleanup_all(s->connection->pool);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 return NGX_ABORT;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 lc = (ngx_stream_limit_conn_node_t *) &node->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 node->key = hash;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 lc->len = (u_char) key.len;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 lc->conn = 1;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199 ngx_memcpy(lc->data, key.data, key.len);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 ngx_rbtree_insert(ctx->rbtree, node);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 } else {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 lc = (ngx_stream_limit_conn_node_t *) &node->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 if ((ngx_uint_t) lc->conn >= limits[i].conn) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 ngx_shmtx_unlock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211 ngx_log_error(lccf->log_level, s->connection->log, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 "limiting connections by zone \"%V\"",
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 &limits[i].shm_zone->shm.name);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215 ngx_stream_limit_conn_cleanup_all(s->connection->pool);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 return NGX_ABORT;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 lc->conn++;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 "limit conn: %08XD %d", node->key, lc->conn);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225 ngx_shmtx_unlock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227 cln = ngx_pool_cleanup_add(s->connection->pool,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 sizeof(ngx_stream_limit_conn_cleanup_t));
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229 if (cln == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230 return NGX_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 cln->handler = ngx_stream_limit_conn_cleanup;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 lccln = cln->data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 lccln->shm_zone = limits[i].shm_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 lccln->node = node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240 return NGX_DECLINED;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 static void
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 ngx_stream_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 ngx_rbtree_node_t **p;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 ngx_stream_limit_conn_node_t *lcn, *lcnt;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 for ( ;; ) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 if (node->key < temp->key) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255 p = &temp->left;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 } else if (node->key > temp->key) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 p = &temp->right;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 } else { /* node->key == temp->key */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 lcn = (ngx_stream_limit_conn_node_t *) &node->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 lcnt = (ngx_stream_limit_conn_node_t *) &temp->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 p = (ngx_memn2cmp(lcn->data, lcnt->data, lcn->len, lcnt->len) < 0)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267 ? &temp->left : &temp->right;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 if (*p == sentinel) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 break;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 temp = *p;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277 *p = node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 node->parent = temp;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 node->left = sentinel;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 node->right = sentinel;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 ngx_rbt_red(node);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 static ngx_rbtree_node_t *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286 ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287 uint32_t hash)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 ngx_int_t rc;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290 ngx_rbtree_node_t *node, *sentinel;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 ngx_stream_limit_conn_node_t *lcn;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 node = rbtree->root;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 sentinel = rbtree->sentinel;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 while (node != sentinel) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 if (hash < node->key) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299 node = node->left;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 continue;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303 if (hash > node->key) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304 node = node->right;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 continue;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308 /* hash == node->key */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 lcn = (ngx_stream_limit_conn_node_t *) &node->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 rc = ngx_memn2cmp(key->data, lcn->data, key->len, (size_t) lcn->len);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314 if (rc == 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 return node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 node = (rc < 0) ? node->left : node->right;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321 return NULL;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325 static void
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 ngx_stream_limit_conn_cleanup(void *data)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328 ngx_stream_limit_conn_cleanup_t *lccln = data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 ngx_slab_pool_t *shpool;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331 ngx_rbtree_node_t *node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332 ngx_stream_limit_conn_ctx_t *ctx;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 ngx_stream_limit_conn_node_t *lc;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335 ctx = lccln->shm_zone->data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 shpool = (ngx_slab_pool_t *) lccln->shm_zone->shm.addr;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337 node = lccln->node;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 lc = (ngx_stream_limit_conn_node_t *) &node->color;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 ngx_shmtx_lock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, lccln->shm_zone->shm.log, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343 "limit conn cleanup: %08XD %d", node->key, lc->conn);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345 lc->conn--;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 if (lc->conn == 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348 ngx_rbtree_delete(ctx->rbtree, node);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 ngx_slab_free_locked(shpool, node);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 ngx_shmtx_unlock(&shpool->mutex);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356 static ngx_inline void
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357 ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
358 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
359 ngx_pool_cleanup_t *cln;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
360
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361 cln = pool->cleanup;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 while (cln && cln->handler == ngx_stream_limit_conn_cleanup) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364 ngx_stream_limit_conn_cleanup(cln->data);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 cln = cln->next;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 pool->cleanup = cln;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
370
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372 static ngx_int_t
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373 ngx_stream_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375 ngx_stream_limit_conn_ctx_t *octx = data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377 size_t len;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
378 ngx_slab_pool_t *shpool;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
379 ngx_rbtree_node_t *sentinel;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
380 ngx_stream_limit_conn_ctx_t *ctx;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
381
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
382 ctx = shm_zone->data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
383
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
384 if (octx) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
385 ctx->rbtree = octx->rbtree;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
386
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
387 return NGX_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
389
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392 if (shm_zone->shm.exists) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
393 ctx->rbtree = shpool->data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
395 return NGX_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398 ctx->rbtree = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_t));
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399 if (ctx->rbtree == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400 return NGX_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
401 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
403 shpool->data = ctx->rbtree;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
404
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
405 sentinel = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_node_t));
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
406 if (sentinel == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
407 return NGX_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
408 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
409
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
410 ngx_rbtree_init(ctx->rbtree, sentinel,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411 ngx_stream_limit_conn_rbtree_insert_value);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413 len = sizeof(" in limit_conn_zone \"\"") + shm_zone->shm.name.len;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
414
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
415 shpool->log_ctx = ngx_slab_alloc(shpool, len);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
416 if (shpool->log_ctx == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417 return NGX_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
418 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
419
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
420 ngx_sprintf(shpool->log_ctx, " in limit_conn_zone \"%V\"%Z",
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
421 &shm_zone->shm.name);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
422
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423 return NGX_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
427 static void *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
428 ngx_stream_limit_conn_create_conf(ngx_conf_t *cf)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
429 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430 ngx_stream_limit_conn_conf_t *conf;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
431
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
432 conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_conf_t));
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
433 if (conf == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
434 return NULL;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
436
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437 /*
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438 * set by ngx_pcalloc():
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439 *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440 * conf->limits.elts = NULL;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441 */
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 conf->log_level = NGX_CONF_UNSET_UINT;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445 return conf;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
447
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
449 static char *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450 ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
452 ngx_stream_limit_conn_conf_t *prev = parent;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
453 ngx_stream_limit_conn_conf_t *conf = child;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
454
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455 if (conf->limits.elts == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
456 conf->limits = prev->limits;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
458
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459 ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
460
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
461 return NGX_CONF_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
462 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465 static char *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466 ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468 u_char *p;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 ssize_t size;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 ngx_str_t *value, name, s;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471 ngx_uint_t i;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472 ngx_shm_zone_t *shm_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473 ngx_stream_limit_conn_ctx_t *ctx;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
474
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
475 value = cf->args->elts;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
476
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
477 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_ctx_t));
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
478 if (ctx == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
479 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
480 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
481
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
482 size = 0;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
483 name.len = 0;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
484
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
485 for (i = 2; i < cf->args->nelts; i++) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
486
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
487 if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
488
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
489 name.data = value[i].data + 5;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
490
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
491 p = (u_char *) ngx_strchr(name.data, ':');
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
492
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
493 if (p == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
494 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
495 "invalid zone size \"%V\"", &value[i]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
496 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
497 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
498
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
499 name.len = p - name.data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
500
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
501 s.data = p + 1;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502 s.len = value[i].data + value[i].len - s.data;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
503
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
504 size = ngx_parse_size(&s);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
505
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506 if (size == NGX_ERROR) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
508 "invalid zone size \"%V\"", &value[i]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
510 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
511
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512 if (size < (ssize_t) (8 * ngx_pagesize)) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514 "zone \"%V\" is too small", &value[i]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
516 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518 continue;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
520
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
522 "invalid parameter \"%V\"", &value[i]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526 if (name.len == 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528 "\"%V\" must have \"zone\" parameter",
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
529 &cmd->name);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
530 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533 shm_zone = ngx_shared_memory_add(cf, &name, size,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534 &ngx_stream_limit_conn_module);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
535 if (shm_zone == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
536 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539 if (shm_zone->data) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
540 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541 "%V \"%V\" is already bound to key "
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
542 "\"$binary_remote_addr\"",
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
543 &cmd->name, &name);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
544 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
545 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
546
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
547 if (ngx_strcmp(value[1].data, "$binary_remote_addr") != 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
548 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
549 "unsupported key \"%V\", use "
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
550 "$binary_remote_addr", &value[1]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
554 shm_zone->init = ngx_stream_limit_conn_init_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
555 shm_zone->data = ctx;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
557 return NGX_CONF_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
558 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
560
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
561 static char *
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562 ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
563 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
564 ngx_shm_zone_t *shm_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565 ngx_stream_limit_conn_conf_t *lccf = conf;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
566 ngx_stream_limit_conn_limit_t *limit, *limits;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
568 ngx_str_t *value;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
569 ngx_int_t n;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
570 ngx_uint_t i;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
571
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
572 value = cf->args->elts;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
573
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
574 shm_zone = ngx_shared_memory_add(cf, &value[1], 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
575 &ngx_stream_limit_conn_module);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
576 if (shm_zone == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
577 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
578 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
579
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
580 limits = lccf->limits.elts;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
581
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
582 if (limits == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
583 if (ngx_array_init(&lccf->limits, cf->pool, 1,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
584 sizeof(ngx_stream_limit_conn_limit_t))
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585 != NGX_OK)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
586 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
587 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
588 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
589 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
590
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
591 for (i = 0; i < lccf->limits.nelts; i++) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
592 if (shm_zone == limits[i].shm_zone) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
593 return "is duplicate";
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
594 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
595 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
596
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
597 n = ngx_atoi(value[2].data, value[2].len);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
598 if (n <= 0) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
599 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
600 "invalid number of connections \"%V\"", &value[2]);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
601 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
602 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
603
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
604 if (n > 65535) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
605 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
606 "connection limit must be less 65536");
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
607 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
608 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
609
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
610 limit = ngx_array_push(&lccf->limits);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
611 if (limit == NULL) {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
612 return NGX_CONF_ERROR;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
613 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
614
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
615 limit->conn = n;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
616 limit->shm_zone = shm_zone;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
617
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
618 return NGX_CONF_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
619 }
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
620
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
621
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
622 static ngx_int_t
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
623 ngx_stream_limit_conn_init(ngx_conf_t *cf)
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
624 {
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
625 ngx_stream_core_main_conf_t *cmcf;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
626
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
627 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
628
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
629 cmcf->limit_conn_handler = ngx_stream_limit_conn_handler;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
630
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
631 return NGX_OK;
0dcef374b8bb Stream: connection limiting module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
632 }