| 320 | namespace |
| 321 | { |
| 322 | bool |
| 323 | get_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 | |
| 355 | unsigned int |
| 356 | build_iovec_block_chain(unsigned max_niov, int64_t size_index, Ptr<IOBufferBlock> &chain, struct iovec *out_tiovec) |
no test coverage detected