| 32 | } |
| 33 | |
| 34 | TMsgHdr* AddSockAuxData(TMsgHdr* header, const ui8 tos, const sockaddr_in6& myAddr, void* buffer, size_t bufferSize) { |
| 35 | #ifdef _win_ |
| 36 | Y_UNUSED(header); |
| 37 | Y_UNUSED(tos); |
| 38 | Y_UNUSED(myAddr); |
| 39 | Y_UNUSED(buffer); |
| 40 | Y_UNUSED(bufferSize); |
| 41 | return nullptr; |
| 42 | #else |
| 43 | header->msg_control = buffer; |
| 44 | header->msg_controllen = bufferSize; |
| 45 | |
| 46 | size_t totalLen = 0; |
| 47 | #ifdef _cygwin_ |
| 48 | Y_UNUSED(tos); |
| 49 | #else |
| 50 | // Cygwin does not support IPV6_TCLASS, so we ignore it |
| 51 | cmsghdr* cmsgTos = CMSG_FIRSTHDR(header); |
| 52 | if (cmsgTos == nullptr) { |
| 53 | header->msg_control = nullptr; |
| 54 | header->msg_controllen = 0; |
| 55 | return nullptr; |
| 56 | } |
| 57 | cmsgTos->cmsg_level = IPPROTO_IPV6; |
| 58 | cmsgTos->cmsg_type = IPV6_TCLASS; |
| 59 | cmsgTos->cmsg_len = CMSG_LEN(sizeof(int)); |
| 60 | totalLen = CMSG_SPACE(sizeof(int)); |
| 61 | *(ui8*)CMSG_DATA(cmsgTos) = tos; |
| 62 | #endif |
| 63 | |
| 64 | if (((ui64*)myAddr.sin6_addr.s6_addr)[0] != 0u || ((ui64*)myAddr.sin6_addr.s6_addr)[1] != 0u) { |
| 65 | in6_pktinfo* pktInfo; |
| 66 | #ifdef _cygwin_ |
| 67 | cmsghdr* cmsgAddr = CMSG_FIRSTHDR(header); |
| 68 | #else |
| 69 | cmsghdr* cmsgAddr = CMSG_NXTHDR(header, cmsgTos); |
| 70 | #endif |
| 71 | if (cmsgAddr == nullptr) { |
| 72 | // leave only previous record |
| 73 | header->msg_controllen = totalLen; |
| 74 | return nullptr; |
| 75 | } |
| 76 | cmsgAddr->cmsg_level = IPPROTO_IPV6; |
| 77 | cmsgAddr->cmsg_type = IPV6_PKTINFO; |
| 78 | cmsgAddr->cmsg_len = CMSG_LEN(sizeof(*pktInfo)); |
| 79 | totalLen += CMSG_SPACE(sizeof(*pktInfo)); |
| 80 | pktInfo = (in6_pktinfo*)CMSG_DATA(cmsgAddr); |
| 81 | |
| 82 | pktInfo->ipi6_addr = myAddr.sin6_addr; |
| 83 | pktInfo->ipi6_ifindex = 0; /* 0 = use interface specified in routing table */ |
| 84 | } |
| 85 | header->msg_controllen = totalLen; //write right len |
| 86 | |
| 87 | return header; |
| 88 | #endif |
| 89 | } |
| 90 | |
| 91 | TIoVec CreateIoVec(char* data, const size_t dataSize) { |
no test coverage detected