Skip to content

Commit b318418

Browse files
authored
Want vsock packet dtrace probes
1 parent 4458148 commit b318418

4 files changed

Lines changed: 40 additions & 3 deletions

File tree

lib/propolis/src/hw/virtio/vsock.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use crate::vmm::MemCtx;
1919
use crate::vsock::packet::VsockPacket;
2020
use crate::vsock::packet::VsockPacketError;
2121
use crate::vsock::packet::VsockPacketHeader;
22+
use crate::vsock::probes;
2223
use crate::vsock::proxy::VsockPortMapping;
2324
use crate::vsock::GuestCid;
2425
use crate::vsock::VsockBackend;
@@ -84,6 +85,7 @@ impl RxPermit<'_> {
8485
});
8586
}
8687

88+
probes::vsock_pkt_rx!(|| header);
8789
queue.push_used(&mut chain, &mem);
8890
}
8991
}

lib/propolis/src/vsock/mod.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,13 @@ pub enum VsockError {
5555
pub trait VsockBackend: Send + Sync + 'static {
5656
fn queue_notify(&self, queue_id: u16) -> Result<(), VsockError>;
5757
}
58+
59+
#[usdt::provider(provider = "propolis")]
60+
mod probes {
61+
use crate::vsock::packet::VsockPacketHeader;
62+
63+
/// Host->Guest
64+
fn vsock_pkt_rx(hdr: &VsockPacketHeader) {}
65+
/// Guest->Host
66+
fn vsock_pkt_tx(hdr: &VsockPacketHeader) {}
67+
}

lib/propolis/src/vsock/packet.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// License, v. 2.0. If a copy of the MPL was not distributed with this
33
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
44

5+
use serde::{Serialize, Serializer};
56
use strum::FromRepr;
67
use zerocopy::byteorder::little_endian::{U16, U32, U64};
78
use zerocopy::{FromBytes, Immutable, IntoBytes};
@@ -11,15 +12,15 @@ use crate::vsock::{GuestCid, VSOCK_HOST_CID};
1112

1213
bitflags! {
1314
/// Shutdown flags for VIRTIO_VSOCK_OP_SHUTDOWN
14-
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
15+
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize)]
1516
#[repr(transparent)]
1617
pub struct VsockPacketFlags: u32 {
1718
const VIRTIO_VSOCK_SHUTDOWN_F_RECEIVE = 1 << 0;
1819
const VIRTIO_VSOCK_SHUTDOWN_F_SEND = 1 << 1;
1920
}
2021
}
2122

22-
#[derive(Debug, Clone, Copy, FromRepr, PartialEq, Eq)]
23+
#[derive(Debug, Clone, Copy, FromRepr, PartialEq, Eq, Serialize)]
2324
#[repr(u16)]
2425
pub enum VsockSocketType {
2526
Stream = 1,
@@ -52,7 +53,7 @@ pub enum VsockPacketError {
5253
InvalidDstCid { dst_cid: u64 },
5354
}
5455

55-
#[derive(Clone, Copy, Debug, FromRepr, Eq, PartialEq)]
56+
#[derive(Clone, Copy, Debug, FromRepr, Eq, PartialEq, Serialize)]
5657
#[repr(u16)]
5758
pub enum VsockPacketOp {
5859
Request = 1,
@@ -90,6 +91,28 @@ pub struct VsockPacketHeader {
9091
fwd_cnt: U32,
9192
}
9293

94+
// NB: This implementation is here to support dtrace usdt probes.
95+
impl Serialize for VsockPacketHeader {
96+
fn serialize<S: Serializer>(
97+
&self,
98+
serializer: S,
99+
) -> Result<S::Ok, S::Error> {
100+
use serde::ser::SerializeStruct;
101+
let mut s = serializer.serialize_struct("VsockPacketHeader", 10)?;
102+
s.serialize_field("src_cid", &self.src_cid.get())?;
103+
s.serialize_field("dst_cid", &self.dst_cid.get())?;
104+
s.serialize_field("src_port", &self.src_port.get())?;
105+
s.serialize_field("dst_port", &self.dst_port.get())?;
106+
s.serialize_field("len", &self.len.get())?;
107+
s.serialize_field("socket_type", &self.socket_type())?;
108+
s.serialize_field("op", &self.op())?;
109+
s.serialize_field("flags", &self.flags())?;
110+
s.serialize_field("buf_alloc", &self.buf_alloc.get())?;
111+
s.serialize_field("fwd_cnt", &self.fwd_cnt.get())?;
112+
s.end()
113+
}
114+
}
115+
93116
impl VsockPacketHeader {
94117
pub fn src_cid(&self) -> u64 {
95118
self.src_cid.get()

lib/propolis/src/vsock/poller.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use crate::hw::virtio::vsock::VSOCK_TX_QUEUE;
2222
use crate::vsock::packet::VsockPacket;
2323
use crate::vsock::packet::VsockPacketFlags;
2424
use crate::vsock::packet::VsockSocketType;
25+
use crate::vsock::probes;
2526
use crate::vsock::proxy::ConnKey;
2627
use crate::vsock::proxy::VsockPortMapping;
2728
use crate::vsock::proxy::VsockProxyConn;
@@ -302,6 +303,7 @@ impl VsockPoller {
302303
}
303304
};
304305

306+
probes::vsock_pkt_tx!(|| &packet.header);
305307
// If the packet is not destined for the host drop it.
306308
if packet.header.dst_cid() != VSOCK_HOST_CID {
307309
warn!(

0 commit comments

Comments
 (0)