* Copyright (c) 2025 Huawei Technologies Co., Ltd.
* This program is free software, you can redistribute it and/or modify it under the terms and conditions of
* CANN Open Software License Agreement Version 2.0 (the "License").
* Please refer to the License for details. You may not use this file except in compliance with the License.
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
* See LICENSE in the root of the software repository for the full text of the License.
*/
#ifndef SHMEM_SOCKET_H
#define SHMEM_SOCKET_H
#include "host/shmem_host_def.h"
#include "utils/shmemi_logger.h"
#include "utils/shmemi_host_types.h"
#include "init/bootstrap/shmemi_bootstrap.h"
#include "shmemi_host_def.h"
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_IF_NAME_SIZE 16
#define SOCKET_TYPE_SEND 0
#define SOCKET_TYPE_RECV 1
#define RETRY_REFUSED_TIMES 1e5
#define RETRY_TIMEDOUT_TIMES 50
#define SLEEP_INT 1000
#define SOCKET_ACCEPT_TIMEOUT_MS 50000
#define SOCKET_RECV_TIMEOUT_MS 30000
#define SOCKET_BACKLOG 16384
typedef enum {
SOCKET_STATE_CREATED,
SOCKET_STATE_BOUND,
SOCKET_STATE_LISTENING,
SOCKET_STATE_ACCEPTING,
SOCKET_STATE_ACCEPTED,
SOCKET_STATE_CONNECTING,
SOCKET_STATE_CONNECTED,
SOCKET_STATE_READY,
SOCKET_STATE_ERROR,
SOCKET_STATE_CLOSED
} socket_state_t;
typedef enum {
SOCKET_TYPE_BOOTSTRAP,
SOCKET_TYPE_DATA
} socket_type_t;
typedef struct {
int fd;
int accept_fd;
sockaddr_t addr;
socket_state_t state;
uint64_t magic;
socket_type_t type;
int refused_retries;
int timeout_retries;
} socket_t;
struct bootstrap_root_args {
socket_t* listen_sock;
uint64_t magic;
int version;
};
typedef struct {
int rank;
int nranks;
sockaddr_t ext_addr_listen;
sockaddr_t ext_address_listen_root;
} bootstrap_ext_info;
struct bootstrap_netstate {
char bootstrap_netifname[MAX_IF_NAME_SIZE + 1];
sockaddr_t bootstrap_netifaddr;
int bootstrap_netinitdone = 0;
pthread_mutex_t bootstrap_netlock = PTHREAD_MUTEX_INITIALIZER;
pthread_t bootstrap_root;
};
typedef struct unexpected_conn {
int peer;
int tag;
socket_t sock;
struct unexpected_conn* next;
} unexpected_conn_t;
typedef struct {
int rank;
int nranks;
uint64_t magic;
socket_t listen_sock;
socket_t ring_send_sock;
socket_t ring_recv_sock;
sockaddr_t* peer_addrs;
unexpected_conn_t* unexpected_conns;
} uid_bootstrap_state;
int socket_init(socket_t* sock, socket_type_t type, uint64_t magic, const sockaddr_t* init_addr);
int socket_listen(socket_t* sock);
int socket_connect(socket_t* sock);
int socket_accept(socket_t* client_sock, socket_t* listen_sock);
int socket_send(socket_t* sock, void* ptr, int size);
int socket_recv(socket_t* sock, void* ptr, int size);
int socket_close(socket_t* sock);
int socket_get_sainfo(socket_t* sock, sockaddr* sa, socklen_t* addr_len);
#ifdef __cplusplus
}
#endif
#endif