src/stream/ngx_stream.h - nginx source code

Data types defined

Macros defined

Source code


  1. /*
  2. * Copyright (C) Roman Arutyunyan
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #ifndef _NGX_STREAM_H_INCLUDED_
  6. #define _NGX_STREAM_H_INCLUDED_


  7. #include <ngx_config.h>
  8. #include <ngx_core.h>

  9. #if (NGX_STREAM_SSL)
  10. #include <ngx_stream_ssl_module.h>
  11. #endif


  12. typedef struct ngx_stream_session_s  ngx_stream_session_t;


  13. #include <ngx_stream_variables.h>
  14. #include <ngx_stream_script.h>
  15. #include <ngx_stream_upstream.h>
  16. #include <ngx_stream_upstream_round_robin.h>


  17. #define NGX_STREAM_OK                        200
  18. #define NGX_STREAM_BAD_REQUEST               400
  19. #define NGX_STREAM_FORBIDDEN                 403
  20. #define NGX_STREAM_INTERNAL_SERVER_ERROR     500
  21. #define NGX_STREAM_BAD_GATEWAY               502
  22. #define NGX_STREAM_SERVICE_UNAVAILABLE       503


  23. typedef struct {
  24.     void                         **main_conf;
  25.     void                         **srv_conf;
  26. } ngx_stream_conf_ctx_t;


  27. typedef struct {
  28.     struct sockaddr               *sockaddr;
  29.     socklen_t                      socklen;
  30.     ngx_str_t                      addr_text;

  31.     unsigned                       set:1;
  32.     unsigned                       default_server:1;
  33.     unsigned                       bind:1;
  34.     unsigned                       wildcard:1;
  35.     unsigned                       ssl:1;
  36. #if (NGX_HAVE_INET6)
  37.     unsigned                       ipv6only:1;
  38. #endif
  39.     unsigned                       deferred_accept:1;
  40.     unsigned                       reuseport:1;
  41.     unsigned                       so_keepalive:2;
  42.     unsigned                       proxy_protocol:1;

  43.     int                            backlog;
  44.     int                            rcvbuf;
  45.     int                            sndbuf;
  46.     int                            type;
  47. #if (NGX_HAVE_SETFIB)
  48.     int                            setfib;
  49. #endif
  50. #if (NGX_HAVE_TCP_FASTOPEN)
  51.     int                            fastopen;
  52. #endif
  53. #if (NGX_HAVE_KEEPALIVE_TUNABLE)
  54.     int                            tcp_keepidle;
  55.     int                            tcp_keepintvl;
  56.     int                            tcp_keepcnt;
  57. #endif

  58. #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
  59.     char                          *accept_filter;
  60. #endif
  61. } ngx_stream_listen_opt_t;


  62. typedef enum {
  63.     NGX_STREAM_POST_ACCEPT_PHASE = 0,
  64.     NGX_STREAM_PREACCESS_PHASE,
  65.     NGX_STREAM_ACCESS_PHASE,
  66.     NGX_STREAM_SSL_PHASE,
  67.     NGX_STREAM_PREREAD_PHASE,
  68.     NGX_STREAM_CONTENT_PHASE,
  69.     NGX_STREAM_LOG_PHASE
  70. } ngx_stream_phases;


  71. typedef struct ngx_stream_phase_handler_s  ngx_stream_phase_handler_t;

  72. typedef ngx_int_t (*ngx_stream_phase_handler_pt)(ngx_stream_session_t *s,
  73.     ngx_stream_phase_handler_t *ph);
  74. typedef ngx_int_t (*ngx_stream_handler_pt)(ngx_stream_session_t *s);
  75. typedef void (*ngx_stream_content_handler_pt)(ngx_stream_session_t *s);


  76. struct ngx_stream_phase_handler_s {
  77.     ngx_stream_phase_handler_pt    checker;
  78.     ngx_stream_handler_pt          handler;
  79.     ngx_uint_t                     next;
  80. };


  81. typedef struct {
  82.     ngx_stream_phase_handler_t    *handlers;
  83. } ngx_stream_phase_engine_t;


  84. typedef struct {
  85.     ngx_array_t                    handlers;
  86. } ngx_stream_phase_t;


  87. typedef struct {
  88.     ngx_array_t                    servers;     /* ngx_stream_core_srv_conf_t */

  89.     ngx_stream_phase_engine_t      phase_engine;

  90.     ngx_hash_t                     variables_hash;

  91.     ngx_array_t                    variables;        /* ngx_stream_variable_t */
  92.     ngx_array_t                    prefix_variables; /* ngx_stream_variable_t */
  93.     ngx_uint_t                     ncaptures;

  94.     ngx_uint_t                     server_names_hash_max_size;
  95.     ngx_uint_t                     server_names_hash_bucket_size;

  96.     ngx_uint_t                     variables_hash_max_size;
  97.     ngx_uint_t                     variables_hash_bucket_size;

  98.     ngx_hash_keys_arrays_t        *variables_keys;

  99.     ngx_array_t                   *ports;

  100.     ngx_stream_phase_t             phases[NGX_STREAM_LOG_PHASE + 1];
  101. } ngx_stream_core_main_conf_t;


  102. typedef struct {
  103.     /* array of the ngx_stream_server_name_t, "server_name" directive */
  104.     ngx_array_t                    server_names;

  105.     ngx_stream_content_handler_pt  handler;

  106.     ngx_stream_conf_ctx_t         *ctx;

  107.     u_char                        *file_name;
  108.     ngx_uint_t                     line;

  109.     ngx_str_t                      server_name;

  110.     ngx_flag_t                     tcp_nodelay;
  111.     size_t                         preread_buffer_size;
  112.     ngx_msec_t                     preread_timeout;

  113.     ngx_log_t                     *error_log;

  114.     ngx_msec_t                     resolver_timeout;
  115.     ngx_resolver_t                *resolver;

  116.     ngx_msec_t                     proxy_protocol_timeout;

  117.     unsigned                       listen:1;
  118. #if (NGX_PCRE)
  119.     unsigned                       captures:1;
  120. #endif
  121. } ngx_stream_core_srv_conf_t;


  122. /* list of structures to find core_srv_conf quickly at run time */


  123. typedef struct {
  124. #if (NGX_PCRE)
  125.     ngx_stream_regex_t            *regex;
  126. #endif
  127.     ngx_stream_core_srv_conf_t    *server;   /* virtual name server conf */
  128.     ngx_str_t                      name;
  129. } ngx_stream_server_name_t;


  130. typedef struct {
  131.     ngx_hash_combined_t            names;

  132.     ngx_uint_t                     nregex;
  133.     ngx_stream_server_name_t      *regex;
  134. } ngx_stream_virtual_names_t;


  135. typedef struct {
  136.     /* the default server configuration for this address:port */
  137.     ngx_stream_core_srv_conf_t    *default_server;

  138.     ngx_stream_virtual_names_t    *virtual_names;

  139.     unsigned                       ssl:1;
  140.     unsigned                       proxy_protocol:1;
  141. } ngx_stream_addr_conf_t;


  142. typedef struct {
  143.     in_addr_t                      addr;
  144.     ngx_stream_addr_conf_t         conf;
  145. } ngx_stream_in_addr_t;


  146. #if (NGX_HAVE_INET6)

  147. typedef struct {
  148.     struct in6_addr                addr6;
  149.     ngx_stream_addr_conf_t         conf;
  150. } ngx_stream_in6_addr_t;

  151. #endif


  152. typedef struct {
  153.     /* ngx_stream_in_addr_t or ngx_stream_in6_addr_t */
  154.     void                          *addrs;
  155.     ngx_uint_t                     naddrs;
  156. } ngx_stream_port_t;


  157. typedef struct {
  158.     int                            family;
  159.     int                            type;
  160.     in_port_t                      port;
  161.     ngx_array_t                    addrs; /* array of ngx_stream_conf_addr_t */
  162. } ngx_stream_conf_port_t;


  163. typedef struct {
  164.     ngx_stream_listen_opt_t        opt;

  165.     unsigned                       protocols:3;
  166.     unsigned                       protocols_set:1;
  167.     unsigned                       protocols_changed:1;

  168.     ngx_hash_t                     hash;
  169.     ngx_hash_wildcard_t           *wc_head;
  170.     ngx_hash_wildcard_t           *wc_tail;

  171. #if (NGX_PCRE)
  172.     ngx_uint_t                     nregex;
  173.     ngx_stream_server_name_t      *regex;
  174. #endif

  175.     /* the default server configuration for this address:port */
  176.     ngx_stream_core_srv_conf_t    *default_server;
  177.     ngx_array_t                    servers;
  178.                                       /* array of ngx_stream_core_srv_conf_t */
  179. } ngx_stream_conf_addr_t;


  180. struct ngx_stream_session_s {
  181.     uint32_t                       signature;         /* "STRM" */

  182.     ngx_connection_t              *connection;

  183.     off_t                          received;
  184.     time_t                         start_sec;
  185.     ngx_msec_t                     start_msec;

  186.     ngx_log_handler_pt             log_handler;

  187.     void                         **ctx;
  188.     void                         **main_conf;
  189.     void                         **srv_conf;

  190.     ngx_stream_virtual_names_t    *virtual_names;

  191.     ngx_stream_upstream_t         *upstream;
  192.     ngx_array_t                   *upstream_states;
  193.                                            /* of ngx_stream_upstream_state_t */
  194.     ngx_stream_variable_value_t   *variables;

  195. #if (NGX_PCRE)
  196.     ngx_uint_t                     ncaptures;
  197.     int                           *captures;
  198.     u_char                        *captures_data;
  199. #endif

  200.     ngx_int_t                      phase_handler;
  201.     ngx_uint_t                     status;

  202.     unsigned                       ssl:1;

  203.     unsigned                       stat_processing:1;

  204.     unsigned                       health_check:1;

  205.     unsigned                       limit_conn_status:2;
  206. };


  207. typedef struct {
  208.     ngx_int_t                    (*preconfiguration)(ngx_conf_t *cf);
  209.     ngx_int_t                    (*postconfiguration)(ngx_conf_t *cf);

  210.     void                        *(*create_main_conf)(ngx_conf_t *cf);
  211.     char                        *(*init_main_conf)(ngx_conf_t *cf, void *conf);

  212.     void                        *(*create_srv_conf)(ngx_conf_t *cf);
  213.     char                        *(*merge_srv_conf)(ngx_conf_t *cf, void *prev,
  214.                                                    void *conf);
  215. } ngx_stream_module_t;


  216. #define NGX_STREAM_MODULE       0x4d525453     /* "STRM" */

  217. #define NGX_STREAM_MAIN_CONF    0x02000000
  218. #define NGX_STREAM_SRV_CONF     0x04000000
  219. #define NGX_STREAM_UPS_CONF     0x08000000


  220. #define NGX_STREAM_MAIN_CONF_OFFSET  offsetof(ngx_stream_conf_ctx_t, main_conf)
  221. #define NGX_STREAM_SRV_CONF_OFFSET   offsetof(ngx_stream_conf_ctx_t, srv_conf)


  222. #define ngx_stream_get_module_ctx(s, module)   (s)->ctx[module.ctx_index]
  223. #define ngx_stream_set_ctx(s, c, module)       s->ctx[module.ctx_index] = c;
  224. #define ngx_stream_delete_ctx(s, module)       s->ctx[module.ctx_index] = NULL;


  225. #define ngx_stream_get_module_main_conf(s, module)                             \
  226.     (s)->main_conf[module.ctx_index]
  227. #define ngx_stream_get_module_srv_conf(s, module)                              \
  228.     (s)->srv_conf[module.ctx_index]

  229. #define ngx_stream_conf_get_module_main_conf(cf, module)                       \
  230.     ((ngx_stream_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index]
  231. #define ngx_stream_conf_get_module_srv_conf(cf, module)                        \
  232.     ((ngx_stream_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index]

  233. #define ngx_stream_cycle_get_module_main_conf(cycle, module)                   \
  234.     (cycle->conf_ctx[ngx_stream_module.index] ?                                \
  235.         ((ngx_stream_conf_ctx_t *) cycle->conf_ctx[ngx_stream_module.index])   \
  236.             ->main_conf[module.ctx_index]:                                     \
  237.         NULL)


  238. #define NGX_STREAM_WRITE_BUFFERED  0x10


  239. ngx_int_t ngx_stream_add_listen(ngx_conf_t *cf,
  240.     ngx_stream_core_srv_conf_t *cscf, ngx_stream_listen_opt_t *lsopt);

  241. void ngx_stream_core_run_phases(ngx_stream_session_t *s);
  242. ngx_int_t ngx_stream_core_generic_phase(ngx_stream_session_t *s,
  243.     ngx_stream_phase_handler_t *ph);
  244. ngx_int_t ngx_stream_core_preread_phase(ngx_stream_session_t *s,
  245.     ngx_stream_phase_handler_t *ph);
  246. ngx_int_t ngx_stream_core_content_phase(ngx_stream_session_t *s,
  247.     ngx_stream_phase_handler_t *ph);

  248. ngx_int_t ngx_stream_validate_host(ngx_str_t *host, ngx_pool_t *pool,
  249.     ngx_uint_t alloc);
  250. ngx_int_t ngx_stream_find_virtual_server(ngx_stream_session_t *s,
  251.     ngx_str_t *host, ngx_stream_core_srv_conf_t **cscfp);

  252. void ngx_stream_init_connection(ngx_connection_t *c);
  253. void ngx_stream_session_handler(ngx_event_t *rev);
  254. void ngx_stream_finalize_session(ngx_stream_session_t *s, ngx_uint_t rc);


  255. extern ngx_module_t  ngx_stream_module;
  256. extern ngx_uint_t    ngx_stream_max_module;
  257. extern ngx_module_t  ngx_stream_core_module;


  258. typedef ngx_int_t (*ngx_stream_filter_pt)(ngx_stream_session_t *s,
  259.     ngx_chain_t *chain, ngx_uint_t from_upstream);


  260. extern ngx_stream_filter_pt  ngx_stream_top_filter;


  261. #endif /* _NGX_STREAM_H_INCLUDED_ */