mirror of
https://github.com/hermitcore/libhermit.git
synced 2025-03-16 00:00:06 +01:00
417 lines
12 KiB
C
Executable file
417 lines
12 KiB
C
Executable file
/*
|
|
* Copyright (c) 2011 Mellanox Technologies Ltd. All rights reserved.
|
|
*
|
|
* This software is available to you under a choice of one of two
|
|
* licenses. You may choose to be licensed under the terms of the GNU
|
|
* General Public License (GPL) Version 2, available from the file
|
|
* COPYING in the main directory of this source tree, or the
|
|
* OpenIB.org BSD license below:
|
|
*
|
|
* Redistribution and use in source and binary forms, with or
|
|
* without modification, are permitted provided that the following
|
|
* conditions are met:
|
|
*
|
|
* - Redistributions of source code must retain the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer.
|
|
*
|
|
* - Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer in the documentation and/or other materials
|
|
* provided with the distribution.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*
|
|
* Author: Ido Shamay <idos@dev.mellanox.co.il>
|
|
*
|
|
* Description : ...
|
|
*
|
|
* Methods : ...
|
|
*/
|
|
|
|
#ifndef PERFTEST_COMMUNICATION_WRITE_BW_H
|
|
#define PERFTEST_COMMUNICATION_WRITE_BW_H
|
|
|
|
#include <netinet/in.h>
|
|
|
|
#include <hermit/ibv.h>
|
|
#include <hermit/verbs.h>
|
|
|
|
#include "perftest_resources_write_bw.h"
|
|
|
|
/* Macro for 64 bit variables to switch to/from net */
|
|
#if __BYTE_ORDER == __BIG_ENDIAN || __BYTE_ORDER == __LITTLE_ENDIAN
|
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
|
#define ntoh_64(x) (x)
|
|
#define hton_64(x) (x)
|
|
#define ntoh_double(x) (x)
|
|
#define hton_double(x) (x)
|
|
#else
|
|
#define ntoh_64(x) bswap_64(x)
|
|
#define hton_64(x) bswap_64(x)
|
|
#define ntoh_double(x) bswap_double(x)
|
|
#define hton_double(x) bswap_double(x)
|
|
#endif
|
|
#else
|
|
#error "Only BIG_ENDIAN and LITTLE_ENDIAN are supported."
|
|
#endif
|
|
|
|
/* long is 64-bit in LP64 mode, 32-bit in LLP64 mode. */
|
|
#if defined(_LP64) || defined(__LP64__)
|
|
#define ntoh_long(x) ntoh_64(x)
|
|
#define hton_long(x) hton_64(x)
|
|
#else
|
|
#define ntoh_long(x) ntohl(x)
|
|
#define hton_long(x) htonl(x)
|
|
#endif
|
|
|
|
/* int is 32-bit in both LP64 and LLP64 modes. */
|
|
#define ntoh_int(x) (int) ntohl((uint32_t) (x))
|
|
#define hton_int(x) (int) htonl((uint32_t) (x))
|
|
|
|
#define KEY_MSG_SIZE (59) /* Message size without gid. */
|
|
#define KEY_MSG_SIZE_GID (108) /* Message size with gid (MGID as well). */
|
|
#define SYNC_SPEC_ID (5)
|
|
|
|
/* The Format of the message we pass through sockets , without passing Gid. */
|
|
#define KEY_PRINT_FMT "%04x:%04x:%06x:%06x:%08x:%016Lx:%08x"
|
|
|
|
/* The Format of the message we pass through sockets (With Gid). */
|
|
#define KEY_PRINT_FMT_GID "%04x:%04x:%06x:%06x:%08x:%016Lx:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%08x:"
|
|
|
|
/* The Basic print format for all verbs. */
|
|
#define BASIC_ADDR_FMT " %s address: LID %#04x QPN %#06x PSN %#06x"
|
|
|
|
/* Addition format string for READ - the outstanding reads. */
|
|
#define READ_FMT " OUT %#04x"
|
|
|
|
/* The print format of the pingpong_dest element for RDMA verbs. */
|
|
#define RDMA_FMT " RKey %#08x VAddr %#016Lx"
|
|
|
|
/* The print number of SRQ in case of XRC */
|
|
#define XRC_FMT " SRQn %#08x"
|
|
#define DC_FMT " SRQn %#08x"
|
|
|
|
/* The print format of a global address or a multicast address. */
|
|
#define PERF_GID_FMT " %s: %02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d\n"
|
|
|
|
/* The print format of a global address or a multicast address. */
|
|
#define PERF_RAW_MGID_FMT " %s: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n"
|
|
|
|
struct perftest_comm {
|
|
struct pingpong_context *rdma_ctx;
|
|
struct perftest_parameters *rdma_params;
|
|
};
|
|
|
|
/* bswap_double
|
|
*
|
|
* Description : swap byte order for double.
|
|
*
|
|
* Parameters :
|
|
* x - input double variable
|
|
*
|
|
* Return Value : double after byte order being swapped.
|
|
*/
|
|
double bswap_double(double x);
|
|
|
|
|
|
/* create_comm_struct
|
|
*
|
|
* Description : Creating the communication struct for Etherent.
|
|
*
|
|
* Parameters :
|
|
* comm - An empty Communication struct.
|
|
* user_param - Perftest parameters.
|
|
*
|
|
* Return Value : SUCCESS,FAILURE.
|
|
*/
|
|
int create_comm_struct (struct perftest_comm *comm,
|
|
struct perftest_parameters *user_param);
|
|
|
|
|
|
/* set_up_connection .
|
|
*
|
|
* Description : Fills the my_dest with all of the machine proporties.
|
|
*
|
|
*
|
|
* Parameters :
|
|
* ctx - Pingoong context after the ctx_init function.
|
|
* user_param - Perftest parameters.
|
|
* my_dest - An empty pingpong_dest struct.
|
|
*
|
|
* Return Value : SUCCESS,FAILURE.
|
|
*/
|
|
int set_up_connection(struct pingpong_context *ctx,
|
|
struct perftest_parameters *user_param,
|
|
struct pingpong_dest *my_dest);
|
|
|
|
/* establish_connection .
|
|
*
|
|
* Description :
|
|
*
|
|
* Connect the client to a well known server to a requested port.
|
|
* It assumes the Server is waiting for request on the port.
|
|
* It uses Ethernet sockets.
|
|
*
|
|
* Parameters :
|
|
* comm - The communication struct with all the data.
|
|
*
|
|
* Return Value : SUCCESS,FAILURE.
|
|
*/
|
|
int establish_connection(struct perftest_comm *comm);
|
|
|
|
/* retry_rdma_connect .
|
|
*
|
|
* Description : Retries rdma_client_connect() because the listener may not be ready
|
|
* when the rdma client attempts to connect
|
|
*
|
|
* Parameters :
|
|
* ctx - An empty resources struct to fill the resources created for this QP.
|
|
* user_param - Perftest parameters.
|
|
*
|
|
* Return Value : SUCCESS,FAILURE.
|
|
*/
|
|
int retry_rdma_connect(struct pingpong_context *ctx,
|
|
struct perftest_parameters *user_param);
|
|
|
|
/* ctx_hand_shake .
|
|
*
|
|
* Description :
|
|
*
|
|
* Exchanging the data , represented in struct pingpong_dest , between
|
|
* a server and client that performed the ctx_server/clinet_connect.
|
|
* The method fills in rem_dest the remote machine data , and passed the data
|
|
* in my_dest to other machine.
|
|
*
|
|
* Parameters :
|
|
*
|
|
* params - The parameters needed for this method. Are mentioned above ,and
|
|
* contains standard IB info. (exists on perftest).
|
|
* my_dest - Contains the data you want to pass to the other side.
|
|
* rem_dest - The other side data.
|
|
*
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
*/
|
|
int ctx_hand_shake(struct perftest_comm *comm,
|
|
struct pingpong_dest *my_dest,
|
|
struct pingpong_dest *rem_dest);
|
|
|
|
|
|
|
|
/* ctx_print_pingpong_data.
|
|
*
|
|
* Description :
|
|
*
|
|
* Prints the data stored in the struct pingpong_dest.
|
|
*
|
|
* Parameters :
|
|
*
|
|
* params - The parameters of the machine.
|
|
* element - The element to print.
|
|
*/
|
|
void ctx_print_pingpong_data(struct pingpong_dest *element,
|
|
struct perftest_comm *comm);
|
|
|
|
/* ctx_close_connection .
|
|
*
|
|
* Description :
|
|
*
|
|
* Close the connection between the 2 machines.
|
|
* It performs an handshake to ensure the 2 sides are there.
|
|
*
|
|
* Parameters :
|
|
*
|
|
* params - The parameters of the machine
|
|
* my_dest ,rem_dest - The 2 sides that ends the connection.
|
|
*
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
*/
|
|
int ctx_close_connection(struct perftest_comm *comm,
|
|
struct pingpong_dest *my_dest,
|
|
struct pingpong_dest *rem_dest);
|
|
|
|
/* ctx_xchg_data .
|
|
*
|
|
* Description :
|
|
*
|
|
* Exchanging data between
|
|
* a server and client after performing ctx_server/client_connect.
|
|
* The method fills in rem_data the remote machine data , and passed the data
|
|
* in my_dest to other machine.
|
|
*
|
|
* Parameters :
|
|
*
|
|
* comm - contains connections info
|
|
* my_data - Contains the data you want to pass to the other side.
|
|
* rem_data - The other side data.
|
|
* size - size of my_data (after casting is made)
|
|
*
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
*/
|
|
int ctx_xchg_data( struct perftest_comm *comm,
|
|
void *my_data,
|
|
void *rem_data,int size);
|
|
|
|
/* ethernet_write_data .
|
|
*
|
|
* Description :
|
|
*
|
|
* Sends data that is written in msg using ethernet
|
|
* This functions can send any basic type (int,float,double,char*,string, etc..).
|
|
* If you need to send a struct, decoder and encoder must be implemented to convert
|
|
* the struct to a string
|
|
*
|
|
* Parameters :
|
|
*
|
|
* comm - contains connections info
|
|
* msg - message that will be sent
|
|
* size - size of the message
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
*/
|
|
int ethernet_write_data(struct perftest_comm *comm, char *msg, size_t size);
|
|
|
|
/* ethernet_read_data .
|
|
*
|
|
* Description :
|
|
*
|
|
* Read data from remote machine using ethernet.
|
|
*
|
|
* Parameters :
|
|
*
|
|
* comm - contains connections info
|
|
* recv_msg - function will return, in this argument, the message from remote machine
|
|
* size - size of the message
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
*/
|
|
int ethernet_read_data(struct perftest_comm *comm, char *recv_msg, size_t size);
|
|
|
|
/* rdma_write_data .
|
|
*
|
|
* Description :
|
|
*
|
|
* Sends data that to remote machine using RDMA.
|
|
* This functions can send any variable type
|
|
*
|
|
* Parameters :
|
|
*
|
|
* data - data that will be sent
|
|
* comm - contains connections info
|
|
* size - size of data
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
*/
|
|
int rdma_write_data(void *data, struct perftest_comm *comm, int size);
|
|
|
|
/* rdma_read_data .
|
|
*
|
|
* Description :
|
|
*
|
|
* Reads data from remote machine using RDMA.
|
|
* This functions can read any variable type
|
|
*
|
|
* Parameters :
|
|
*
|
|
* data - data that will be sent
|
|
* comm - contains connections info
|
|
* size - size of data
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
*/
|
|
int rdma_read_data(void *data, struct perftest_comm *comm, int size);
|
|
|
|
/* ctx_xchg_data .
|
|
*
|
|
* Description :
|
|
*
|
|
* Implements ctx_xchg_data for ethernet
|
|
*
|
|
* Parameters :
|
|
*
|
|
* comm - contains connections info
|
|
* my_data - Contains the data you want to pass to the other side.
|
|
* rem_data - The other side data.
|
|
* size - size of my_data (after casting is made)
|
|
*
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
*/
|
|
int ctx_xchg_data_ethernet( struct perftest_comm *comm, void *my_data, void *rem_data,int size);
|
|
|
|
/* ctx_xchg_data .
|
|
*
|
|
* Description :
|
|
*
|
|
* Implements ctx_xchg_data for RDMA
|
|
*
|
|
* Parameters :
|
|
*
|
|
* comm - contains connections info
|
|
* my_data - Contains the data you want to pass to the other side.
|
|
* rem_data - The other side data.
|
|
* size - size of my_data (after casting is made)
|
|
*
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
*/
|
|
int ctx_xchg_data_rdma( struct perftest_comm *comm, void *my_data, void *rem_data,int size);
|
|
|
|
/* ctx_xchg_data .
|
|
*
|
|
* Description :
|
|
*
|
|
* Exchanging bw reports between
|
|
* a server and client after performing ctx_server/client_connect.
|
|
* The method fills in rem_data the remote machine data , and passed the data
|
|
* in my_dest to other machine.
|
|
*
|
|
* Parameters :
|
|
*
|
|
* comm - contains connections info
|
|
* my_bw_rep - Contains the data you want to pass to the other side.
|
|
* rem_bw_rep - The other side data.
|
|
*
|
|
* Return Value : 0 upon success. -1 if it fails.
|
|
*/
|
|
void xchg_bw_reports (struct perftest_comm *comm, struct bw_report_data *my_bw_rep,
|
|
struct bw_report_data *rem_bw_rep, float remote_version);
|
|
|
|
/* exchange_versions.
|
|
*
|
|
* Description :
|
|
* Exchange versions between sides.
|
|
*
|
|
*/
|
|
void exchange_versions (struct perftest_comm *user_comm, struct perftest_parameters *user_param);
|
|
|
|
/* check_sys_data.
|
|
*
|
|
* Description :
|
|
* Exchange system data between sides.
|
|
*
|
|
*/
|
|
void check_sys_data(struct perftest_comm *user_comm, struct perftest_parameters *user_param);
|
|
|
|
/* check_mtu
|
|
*
|
|
* Description : Configures test MTU.
|
|
*
|
|
* Parameters :
|
|
*
|
|
* context - Context of the device.
|
|
* user_param - Perftest parameters.
|
|
* user_comm - user communication struct.
|
|
* Return Value : SUCCESS, FAILURE.
|
|
*/
|
|
int check_mtu(struct ibv_context *context,struct perftest_parameters *user_param, struct perftest_comm *user_comm);
|
|
|
|
int ctx_check_gid_compatibility(struct pingpong_dest *my_dest,
|
|
struct pingpong_dest *rem_dest);
|
|
|
|
#endif /* PERFTEST_COMMUNICATION_H */
|
|
|
|
|
|
|