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