add heart beat to client

This commit is contained in:
PoliEcho 2025-07-28 14:43:20 +02:00
parent 7f3aa3076d
commit 63d485b8b5

View File

@ -5,7 +5,6 @@ use std::{
}; };
use pea_2_pea::*; use pea_2_pea::*;
use rand::RngCore;
use super::types; use super::types;
@ -106,67 +105,48 @@ pub fn register_request(
buf: &mut [u8; BUFFER_SIZE], buf: &mut [u8; BUFFER_SIZE],
dst: &SocketAddr, dst: &SocketAddr,
socket: UdpSocket, socket: UdpSocket,
encryption_key: Option<[u8; 32]>, network: &types::Network,
salt_opt: Option<[u8; SALT_AND_IV_SIZE as usize]>, public_sock_addr: &Box<[u8]>,
mut public_sock_addr: Vec<u8>, iv: [u8; SALT_AND_IV_SIZE as usize],
network_id: String, ) -> Result<([u8; SALT_AND_IV_SIZE as usize], usize), ServerErrorResponses> {
) -> Result<usize, ServerErrorResponses> { let mut send_buf: Box<[u8]> = vec![
let mut send_buf: Box<[u8]> =
vec![
0u8; 0u8;
RegisterRequestDataPositions::DATA as usize + network_id.len() + public_sock_addr.len() RegisterRequestDataPositions::DATA as usize
+ network.net_id.len()
+ public_sock_addr.len()
] ]
.into_boxed_slice(); .into_boxed_slice();
send_buf[0] = ServerMethods::REGISTER as u8; // set metod identification byte send_buf[0] = ServerMethods::REGISTER as u8; // set metod identification byte
send_buf[RegisterRequestDataPositions::ENCRYPTED as usize] = match encryption_key { send_buf[RegisterRequestDataPositions::ENCRYPTED as usize] = network.encrypted as u8;
// stor encryption flag byte
Some(_) => true as u8, send_buf[RegisterRequestDataPositions::ID_LEN as usize] = network.net_id.len() as u8;
None => false as u8,
};
send_buf[RegisterRequestDataPositions::ID_LEN as usize] = network_id.len() as u8;
send_buf[RegisterRequestDataPositions::DATA as usize send_buf[RegisterRequestDataPositions::DATA as usize
..RegisterRequestDataPositions::DATA as usize + network_id.len()] ..RegisterRequestDataPositions::DATA as usize + network.net_id.len()]
.copy_from_slice(network_id.as_bytes()); // store network id .copy_from_slice(network.net_id.as_bytes()); // store network id
let mut iv: [u8; SALT_AND_IV_SIZE as usize] = [0; SALT_AND_IV_SIZE as usize];
let salt: [u8; SALT_AND_IV_SIZE as usize];
match salt_opt {
Some(s) => salt = s,
None => salt = [0; SALT_AND_IV_SIZE as usize],
}
match encryption_key {
Some(encryption_key) => {
let mut rng = rand::rng();
rng.fill_bytes(&mut iv);
public_sock_addr =
shared::crypto::encrypt(&encryption_key, &iv, public_sock_addr.as_slice()).unwrap();
}
None => {
iv = [0; SALT_AND_IV_SIZE as usize];
}
};
send_buf[RegisterRequestDataPositions::IV as usize send_buf[RegisterRequestDataPositions::IV as usize
..RegisterRequestDataPositions::IV as usize + SALT_AND_IV_SIZE as usize] ..RegisterRequestDataPositions::IV as usize + SALT_AND_IV_SIZE as usize]
.copy_from_slice(&iv); // copy iv ad salt do the request .copy_from_slice(&iv); // copy iv ad salt do the request
send_buf[RegisterRequestDataPositions::SALT as usize send_buf[RegisterRequestDataPositions::SALT as usize
..RegisterRequestDataPositions::SALT as usize + SALT_AND_IV_SIZE as usize] ..RegisterRequestDataPositions::SALT as usize + SALT_AND_IV_SIZE as usize]
.copy_from_slice(&salt); .copy_from_slice(&network.salt);
send_buf[RegisterRequestDataPositions::SOCKADDR_LEN as usize] = public_sock_addr.len() as u8; send_buf[RegisterRequestDataPositions::SOCKADDR_LEN as usize] = public_sock_addr.len() as u8;
send_buf[RegisterRequestDataPositions::DATA as usize + network_id.len() send_buf[RegisterRequestDataPositions::DATA as usize + network.net_id.len()
..RegisterRequestDataPositions::DATA as usize + network_id.len() + public_sock_addr.len()] ..RegisterRequestDataPositions::DATA as usize
+ network.net_id.len()
+ public_sock_addr.len()]
.copy_from_slice(&public_sock_addr); .copy_from_slice(&public_sock_addr);
match send_and_recv_with_retry(buf, &send_buf, dst, socket, STANDARD_RETRY_MAX) { match send_and_recv_with_retry(buf, &send_buf, dst, socket, STANDARD_RETRY_MAX) {
Ok((data_lenght, _)) => return Ok(data_lenght), Ok((data_lenght, _)) => return Ok((iv, data_lenght)),
Err(e) => return Err(e), Err(e) => return Err(e),
} }
} }
fn get_request( pub fn get_request(
buf: &mut [u8; BUFFER_SIZE], buf: &mut [u8; BUFFER_SIZE],
dst: &SocketAddr, dst: &SocketAddr,
socket: UdpSocket, socket: UdpSocket,
@ -291,3 +271,44 @@ fn get_request(
return Ok(types::Network::new(encrypted, key, network_id, salt, peers)); return Ok(types::Network::new(encrypted, key, network_id, salt, peers));
} }
pub fn send_heartbeat(
buf: &mut [u8; BUFFER_SIZE],
dst: &SocketAddr,
socket: UdpSocket,
network: &types::Network,
my_public_sock_addr: &Box<[u8]>,
iv: &[u8; SALT_AND_IV_SIZE as usize],
) -> Result<usize, ServerErrorResponses> {
let mut send_buf: Box<[u8]> = vec![
0u8;
HeartBeatRequestDataPositions::IV as usize
+ SALT_AND_IV_SIZE as usize
+ my_public_sock_addr.len()
]
.into_boxed_slice();
send_buf[0] = ServerMethods::HEARTBEAT as u8;
send_buf[HeartBeatRequestDataPositions::ID_LEN as usize] = network.net_id.len() as u8;
send_buf[HeartBeatRequestDataPositions::SOCKADDR_LEN as usize] =
my_public_sock_addr.len() as u8;
send_buf[HeartBeatRequestDataPositions::IV as usize
..HeartBeatRequestDataPositions::IV as usize + SALT_AND_IV_SIZE as usize]
.copy_from_slice(iv);
send_buf[HeartBeatRequestDataPositions::DATA as usize
..HeartBeatRequestDataPositions::DATA as usize + network.net_id.len()]
.copy_from_slice(network.net_id.as_bytes());
send_buf[HeartBeatRequestDataPositions::DATA as usize + network.net_id.len()
..HeartBeatRequestDataPositions::DATA as usize
+ network.net_id.len()
+ my_public_sock_addr.len()]
.copy_from_slice(&my_public_sock_addr);
match send_and_recv_with_retry(buf, &send_buf, dst, socket, STANDARD_RETRY_MAX) {
Ok((data_lenght, _)) => return Ok(data_lenght),
Err(e) => return Err(e),
}
}