From: Kefu Chai Date: Sat, 29 Apr 2017 05:27:49 +0000 (+0800) Subject: msg/simple: use my addr when setting sock priority X-Git-Tag: v12.0.3~160^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=256b5b8069c62af598703caf90acb0878cf7f132;p=ceph.git msg/simple: use my addr when setting sock priority actually we always fails to set ToS of listening socket. 6f1037e22c2a304795895498cdc955e0ef80f8e3 reveals this issue. Fixes: http://tracker.ceph.com/issues/19801 Signed-off-by: Kefu Chai --- diff --git a/src/msg/simple/Pipe.cc b/src/msg/simple/Pipe.cc index 7783d4e4a877..771c92079039 100644 --- a/src/msg/simple/Pipe.cc +++ b/src/msg/simple/Pipe.cc @@ -923,25 +923,29 @@ void Pipe::set_socket_options() int r = -1; #ifdef IPTOS_CLASS_CS6 int iptos = IPTOS_CLASS_CS6; - - if (peer_addr.get_family() == AF_INET) { + int addr_family = 0; + if (!peer_addr.is_blank_ip()) { + addr_family = peer_addr.get_family(); + } else { + addr_family = msgr->get_myaddr().get_family(); + } + switch (addr_family) { + case AF_INET: r = ::setsockopt(sd, IPPROTO_IP, IP_TOS, &iptos, sizeof(iptos)); - if (r < 0) { - r = -errno; - ldout(msgr->cct,0) << "couldn't set IP_TOS to " << iptos - << ": " << cpp_strerror(r) << dendl; - } - } else if (peer_addr.get_family() == AF_INET6) { + break; + case AF_INET6: r = ::setsockopt(sd, IPPROTO_IPV6, IPV6_TCLASS, &iptos, sizeof(iptos)); - if (r < 0) { - r = -errno; - ldout(msgr->cct,0) << "couldn't set IPV6_TCLASS to " << iptos - << ": " << cpp_strerror(r) << dendl; - } - } else { + break; + default: lderr(msgr->cct) << "couldn't set ToS of unknown family (" - << peer_addr.get_family() << ")" + << addr_family << ")" << " to " << iptos << dendl; + return; + } + if (r < 0) { + r = -errno; + ldout(msgr->cct,0) << "couldn't set TOS to " << iptos + << ": " << cpp_strerror(r) << dendl; } #endif // setsockopt(IPTOS_CLASS_CS6) sets the priority of the socket as 0.