You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

160 lines
4.8 KiB

// 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,
},
}
}