updated TCP code

This commit is contained in:
Robin Müller 2024-04-16 09:59:31 +02:00
parent 192e701785
commit b359ff9d33
Signed by: muellerr
GPG Key ID: A649FB78196E3849
7 changed files with 80 additions and 19 deletions

8
Cargo.lock generated
View File

@ -590,7 +590,7 @@ checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
[[package]] [[package]]
name = "satrs" name = "satrs"
version = "0.2.0-rc.0" version = "0.2.0-rc.0"
source = "git+https://egit.irs.uni-stuttgart.de/rust/sat-rs.git?branch=rework-tmtc-modules#a077c32f3c977f79c9d165e8f3bff66f1d81a669" source = "git+https://egit.irs.uni-stuttgart.de/rust/sat-rs.git?branch=rework-tmtc-modules#29c0961fab78a0e192e5fc918c7e07ccf20d39a6"
dependencies = [ dependencies = [
"bus", "bus",
"cobs", "cobs",
@ -615,7 +615,7 @@ dependencies = [
[[package]] [[package]]
name = "satrs-mib" name = "satrs-mib"
version = "0.1.1" version = "0.1.1"
source = "git+https://egit.irs.uni-stuttgart.de/rust/sat-rs.git?branch=rework-tmtc-modules#a077c32f3c977f79c9d165e8f3bff66f1d81a669" source = "git+https://egit.irs.uni-stuttgart.de/rust/sat-rs.git?branch=rework-tmtc-modules#29c0961fab78a0e192e5fc918c7e07ccf20d39a6"
dependencies = [ dependencies = [
"csv", "csv",
"satrs-mib-codegen", "satrs-mib-codegen",
@ -627,7 +627,7 @@ dependencies = [
[[package]] [[package]]
name = "satrs-mib-codegen" name = "satrs-mib-codegen"
version = "0.1.1" version = "0.1.1"
source = "git+https://egit.irs.uni-stuttgart.de/rust/sat-rs.git?branch=rework-tmtc-modules#a077c32f3c977f79c9d165e8f3bff66f1d81a669" source = "git+https://egit.irs.uni-stuttgart.de/rust/sat-rs.git?branch=rework-tmtc-modules#29c0961fab78a0e192e5fc918c7e07ccf20d39a6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -637,7 +637,7 @@ dependencies = [
[[package]] [[package]]
name = "satrs-shared" name = "satrs-shared"
version = "0.1.3" version = "0.1.3"
source = "git+https://egit.irs.uni-stuttgart.de/rust/sat-rs.git?branch=rework-tmtc-modules#a077c32f3c977f79c9d165e8f3bff66f1d81a669" source = "git+https://egit.irs.uni-stuttgart.de/rust/sat-rs.git?branch=rework-tmtc-modules#29c0961fab78a0e192e5fc918c7e07ccf20d39a6"
dependencies = [ dependencies = [
"serde", "serde",
"spacepackets", "spacepackets",

View File

@ -29,3 +29,11 @@ branch = "rework-tmtc-modules"
[dev-dependencies] [dev-dependencies]
env_logger = "0.11" env_logger = "0.11"
# I don't think we need insane performance. If anything, a small binary is easier to upload
# to the satellite.
[profile.release]
strip = true
opt-level = "z" # Optimize for size.
lto = true
codegen-units = 1

View File

@ -16,6 +16,11 @@ pub const TCP_SPP_SERVER_PORT: u16 = 4096;
pub const EXPERIMENT_ID: u32 = 278; pub const EXPERIMENT_ID: u32 = 278;
pub const EXPERIMENT_APID: u16 = 1024 + EXPERIMENT_ID as u16; pub const EXPERIMENT_APID: u16 = 1024 + EXPERIMENT_ID as u16;
pub const EXPERIMENT_PACKET_ID: PacketId = PacketId::new_for_tc(true, EXPERIMENT_APID); pub const EXPERIMENT_PACKET_ID: PacketId = PacketId::new_for_tc(true, EXPERIMENT_APID);
pub const VALID_PACKET_ID_LIST: &[PacketId] = &[PacketId::new_for_tc(true, EXPERIMENT_APID)];
// TODO: Would be nice if this can be commanded as well..
/// Can be enabled to print all SPP packets received from the SPP server on port 4096.
pub const SPP_CLIENT_WIRETAPPING_RX: bool = false;
#[derive(Copy, Clone, PartialEq, Eq, Debug, TryFromPrimitive, IntoPrimitive)] #[derive(Copy, Clone, PartialEq, Eq, Debug, TryFromPrimitive, IntoPrimitive)]
#[repr(u8)] #[repr(u8)]

View File

@ -1,4 +1,36 @@
use derive_new::new;
use ops_sat_rs::config::SPP_CLIENT_WIRETAPPING_RX;
use satrs::{
encoding::ccsds::{SpValidity, SpacePacketValidator},
spacepackets::PacketId,
};
pub mod can; pub mod can;
pub mod tcp_server; pub mod tcp_server;
pub mod tcp_spp_client; pub mod tcp_spp_client;
pub mod udp_server; pub mod udp_server;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TcpComponent {
Server,
Client,
}
#[derive(new, Clone)]
pub struct SimpleSpValidator {
component: TcpComponent,
valid_ids: Vec<PacketId>,
}
impl SpacePacketValidator for SimpleSpValidator {
fn validate(&self, sp_header: &satrs::spacepackets::SpHeader, raw_buf: &[u8]) -> SpValidity {
if SPP_CLIENT_WIRETAPPING_RX && self.component == TcpComponent::Client {
log::debug!("sp header: {:?}", sp_header);
log::debug!("raw data: {:x?}", raw_buf);
}
if self.valid_ids.contains(&sp_header.packet_id) {
return SpValidity::Valid;
}
SpValidity::Ignore
}
}

View File

@ -13,6 +13,8 @@ use satrs::{
tmtc::{PacketAsVec, PacketSource}, tmtc::{PacketAsVec, PacketSource},
}; };
use super::{SimpleSpValidator, TcpComponent};
#[derive(Default, Clone)] #[derive(Default, Clone)]
pub struct SyncTcpTmSource { pub struct SyncTcpTmSource {
tm_queue: Arc<Mutex<VecDeque<Vec<u8>>>>, tm_queue: Arc<Mutex<VecDeque<Vec<u8>>>>,
@ -84,7 +86,7 @@ impl HandledConnectionHandler for ConnectionFinishedHandler {
pub type TcpServer = TcpSpacepacketsServer< pub type TcpServer = TcpSpacepacketsServer<
SyncTcpTmSource, SyncTcpTmSource,
mpsc::Sender<PacketAsVec>, mpsc::Sender<PacketAsVec>,
Vec<PacketId>, SimpleSpValidator,
ConnectionFinishedHandler, ConnectionFinishedHandler,
(), (),
GenericSendError, GenericSendError,
@ -97,14 +99,14 @@ impl TcpTask {
cfg: ServerConfig, cfg: ServerConfig,
tm_source: SyncTcpTmSource, tm_source: SyncTcpTmSource,
tc_sender: mpsc::Sender<PacketAsVec>, tc_sender: mpsc::Sender<PacketAsVec>,
packet_id_lookup: Vec<PacketId>, valid_ids: Vec<PacketId>,
stop_signal: Arc<AtomicBool>, stop_signal: Arc<AtomicBool>,
) -> Result<Self, std::io::Error> { ) -> Result<Self, std::io::Error> {
Ok(Self(TcpSpacepacketsServer::new( Ok(Self(TcpSpacepacketsServer::new(
cfg, cfg,
tm_source, tm_source,
tc_sender, tc_sender,
packet_id_lookup, SimpleSpValidator::new(TcpComponent::Server, valid_ids),
ConnectionFinishedHandler::default(), ConnectionFinishedHandler::default(),
Some(stop_signal), Some(stop_signal),
)?)) )?))
@ -113,7 +115,7 @@ impl TcpTask {
pub fn periodic_operation(&mut self) { pub fn periodic_operation(&mut self) {
let result = self let result = self
.0 .0
.handle_next_connection(Some(Duration::from_millis(STOP_CHECK_FREQUENCY))); .handle_all_connections(Some(Duration::from_millis(STOP_CHECK_FREQUENCY)));
match result { match result {
Ok(_conn_result) => (), Ok(_conn_result) => (),
Err(e) => { Err(e) => {

View File

@ -6,13 +6,16 @@ use std::time::Duration;
use mio::net::TcpStream; use mio::net::TcpStream;
use mio::{Events, Interest, Poll, Token}; use mio::{Events, Interest, Poll, Token};
use ops_sat_rs::config::tasks::STOP_CHECK_FREQUENCY; use ops_sat_rs::config::tasks::STOP_CHECK_FREQUENCY;
use ops_sat_rs::config::{EXPERIMENT_PACKET_ID, TCP_SPP_SERVER_PORT}; use ops_sat_rs::config::{SPP_CLIENT_WIRETAPPING_RX, TCP_SPP_SERVER_PORT};
use satrs::encoding::ccsds::parse_buffer_for_ccsds_space_packets; use satrs::encoding::ccsds::parse_buffer_for_ccsds_space_packets;
use satrs::queue::GenericSendError; use satrs::queue::GenericSendError;
use satrs::spacepackets::PacketId;
use satrs::tmtc::PacketAsVec; use satrs::tmtc::PacketAsVec;
use satrs::ComponentId; use satrs::ComponentId;
use thiserror::Error; use thiserror::Error;
use super::{SimpleSpValidator, TcpComponent};
#[derive(Debug, Error)] #[derive(Debug, Error)]
pub enum PacketForwardingError { pub enum PacketForwardingError {
#[error("send error: {0}")] #[error("send error: {0}")]
@ -28,10 +31,15 @@ pub struct TcpSppClient {
client: TcpStream, client: TcpStream,
read_buf: [u8; 4096], read_buf: [u8; 4096],
tc_source_tx: mpsc::Sender<PacketAsVec>, tc_source_tx: mpsc::Sender<PacketAsVec>,
validator: SimpleSpValidator,
} }
impl TcpSppClient { impl TcpSppClient {
pub fn new(id: ComponentId, tc_source_tx: mpsc::Sender<PacketAsVec>) -> io::Result<Self> { pub fn new(
id: ComponentId,
tc_source_tx: mpsc::Sender<PacketAsVec>,
valid_ids: &'static [PacketId],
) -> io::Result<Self> {
let poll = Poll::new()?; let poll = Poll::new()?;
let events = Events::with_capacity(128); let events = Events::with_capacity(128);
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 1)), TCP_SPP_SERVER_PORT); let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 1)), TCP_SPP_SERVER_PORT);
@ -48,6 +56,7 @@ impl TcpSppClient {
client, client,
read_buf: [0; 4096], read_buf: [0; 4096],
tc_source_tx, tc_source_tx,
validator: SimpleSpValidator::new(TcpComponent::Client, valid_ids.to_vec()),
}) })
} }
@ -85,10 +94,17 @@ impl TcpSppClient {
read_bytes: usize, read_bytes: usize,
) -> Result<(), PacketForwardingError> { ) -> Result<(), PacketForwardingError> {
let mut dummy = 0; let mut dummy = 0;
if SPP_CLIENT_WIRETAPPING_RX {
log::debug!(
"received {} bytes on TCP client: {:x?}",
read_bytes,
&self.read_buf[..read_bytes]
);
}
// This parser is able to deal with broken tail packets, but we ignore those for now.. // This parser is able to deal with broken tail packets, but we ignore those for now..
parse_buffer_for_ccsds_space_packets( parse_buffer_for_ccsds_space_packets(
&mut self.read_buf[..read_bytes], &mut self.read_buf[..read_bytes],
&[EXPERIMENT_PACKET_ID].as_slice(), &self.validator,
self.id, self.id,
&self.tc_source_tx, &self.tc_source_tx,
&mut dummy, &mut dummy,

View File

@ -9,13 +9,10 @@ use log::info;
use ops_sat_rs::config::{ use ops_sat_rs::config::{
components::{CONTROLLER_ID, TCP_SERVER, TCP_SPP_CLIENT, UDP_SERVER}, components::{CONTROLLER_ID, TCP_SERVER, TCP_SPP_CLIENT, UDP_SERVER},
tasks::{FREQ_MS_CTRL, FREQ_MS_PUS_STACK}, tasks::{FREQ_MS_CTRL, FREQ_MS_PUS_STACK},
EXPERIMENT_APID, VALID_PACKET_ID_LIST,
}; };
use ops_sat_rs::config::{tasks::FREQ_MS_UDP_TMTC, OBSW_SERVER_ADDR, SERVER_PORT}; use ops_sat_rs::config::{tasks::FREQ_MS_UDP_TMTC, OBSW_SERVER_ADDR, SERVER_PORT};
use satrs::{ use satrs::hal::std::{tcp_server::ServerConfig, udp_server::UdpTcServer};
hal::std::{tcp_server::ServerConfig, udp_server::UdpTcServer},
spacepackets::PacketId,
};
use crate::tmtc::tc_source::TcSourceTaskDynamic; use crate::tmtc::tc_source::TcSourceTaskDynamic;
use crate::tmtc::tm_sink::TmFunnelDynamic; use crate::tmtc::tm_sink::TmFunnelDynamic;
@ -147,7 +144,7 @@ fn main() {
tcp_server_cfg, tcp_server_cfg,
sync_tm_tcp_source.clone(), sync_tm_tcp_source.clone(),
tc_source_tx.clone(), tc_source_tx.clone(),
vec![PacketId::new_for_tc(true, EXPERIMENT_APID)], VALID_PACKET_ID_LIST.to_vec(),
stop_signal.clone(), stop_signal.clone(),
) )
.expect("tcp server creation failed"); .expect("tcp server creation failed");
@ -165,7 +162,8 @@ fn main() {
stop_signal.clone(), stop_signal.clone(),
); );
let mut tcp_spp_client = TcpSppClient::new(TCP_SPP_CLIENT.id(), tc_source_tx) let mut tcp_spp_client =
TcpSppClient::new(TCP_SPP_CLIENT.id(), tc_source_tx, VALID_PACKET_ID_LIST)
.expect("creating TCP SPP client failed"); .expect("creating TCP SPP client failed");
info!("Starting CTRL task"); info!("Starting CTRL task");