This is an automated email from the ASF dual-hosted git repository.
maskit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new a8932cf8cf Don't call getsockname on every packet (#11850)
a8932cf8cf is described below
commit a8932cf8cfced6a6cf6a0803e05574cb67545ab3
Author: Masakazu Kitajo <[email protected]>
AuthorDate: Wed Nov 20 15:26:20 2024 -0700
Don't call getsockname on every packet (#11850)
* Don't call getsockname on every packet
* fix errors
* fix errors
* fix errors
* fix errors
* fix wording
---
src/iocore/net/UnixUDPNet.cc | 35 ++++++++++++++++++++---------------
1 file changed, 20 insertions(+), 15 deletions(-)
diff --git a/src/iocore/net/UnixUDPNet.cc b/src/iocore/net/UnixUDPNet.cc
index dd9ed940dd..8d5f4fed6c 100644
--- a/src/iocore/net/UnixUDPNet.cc
+++ b/src/iocore/net/UnixUDPNet.cc
@@ -315,7 +315,7 @@ UDPNetProcessorInternal::start(int n_upd_threads, size_t
stacksize)
namespace
{
bool
-get_ip_address_from_cmsg(struct cmsghdr *cmsg, sockaddr_in6 *toaddr)
+get_ip_address_from_cmsg(struct cmsghdr *cmsg, sockaddr_storage *toaddr)
{
#ifdef IP_PKTINFO
if (IP_PKTINFO == cmsg->cmsg_type) {
@@ -339,7 +339,7 @@ get_ip_address_from_cmsg(struct cmsghdr *cmsg, sockaddr_in6
*toaddr)
if (IPV6_PKTINFO == cmsg->cmsg_type) { // IPV6_RECVPKTINFO uses IPV6_PKTINFO
too
if (cmsg->cmsg_level == IPPROTO_IPV6) {
struct in6_pktinfo *pktinfo = reinterpret_cast<struct in6_pktinfo
*>(CMSG_DATA(cmsg));
- memcpy(toaddr->sin6_addr.s6_addr, &pktinfo->ipi6_addr, 16);
+ memcpy(reinterpret_cast<sockaddr_in6 *>(toaddr)->sin6_addr.s6_addr,
&pktinfo->ipi6_addr, 16);
}
return true;
}
@@ -402,14 +402,13 @@
UDPNetProcessorInternal::read_single_message_from_net(UDPNetHandler *nh, UDPConn
unsigned int niov = build_iovec_block_chain(max_niov, size_index, chain,
tiovec);
// build struct msghdr
- sockaddr_in6 fromaddr;
- sockaddr_in6 toaddr;
- int toaddr_len = sizeof(toaddr);
- msg.msg_name = &fromaddr;
- msg.msg_namelen = sizeof(fromaddr);
- msg.msg_iov = tiovec;
- msg.msg_iovlen = niov;
- msg.msg_flags = 0;
+ sockaddr_storage fromaddr;
+ sockaddr_storage toaddr;
+ msg.msg_name = &fromaddr;
+ msg.msg_namelen = sizeof(fromaddr);
+ msg.msg_iov = tiovec;
+ msg.msg_iovlen = niov;
+ msg.msg_flags = 0;
static const size_t cmsg_size{CMSG_SPACE(sizeof(int))
#ifdef IP_PKTINFO
@@ -442,7 +441,7 @@
UDPNetProcessorInternal::read_single_message_from_net(UDPNetHandler *nh, UDPConn
Dbg(dbg_ctl_udp_read, "The UDP packet is truncated");
}
- safe_getsockname(xuc->getFd(), reinterpret_cast<struct sockaddr
*>(&toaddr), &toaddr_len);
+ toaddr.ss_family = AF_UNSPEC;
for (auto cmsg = CMSG_FIRSTHDR(&msg); cmsg != nullptr; cmsg =
CMSG_NXTHDR(&msg, cmsg)) {
if (get_ip_address_from_cmsg(cmsg, &toaddr)) {
break;
@@ -456,6 +455,10 @@
UDPNetProcessorInternal::read_single_message_from_net(UDPNetHandler *nh, UDPConn
}
#endif
}
+ // Use the local address if we couldn't get the destination address from
any cmsgs
+ if (toaddr.ss_family == AF_UNSPEC) {
+ xuc->getBinding(reinterpret_cast<struct sockaddr *>(&toaddr));
+ }
// If gro was used, then the kernel will tell us the size of each part
that was spliced together.
Dbg(dbg_ctl_udp_read, "Received %lld bytes. gso_size %lld (%s)",
static_cast<long long>(r), static_cast<long long>(gso_size),
@@ -521,9 +524,8 @@
UDPNetProcessorInternal::read_multiple_messages_from_net(UDPNetHandler *nh, UDPC
struct iovec tiovec[MAX_RECEIVE_MSG_PER_CALL][max_niov];
// Addresses
- sockaddr_in6 fromaddr[MAX_RECEIVE_MSG_PER_CALL];
- sockaddr_in6 toaddr[MAX_RECEIVE_MSG_PER_CALL];
- int toaddr_len = sizeof(toaddr);
+ sockaddr_storage fromaddr[MAX_RECEIVE_MSG_PER_CALL];
+ sockaddr_storage toaddr[MAX_RECEIVE_MSG_PER_CALL];
size_t total_bytes_read{0};
@@ -589,7 +591,7 @@
UDPNetProcessorInternal::read_multiple_messages_from_net(UDPNetHandler *nh, UDPC
return;
}
- safe_getsockname(xuc->getFd(), reinterpret_cast<struct sockaddr
*>(&toaddr[packet_num]), &toaddr_len);
+ toaddr[packet_num].ss_family = AF_UNSPEC;
if (mhdr.msg_controllen > 0) {
for (auto cmsg = CMSG_FIRSTHDR(&mhdr); cmsg != nullptr; cmsg =
CMSG_NXTHDR(&mhdr, cmsg)) {
if (get_ip_address_from_cmsg(cmsg, &toaddr[packet_num])) {
@@ -605,6 +607,9 @@
UDPNetProcessorInternal::read_multiple_messages_from_net(UDPNetHandler *nh, UDPC
#endif
}
}
+ if (toaddr[packet_num].ss_family == AF_UNSPEC) {
+ xuc->getBinding(reinterpret_cast<struct sockaddr
*>(&toaddr[packet_num]));
+ }
const int64_t received = mmsg[packet_num].msg_len;
total_bytes_read += received;