| Index: net/tools/quic/quic_socket_utils.cc
|
| diff --git a/net/tools/quic/quic_socket_utils.cc b/net/tools/quic/quic_socket_utils.cc
|
| index 7b97de38fe189d243cc494b47012d6086a647e40..87d16ac1b114f53dc267a63e56c4198787e0f207 100644
|
| --- a/net/tools/quic/quic_socket_utils.cc
|
| +++ b/net/tools/quic/quic_socket_utils.cc
|
| @@ -154,6 +154,26 @@ int QuicSocketUtils::ReadPacket(int fd, char* buffer, size_t buf_len,
|
| return bytes_read;
|
| }
|
|
|
| +void QuicSocketUtils::SetIpInfoInCmsg(const IPAddressNumber& self_address,
|
| + cmsghdr* cmsg) {
|
| + if (GetAddressFamily(self_address) == ADDRESS_FAMILY_IPV4) {
|
| + cmsg->cmsg_len = CMSG_LEN(sizeof(in_pktinfo));
|
| + cmsg->cmsg_level = IPPROTO_IP;
|
| + cmsg->cmsg_type = IP_PKTINFO;
|
| + in_pktinfo* pktinfo = reinterpret_cast<in_pktinfo*>(CMSG_DATA(cmsg));
|
| + memset(pktinfo, 0, sizeof(in_pktinfo));
|
| + pktinfo->ipi_ifindex = 0;
|
| + memcpy(&pktinfo->ipi_spec_dst, &self_address[0], self_address.size());
|
| + } else {
|
| + cmsg->cmsg_len = CMSG_LEN(sizeof(in6_pktinfo));
|
| + cmsg->cmsg_level = IPPROTO_IPV6;
|
| + cmsg->cmsg_type = IPV6_PKTINFO;
|
| + in6_pktinfo* pktinfo = reinterpret_cast<in6_pktinfo*>(CMSG_DATA(cmsg));
|
| + memset(pktinfo, 0, sizeof(in6_pktinfo));
|
| + memcpy(&pktinfo->ipi6_addr, &self_address[0], self_address.size());
|
| + }
|
| +}
|
| +
|
| // static
|
| WriteResult QuicSocketUtils::WritePacket(int fd,
|
| const char* buffer,
|
| @@ -183,30 +203,11 @@ WriteResult QuicSocketUtils::WritePacket(int fd,
|
| if (self_address.empty()) {
|
| hdr.msg_control = 0;
|
| hdr.msg_controllen = 0;
|
| - } else if (GetAddressFamily(self_address) == ADDRESS_FAMILY_IPV4) {
|
| - hdr.msg_control = cbuf;
|
| - hdr.msg_controllen = kSpaceForIp;
|
| - cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr);
|
| -
|
| - cmsg->cmsg_len = CMSG_LEN(sizeof(in_pktinfo));
|
| - cmsg->cmsg_level = IPPROTO_IP;
|
| - cmsg->cmsg_type = IP_PKTINFO;
|
| - in_pktinfo* pktinfo = reinterpret_cast<in_pktinfo*>(CMSG_DATA(cmsg));
|
| - memset(pktinfo, 0, sizeof(in_pktinfo));
|
| - pktinfo->ipi_ifindex = 0;
|
| - memcpy(&pktinfo->ipi_spec_dst, &self_address[0], self_address.size());
|
| - hdr.msg_controllen = cmsg->cmsg_len;
|
| } else {
|
| hdr.msg_control = cbuf;
|
| hdr.msg_controllen = kSpaceForIp;
|
| - cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr);
|
| -
|
| - cmsg->cmsg_len = CMSG_LEN(sizeof(in6_pktinfo));
|
| - cmsg->cmsg_level = IPPROTO_IPV6;
|
| - cmsg->cmsg_type = IPV6_PKTINFO;
|
| - in6_pktinfo* pktinfo = reinterpret_cast<in6_pktinfo*>(CMSG_DATA(cmsg));
|
| - memset(pktinfo, 0, sizeof(in6_pktinfo));
|
| - memcpy(&pktinfo->ipi6_addr, &self_address[0], self_address.size());
|
| + cmsghdr *cmsg = CMSG_FIRSTHDR(&hdr);
|
| + SetIpInfoInCmsg(self_address, cmsg);
|
| hdr.msg_controllen = cmsg->cmsg_len;
|
| }
|
|
|
|
|