mirror of
https://github.com/edera-dev/krata.git
synced 2025-08-05 06:01:32 +00:00
chore: make idm magic value three bytes
This commit is contained in:
@ -22,6 +22,9 @@ use tokio::{
|
|||||||
task::JoinHandle,
|
task::JoinHandle,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const IDM_TX_QUEUE_LEN: usize = 100;
|
||||||
|
const IDM_SNOOP_QUEUE_LEN: usize = 100;
|
||||||
|
|
||||||
type BackendFeedMap = Arc<Mutex<HashMap<u32, Sender<IdmPacket>>>>;
|
type BackendFeedMap = Arc<Mutex<HashMap<u32, Sender<IdmPacket>>>>;
|
||||||
type ClientMap = Arc<Mutex<HashMap<u32, IdmClient>>>;
|
type ClientMap = Arc<Mutex<HashMap<u32, IdmClient>>>;
|
||||||
|
|
||||||
@ -74,8 +77,8 @@ impl DaemonIdm {
|
|||||||
pub async fn new() -> Result<DaemonIdm> {
|
pub async fn new() -> Result<DaemonIdm> {
|
||||||
let (service, tx_raw_sender, rx_receiver) =
|
let (service, tx_raw_sender, rx_receiver) =
|
||||||
ChannelService::new("krata-channel".to_string(), None).await?;
|
ChannelService::new("krata-channel".to_string(), None).await?;
|
||||||
let (tx_sender, tx_receiver) = channel(100);
|
let (tx_sender, tx_receiver) = channel(IDM_TX_QUEUE_LEN);
|
||||||
let (snoop_sender, _) = broadcast::channel(100);
|
let (snoop_sender, _) = broadcast::channel(IDM_SNOOP_QUEUE_LEN);
|
||||||
let task = service.launch().await?;
|
let task = service.launch().await?;
|
||||||
let clients = Arc::new(Mutex::new(HashMap::new()));
|
let clients = Arc::new(Mutex::new(HashMap::new()));
|
||||||
let feeds = Arc::new(Mutex::new(HashMap::new()));
|
let feeds = Arc::new(Mutex::new(HashMap::new()));
|
||||||
@ -120,17 +123,17 @@ impl DaemonIdm {
|
|||||||
if let Some(data) = data {
|
if let Some(data) = data {
|
||||||
let buffer = buffers.entry(domid).or_insert_with_key(|_| BytesMut::new());
|
let buffer = buffers.entry(domid).or_insert_with_key(|_| BytesMut::new());
|
||||||
buffer.extend_from_slice(&data);
|
buffer.extend_from_slice(&data);
|
||||||
if buffer.len() < 6 {
|
if buffer.len() < 7 {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if buffer[0] != 0xff || buffer[1] != 0xff {
|
if buffer[0] != 0xff || buffer[1] != 0xfe || buffer[2] != 0xff {
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let size = (buffer[2] as u32 | (buffer[3] as u32) << 8 | (buffer[4] as u32) << 16 | (buffer[5] as u32) << 24) as usize;
|
let size = (buffer[3] as u32 | (buffer[4] as u32) << 8 | (buffer[5] as u32) << 16 | (buffer[6] as u32) << 24) as usize;
|
||||||
let needed = size + 6;
|
let needed = size + 7;
|
||||||
if buffer.len() < needed {
|
if buffer.len() < needed {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -165,14 +168,15 @@ impl DaemonIdm {
|
|||||||
x = self.tx_receiver.recv() => match x {
|
x = self.tx_receiver.recv() => match x {
|
||||||
Some((domid, packet)) => {
|
Some((domid, packet)) => {
|
||||||
let data = packet.encode_to_vec();
|
let data = packet.encode_to_vec();
|
||||||
let mut buffer = vec![0u8; 6];
|
let mut buffer = vec![0u8; 7];
|
||||||
let length = data.len() as u32;
|
let length = data.len() as u32;
|
||||||
buffer[0] = 0xff;
|
buffer[0] = 0xff;
|
||||||
buffer[1] = 0xff;
|
buffer[1] = 0xfe;
|
||||||
buffer[2] = length as u8;
|
buffer[2] = 0xff;
|
||||||
buffer[3] = (length << 8) as u8;
|
buffer[3] = length as u8;
|
||||||
buffer[4] = (length << 16) as u8;
|
buffer[4] = (length << 8) as u8;
|
||||||
buffer[5] = (length << 24) as u8;
|
buffer[5] = (length << 16) as u8;
|
||||||
|
buffer[6] = (length << 24) as u8;
|
||||||
buffer.extend_from_slice(&data);
|
buffer.extend_from_slice(&data);
|
||||||
self.tx_raw_sender.send((domid, buffer)).await?;
|
self.tx_raw_sender.send((domid, buffer)).await?;
|
||||||
let _ = self.snoop_sender.send(DaemonIdmSnoopPacket { from: 0, to: domid, packet });
|
let _ = self.snoop_sender.send(DaemonIdmSnoopPacket { from: 0, to: domid, packet });
|
||||||
|
@ -74,7 +74,11 @@ impl IdmBackend for IdmFileBackend {
|
|||||||
return Ok(IdmPacket::default());
|
return Ok(IdmPacket::default());
|
||||||
}
|
}
|
||||||
let b2 = guard.get_inner_mut().read_u8().await?;
|
let b2 = guard.get_inner_mut().read_u8().await?;
|
||||||
if b2 != 0xff {
|
if b2 != 0xfe {
|
||||||
|
return Ok(IdmPacket::default());
|
||||||
|
}
|
||||||
|
let b3 = guard.get_inner_mut().read_u8().await?;
|
||||||
|
if b3 != 0xff {
|
||||||
return Ok(IdmPacket::default());
|
return Ok(IdmPacket::default());
|
||||||
}
|
}
|
||||||
let size = guard.get_inner_mut().read_u32_le().await?;
|
let size = guard.get_inner_mut().read_u32_le().await?;
|
||||||
@ -92,7 +96,7 @@ impl IdmBackend for IdmFileBackend {
|
|||||||
async fn send(&mut self, packet: IdmPacket) -> Result<()> {
|
async fn send(&mut self, packet: IdmPacket) -> Result<()> {
|
||||||
let mut file = self.write.lock().await;
|
let mut file = self.write.lock().await;
|
||||||
let data = packet.encode_to_vec();
|
let data = packet.encode_to_vec();
|
||||||
file.write_all(&[0xff, 0xff]).await?;
|
file.write_all(&[0xff, 0xfe, 0xff]).await?;
|
||||||
file.write_u32_le(data.len() as u32).await?;
|
file.write_u32_le(data.len() as u32).await?;
|
||||||
file.write_all(&data).await?;
|
file.write_all(&data).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
Reference in New Issue
Block a user