diff options
Diffstat (limited to 'seaweedfs-rdma-sidecar/pkg/ipc/messages.go')
| -rw-r--r-- | seaweedfs-rdma-sidecar/pkg/ipc/messages.go | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/seaweedfs-rdma-sidecar/pkg/ipc/messages.go b/seaweedfs-rdma-sidecar/pkg/ipc/messages.go new file mode 100644 index 000000000..4293ac396 --- /dev/null +++ b/seaweedfs-rdma-sidecar/pkg/ipc/messages.go @@ -0,0 +1,160 @@ +// Package ipc provides communication between Go sidecar and Rust RDMA engine +package ipc + +import "time" + +// IpcMessage represents the tagged union of all IPC messages +// This matches the Rust enum: #[serde(tag = "type", content = "data")] +type IpcMessage struct { + Type string `msgpack:"type"` + Data interface{} `msgpack:"data"` +} + +// Request message types +const ( + MsgStartRead = "StartRead" + MsgCompleteRead = "CompleteRead" + MsgGetCapabilities = "GetCapabilities" + MsgPing = "Ping" +) + +// Response message types +const ( + MsgStartReadResponse = "StartReadResponse" + MsgCompleteReadResponse = "CompleteReadResponse" + MsgGetCapabilitiesResponse = "GetCapabilitiesResponse" + MsgPong = "Pong" + MsgError = "Error" +) + +// StartReadRequest corresponds to Rust StartReadRequest +type StartReadRequest struct { + VolumeID uint32 `msgpack:"volume_id"` + NeedleID uint64 `msgpack:"needle_id"` + Cookie uint32 `msgpack:"cookie"` + Offset uint64 `msgpack:"offset"` + Size uint64 `msgpack:"size"` + RemoteAddr uint64 `msgpack:"remote_addr"` + RemoteKey uint32 `msgpack:"remote_key"` + TimeoutSecs uint64 `msgpack:"timeout_secs"` + AuthToken *string `msgpack:"auth_token,omitempty"` +} + +// StartReadResponse corresponds to Rust StartReadResponse +type StartReadResponse struct { + SessionID string `msgpack:"session_id"` + LocalAddr uint64 `msgpack:"local_addr"` + LocalKey uint32 `msgpack:"local_key"` + TransferSize uint64 `msgpack:"transfer_size"` + ExpectedCrc uint32 `msgpack:"expected_crc"` + ExpiresAtNs uint64 `msgpack:"expires_at_ns"` +} + +// CompleteReadRequest corresponds to Rust CompleteReadRequest +type CompleteReadRequest struct { + SessionID string `msgpack:"session_id"` + Success bool `msgpack:"success"` + BytesTransferred uint64 `msgpack:"bytes_transferred"` + ClientCrc *uint32 `msgpack:"client_crc,omitempty"` + ErrorMessage *string `msgpack:"error_message,omitempty"` +} + +// CompleteReadResponse corresponds to Rust CompleteReadResponse +type CompleteReadResponse struct { + Success bool `msgpack:"success"` + ServerCrc *uint32 `msgpack:"server_crc,omitempty"` + Message *string `msgpack:"message,omitempty"` +} + +// GetCapabilitiesRequest corresponds to Rust GetCapabilitiesRequest +type GetCapabilitiesRequest struct { + ClientID *string `msgpack:"client_id,omitempty"` +} + +// GetCapabilitiesResponse corresponds to Rust GetCapabilitiesResponse +type GetCapabilitiesResponse struct { + DeviceName string `msgpack:"device_name"` + VendorId uint32 `msgpack:"vendor_id"` + MaxTransferSize uint64 `msgpack:"max_transfer_size"` + MaxSessions usize `msgpack:"max_sessions"` + ActiveSessions usize `msgpack:"active_sessions"` + PortGid string `msgpack:"port_gid"` + PortLid uint16 `msgpack:"port_lid"` + SupportedAuth []string `msgpack:"supported_auth"` + Version string `msgpack:"version"` + RealRdma bool `msgpack:"real_rdma"` +} + +// usize corresponds to Rust's usize type (platform dependent, but typically uint64 on 64-bit systems) +type usize uint64 + +// PingRequest corresponds to Rust PingRequest +type PingRequest struct { + TimestampNs uint64 `msgpack:"timestamp_ns"` + ClientID *string `msgpack:"client_id,omitempty"` +} + +// PongResponse corresponds to Rust PongResponse +type PongResponse struct { + ClientTimestampNs uint64 `msgpack:"client_timestamp_ns"` + ServerTimestampNs uint64 `msgpack:"server_timestamp_ns"` + ServerRttNs uint64 `msgpack:"server_rtt_ns"` +} + +// ErrorResponse corresponds to Rust ErrorResponse +type ErrorResponse struct { + Code string `msgpack:"code"` + Message string `msgpack:"message"` + Details *string `msgpack:"details,omitempty"` +} + +// Helper functions for creating messages +func NewStartReadMessage(req *StartReadRequest) *IpcMessage { + return &IpcMessage{ + Type: MsgStartRead, + Data: req, + } +} + +func NewCompleteReadMessage(sessionID string, success bool, bytesTransferred uint64, clientCrc *uint32, errorMessage *string) *IpcMessage { + return &IpcMessage{ + Type: MsgCompleteRead, + Data: &CompleteReadRequest{ + SessionID: sessionID, + Success: success, + BytesTransferred: bytesTransferred, + ClientCrc: clientCrc, + ErrorMessage: errorMessage, + }, + } +} + +func NewGetCapabilitiesMessage(clientID *string) *IpcMessage { + return &IpcMessage{ + Type: MsgGetCapabilities, + Data: &GetCapabilitiesRequest{ + ClientID: clientID, + }, + } +} + +func NewPingMessage(clientID *string) *IpcMessage { + return &IpcMessage{ + Type: MsgPing, + Data: &PingRequest{ + TimestampNs: uint64(time.Now().UnixNano()), + ClientID: clientID, + }, + } +} + +func NewErrorMessage(code, message string, details *string) *IpcMessage { + return &IpcMessage{ + Type: MsgError, + Data: &ErrorResponse{ + Code: code, + Message: message, + Details: details, + }, + } +} |
