MCPcopy Create free account
hub / github.com/apache/trafficserver / get_ip_address_from_cmsg

Function get_ip_address_from_cmsg

src/iocore/net/UnixUDPNet.cc:322–353  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

320namespace
321{
322bool
323get_ip_address_from_cmsg(struct cmsghdr *cmsg, sockaddr_storage *toaddr)
324{
325#ifdef IP_PKTINFO
326 if (IP_PKTINFO == cmsg->cmsg_type) {
327 if (cmsg->cmsg_level == IPPROTO_IP) {
328 struct in_pktinfo *pktinfo = reinterpret_cast<struct in_pktinfo *>(CMSG_DATA(cmsg));
329 reinterpret_cast<sockaddr_in *>(toaddr)->sin_addr.s_addr = pktinfo->ipi_addr.s_addr;
330 }
331 return true;
332 }
333#endif
334#ifdef IP_RECVDSTADDR
335 if (IP_RECVDSTADDR == cmsg->cmsg_type) {
336 if (cmsg->cmsg_level == IPPROTO_IP) {
337 struct in_addr *addr = reinterpret_cast<struct in_addr *>(CMSG_DATA(cmsg));
338 reinterpret_cast<sockaddr_in *>(toaddr)->sin_addr.s_addr = addr->s_addr;
339 }
340 return true;
341 }
342#endif
343#if defined(IPV6_PKTINFO) || defined(IPV6_RECVPKTINFO)
344 if (IPV6_PKTINFO == cmsg->cmsg_type) { // IPV6_RECVPKTINFO uses IPV6_PKTINFO too
345 if (cmsg->cmsg_level == IPPROTO_IPV6) {
346 struct in6_pktinfo *pktinfo = reinterpret_cast<struct in6_pktinfo *>(CMSG_DATA(cmsg));
347 memcpy(reinterpret_cast<sockaddr_in6 *>(toaddr)->sin6_addr.s6_addr, &pktinfo->ipi6_addr, 16);
348 }
349 return true;
350 }
351#endif
352 return false;
353}
354
355unsigned int
356build_iovec_block_chain(unsigned max_niov, int64_t size_index, Ptr<IOBufferBlock> &chain, struct iovec *out_tiovec)

Calls 1

memcpyFunction · 0.50

Tested by

no test coverage detected