NOC: Send an ACK up-front since NOC operations take longer time

Ack the other end while we are processing stuff, so it doesn't bombard us
with retransmissions
This commit is contained in:
Kedar Sovani 2023-04-01 21:27:37 +08:00
parent f5837b4320
commit 0e172f073a
6 changed files with 36 additions and 12 deletions

View file

@ -30,7 +30,7 @@ use crate::interaction_model::messages::ib;
use crate::tlv::{FromTLV, OctetStr, TLVElement, TLVWriter, TagType, ToTLV, UtfStr}; use crate::tlv::{FromTLV, OctetStr, TLVElement, TLVWriter, TagType, ToTLV, UtfStr};
use crate::transport::session::SessionMode; use crate::transport::session::SessionMode;
use crate::utils::writebuf::WriteBuf; use crate::utils::writebuf::WriteBuf;
use crate::{cmd_enter, error::*}; use crate::{cmd_enter, error::*, secure_channel};
use log::{error, info}; use log::{error, info};
use num_derive::FromPrimitive; use num_derive::FromPrimitive;
@ -177,6 +177,15 @@ impl NocCluster {
return Err(NocStatus::InsufficientPrivlege); return Err(NocStatus::InsufficientPrivlege);
} }
// This command's processing may take longer, send a stand alone ACK to the peer to avoid any retranmissions
let ack_send = secure_channel::common::send_mrp_standalone_ack(
cmd_req.trans.exch,
cmd_req.trans.session,
);
if ack_send.is_err() {
error!("Error sending Standalone ACK, falling back to piggybacked ACK");
}
let r = AddNocReq::from_tlv(&cmd_req.data).map_err(|_| NocStatus::InvalidNOC)?; let r = AddNocReq::from_tlv(&cmd_req.data).map_err(|_| NocStatus::InvalidNOC)?;
let noc_value = Cert::new(r.noc_value.0).map_err(|_| NocStatus::InvalidNOC)?; let noc_value = Cert::new(r.noc_value.0).map_err(|_| NocStatus::InvalidNOC)?;
@ -188,7 +197,6 @@ impl NocCluster {
} else { } else {
None None
}; };
let fabric = Fabric::new( let fabric = Fabric::new(
noc_data.key_pair, noc_data.key_pair,
noc_data.root_ca, noc_data.root_ca,

View file

@ -37,11 +37,11 @@ macro_rules! cmd_enter {
}}; }};
} }
pub struct CommandReq<'a, 'b, 'c, 'd> { pub struct CommandReq<'a, 'b, 'c, 'd, 'e> {
pub cmd: ib::CmdPath, pub cmd: ib::CmdPath,
pub data: TLVElement<'a>, pub data: TLVElement<'a>,
pub resp: &'a mut TLVWriter<'b, 'c>, pub resp: &'a mut TLVWriter<'b, 'c>,
pub trans: &'a mut Transaction<'d>, pub trans: &'a mut Transaction<'d, 'e>,
} }
impl InteractionModel { impl InteractionModel {

View file

@ -25,7 +25,7 @@ use crate::{
exchange::Exchange, exchange::Exchange,
packet::Packet, packet::Packet,
proto_demux::{self, ProtoCtx, ResponseRequired}, proto_demux::{self, ProtoCtx, ResponseRequired},
session::Session, session::SessionHandle,
}, },
}; };
use colored::Colorize; use colored::Colorize;
@ -59,8 +59,8 @@ pub enum OpCode {
TimedRequest = 10, TimedRequest = 10,
} }
impl<'a> Transaction<'a> { impl<'a, 'b> Transaction<'a, 'b> {
pub fn new(session: &'a mut Session, exch: &'a mut Exchange) -> Self { pub fn new(session: &'a mut SessionHandle<'b>, exch: &'a mut Exchange) -> Self {
Self { Self {
state: TransactionState::Ongoing, state: TransactionState::Ongoing,
session, session,

View file

@ -18,7 +18,7 @@
use crate::{ use crate::{
error::Error, error::Error,
tlv::TLVWriter, tlv::TLVWriter,
transport::{exchange::Exchange, proto_demux::ResponseRequired, session::Session}, transport::{exchange::Exchange, proto_demux::ResponseRequired, session::SessionHandle},
}; };
use self::{ use self::{
@ -32,9 +32,9 @@ pub enum TransactionState {
Complete, Complete,
Terminate, Terminate,
} }
pub struct Transaction<'a> { pub struct Transaction<'a, 'b> {
pub state: TransactionState, pub state: TransactionState,
pub session: &'a mut Session, pub session: &'a mut SessionHandle<'b>,
pub exch: &'a mut Exchange, pub exch: &'a mut Exchange,
} }

View file

@ -15,9 +15,18 @@
* limitations under the License. * limitations under the License.
*/ */
use boxslab::Slab;
use log::info;
use num_derive::FromPrimitive; use num_derive::FromPrimitive;
use crate::{error::Error, transport::packet::Packet}; use crate::{
error::Error,
transport::{
exchange::Exchange,
packet::{Packet, PacketPool},
session::SessionHandle,
},
};
use super::status_report::{create_status_report, GeneralCode}; use super::status_report::{create_status_report, GeneralCode};
@ -83,3 +92,10 @@ pub fn create_mrp_standalone_ack(proto_tx: &mut Packet) {
proto_tx.set_proto_opcode(OpCode::MRPStandAloneAck as u8); proto_tx.set_proto_opcode(OpCode::MRPStandAloneAck as u8);
proto_tx.unset_reliable(); proto_tx.unset_reliable();
} }
pub fn send_mrp_standalone_ack(exch: &mut Exchange, sess: &mut SessionHandle) -> Result<(), Error> {
info!("Sending standalone ACK");
let mut ack_packet = Slab::<PacketPool>::try_new(Packet::new_tx()?).ok_or(Error::NoMemory)?;
create_mrp_standalone_ack(&mut ack_packet);
exch.send(ack_packet, sess)
}

View file

@ -175,7 +175,7 @@ impl Exchange {
} }
} }
fn send( pub fn send(
&mut self, &mut self,
mut proto_tx: BoxSlab<PacketPool>, mut proto_tx: BoxSlab<PacketPool>,
session: &mut SessionHandle, session: &mut SessionHandle,