From 05e872ac0aa85d9514125be2393afc87a672cd06 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 17 Jun 2026 23:28:05 +0800 Subject: [PATCH 1/2] feat(inbound): limit data transfer and concurrent connections per IP --- leaf/src/app/inbound/manager.rs | 2 + leaf/src/app/inbound/mod.rs | 1 + leaf/src/app/inbound/network_listener.rs | 45 ++++++++++++++ leaf/src/app/inbound/tracked_stream.rs | 75 ++++++++++++++++++++++++ leaf/src/config/common.rs | 8 +++ leaf/src/config/conf/config.rs | 8 +++ leaf/src/config/internal/config.proto | 2 + leaf/src/config/internal/config.rs | 26 ++++++++ 8 files changed, 167 insertions(+) create mode 100644 leaf/src/app/inbound/tracked_stream.rs diff --git a/leaf/src/app/inbound/manager.rs b/leaf/src/app/inbound/manager.rs index d35acbdc3..01ed97455 100644 --- a/leaf/src/app/inbound/manager.rs +++ b/leaf/src/app/inbound/manager.rs @@ -368,6 +368,8 @@ impl InboundManager { handler: h.clone(), dispatcher: dispatcher.clone(), nat_manager: nat_manager.clone(), + max_conn_data: inbound.max_conn_data, + max_ips_conn: inbound.max_ips_conn, }; network_listeners.insert(tag.clone(), listener); } diff --git a/leaf/src/app/inbound/mod.rs b/leaf/src/app/inbound/mod.rs index 49850d8f1..7c6072173 100644 --- a/leaf/src/app/inbound/mod.rs +++ b/leaf/src/app/inbound/mod.rs @@ -1,4 +1,5 @@ pub mod network_listener; +pub mod tracked_stream; #[cfg(feature = "inbound-tun")] mod tun_listener; diff --git a/leaf/src/app/inbound/network_listener.rs b/leaf/src/app/inbound/network_listener.rs index 9a8c958ee..082174293 100644 --- a/leaf/src/app/inbound/network_listener.rs +++ b/leaf/src/app/inbound/network_listener.rs @@ -172,6 +172,7 @@ async fn handle_inbound_tcp_stream( handler: AnyInboundHandler, dispatcher: Arc, nat_manager: Arc, + max_conn_data: u64, ) -> io::Result<()> { let source = stream .peer_addr() @@ -193,6 +194,9 @@ async fn handle_inbound_tcp_stream( "handle inbound tcp stream src={} local={}", &source, &local_addr ); + + let stream = crate::app::inbound::tracked_stream::TrackedStream::new(stream, max_conn_data); + async move { // Transforms the TCP stream into an inbound transport. let transport = timeout( @@ -216,6 +220,8 @@ async fn handle_tcp_listen( handler: AnyInboundHandler, dispatcher: Arc, nat_manager: Arc, + max_conn_data: u64, + max_ips_conn: u32, ) -> io::Result<()> { let listener = crate::proxy::TcpListener::bind(&listen_addr).await?; let listen_addr = listener.io().local_addr()?; @@ -229,11 +235,33 @@ async fn handle_tcp_listen( .insert(handler.tag().clone(), listen_addr); } + let mut ip_conn_counts: Option>>> = None; + if max_ips_conn > 0 { + ip_conn_counts = Some(Arc::new(tokio::sync::Mutex::new(std::collections::HashMap::new()))); + } + loop { let (stream, _) = listener.accept().await?; + + if let Some(counts) = &ip_conn_counts { + let ip = stream.peer_addr().map(|a| a.ip()); + if let Ok(ip) = ip { + let mut counts_lock = counts.lock().await; + let count = counts_lock.entry(ip).or_insert(0); + if *count >= max_ips_conn { + warn!("ip {} exceeds max concurrent connections {}", ip, max_ips_conn); + continue; + } + *count += 1; + } + } + let handler_cloned = handler.clone(); let dispatcher_cloned = dispatcher.clone(); let nat_manager_cloned = nat_manager.clone(); + let counts_cloned = ip_conn_counts.clone(); + let peer_ip = stream.peer_addr().map(|a| a.ip()).ok(); + tokio::spawn(async move { // Handle each TCP stream. if let Err(e) = handle_inbound_tcp_stream( @@ -241,11 +269,22 @@ async fn handle_tcp_listen( handler_cloned, dispatcher_cloned, nat_manager_cloned, + max_conn_data, ) .await { debug!("handle inbound stream failed: {}", e); } + + if let (Some(counts), Some(ip)) = (counts_cloned, peer_ip) { + let mut counts_lock = counts.lock().await; + if let Some(count) = counts_lock.get_mut(&ip) { + *count -= 1; + if *count == 0 { + counts_lock.remove(&ip); + } + } + } }); } } @@ -284,6 +323,8 @@ pub struct NetworkInboundListener { pub handler: AnyInboundHandler, pub dispatcher: Arc, pub nat_manager: Arc, + pub max_conn_data: u64, + pub max_ips_conn: u32, } impl NetworkInboundListener { @@ -296,12 +337,16 @@ impl NetworkInboundListener { let handler_cloned = self.handler.clone(); let dispatcher_cloned = self.dispatcher.clone(); let nat_manager_cloned = self.nat_manager.clone(); + let max_conn_data_cloned = self.max_conn_data; + let max_ips_conn_cloned = self.max_ips_conn; runners.push(Box::pin(async move { if let Err(e) = handle_tcp_listen( listen_addr_cloned, handler_cloned, dispatcher_cloned, nat_manager_cloned, + max_conn_data_cloned, + max_ips_conn_cloned, ) .await { diff --git a/leaf/src/app/inbound/tracked_stream.rs b/leaf/src/app/inbound/tracked_stream.rs new file mode 100644 index 000000000..9a19ea875 --- /dev/null +++ b/leaf/src/app/inbound/tracked_stream.rs @@ -0,0 +1,75 @@ +use std::io; +use std::pin::Pin; +use std::task::{Context, Poll}; +use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; + +pub struct TrackedStream { + inner: T, + max_data: u64, + current_data: u64, +} + +impl TrackedStream { + pub fn new(inner: T, max_data: u64) -> Self { + TrackedStream { + inner, + max_data, + current_data: 0, + } + } +} + +impl AsyncRead for TrackedStream { + fn poll_read( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &mut ReadBuf<'_>, + ) -> Poll> { + let before = buf.filled().len(); + match Pin::new(&mut self.inner).poll_read(cx, buf) { + Poll::Ready(Ok(())) => { + let after = buf.filled().len(); + let n = (after - before) as u64; + if self.max_data > 0 && self.current_data + n > self.max_data { + return Poll::Ready(Err(io::Error::new( + io::ErrorKind::ConnectionAborted, + "data transfer limit exceeded", + ))); + } + self.current_data += n; + Poll::Ready(Ok(())) + } + other => other, + } + } +} + +impl AsyncWrite for TrackedStream { + fn poll_write( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &[u8], + ) -> Poll> { + match Pin::new(&mut self.inner).poll_write(cx, buf) { + Poll::Ready(Ok(n)) => { + if self.max_data > 0 && self.current_data + (n as u64) > self.max_data { + return Poll::Ready(Err(io::Error::new( + io::ErrorKind::ConnectionAborted, + "data transfer limit exceeded", + ))); + } + self.current_data += n as u64; + Poll::Ready(Ok(n)) + } + other => other, + } + } + + fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.inner).poll_flush(cx) + } + + fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.inner).poll_shutdown(cx) + } +} \ No newline at end of file diff --git a/leaf/src/config/common.rs b/leaf/src/config/common.rs index 03a1ba80d..95ccb1fe3 100644 --- a/leaf/src/config/common.rs +++ b/leaf/src/config/common.rs @@ -332,6 +332,8 @@ pub struct Inbound { pub tag: Option, pub address: Option, pub port: Option, + pub max_conn_data: Option, + pub max_ips_conn: Option, #[serde(flatten)] pub settings: InboundSettings, } @@ -592,6 +594,12 @@ pub fn to_internal(mut config: Config) -> Result { if let Some(ext_port) = ext_inbound.port { inbound.port = ext_port as u32; } + if let Some(max_conn_data) = ext_inbound.max_conn_data { + inbound.max_conn_data = max_conn_data; + } + if let Some(max_ips_conn) = ext_inbound.max_ips_conn { + inbound.max_ips_conn = max_ips_conn; + } match &ext_inbound.settings { #[cfg(any( diff --git a/leaf/src/config/conf/config.rs b/leaf/src/config/conf/config.rs index ed1f2c068..6cba9d03d 100644 --- a/leaf/src/config/conf/config.rs +++ b/leaf/src/config/conf/config.rs @@ -1009,6 +1009,8 @@ pub fn to_common(conf: &Config) -> Result { tag: Some("http".to_string()), address: Some(interface.clone()), port: Some(*port), + max_conn_data: None, + max_ips_conn: None, settings: common::InboundSettings::Http, }); } @@ -1021,6 +1023,8 @@ pub fn to_common(conf: &Config) -> Result { tag: Some("socks".to_string()), address: Some(interface.clone()), port: Some(*port), + max_conn_data: None, + max_ips_conn: None, settings: common::InboundSettings::Socks { settings: None }, }); } @@ -1030,6 +1034,8 @@ pub fn to_common(conf: &Config) -> Result { tag: Some("nf".to_string()), address: Some("127.0.0.1".to_string()), port: Some(0), + max_conn_data: None, + max_ips_conn: None, settings: common::InboundSettings::Nf { settings: Some(common::NfInboundSettings { driver_name: nf.driver_name.clone(), @@ -1081,6 +1087,8 @@ pub fn to_common(conf: &Config) -> Result { tag: Some("tun".to_string()), address: None, port: None, + max_conn_data: None, + max_ips_conn: None, settings: common::InboundSettings::Tun { settings: Some(settings), }, diff --git a/leaf/src/config/internal/config.proto b/leaf/src/config/internal/config.proto index 2c751a6c2..ab3ee46ab 100644 --- a/leaf/src/config/internal/config.proto +++ b/leaf/src/config/internal/config.proto @@ -119,6 +119,8 @@ message Inbound { string address = 3; uint32 port = 4; bytes settings = 5; + uint64 max_conn_data = 6; + uint32 max_ips_conn = 7; } message RedirectOutboundSettings { diff --git a/leaf/src/config/internal/config.rs b/leaf/src/config/internal/config.rs index 09a822932..064bd9a1b 100644 --- a/leaf/src/config/internal/config.rs +++ b/leaf/src/config/internal/config.rs @@ -2022,6 +2022,10 @@ pub struct Inbound { pub port: u32, // @@protoc_insertion_point(field:Inbound.settings) pub settings: ::std::vec::Vec, + // @@protoc_insertion_point(field:Inbound.max_conn_data) + pub max_conn_data: u64, + // @@protoc_insertion_point(field:Inbound.max_ips_conn) + pub max_ips_conn: u32, // special fields // @@protoc_insertion_point(special_field:Inbound.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -2064,6 +2068,12 @@ impl ::protobuf::Message for Inbound { 42 => { self.settings = is.read_bytes()?; }, + 48 => { + self.max_conn_data = is.read_uint64()?; + }, + 56 => { + self.max_ips_conn = is.read_uint32()?; + }, tag => { ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; }, @@ -2091,6 +2101,12 @@ impl ::protobuf::Message for Inbound { if !self.settings.is_empty() { my_size += ::protobuf::rt::bytes_size(5, &self.settings); } + if self.max_conn_data != 0 { + my_size += ::protobuf::rt::uint64_size(6, self.max_conn_data); + } + if self.max_ips_conn != 0 { + my_size += ::protobuf::rt::uint32_size(7, self.max_ips_conn); + } my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); self.special_fields.cached_size().set(my_size as u32); my_size @@ -2112,6 +2128,12 @@ impl ::protobuf::Message for Inbound { if !self.settings.is_empty() { os.write_bytes(5, &self.settings)?; } + if self.max_conn_data != 0 { + os.write_uint64(6, self.max_conn_data)?; + } + if self.max_ips_conn != 0 { + os.write_uint32(7, self.max_ips_conn)?; + } os.write_unknown_fields(self.special_fields.unknown_fields())?; ::std::result::Result::Ok(()) } @@ -2134,6 +2156,8 @@ impl ::protobuf::Message for Inbound { self.address.clear(); self.port = 0; self.settings.clear(); + self.max_conn_data = 0; + self.max_ips_conn = 0; self.special_fields.clear(); } @@ -2144,6 +2168,8 @@ impl ::protobuf::Message for Inbound { address: ::std::string::String::new(), port: 0, settings: ::std::vec::Vec::new(), + max_conn_data: 0, + max_ips_conn: 0, special_fields: ::protobuf::SpecialFields::new(), }; &instance From 1d20301570395cff1db5f3e316222b0ec3b4732e Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 18 Jun 2026 13:28:41 +0800 Subject: [PATCH 2/2] Revert "feat(inbound): limit data transfer and concurrent connections per IP" This reverts commit 05e872ac0aa85d9514125be2393afc87a672cd06. --- leaf/src/app/inbound/manager.rs | 2 - leaf/src/app/inbound/mod.rs | 1 - leaf/src/app/inbound/network_listener.rs | 45 -------------- leaf/src/app/inbound/tracked_stream.rs | 75 ------------------------ leaf/src/config/common.rs | 8 --- leaf/src/config/conf/config.rs | 8 --- leaf/src/config/internal/config.proto | 2 - leaf/src/config/internal/config.rs | 26 -------- 8 files changed, 167 deletions(-) delete mode 100644 leaf/src/app/inbound/tracked_stream.rs diff --git a/leaf/src/app/inbound/manager.rs b/leaf/src/app/inbound/manager.rs index 01ed97455..d35acbdc3 100644 --- a/leaf/src/app/inbound/manager.rs +++ b/leaf/src/app/inbound/manager.rs @@ -368,8 +368,6 @@ impl InboundManager { handler: h.clone(), dispatcher: dispatcher.clone(), nat_manager: nat_manager.clone(), - max_conn_data: inbound.max_conn_data, - max_ips_conn: inbound.max_ips_conn, }; network_listeners.insert(tag.clone(), listener); } diff --git a/leaf/src/app/inbound/mod.rs b/leaf/src/app/inbound/mod.rs index 7c6072173..49850d8f1 100644 --- a/leaf/src/app/inbound/mod.rs +++ b/leaf/src/app/inbound/mod.rs @@ -1,5 +1,4 @@ pub mod network_listener; -pub mod tracked_stream; #[cfg(feature = "inbound-tun")] mod tun_listener; diff --git a/leaf/src/app/inbound/network_listener.rs b/leaf/src/app/inbound/network_listener.rs index 082174293..9a8c958ee 100644 --- a/leaf/src/app/inbound/network_listener.rs +++ b/leaf/src/app/inbound/network_listener.rs @@ -172,7 +172,6 @@ async fn handle_inbound_tcp_stream( handler: AnyInboundHandler, dispatcher: Arc, nat_manager: Arc, - max_conn_data: u64, ) -> io::Result<()> { let source = stream .peer_addr() @@ -194,9 +193,6 @@ async fn handle_inbound_tcp_stream( "handle inbound tcp stream src={} local={}", &source, &local_addr ); - - let stream = crate::app::inbound::tracked_stream::TrackedStream::new(stream, max_conn_data); - async move { // Transforms the TCP stream into an inbound transport. let transport = timeout( @@ -220,8 +216,6 @@ async fn handle_tcp_listen( handler: AnyInboundHandler, dispatcher: Arc, nat_manager: Arc, - max_conn_data: u64, - max_ips_conn: u32, ) -> io::Result<()> { let listener = crate::proxy::TcpListener::bind(&listen_addr).await?; let listen_addr = listener.io().local_addr()?; @@ -235,33 +229,11 @@ async fn handle_tcp_listen( .insert(handler.tag().clone(), listen_addr); } - let mut ip_conn_counts: Option>>> = None; - if max_ips_conn > 0 { - ip_conn_counts = Some(Arc::new(tokio::sync::Mutex::new(std::collections::HashMap::new()))); - } - loop { let (stream, _) = listener.accept().await?; - - if let Some(counts) = &ip_conn_counts { - let ip = stream.peer_addr().map(|a| a.ip()); - if let Ok(ip) = ip { - let mut counts_lock = counts.lock().await; - let count = counts_lock.entry(ip).or_insert(0); - if *count >= max_ips_conn { - warn!("ip {} exceeds max concurrent connections {}", ip, max_ips_conn); - continue; - } - *count += 1; - } - } - let handler_cloned = handler.clone(); let dispatcher_cloned = dispatcher.clone(); let nat_manager_cloned = nat_manager.clone(); - let counts_cloned = ip_conn_counts.clone(); - let peer_ip = stream.peer_addr().map(|a| a.ip()).ok(); - tokio::spawn(async move { // Handle each TCP stream. if let Err(e) = handle_inbound_tcp_stream( @@ -269,22 +241,11 @@ async fn handle_tcp_listen( handler_cloned, dispatcher_cloned, nat_manager_cloned, - max_conn_data, ) .await { debug!("handle inbound stream failed: {}", e); } - - if let (Some(counts), Some(ip)) = (counts_cloned, peer_ip) { - let mut counts_lock = counts.lock().await; - if let Some(count) = counts_lock.get_mut(&ip) { - *count -= 1; - if *count == 0 { - counts_lock.remove(&ip); - } - } - } }); } } @@ -323,8 +284,6 @@ pub struct NetworkInboundListener { pub handler: AnyInboundHandler, pub dispatcher: Arc, pub nat_manager: Arc, - pub max_conn_data: u64, - pub max_ips_conn: u32, } impl NetworkInboundListener { @@ -337,16 +296,12 @@ impl NetworkInboundListener { let handler_cloned = self.handler.clone(); let dispatcher_cloned = self.dispatcher.clone(); let nat_manager_cloned = self.nat_manager.clone(); - let max_conn_data_cloned = self.max_conn_data; - let max_ips_conn_cloned = self.max_ips_conn; runners.push(Box::pin(async move { if let Err(e) = handle_tcp_listen( listen_addr_cloned, handler_cloned, dispatcher_cloned, nat_manager_cloned, - max_conn_data_cloned, - max_ips_conn_cloned, ) .await { diff --git a/leaf/src/app/inbound/tracked_stream.rs b/leaf/src/app/inbound/tracked_stream.rs deleted file mode 100644 index 9a19ea875..000000000 --- a/leaf/src/app/inbound/tracked_stream.rs +++ /dev/null @@ -1,75 +0,0 @@ -use std::io; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; - -pub struct TrackedStream { - inner: T, - max_data: u64, - current_data: u64, -} - -impl TrackedStream { - pub fn new(inner: T, max_data: u64) -> Self { - TrackedStream { - inner, - max_data, - current_data: 0, - } - } -} - -impl AsyncRead for TrackedStream { - fn poll_read( - mut self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &mut ReadBuf<'_>, - ) -> Poll> { - let before = buf.filled().len(); - match Pin::new(&mut self.inner).poll_read(cx, buf) { - Poll::Ready(Ok(())) => { - let after = buf.filled().len(); - let n = (after - before) as u64; - if self.max_data > 0 && self.current_data + n > self.max_data { - return Poll::Ready(Err(io::Error::new( - io::ErrorKind::ConnectionAborted, - "data transfer limit exceeded", - ))); - } - self.current_data += n; - Poll::Ready(Ok(())) - } - other => other, - } - } -} - -impl AsyncWrite for TrackedStream { - fn poll_write( - mut self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &[u8], - ) -> Poll> { - match Pin::new(&mut self.inner).poll_write(cx, buf) { - Poll::Ready(Ok(n)) => { - if self.max_data > 0 && self.current_data + (n as u64) > self.max_data { - return Poll::Ready(Err(io::Error::new( - io::ErrorKind::ConnectionAborted, - "data transfer limit exceeded", - ))); - } - self.current_data += n as u64; - Poll::Ready(Ok(n)) - } - other => other, - } - } - - fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - Pin::new(&mut self.inner).poll_flush(cx) - } - - fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - Pin::new(&mut self.inner).poll_shutdown(cx) - } -} \ No newline at end of file diff --git a/leaf/src/config/common.rs b/leaf/src/config/common.rs index 95ccb1fe3..03a1ba80d 100644 --- a/leaf/src/config/common.rs +++ b/leaf/src/config/common.rs @@ -332,8 +332,6 @@ pub struct Inbound { pub tag: Option, pub address: Option, pub port: Option, - pub max_conn_data: Option, - pub max_ips_conn: Option, #[serde(flatten)] pub settings: InboundSettings, } @@ -594,12 +592,6 @@ pub fn to_internal(mut config: Config) -> Result { if let Some(ext_port) = ext_inbound.port { inbound.port = ext_port as u32; } - if let Some(max_conn_data) = ext_inbound.max_conn_data { - inbound.max_conn_data = max_conn_data; - } - if let Some(max_ips_conn) = ext_inbound.max_ips_conn { - inbound.max_ips_conn = max_ips_conn; - } match &ext_inbound.settings { #[cfg(any( diff --git a/leaf/src/config/conf/config.rs b/leaf/src/config/conf/config.rs index 6cba9d03d..ed1f2c068 100644 --- a/leaf/src/config/conf/config.rs +++ b/leaf/src/config/conf/config.rs @@ -1009,8 +1009,6 @@ pub fn to_common(conf: &Config) -> Result { tag: Some("http".to_string()), address: Some(interface.clone()), port: Some(*port), - max_conn_data: None, - max_ips_conn: None, settings: common::InboundSettings::Http, }); } @@ -1023,8 +1021,6 @@ pub fn to_common(conf: &Config) -> Result { tag: Some("socks".to_string()), address: Some(interface.clone()), port: Some(*port), - max_conn_data: None, - max_ips_conn: None, settings: common::InboundSettings::Socks { settings: None }, }); } @@ -1034,8 +1030,6 @@ pub fn to_common(conf: &Config) -> Result { tag: Some("nf".to_string()), address: Some("127.0.0.1".to_string()), port: Some(0), - max_conn_data: None, - max_ips_conn: None, settings: common::InboundSettings::Nf { settings: Some(common::NfInboundSettings { driver_name: nf.driver_name.clone(), @@ -1087,8 +1081,6 @@ pub fn to_common(conf: &Config) -> Result { tag: Some("tun".to_string()), address: None, port: None, - max_conn_data: None, - max_ips_conn: None, settings: common::InboundSettings::Tun { settings: Some(settings), }, diff --git a/leaf/src/config/internal/config.proto b/leaf/src/config/internal/config.proto index ab3ee46ab..2c751a6c2 100644 --- a/leaf/src/config/internal/config.proto +++ b/leaf/src/config/internal/config.proto @@ -119,8 +119,6 @@ message Inbound { string address = 3; uint32 port = 4; bytes settings = 5; - uint64 max_conn_data = 6; - uint32 max_ips_conn = 7; } message RedirectOutboundSettings { diff --git a/leaf/src/config/internal/config.rs b/leaf/src/config/internal/config.rs index 064bd9a1b..09a822932 100644 --- a/leaf/src/config/internal/config.rs +++ b/leaf/src/config/internal/config.rs @@ -2022,10 +2022,6 @@ pub struct Inbound { pub port: u32, // @@protoc_insertion_point(field:Inbound.settings) pub settings: ::std::vec::Vec, - // @@protoc_insertion_point(field:Inbound.max_conn_data) - pub max_conn_data: u64, - // @@protoc_insertion_point(field:Inbound.max_ips_conn) - pub max_ips_conn: u32, // special fields // @@protoc_insertion_point(special_field:Inbound.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -2068,12 +2064,6 @@ impl ::protobuf::Message for Inbound { 42 => { self.settings = is.read_bytes()?; }, - 48 => { - self.max_conn_data = is.read_uint64()?; - }, - 56 => { - self.max_ips_conn = is.read_uint32()?; - }, tag => { ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; }, @@ -2101,12 +2091,6 @@ impl ::protobuf::Message for Inbound { if !self.settings.is_empty() { my_size += ::protobuf::rt::bytes_size(5, &self.settings); } - if self.max_conn_data != 0 { - my_size += ::protobuf::rt::uint64_size(6, self.max_conn_data); - } - if self.max_ips_conn != 0 { - my_size += ::protobuf::rt::uint32_size(7, self.max_ips_conn); - } my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); self.special_fields.cached_size().set(my_size as u32); my_size @@ -2128,12 +2112,6 @@ impl ::protobuf::Message for Inbound { if !self.settings.is_empty() { os.write_bytes(5, &self.settings)?; } - if self.max_conn_data != 0 { - os.write_uint64(6, self.max_conn_data)?; - } - if self.max_ips_conn != 0 { - os.write_uint32(7, self.max_ips_conn)?; - } os.write_unknown_fields(self.special_fields.unknown_fields())?; ::std::result::Result::Ok(()) } @@ -2156,8 +2134,6 @@ impl ::protobuf::Message for Inbound { self.address.clear(); self.port = 0; self.settings.clear(); - self.max_conn_data = 0; - self.max_ips_conn = 0; self.special_fields.clear(); } @@ -2168,8 +2144,6 @@ impl ::protobuf::Message for Inbound { address: ::std::string::String::new(), port: 0, settings: ::std::vec::Vec::new(), - max_conn_data: 0, - max_ips_conn: 0, special_fields: ::protobuf::SpecialFields::new(), }; &instance