134 lines
4.1 KiB
C
134 lines
4.1 KiB
C
#ifndef OPEN_RDMASOCKET_H_
|
|
#define OPEN_RDMASOCKET_H_
|
|
|
|
#include <common/toolkit/SocketTk.h>
|
|
#include <common/toolkit/StringTk.h>
|
|
#include <common/toolkit/Time.h>
|
|
#include <common/Common.h>
|
|
#include <common/net/sock/ibv/IBVSocket.h>
|
|
#include <common/net/sock/PooledSocket.h>
|
|
#include <common/net/sock/NicAddressStats.h>
|
|
#include <app/config/Config.h>
|
|
|
|
struct ib_device;
|
|
struct ib_mr;
|
|
struct RDMASocket;
|
|
typedef struct RDMASocket RDMASocket;
|
|
struct NicAddressStats;
|
|
typedef struct NicAddressStats NicAddressStats;
|
|
|
|
|
|
extern __must_check bool RDMASocket_init(RDMASocket* this, struct in_addr srcIpAddr, NicAddressStats* nicStats);
|
|
extern RDMASocket* RDMASocket_construct(struct in_addr srcIpAddr, NicAddressStats* nicStats);
|
|
extern void _RDMASocket_uninit(Socket* this);
|
|
|
|
extern bool RDMASocket_rdmaDevicesExist(void);
|
|
|
|
extern bool _RDMASocket_connectByIP(Socket* this, struct in_addr ipaddress,
|
|
unsigned short port);
|
|
extern bool _RDMASocket_bindToAddr(Socket* this, struct in_addr ipaddress,
|
|
unsigned short port);
|
|
extern bool _RDMASocket_listen(Socket* this);
|
|
extern bool _RDMASocket_shutdown(Socket* this);
|
|
extern bool _RDMASocket_shutdownAndRecvDisconnect(Socket* this, int timeoutMS);
|
|
|
|
extern ssize_t _RDMASocket_recvT(Socket* this, struct iov_iter* iter, int flags,
|
|
int timeoutMS);
|
|
extern ssize_t _RDMASocket_sendto(Socket* this, struct iov_iter* iter, int flags,
|
|
fhgfs_sockaddr_in *to);
|
|
|
|
extern unsigned long RDMASocket_poll(RDMASocket* this, short events, bool finishPoll);
|
|
|
|
// inliners
|
|
static inline struct ib_device* RDMASocket_getDevice(RDMASocket* this);
|
|
static inline unsigned RDMASocket_getRkey(RDMASocket* this);
|
|
static inline bool RDMASocket_isRkeyGlobal(RDMASocket* this);
|
|
|
|
static inline void RDMASocket_setBuffers(RDMASocket* this, unsigned bufNum, unsigned bufSize,
|
|
unsigned fragmentSize, RDMAKeyType keyType);
|
|
static inline void RDMASocket_setTimeouts(RDMASocket* this, int connectMS,
|
|
int completionMS, int flowSendMS, int flowRecvMS, int pollMS);
|
|
static inline void RDMASocket_setTypeOfService(RDMASocket* this, int typeOfService);
|
|
static inline void RDMASocket_setConnectionFailureStatus(RDMASocket* this, unsigned value);
|
|
static inline bool RDMASocket_registerMr(RDMASocket* this, struct ib_mr* mr, int access);
|
|
static inline IBVSocketKeyType RDMASocket_toIBVSocketKeyType(RDMAKeyType keyType);
|
|
|
|
struct RDMASocket
|
|
{
|
|
PooledSocket pooledSocket;
|
|
|
|
IBVSocket ibvsock;
|
|
|
|
IBVCommConfig commCfg;
|
|
};
|
|
|
|
unsigned RDMASocket_getRkey(RDMASocket *this)
|
|
{
|
|
return IBVSocket_getRkey(&this->ibvsock);
|
|
}
|
|
|
|
bool RDMASocket_isRkeyGlobal(RDMASocket* this)
|
|
{
|
|
return this->commCfg.keyType != IBVSOCKETKEYTYPE_Register;
|
|
}
|
|
|
|
struct ib_device* RDMASocket_getDevice(RDMASocket *this)
|
|
{
|
|
return IBVSocket_getDevice(&this->ibvsock);
|
|
}
|
|
|
|
IBVSocketKeyType RDMASocket_toIBVSocketKeyType(RDMAKeyType keyType)
|
|
{
|
|
switch (keyType)
|
|
{
|
|
case RDMAKEYTYPE_UnsafeDMA:
|
|
return IBVSOCKETKEYTYPE_UnsafeDMA;
|
|
case RDMAKEYTYPE_Register:
|
|
return IBVSOCKETKEYTYPE_Register;
|
|
default:
|
|
return IBVSOCKETKEYTYPE_UnsafeGlobal;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Note: Only has an effect for unconnected sockets.
|
|
*/
|
|
void RDMASocket_setBuffers(RDMASocket* this, unsigned bufNum, unsigned bufSize,
|
|
unsigned fragmentSize, RDMAKeyType keyType)
|
|
{
|
|
this->commCfg.bufNum = bufNum;
|
|
this->commCfg.bufSize = bufSize;
|
|
this->commCfg.fragmentSize = fragmentSize;
|
|
this->commCfg.keyType = RDMASocket_toIBVSocketKeyType(keyType);
|
|
}
|
|
|
|
void RDMASocket_setTimeouts(RDMASocket* this, int connectMS,
|
|
int completionMS, int flowSendMS, int flowRecvMS, int pollMS)
|
|
{
|
|
IBVSocket_setTimeouts(&this->ibvsock, connectMS, completionMS, flowSendMS,
|
|
flowRecvMS, pollMS);
|
|
}
|
|
|
|
/**
|
|
* Note: Only has an effect for unconnected sockets.
|
|
*/
|
|
void RDMASocket_setTypeOfService(RDMASocket* this, int typeOfService)
|
|
{
|
|
IBVSocket_setTypeOfService(&this->ibvsock, typeOfService);
|
|
}
|
|
|
|
/**
|
|
* Note: Only has an effect for unconnected sockets.
|
|
*/
|
|
void RDMASocket_setConnectionFailureStatus(RDMASocket* this, unsigned value)
|
|
{
|
|
IBVSocket_setConnectionFailureStatus(&this->ibvsock, value);
|
|
}
|
|
|
|
bool RDMASocket_registerMr(RDMASocket* this, struct ib_mr* mr, int access)
|
|
{
|
|
return !IBVSocket_registerMr(&this->ibvsock, mr, access);
|
|
}
|
|
|
|
#endif /*OPEN_RDMASOCKET_H_*/
|