xref: /unit/src/nxt_router.c (revision 20)
1*20Sigor@sysoev.ru 
2*20Sigor@sysoev.ru /*
3*20Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
4*20Sigor@sysoev.ru  * Copyright (C) Valentin V. Bartenev
5*20Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
6*20Sigor@sysoev.ru  */
7*20Sigor@sysoev.ru 
8*20Sigor@sysoev.ru #include <nxt_main.h>
9*20Sigor@sysoev.ru #include <nxt_runtime.h>
10*20Sigor@sysoev.ru #include <nxt_master_process.h>
11*20Sigor@sysoev.ru 
12*20Sigor@sysoev.ru 
13*20Sigor@sysoev.ru static nxt_int_t nxt_router_listen_socket(nxt_task_t *task, nxt_runtime_t *rt);
14*20Sigor@sysoev.ru 
15*20Sigor@sysoev.ru 
16*20Sigor@sysoev.ru nxt_int_t
17*20Sigor@sysoev.ru nxt_router_start(nxt_task_t *task, nxt_runtime_t *rt)
18*20Sigor@sysoev.ru {
19*20Sigor@sysoev.ru     if (nxt_router_listen_socket(task, rt) != NXT_OK) {
20*20Sigor@sysoev.ru         return NXT_ERROR;
21*20Sigor@sysoev.ru     }
22*20Sigor@sysoev.ru 
23*20Sigor@sysoev.ru     return NXT_OK;
24*20Sigor@sysoev.ru }
25*20Sigor@sysoev.ru 
26*20Sigor@sysoev.ru 
27*20Sigor@sysoev.ru static nxt_int_t
28*20Sigor@sysoev.ru nxt_router_listen_socket(nxt_task_t *task, nxt_runtime_t *rt)
29*20Sigor@sysoev.ru {
30*20Sigor@sysoev.ru     nxt_sockaddr_t       *sa;
31*20Sigor@sysoev.ru     nxt_listen_socket_t  *ls;
32*20Sigor@sysoev.ru 
33*20Sigor@sysoev.ru     sa = nxt_sockaddr_alloc(rt->mem_pool, sizeof(struct sockaddr_in),
34*20Sigor@sysoev.ru                             NXT_INET_ADDR_STR_LEN);
35*20Sigor@sysoev.ru     if (sa == NULL) {
36*20Sigor@sysoev.ru         return NXT_ERROR;
37*20Sigor@sysoev.ru     }
38*20Sigor@sysoev.ru 
39*20Sigor@sysoev.ru     sa->type = SOCK_STREAM;
40*20Sigor@sysoev.ru     sa->u.sockaddr_in.sin_family = AF_INET;
41*20Sigor@sysoev.ru     sa->u.sockaddr_in.sin_port = htons(8000);
42*20Sigor@sysoev.ru 
43*20Sigor@sysoev.ru     nxt_sockaddr_text(sa);
44*20Sigor@sysoev.ru 
45*20Sigor@sysoev.ru     ls = nxt_runtime_listen_socket_add(rt, sa);
46*20Sigor@sysoev.ru     if (ls == NULL) {
47*20Sigor@sysoev.ru         return NXT_ERROR;
48*20Sigor@sysoev.ru     }
49*20Sigor@sysoev.ru 
50*20Sigor@sysoev.ru     ls->read_after_accept = 1;
51*20Sigor@sysoev.ru 
52*20Sigor@sysoev.ru     ls->flags = NXT_NONBLOCK;
53*20Sigor@sysoev.ru 
54*20Sigor@sysoev.ru #if 0
55*20Sigor@sysoev.ru     /* STUB */
56*20Sigor@sysoev.ru     wq = nxt_mem_zalloc(cf->mem_pool, sizeof(nxt_work_queue_t));
57*20Sigor@sysoev.ru     if (wq == NULL) {
58*20Sigor@sysoev.ru         return NXT_ERROR;
59*20Sigor@sysoev.ru     }
60*20Sigor@sysoev.ru     nxt_work_queue_name(wq, "listen");
61*20Sigor@sysoev.ru     /**/
62*20Sigor@sysoev.ru 
63*20Sigor@sysoev.ru     ls->work_queue = wq;
64*20Sigor@sysoev.ru #endif
65*20Sigor@sysoev.ru     ls->handler = nxt_stream_connection_init;
66*20Sigor@sysoev.ru 
67*20Sigor@sysoev.ru     /*
68*20Sigor@sysoev.ru      * Connection memory pool chunk size is tunned to
69*20Sigor@sysoev.ru      * allocate the most data in one mem_pool chunk.
70*20Sigor@sysoev.ru      */
71*20Sigor@sysoev.ru     ls->mem_pool_size = nxt_listen_socket_pool_min_size(ls)
72*20Sigor@sysoev.ru                         + sizeof(nxt_event_conn_proxy_t)
73*20Sigor@sysoev.ru                         + sizeof(nxt_event_conn_t)
74*20Sigor@sysoev.ru                         + 4 * sizeof(nxt_buf_t);
75*20Sigor@sysoev.ru 
76*20Sigor@sysoev.ru     if (nxt_listen_socket_create(task, ls, 0) != NXT_OK) {
77*20Sigor@sysoev.ru         return NXT_ERROR;
78*20Sigor@sysoev.ru     }
79*20Sigor@sysoev.ru 
80*20Sigor@sysoev.ru     if (nxt_event_conn_listen(task, ls) != NXT_OK) {
81*20Sigor@sysoev.ru         return NXT_ERROR;
82*20Sigor@sysoev.ru     }
83*20Sigor@sysoev.ru 
84*20Sigor@sysoev.ru     return NXT_OK;
85*20Sigor@sysoev.ru }
86