comparison src/event/ngx_event_udp.c @ 8812: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
8811:bb5152ed045b 8812: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