Netstack untuk tujuan khusus mengubah paket dari/ke antarmuka TUN menjadi aliran TCP dan paket UDP. Ia menggunakan smoltcp-rs sebagai netstack backend.
Peti ini menyediakan dukungan netstack ringan untuk Linux, iOS, macOS, Android dan Windows. Saat ini, ia berfungsi pada sebagian besar target, namun terutama menguji platform populer yang meliputi:
// let device = tun2::create_as_async(&cfg)?;
// let framed = device.into_framed();
let ( stack , runner , udp_socket , tcp_listener ) = netstack_smoltcp :: StackBuilder :: default ( )
. stack_buffer_size ( 512 )
. tcp_buffer_size ( 4096 )
. enable_udp ( true )
. enable_tcp ( true )
. enable_icmp ( true )
. build ( )
. unwrap ( ) ;
let mut udp_socket = udp_socket . unwrap ( ) ; // udp enabled
let mut tcp_listener = tcp_listener . unwrap ( ) ; // tcp/icmp enabled
if let Some ( runner ) = runner {
tokio :: spawn ( runner ) ;
}
let ( mut stack_sink , mut stack_stream ) = stack . split ( ) ;
let ( mut tun_sink , mut tun_stream ) = framed . split ( ) ;
// Reads packet from stack and sends to TUN.
tokio :: spawn ( async move {
while let Some ( pkt ) = stack_stream . next ( ) . await {
if let Ok ( pkt ) = pkt {
tun_sink . send ( pkt ) . await . unwrap ( ) ;
}
}
} ) ;
// Reads packet from TUN and sends to stack.
tokio :: spawn ( async move {
while let Some ( pkt ) = tun_stream . next ( ) . await {
if let Ok ( pkt ) = pkt {
stack_sink . send ( pkt ) . await . unwrap ( ) ;
}
}
} ) ;
// Extracts TCP connections from stack and sends them to the dispatcher.
tokio :: spawn ( async move {
handle_inbound_stream ( tcp_listener ) . await ;
} ) ;
// Receive and send UDP packets between netstack and NAT manager. The NAT
// manager would maintain UDP sessions and send them to the dispatcher.
tokio :: spawn ( async move {
handle_inbound_datagram ( udp_socket ) . await ;
} ) ;
Proyek ini dilisensikan di bawah salah satu dari
sesuai pilihan Anda.
Kecuali jika Anda secara eksplisit menyatakan sebaliknya, setiap kontribusi yang dengan sengaja Anda kirimkan untuk dimasukkan ke dalam netstack-smoltcp, sebagaimana didefinisikan dalam lisensi Apache-2.0, akan memiliki lisensi ganda seperti di atas, tanpa syarat atau ketentuan tambahan apa pun.
Terima kasih khusus kepada proyek luar biasa yang menginspirasi netstack-smoltcp (tanpa urutan tertentu):