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 } ;
56use strum:: FromRepr ;
67use zerocopy:: byteorder:: little_endian:: { U16 , U32 , U64 } ;
78use zerocopy:: { FromBytes , Immutable , IntoBytes } ;
@@ -11,15 +12,15 @@ use crate::vsock::{GuestCid, VSOCK_HOST_CID};
1112
1213bitflags ! {
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 ) ]
2425pub 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 ) ]
5758pub 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+
93116impl VsockPacketHeader {
94117 pub fn src_cid ( & self ) -> u64 {
95118 self . src_cid . get ( )
0 commit comments