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