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