comparison src/os/unix/ngx_udp_sendmsg_chain.c @ 8003:0f6cc8f73744

Core: added function for local source address cmsg.
author Vladimir Homutov <vl@nginx.com>
date Tue, 25 Jan 2022 15:48:58 +0300
parents cfe1284e5d1d
children 3108d4d668e4 ce6d9cf0f567
comparison
equal deleted inserted replaced
8002:cfe1284e5d1d 8003:0f6cc8f73744
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)