Skip to main content

NetworkEngine

Struct NetworkEngine 

Source
pub struct NetworkEngine { /* private fields */ }
Expand description

The guest-visible network state of one record or replay run.

Implementations§

Source§

impl NetworkEngine

Source

pub fn new_record(epoch: DateTime<Utc>) -> Self

Start recording; epoch is the run’s configured epoch.

Source

pub fn new_replay(trace: NetworkTraceV2) -> Self

Replay trace, which must already have passed validation.

Source

pub fn is_record(&self) -> bool

Source

pub fn is_channel(&self, id: OpenFileId) -> bool

Whether the guest connected id as a network channel.

Source

pub fn record_connect( &mut self, id: OpenFileId, peer: NetworkAddressV1, local: Option<NetworkAddressV1>, errno: i32, nonblocking: bool, ) -> Result<i32, NetworkEngineError>

Record a connect the runtime performed on the host. errno is 0 on success, and local is the host-assigned local address.

Source

pub fn replay_connect( &mut self, id: OpenFileId, peer: &NetworkAddressV1, nonblocking: bool, ) -> Result<i32, NetworkEngineError>

Replay the recorded connect of id, which must target the recorded peer.

Source

pub fn addresses( &self, id: OpenFileId, ) -> Option<(Option<&NetworkAddressV1>, &NetworkAddressV1)>

The local and peer addresses of a connected channel, for getsockname and getpeername.

Source

pub fn needs_pull(&self, id: OpenFileId) -> bool

Whether the recorder should pull more input for id from the host.

Source

pub fn record_arrival( &mut self, id: OpenFileId, now: LogicalTime, arrival: NetworkArrival, ) -> Result<(), NetworkEngineError>

Record what the runtime pulled from the host for id at global time now, and make it visible to the guest at once.

Source

pub fn recv( &mut self, id: OpenFileId, now: LogicalTime, max_len: usize, target: usize, peek: bool, ) -> Result<NetworkRecvOutcome, NetworkEngineError>

A guest receive of at most max_len bytes at global time now.

target is the byte count that completes a blocking receive: min(SO_RCVLOWAT, max_len), or max_len under MSG_WAITALL. A nonblocking receive, or one whose timeout expired, passes 1. With peek the bytes stay queued.

Source

pub fn readiness( &mut self, id: OpenFileId, now: LogicalTime, lowat: usize, ) -> Result<i16, NetworkEngineError>

The poll events id reports at global time now, before masking with the requested events. Mirrors Linux tcp_poll; lowat is the socket’s SO_RCVLOWAT, which the guest may set before it connects.

Source

pub fn take_error( &mut self, id: OpenFileId, now: LogicalTime, ) -> Result<i32, NetworkEngineError>

Consume and return the pending socket error at global time now, as SO_ERROR does; 0 when there is none. Inputs due by now are released first, so the first observer of a recorded error sees it whichever operation it uses.

Source

pub fn send_failure( &mut self, id: OpenFileId, now: LogicalTime, ) -> Result<Option<i32>, NetworkEngineError>

The errno a guest send at global time now fails with before transmitting anything, or None when the send may proceed. Inputs due by now are released first. A pending error is consumed first; otherwise a socket shut down for writing fails with EPIPE.

Source

pub fn record_send( &mut self, id: OpenFileId, sent: &[u8], at: Option<SendMark>, now: LogicalTime, waits: u64, ) -> Result<SendMark, NetworkEngineError>

Record the bytes a host send accepted at now and return where they left the stream. Empty sent records nothing and returns the current mark, which a blocking send takes before its first wait. at is the mark of a send that then waited for buffer space; any output event on the channel in the meantime, accepted or refused, is refused, because replay would order the two the other way. waits counts the send’s waits since it started or since its previous accepted chunk; when it is nonzero the fragment records that count and now, so that replay accepts it only after waiting as long.

Source

pub fn record_refused_send( &mut self, id: OpenFileId, ) -> Result<(), NetworkEngineError>

Record a nonblocking send that the host refused with EAGAIN, as an empty fragment at the current stream offset.

Source

pub fn replay_send( &mut self, id: OpenFileId, bytes: &[u8], nonblocking: bool, now: LogicalTime, waits: u64, ) -> Result<ReplaySendOutcome, NetworkEngineError>

Match a guest send at now against the recording and return how many bytes it transmits: the bytes left in the current recorded fragment, at most bytes.len(). A recorded short write therefore replays as the same short write. ReplaySendOutcome::WouldBlock is a nonblocking send that the recording refused with EAGAIN; a blocking send at that point diverged.

A fragment that the recording accepted only after its send waited is due once this send has waited waits times as many and now has reached the recorded acceptance time; before that the send gets ReplaySendOutcome::NotYet and waits again. The check and the consumption happen in this one call, so nothing can run between them.

Source

pub fn shutdown( &mut self, id: OpenFileId, how: i32, ) -> Result<i32, NetworkEngineError>

Apply shutdown(how); returns 0 or the errno the guest sees.

Source

pub fn apply( &mut self, now: LogicalTime, request: NetworkRequest, ) -> Result<NetworkReply, NetworkEngineError>

Perform request at global time now.

Source

pub fn finish_replay(self) -> Result<(), NetworkEngineError>

End a replay: fail if the guest left part of the recording unused, by never connecting a recorded socket, by sending fewer bytes than the recording holds, or by never making a recorded refused send. Inputs the guest never read are not checked: when an input is released depends on the schedule, so a replay may end before a final input the recording happened to observe.

Source

pub fn finish(self) -> Result<NetworkTraceV2, NetworkEngineError>

The trace of a record run. Fails if the run was a replay or the recording does not validate.

Trait Implementations§

Source§

impl Debug for NetworkEngine

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more