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; |
} |