Mercurial > hg > nginx-quic
comparison src/os/unix/ngx_udp_sendmsg_chain.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 | 2dfd313f22f2 |
children | 913ff20e4c62 |
comparison
equal
deleted
inserted
replaced
8512:bb5152ed045b | 8513:e7a2d3914877 |
---|---|
314 #endif | 314 #endif |
315 | 315 |
316 return 0; | 316 return 0; |
317 } | 317 } |
318 | 318 |
319 | |
320 ngx_int_t | |
321 ngx_get_srcaddr_cmsg(struct cmsghdr *cmsg, struct sockaddr *local_sockaddr) | |
322 { | |
323 | |
324 #if (NGX_HAVE_IP_RECVDSTADDR) | |
325 struct in_addr *addr; | |
326 struct sockaddr_in *sin; | |
327 #elif (NGX_HAVE_IP_PKTINFO) | |
328 struct in_pktinfo *pkt; | |
329 struct sockaddr_in *sin; | |
330 #endif | |
331 | |
332 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) | |
333 struct in6_pktinfo *pkt6; | |
334 struct sockaddr_in6 *sin6; | |
335 #endif | |
336 | |
337 | |
338 #if (NGX_HAVE_IP_RECVDSTADDR) | |
339 | |
340 if (cmsg->cmsg_level == IPPROTO_IP | |
341 && cmsg->cmsg_type == IP_RECVDSTADDR | |
342 && local_sockaddr->sa_family == AF_INET) | |
343 { | |
344 addr = (struct in_addr *) CMSG_DATA(cmsg); | |
345 sin = (struct sockaddr_in *) local_sockaddr; | |
346 sin->sin_addr = *addr; | |
347 | |
348 return NGX_OK; | |
349 } | |
350 | |
351 #elif (NGX_HAVE_IP_PKTINFO) | |
352 | |
353 if (cmsg->cmsg_level == IPPROTO_IP | |
354 && cmsg->cmsg_type == IP_PKTINFO | |
355 && local_sockaddr->sa_family == AF_INET) | |
356 { | |
357 pkt = (struct in_pktinfo *) CMSG_DATA(cmsg); | |
358 sin = (struct sockaddr_in *) local_sockaddr; | |
359 sin->sin_addr = pkt->ipi_addr; | |
360 | |
361 return NGX_OK; | |
362 } | |
363 | |
364 #endif | |
365 | |
366 #if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) | |
367 | |
368 if (cmsg->cmsg_level == IPPROTO_IPV6 | |
369 && cmsg->cmsg_type == IPV6_PKTINFO | |
370 && local_sockaddr->sa_family == AF_INET6) | |
371 { | |
372 pkt6 = (struct in6_pktinfo *) CMSG_DATA(cmsg); | |
373 sin6 = (struct sockaddr_in6 *) local_sockaddr; | |
374 sin6->sin6_addr = pkt6->ipi6_addr; | |
375 | |
376 return NGX_OK; | |
377 } | |
378 | |
379 #endif | |
380 | |
381 return NGX_DECLINED; | |
382 } | |
383 | |
319 #endif | 384 #endif |
320 | 385 |
321 | 386 |
322 ssize_t | 387 ssize_t |
323 ngx_sendmsg(ngx_connection_t *c, struct msghdr *msg, int flags) | 388 ngx_sendmsg(ngx_connection_t *c, struct msghdr *msg, int flags) |