aboutsummaryrefslogtreecommitdiff
path: root/seaweedfs-rdma-sidecar/pkg/ipc/messages.go
diff options
context:
space:
mode:
Diffstat (limited to 'seaweedfs-rdma-sidecar/pkg/ipc/messages.go')
-rw-r--r--seaweedfs-rdma-sidecar/pkg/ipc/messages.go160
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,
+ },
+ }
+}