mirror of
				https://github.com/edera-dev/krata.git
				synced 2025-11-03 23:29:39 +00:00 
			
		
		
		
	network: optimize proxynat packet reconstruction
This commit is contained in:
		@ -5,7 +5,7 @@ use std::{
 | 
			
		||||
 | 
			
		||||
use anyhow::{anyhow, Result};
 | 
			
		||||
use async_trait::async_trait;
 | 
			
		||||
use bytes::BytesMut;
 | 
			
		||||
use bytes::{BufMut, BytesMut};
 | 
			
		||||
use etherparse::{
 | 
			
		||||
    IcmpEchoHeader, Icmpv4Header, Icmpv4Type, Icmpv6Header, Icmpv6Type, IpNumber, Ipv4Slice,
 | 
			
		||||
    Ipv6Slice, NetSlice, PacketBuilder, SlicedPacket,
 | 
			
		||||
@ -221,9 +221,11 @@ impl ProxyIcmpHandler {
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        let packet = packet.icmpv4_echo_reply(echo.id, echo.seq);
 | 
			
		||||
        let mut buffer: Vec<u8> = Vec::new();
 | 
			
		||||
        packet.write(&mut buffer, &payload)?;
 | 
			
		||||
        if let Err(error) = context.try_send(buffer.as_slice().into()) {
 | 
			
		||||
        let buffer = BytesMut::with_capacity(packet.size(payload.len()));
 | 
			
		||||
        let mut writer = buffer.writer();
 | 
			
		||||
        packet.write(&mut writer, &payload)?;
 | 
			
		||||
        let buffer = writer.into_inner();
 | 
			
		||||
        if let Err(error) = context.try_send(buffer) {
 | 
			
		||||
            debug!("failed to transmit icmp packet: {}", error);
 | 
			
		||||
        }
 | 
			
		||||
        Ok(())
 | 
			
		||||
@ -264,9 +266,11 @@ impl ProxyIcmpHandler {
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        let packet = packet.icmpv6_echo_reply(echo.id, echo.seq);
 | 
			
		||||
        let mut buffer: Vec<u8> = Vec::new();
 | 
			
		||||
        packet.write(&mut buffer, &payload)?;
 | 
			
		||||
        if let Err(error) = context.try_send(buffer.as_slice().into()) {
 | 
			
		||||
        let buffer = BytesMut::with_capacity(packet.size(payload.len()));
 | 
			
		||||
        let mut writer = buffer.writer();
 | 
			
		||||
        packet.write(&mut writer, &payload)?;
 | 
			
		||||
        let buffer = writer.into_inner();
 | 
			
		||||
        if let Err(error) = context.try_send(buffer) {
 | 
			
		||||
            debug!("failed to transmit icmp packet: {}", error);
 | 
			
		||||
        }
 | 
			
		||||
        Ok(())
 | 
			
		||||
 | 
			
		||||
@ -203,7 +203,7 @@ impl ProxyTcpHandler {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                ProxyTcpAcceptSelect::TxIpPacket(payload) => {
 | 
			
		||||
                    let mut buffer: Vec<u8> = Vec::new();
 | 
			
		||||
                    let mut buffer = BytesMut::with_capacity(Ethernet2Header::LEN + payload.len());
 | 
			
		||||
                    let header = Ethernet2Header {
 | 
			
		||||
                        source: context.key.local_mac.0,
 | 
			
		||||
                        destination: context.key.client_mac.0,
 | 
			
		||||
@ -212,9 +212,9 @@ impl ProxyTcpHandler {
 | 
			
		||||
                            IpAddress::Ipv6(_) => EtherType::IPV6,
 | 
			
		||||
                        },
 | 
			
		||||
                    };
 | 
			
		||||
                    header.write(&mut buffer)?;
 | 
			
		||||
                    buffer.extend_from_slice(&header.to_bytes());
 | 
			
		||||
                    buffer.extend_from_slice(&payload);
 | 
			
		||||
                    if let Err(error) = context.try_send(buffer.as_slice().into()) {
 | 
			
		||||
                    if let Err(error) = context.try_send(buffer) {
 | 
			
		||||
                        debug!("failed to transmit tcp packet: {}", error);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@ -376,7 +376,7 @@ impl ProxyTcpHandler {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                ProxyTcpDataSelect::TxIpPacket(payload) => {
 | 
			
		||||
                    let mut buffer: Vec<u8> = Vec::new();
 | 
			
		||||
                    let mut buffer = BytesMut::with_capacity(Ethernet2Header::LEN + payload.len());
 | 
			
		||||
                    let header = Ethernet2Header {
 | 
			
		||||
                        source: context.key.local_mac.0,
 | 
			
		||||
                        destination: context.key.client_mac.0,
 | 
			
		||||
@ -385,9 +385,9 @@ impl ProxyTcpHandler {
 | 
			
		||||
                            IpAddress::Ipv6(_) => EtherType::IPV6,
 | 
			
		||||
                        },
 | 
			
		||||
                    };
 | 
			
		||||
                    header.write(&mut buffer)?;
 | 
			
		||||
                    buffer.extend_from_slice(&header.to_bytes());
 | 
			
		||||
                    buffer.extend_from_slice(&payload);
 | 
			
		||||
                    if let Err(error) = context.try_send(buffer.as_slice().into()) {
 | 
			
		||||
                    if let Err(error) = context.try_send(buffer) {
 | 
			
		||||
                        debug!("failed to transmit tcp packet: {}", error);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@ -436,7 +436,7 @@ impl ProxyTcpHandler {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                ProxyTcpFinishSelect::TxIpPacket(payload) => {
 | 
			
		||||
                    let mut buffer: Vec<u8> = Vec::new();
 | 
			
		||||
                    let mut buffer = BytesMut::with_capacity(Ethernet2Header::LEN + payload.len());
 | 
			
		||||
                    let header = Ethernet2Header {
 | 
			
		||||
                        source: context.key.local_mac.0,
 | 
			
		||||
                        destination: context.key.client_mac.0,
 | 
			
		||||
@ -445,9 +445,9 @@ impl ProxyTcpHandler {
 | 
			
		||||
                            IpAddress::Ipv6(_) => EtherType::IPV6,
 | 
			
		||||
                        },
 | 
			
		||||
                    };
 | 
			
		||||
                    header.write(&mut buffer)?;
 | 
			
		||||
                    buffer.extend_from_slice(&header.to_bytes());
 | 
			
		||||
                    buffer.extend_from_slice(&payload);
 | 
			
		||||
                    if let Err(error) = context.try_send(buffer.as_slice().into()) {
 | 
			
		||||
                    if let Err(error) = context.try_send(buffer) {
 | 
			
		||||
                        debug!("failed to transmit tcp packet: {}", error);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ use std::{
 | 
			
		||||
 | 
			
		||||
use anyhow::{anyhow, Result};
 | 
			
		||||
use async_trait::async_trait;
 | 
			
		||||
use bytes::BytesMut;
 | 
			
		||||
use bytes::{BufMut, BytesMut};
 | 
			
		||||
use etherparse::{PacketBuilder, SlicedPacket, UdpSlice};
 | 
			
		||||
use log::{debug, warn};
 | 
			
		||||
use smoltcp::wire::IpAddress;
 | 
			
		||||
@ -107,9 +107,11 @@ impl ProxyUdpHandler {
 | 
			
		||||
                    };
 | 
			
		||||
                    let packet =
 | 
			
		||||
                        packet.udp(context.key.external_ip.port, context.key.client_ip.port);
 | 
			
		||||
                    let mut buffer: Vec<u8> = Vec::new();
 | 
			
		||||
                    packet.write(&mut buffer, data)?;
 | 
			
		||||
                    if let Err(error) = context.try_send(buffer.as_slice().into()) {
 | 
			
		||||
                    let buffer = BytesMut::with_capacity(packet.size(data.len()));
 | 
			
		||||
                    let mut writer = buffer.writer();
 | 
			
		||||
                    packet.write(&mut writer, data)?;
 | 
			
		||||
                    let buffer = writer.into_inner();
 | 
			
		||||
                    if let Err(error) = context.try_send(buffer) {
 | 
			
		||||
                        debug!("failed to transmit udp packet: {}", error);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user