annotate src/event/ngx_event_udp.c @ 8319:ffcaf0aad9f2 quic

HTTP/3: limited client header size. The limit is the size of all large client header buffers. Client header size is the total size of all client header names and values.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 17 Feb 2021 11:58:32 +0300
parents 45db1b5c1706
children d62a16fff3a4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7285
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
2 /*
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
5 */
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
6
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
7
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
10 #include <ngx_event.h>
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
11
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
12
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
13 #if !(NGX_WIN32)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
14
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
15 static void ngx_close_accepted_udp_connection(ngx_connection_t *c);
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
16 static ssize_t ngx_udp_shared_recv(ngx_connection_t *c, u_char *buf,
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
17 size_t size);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
18 static ngx_int_t ngx_create_udp_connection(ngx_connection_t *c);
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
19 static ngx_connection_t *ngx_lookup_udp_connection(ngx_listening_t *ls,
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
20 ngx_str_t *key, struct sockaddr *sockaddr, socklen_t socklen,
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
21 struct sockaddr *local_sockaddr, socklen_t local_socklen);
7285
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
22
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
23
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
24 void
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
25 ngx_event_recvmsg(ngx_event_t *ev)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
26 {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
27 ssize_t n;
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
28 ngx_str_t key;
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
29 ngx_buf_t buf;
7285
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
30 ngx_log_t *log;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
31 ngx_err_t err;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
32 socklen_t socklen, local_socklen;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
33 ngx_event_t *rev, *wev;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
34 struct iovec iov[1];
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
35 struct msghdr msg;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
36 ngx_sockaddr_t sa, lsa;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
37 struct sockaddr *sockaddr, *local_sockaddr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
38 ngx_listening_t *ls;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
39 ngx_event_conf_t *ecf;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
40 ngx_connection_t *c, *lc;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
41 static u_char buffer[65535];
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
42
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
43 #if (NGX_HAVE_MSGHDR_MSG_CONTROL)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
44
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
45 #if (NGX_HAVE_IP_RECVDSTADDR)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
46 u_char msg_control[CMSG_SPACE(sizeof(struct in_addr))];
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
47 #elif (NGX_HAVE_IP_PKTINFO)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
48 u_char msg_control[CMSG_SPACE(sizeof(struct in_pktinfo))];
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
50
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
51 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
52 u_char msg_control6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
53 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
54
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
55 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
56
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
57 if (ev->timedout) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
58 if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
60 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
61
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62 ev->timedout = 0;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
66
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67 if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68 ev->available = ecf->multi_accept;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
70
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
71 lc = ev->data;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
72 ls = lc->listening;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
73 ev->ready = 0;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
75 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76 "recvmsg on %V, ready: %d", &ls->addr_text, ev->available);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78 do {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79 ngx_memzero(&msg, sizeof(struct msghdr));
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
81 iov[0].iov_base = (void *) buffer;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
82 iov[0].iov_len = sizeof(buffer);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
83
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84 msg.msg_name = &sa;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85 msg.msg_namelen = sizeof(ngx_sockaddr_t);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
86 msg.msg_iov = iov;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
87 msg.msg_iovlen = 1;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 #if (NGX_HAVE_MSGHDR_MSG_CONTROL)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
90
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
91 if (ls->wildcard) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
92
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
93 #if (NGX_HAVE_IP_RECVDSTADDR || NGX_HAVE_IP_PKTINFO)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94 if (ls->sockaddr->sa_family == AF_INET) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
95 msg.msg_control = &msg_control;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96 msg.msg_controllen = sizeof(msg_control);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
101 if (ls->sockaddr->sa_family == AF_INET6) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102 msg.msg_control = &msg_control6;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103 msg.msg_controllen = sizeof(msg_control6);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
104 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
105 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
107
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
108 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
109
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
110 n = recvmsg(lc->fd, &msg, 0);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
111
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
112 if (n == -1) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
113 err = ngx_socket_errno;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
114
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
115 if (err == NGX_EAGAIN) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
116 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err,
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
117 "recvmsg() not ready");
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
118 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
119 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
120
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
121 ngx_log_error(NGX_LOG_ALERT, ev->log, err, "recvmsg() failed");
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
122
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
123 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
124 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
125
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
126 #if (NGX_HAVE_MSGHDR_MSG_CONTROL)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127 if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
128 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
129 "recvmsg() truncated data");
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
130 continue;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
131 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
132 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
133
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
134 sockaddr = msg.msg_name;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
135 socklen = msg.msg_namelen;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
136
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
137 if (socklen > (socklen_t) sizeof(ngx_sockaddr_t)) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
138 socklen = sizeof(ngx_sockaddr_t);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
139 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
140
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
141 if (socklen == 0) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
142
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
143 /*
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
144 * on Linux recvmsg() returns zero msg_namelen
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
145 * when receiving packets from unbound AF_UNIX sockets
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
146 */
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
147
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
148 socklen = sizeof(struct sockaddr);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
149 ngx_memzero(&sa, sizeof(struct sockaddr));
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
150 sa.sockaddr.sa_family = ls->sockaddr->sa_family;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
151 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
152
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
153 local_sockaddr = ls->sockaddr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
154 local_socklen = ls->socklen;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
155
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
156 #if (NGX_HAVE_MSGHDR_MSG_CONTROL)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
157
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
158 if (ls->wildcard) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
159 struct cmsghdr *cmsg;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
160
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
161 ngx_memcpy(&lsa, local_sockaddr, local_socklen);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
162 local_sockaddr = &lsa.sockaddr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
163
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
164 for (cmsg = CMSG_FIRSTHDR(&msg);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
165 cmsg != NULL;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
166 cmsg = CMSG_NXTHDR(&msg, cmsg))
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
167 {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
168
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
169 #if (NGX_HAVE_IP_RECVDSTADDR)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
170
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
171 if (cmsg->cmsg_level == IPPROTO_IP
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
172 && cmsg->cmsg_type == IP_RECVDSTADDR
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
173 && local_sockaddr->sa_family == AF_INET)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
174 {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
175 struct in_addr *addr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
176 struct sockaddr_in *sin;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
177
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178 addr = (struct in_addr *) CMSG_DATA(cmsg);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179 sin = (struct sockaddr_in *) local_sockaddr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 sin->sin_addr = *addr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182 break;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185 #elif (NGX_HAVE_IP_PKTINFO)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187 if (cmsg->cmsg_level == IPPROTO_IP
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188 && cmsg->cmsg_type == IP_PKTINFO
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189 && local_sockaddr->sa_family == AF_INET)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190 {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
191 struct in_pktinfo *pkt;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192 struct sockaddr_in *sin;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194 pkt = (struct in_pktinfo *) CMSG_DATA(cmsg);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
195 sin = (struct sockaddr_in *) local_sockaddr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196 sin->sin_addr = pkt->ipi_addr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
198 break;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
199 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
203 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
204
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
205 if (cmsg->cmsg_level == IPPROTO_IPV6
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
206 && cmsg->cmsg_type == IPV6_PKTINFO
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207 && local_sockaddr->sa_family == AF_INET6)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208 {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209 struct in6_pktinfo *pkt6;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210 struct sockaddr_in6 *sin6;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
211
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212 pkt6 = (struct in6_pktinfo *) CMSG_DATA(cmsg);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213 sin6 = (struct sockaddr_in6 *) local_sockaddr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
214 sin6->sin6_addr = pkt6->ipi6_addr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
215
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
216 break;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
217 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
218
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
219 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
220
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
221 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
222 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
223
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
224 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
225
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
226 ngx_str_null(&key);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
227
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
228 #if (NGX_QUIC)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
229 if (ls->quic) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
230 if (ngx_quic_get_packet_dcid(ev->log, buffer, n, &key) != NGX_OK) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
231 goto next;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
232 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
233 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
234 #endif
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
235
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
236 c = ngx_lookup_udp_connection(ls, &key, sockaddr, socklen,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
237 local_sockaddr, local_socklen);
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
238
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
239 if (c) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
240
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
241 #if (NGX_DEBUG)
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
242 if (c->log->log_level & NGX_LOG_DEBUG_EVENT) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
243 ngx_log_handler_pt handler;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
244
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
245 handler = c->log->handler;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
246 c->log->handler = NULL;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
247
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
248 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
249 "recvmsg: fd:%d n:%z", c->fd, n);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
250
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
251 c->log->handler = handler;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
252 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
253 #endif
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
254
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
255 ngx_memzero(&buf, sizeof(ngx_buf_t));
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
256
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
257 buf.pos = buffer;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
258 buf.last = buffer + n;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
259
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
260 rev = c->read;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
261
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
262 c->udp->buffer = &buf;
7440
6d4bc025c5a7 Prevented scheduling events on a shared connection.
Roman Arutyunyan <arut@nginx.com>
parents: 7393
diff changeset
263
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
264 rev->ready = 1;
7440
6d4bc025c5a7 Prevented scheduling events on a shared connection.
Roman Arutyunyan <arut@nginx.com>
parents: 7393
diff changeset
265 rev->active = 0;
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
266
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
267 rev->handler(rev);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
268
7391
27559d4a5151 Stream: fixed possible use of a freed connection.
Vladimir Homutov <vl@nginx.com>
parents: 7286
diff changeset
269 if (c->udp) {
27559d4a5151 Stream: fixed possible use of a freed connection.
Vladimir Homutov <vl@nginx.com>
parents: 7286
diff changeset
270 c->udp->buffer = NULL;
27559d4a5151 Stream: fixed possible use of a freed connection.
Vladimir Homutov <vl@nginx.com>
parents: 7286
diff changeset
271 }
27559d4a5151 Stream: fixed possible use of a freed connection.
Vladimir Homutov <vl@nginx.com>
parents: 7286
diff changeset
272
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
273 rev->ready = 0;
7440
6d4bc025c5a7 Prevented scheduling events on a shared connection.
Roman Arutyunyan <arut@nginx.com>
parents: 7393
diff changeset
274 rev->active = 1;
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
275
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
276 goto next;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
277 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
278
7285
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
279 #if (NGX_STAT_STUB)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
280 (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
281 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
282
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
283 ngx_accept_disabled = ngx_cycle->connection_n / 8
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
284 - ngx_cycle->free_connection_n;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
285
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
286 c = ngx_get_connection(lc->fd, ev->log);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
287 if (c == NULL) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
288 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
289 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
290
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
291 c->shared = 1;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
292 c->type = SOCK_DGRAM;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
293 c->socklen = socklen;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
294
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
295 #if (NGX_STAT_STUB)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
296 (void) ngx_atomic_fetch_add(ngx_stat_active, 1);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
297 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
298
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
299 c->pool = ngx_create_pool(ls->pool_size, ev->log);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
300 if (c->pool == NULL) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
301 ngx_close_accepted_udp_connection(c);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
302 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
303 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
304
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
305 c->sockaddr = ngx_palloc(c->pool, socklen);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
306 if (c->sockaddr == NULL) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
307 ngx_close_accepted_udp_connection(c);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
308 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
309 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
310
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
311 ngx_memcpy(c->sockaddr, sockaddr, socklen);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
312
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
313 log = ngx_palloc(c->pool, sizeof(ngx_log_t));
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
314 if (log == NULL) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
315 ngx_close_accepted_udp_connection(c);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
316 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
317 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
318
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
319 *log = ls->log;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
320
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
321 c->recv = ngx_udp_shared_recv;
7285
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
322 c->send = ngx_udp_send;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
323 c->send_chain = ngx_udp_send_chain;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
324
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
325 c->log = log;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
326 c->pool->log = log;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
327 c->listening = ls;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
328
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
329 if (local_sockaddr == &lsa.sockaddr) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
330 local_sockaddr = ngx_palloc(c->pool, local_socklen);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
331 if (local_sockaddr == NULL) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
332 ngx_close_accepted_udp_connection(c);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
333 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
334 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
335
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
336 ngx_memcpy(local_sockaddr, &lsa, local_socklen);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
337 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
338
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
339 c->local_sockaddr = local_sockaddr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
340 c->local_socklen = local_socklen;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
341
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
342 c->buffer = ngx_create_temp_buf(c->pool, n);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
343 if (c->buffer == NULL) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
344 ngx_close_accepted_udp_connection(c);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
346 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
347
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
348 c->buffer->last = ngx_cpymem(c->buffer->last, buffer, n);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
349
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
350 rev = c->read;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
351 wev = c->write;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
352
7440
6d4bc025c5a7 Prevented scheduling events on a shared connection.
Roman Arutyunyan <arut@nginx.com>
parents: 7393
diff changeset
353 rev->active = 1;
7285
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354 wev->ready = 1;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
355
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
356 rev->log = log;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
357 wev->log = log;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
358
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
359 /*
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
360 * TODO: MT: - ngx_atomic_fetch_add()
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
361 * or protection by critical section or light mutex
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
362 *
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
363 * TODO: MP: - allocated in a shared memory
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
364 * - ngx_atomic_fetch_add()
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
365 * or protection by critical section or light mutex
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
366 */
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
367
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
368 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
369
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370 #if (NGX_STAT_STUB)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
371 (void) ngx_atomic_fetch_add(ngx_stat_handled, 1);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
372 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
373
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
374 if (ls->addr_ntop) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
375 c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
376 if (c->addr_text.data == NULL) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
377 ngx_close_accepted_udp_connection(c);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
379 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
380
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
381 c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
382 c->addr_text.data,
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
383 ls->addr_text_max_len, 0);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
384 if (c->addr_text.len == 0) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
385 ngx_close_accepted_udp_connection(c);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
386 return;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
387 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
389
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
390 #if (NGX_DEBUG)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
391 {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
392 ngx_str_t addr;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
393 u_char text[NGX_SOCKADDR_STRLEN];
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
394
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
395 ngx_debug_accepted_connection(ecf, c);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
396
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
397 if (log->log_level & NGX_LOG_DEBUG_EVENT) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
398 addr.data = text;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
399 addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text,
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
400 NGX_SOCKADDR_STRLEN, 1);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
401
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
402 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
403 "*%uA recvmsg: %V fd:%d n:%z",
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404 c->number, &addr, c->fd, n);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
405 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
406
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
407 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
408 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
409
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
410 if (ngx_create_udp_connection(c) != NGX_OK) {
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
411 ngx_close_accepted_udp_connection(c);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
412 return;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
413 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
414
7285
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
415 log->data = NULL;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
416 log->handler = NULL;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
417
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
418 ls->handler(c);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
419
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
420 next:
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
421
7285
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
422 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
423 ev->available -= n;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
424 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426 } while (ev->available);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
427 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
428
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
429
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
430 static void
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
431 ngx_close_accepted_udp_connection(ngx_connection_t *c)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
432 {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
433 ngx_free_connection(c);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
434
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
435 c->fd = (ngx_socket_t) -1;
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
436
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
437 if (c->pool) {
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
438 ngx_destroy_pool(c->pool);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
439 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
440
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
441 #if (NGX_STAT_STUB)
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
442 (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
443 #endif
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
444 }
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
445
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
446
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
447 static ssize_t
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
448 ngx_udp_shared_recv(ngx_connection_t *c, u_char *buf, size_t size)
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
449 {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
450 ssize_t n;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
451 ngx_buf_t *b;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
452
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
453 if (c->udp == NULL || c->udp->buffer == NULL) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
454 return NGX_AGAIN;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
455 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
456
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
457 b = c->udp->buffer;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
458
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
459 n = ngx_min(b->last - b->pos, (ssize_t) size);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
460
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
461 ngx_memcpy(buf, b->pos, n);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
462
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
463 c->udp->buffer = NULL;
7440
6d4bc025c5a7 Prevented scheduling events on a shared connection.
Roman Arutyunyan <arut@nginx.com>
parents: 7393
diff changeset
464
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
465 c->read->ready = 0;
7440
6d4bc025c5a7 Prevented scheduling events on a shared connection.
Roman Arutyunyan <arut@nginx.com>
parents: 7393
diff changeset
466 c->read->active = 1;
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
467
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
468 return n;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
469 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
470
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
471
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
472 void
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
473 ngx_udp_rbtree_insert_value(ngx_rbtree_node_t *temp,
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
474 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
475 {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
476 ngx_int_t rc;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
477 ngx_connection_t *c, *ct;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
478 ngx_rbtree_node_t **p;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
479 ngx_udp_connection_t *udp, *udpt;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
480
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
481 for ( ;; ) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
482
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
483 if (node->key < temp->key) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
484
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
485 p = &temp->left;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
486
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
487 } else if (node->key > temp->key) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
488
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
489 p = &temp->right;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
490
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
491 } else { /* node->key == temp->key */
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
492
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
493 udp = (ngx_udp_connection_t *) node;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
494 c = udp->connection;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
495
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
496 udpt = (ngx_udp_connection_t *) temp;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
497 ct = udpt->connection;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
498
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
499 rc = ngx_memn2cmp(udp->key.data, udpt->key.data,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
500 udp->key.len, udpt->key.len);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
501
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
502 if (rc == 0 && udp->key.len == 0) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
503 rc = ngx_cmp_sockaddr(c->sockaddr, c->socklen,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
504 ct->sockaddr, ct->socklen, 1);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
505 }
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
506
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
507 if (rc == 0 && c->listening->wildcard) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
508 rc = ngx_cmp_sockaddr(c->local_sockaddr, c->local_socklen,
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
509 ct->local_sockaddr, ct->local_socklen, 1);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
510 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
511
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
512 p = (rc < 0) ? &temp->left : &temp->right;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
513 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
514
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
515 if (*p == sentinel) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
516 break;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
517 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
518
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
519 temp = *p;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
520 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
521
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
522 *p = node;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
523 node->parent = temp;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
524 node->left = sentinel;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
525 node->right = sentinel;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
526 ngx_rbt_red(node);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
527 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
528
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
529
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
530 static ngx_int_t
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
531 ngx_create_udp_connection(ngx_connection_t *c)
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
532 {
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
533 ngx_str_t key;
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
534 ngx_pool_cleanup_t *cln;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
535 ngx_udp_connection_t *udp;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
536
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
537 #if (NGX_QUIC)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
538 if (c->listening->quic) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
539 return NGX_OK;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
540 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
541 #endif
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
542
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
543 if (c->udp) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
544 return NGX_OK;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
545 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
546
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
547 udp = ngx_pcalloc(c->pool, sizeof(ngx_udp_connection_t));
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
548 if (udp == NULL) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
549 return NGX_ERROR;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
550 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
551
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
552 cln = ngx_pool_cleanup_add(c->pool, 0);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
553 if (cln == NULL) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
554 return NGX_ERROR;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
555 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
556
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
557 cln->data = c;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
558 cln->handler = ngx_delete_udp_connection;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
559
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
560 key.len = 0;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
561
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
562 ngx_insert_udp_connection(c, udp, &key);
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
563
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
564 c->udp = udp;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
565
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
566 return NGX_OK;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
567 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
568
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
569
7393
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
570 void
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
571 ngx_insert_udp_connection(ngx_connection_t *c, ngx_udp_connection_t *udp,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
572 ngx_str_t *key)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
573 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
574 uint32_t hash;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
575
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
576 ngx_crc32_init(hash);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
577
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
578 ngx_crc32_update(&hash, key->data, key->len);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
579
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
580 if (key->len == 0) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
581 ngx_crc32_update(&hash, (u_char *) c->sockaddr, c->socklen);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
582 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
583
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
584 if (c->listening->wildcard) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
585 ngx_crc32_update(&hash, (u_char *) c->local_sockaddr, c->local_socklen);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
586 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
587
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
588 ngx_crc32_final(hash);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
589
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
590 udp->connection = c;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
591 udp->key = *key;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
592 udp->node.key = hash;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
593
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
594 ngx_rbtree_insert(&c->listening->rbtree, &udp->node);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
595 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
596
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
597
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
598 void
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
599 ngx_delete_udp_connection(void *data)
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
600 {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
601 ngx_connection_t *c = data;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
602
7393
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
603 if (c->udp == NULL) {
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
604 return;
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
605 }
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
606
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
607 ngx_rbtree_delete(&c->listening->rbtree, &c->udp->node);
7391
27559d4a5151 Stream: fixed possible use of a freed connection.
Vladimir Homutov <vl@nginx.com>
parents: 7286
diff changeset
608
27559d4a5151 Stream: fixed possible use of a freed connection.
Vladimir Homutov <vl@nginx.com>
parents: 7286
diff changeset
609 c->udp = NULL;
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
610 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
611
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
612
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
613 static ngx_connection_t *
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
614 ngx_lookup_udp_connection(ngx_listening_t *ls, ngx_str_t *key,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
615 struct sockaddr *sockaddr, socklen_t socklen,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
616 struct sockaddr *local_sockaddr, socklen_t local_socklen)
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
617 {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
618 uint32_t hash;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
619 ngx_int_t rc;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
620 ngx_connection_t *c;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
621 ngx_rbtree_node_t *node, *sentinel;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
622 ngx_udp_connection_t *udp;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
623
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
624 #if (NGX_HAVE_UNIX_DOMAIN)
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
625
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
626 if (sockaddr->sa_family == AF_UNIX) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
627 struct sockaddr_un *saun = (struct sockaddr_un *) sockaddr;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
628
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
629 if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path)
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
630 || saun->sun_path[0] == '\0')
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
631 {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
632 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
633 "unbound unix socket");
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
634 return NULL;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
635 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
636 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
637
7285
88a624c9b491 Events: moved ngx_recvmsg() to new file src/event/ngx_event_udp.c.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
638 #endif
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
639
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
640 node = ls->rbtree.root;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
641 sentinel = ls->rbtree.sentinel;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
642
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
643 ngx_crc32_init(hash);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
644
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
645 ngx_crc32_update(&hash, key->data, key->len);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
646
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
647 if (key->len == 0) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
648 ngx_crc32_update(&hash, (u_char *) sockaddr, socklen);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
649 }
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
650
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
651 if (ls->wildcard) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
652 ngx_crc32_update(&hash, (u_char *) local_sockaddr, local_socklen);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
653 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
654
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
655 ngx_crc32_final(hash);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
656
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
657 while (node != sentinel) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
658
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
659 if (hash < node->key) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
660 node = node->left;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
661 continue;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
662 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
663
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
664 if (hash > node->key) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
665 node = node->right;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
666 continue;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
667 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
668
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
669 /* hash == node->key */
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
670
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
671 udp = (ngx_udp_connection_t *) node;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
672
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
673 c = udp->connection;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
674
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
675 rc = ngx_memn2cmp(key->data, udp->key.data, key->len, udp->key.len);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
676
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
677 if (rc == 0 && key->len == 0) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
678 rc = ngx_cmp_sockaddr(sockaddr, socklen,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
679 c->sockaddr, c->socklen, 1);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
680 }
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
681
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
682 if (rc == 0 && ls->wildcard) {
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
683 rc = ngx_cmp_sockaddr(local_sockaddr, local_socklen,
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
684 c->local_sockaddr, c->local_socklen, 1);
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
685 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
686
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
687 if (rc == 0) {
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
688 if (key->len) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
689 rc = ngx_cmp_sockaddr(sockaddr, socklen,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
690 c->sockaddr, c->socklen, 1);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
691
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
692 if (rc) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
693 #if (NGX_DEBUG)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
694 if (c->log->log_level & NGX_LOG_DEBUG_EVENT) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
695 ngx_str_t addr;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
696 u_char text[NGX_SOCKADDR_STRLEN];
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
697
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
698 addr.data = text;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
699 addr.len = ngx_sock_ntop(sockaddr, socklen, text,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
700 NGX_SOCKADDR_STRLEN, 1);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
701
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
702 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
703 "client migrated to %V", &addr);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
704 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
705 #endif
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
706
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
707 if (c->socklen < socklen) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
708 c->sockaddr = ngx_palloc(c->pool, socklen);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
709 if (c->sockaddr == NULL) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
710 return c;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
711 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
712 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
713
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
714 ngx_memcpy(c->sockaddr, sockaddr, socklen);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
715 c->socklen = socklen;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
716 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
717 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 7440
diff changeset
718
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
719 return c;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
720 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
721
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
722 node = (rc < 0) ? node->left : node->right;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
723 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
724
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
725 return NULL;
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
726 }
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
727
7393
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
728 #else
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
729
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
730 void
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
731 ngx_delete_udp_connection(void *data)
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
732 {
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
733 return;
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
734 }
4698cede59ff Stream: proxy_requests directive.
Vladimir Homutov <vl@nginx.com>
parents: 7391
diff changeset
735
7286
d27aa9060c95 Stream: udp streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7285
diff changeset
736 #endif