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