Mercurial > hg > nginx-quic
comparison src/event/ngx_event_udp.c @ 8513:e7a2d3914877 quic
Core: added separate function for local source address cmsg.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Thu, 15 Jul 2021 14:22:54 +0300 |
parents | 7f95010f10b7 |
children | ce6d9cf0f567 |
comparison
equal
deleted
inserted
replaced
8512:bb5152ed045b | 8513:e7a2d3914877 |
---|---|
39 ngx_listening_t *ls; | 39 ngx_listening_t *ls; |
40 ngx_event_conf_t *ecf; | 40 ngx_event_conf_t *ecf; |
41 ngx_connection_t *c, *lc; | 41 ngx_connection_t *c, *lc; |
42 static u_char buffer[65535]; | 42 static u_char buffer[65535]; |
43 | 43 |
44 #if (NGX_HAVE_MSGHDR_MSG_CONTROL) | 44 #if (NGX_HAVE_ADDRINFO_CMSG) |
45 | 45 u_char msg_control[CMSG_SPACE(sizeof(ngx_addrinfo_t))]; |
46 #if (NGX_HAVE_IP_RECVDSTADDR) | |
47 u_char msg_control[CMSG_SPACE(sizeof(struct in_addr))]; | |
48 #elif (NGX_HAVE_IP_PKTINFO) | |
49 u_char msg_control[CMSG_SPACE(sizeof(struct in_pktinfo))]; | |
50 #endif | |
51 | |
52 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) | |
53 u_char msg_control6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; | |
54 #endif | |
55 | |
56 #endif | 46 #endif |
57 | 47 |
58 if (ev->timedout) { | 48 if (ev->timedout) { |
59 if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) { | 49 if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) { |
60 return; | 50 return; |
85 msg.msg_name = &sa; | 75 msg.msg_name = &sa; |
86 msg.msg_namelen = sizeof(ngx_sockaddr_t); | 76 msg.msg_namelen = sizeof(ngx_sockaddr_t); |
87 msg.msg_iov = iov; | 77 msg.msg_iov = iov; |
88 msg.msg_iovlen = 1; | 78 msg.msg_iovlen = 1; |
89 | 79 |
90 #if (NGX_HAVE_MSGHDR_MSG_CONTROL) | 80 #if (NGX_HAVE_ADDRINFO_CMSG) |
91 | |
92 if (ls->wildcard) { | 81 if (ls->wildcard) { |
93 | 82 msg.msg_control = &msg_control; |
94 #if (NGX_HAVE_IP_RECVDSTADDR || NGX_HAVE_IP_PKTINFO) | 83 msg.msg_controllen = sizeof(msg_control); |
95 if (ls->sockaddr->sa_family == AF_INET) { | 84 |
96 msg.msg_control = &msg_control; | 85 ngx_memzero(&msg_control, sizeof(msg_control)); |
97 msg.msg_controllen = sizeof(msg_control); | 86 } |
98 } | |
99 #endif | |
100 | |
101 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) | |
102 if (ls->sockaddr->sa_family == AF_INET6) { | |
103 msg.msg_control = &msg_control6; | |
104 msg.msg_controllen = sizeof(msg_control6); | |
105 } | |
106 #endif | |
107 } | |
108 | |
109 #endif | 87 #endif |
110 | 88 |
111 n = recvmsg(lc->fd, &msg, 0); | 89 n = recvmsg(lc->fd, &msg, 0); |
112 | 90 |
113 if (n == -1) { | 91 if (n == -1) { |
122 ngx_log_error(NGX_LOG_ALERT, ev->log, err, "recvmsg() failed"); | 100 ngx_log_error(NGX_LOG_ALERT, ev->log, err, "recvmsg() failed"); |
123 | 101 |
124 return; | 102 return; |
125 } | 103 } |
126 | 104 |
127 #if (NGX_HAVE_MSGHDR_MSG_CONTROL) | 105 #if (NGX_HAVE_ADDRINFO_CMSG) |
128 if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) { | 106 if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) { |
129 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | 107 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, |
130 "recvmsg() truncated data"); | 108 "recvmsg() truncated data"); |
131 continue; | 109 continue; |
132 } | 110 } |
152 } | 130 } |
153 | 131 |
154 local_sockaddr = ls->sockaddr; | 132 local_sockaddr = ls->sockaddr; |
155 local_socklen = ls->socklen; | 133 local_socklen = ls->socklen; |
156 | 134 |
157 #if (NGX_HAVE_MSGHDR_MSG_CONTROL) | 135 #if (NGX_HAVE_ADDRINFO_CMSG) |
158 | 136 |
159 if (ls->wildcard) { | 137 if (ls->wildcard) { |
160 struct cmsghdr *cmsg; | 138 struct cmsghdr *cmsg; |
161 | 139 |
162 ngx_memcpy(&lsa, local_sockaddr, local_socklen); | 140 ngx_memcpy(&lsa, local_sockaddr, local_socklen); |
164 | 142 |
165 for (cmsg = CMSG_FIRSTHDR(&msg); | 143 for (cmsg = CMSG_FIRSTHDR(&msg); |
166 cmsg != NULL; | 144 cmsg != NULL; |
167 cmsg = CMSG_NXTHDR(&msg, cmsg)) | 145 cmsg = CMSG_NXTHDR(&msg, cmsg)) |
168 { | 146 { |
169 | 147 if (ngx_get_srcaddr_cmsg(cmsg, local_sockaddr) == NGX_OK) { |
170 #if (NGX_HAVE_IP_RECVDSTADDR) | |
171 | |
172 if (cmsg->cmsg_level == IPPROTO_IP | |
173 && cmsg->cmsg_type == IP_RECVDSTADDR | |
174 && local_sockaddr->sa_family == AF_INET) | |
175 { | |
176 struct in_addr *addr; | |
177 struct sockaddr_in *sin; | |
178 | |
179 addr = (struct in_addr *) CMSG_DATA(cmsg); | |
180 sin = (struct sockaddr_in *) local_sockaddr; | |
181 sin->sin_addr = *addr; | |
182 | |
183 break; | 148 break; |
184 } | 149 } |
185 | |
186 #elif (NGX_HAVE_IP_PKTINFO) | |
187 | |
188 if (cmsg->cmsg_level == IPPROTO_IP | |
189 && cmsg->cmsg_type == IP_PKTINFO | |
190 && local_sockaddr->sa_family == AF_INET) | |
191 { | |
192 struct in_pktinfo *pkt; | |
193 struct sockaddr_in *sin; | |
194 | |
195 pkt = (struct in_pktinfo *) CMSG_DATA(cmsg); | |
196 sin = (struct sockaddr_in *) local_sockaddr; | |
197 sin->sin_addr = pkt->ipi_addr; | |
198 | |
199 break; | |
200 } | |
201 | |
202 #endif | |
203 | |
204 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) | |
205 | |
206 if (cmsg->cmsg_level == IPPROTO_IPV6 | |
207 && cmsg->cmsg_type == IPV6_PKTINFO | |
208 && local_sockaddr->sa_family == AF_INET6) | |
209 { | |
210 struct in6_pktinfo *pkt6; | |
211 struct sockaddr_in6 *sin6; | |
212 | |
213 pkt6 = (struct in6_pktinfo *) CMSG_DATA(cmsg); | |
214 sin6 = (struct sockaddr_in6 *) local_sockaddr; | |
215 sin6->sin6_addr = pkt6->ipi6_addr; | |
216 | |
217 break; | |
218 } | |
219 | |
220 #endif | |
221 | |
222 } | 150 } |
223 } | 151 } |
224 | 152 |
225 #endif | 153 #endif |
226 | 154 |