From 4127a2c4d1203885eb54334b9da3c8eea013b4dc Mon Sep 17 00:00:00 2001 From: sorz Date: Fri, 12 Jul 2019 13:11:16 +0800 Subject: [PATCH] Fix wrong original IPv6 port number --- src/tcp.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/tcp.rs b/src/tcp.rs index 8b3a487..ace7763 100644 --- a/src/tcp.rs +++ b/src/tcp.rs @@ -1,5 +1,11 @@ use libc::{self, c_void, setsockopt, socklen_t, IPPROTO_TCP, TCP_CONGESTION}; -use nix::{self, sys}; +use nix::{ + self, + sys::socket::{ + getsockopt, + sockopt::OriginalDst, + }, +}; use std::{ ffi::OsStr, io::{self, ErrorKind}, @@ -12,13 +18,16 @@ pub fn get_original_dest(fd: &F) -> io::Result where F: AsRawFd, { - let addr = sys::socket::getsockopt(fd.as_raw_fd(), sys::socket::sockopt::OriginalDst).map_err( + let addr = getsockopt(fd.as_raw_fd(), OriginalDst).map_err( |e| match e { nix::Error::Sys(err) => io::Error::from(err), _ => io::Error::new(ErrorKind::Other, e), }, )?; - let addr = SocketAddrV4::new(addr.sin_addr.s_addr.to_be().into(), addr.sin_port.to_be()); + let addr = SocketAddrV4::new( + u32::from_be(addr.sin_addr.s_addr).into(), + u16::from_be(addr.sin_port), + ); Ok(addr) } @@ -42,7 +51,7 @@ where } let addr = SocketAddrV6::new( sockaddr.sin6_addr.s6_addr.into(), - sockaddr.sin6_port, + u16::from_be(sockaddr.sin6_port), sockaddr.sin6_flowinfo, sockaddr.sin6_scope_id, );