static struct sock_conn *sock_conn_map_insert(struct sock_ep_attr *ep_attr, struct sockaddr_in *addr, int conn_fd, int addr_published) { int index; struct sock_conn_map *map = &ep_attr->cmap; if (map->size == map->used) { index = sock_conn_get_next_index(map); if (index < 0) { if (sock_conn_map_increase(map, map->size * 2)) return NULL; index = map->used; map->used++; } } else { index = map->used; map->used++; } map->table[index].av_index = FI_ADDR_NOTAVAIL; map->table[index].connected = 1; map->table[index].addr = *addr; map->table[index].sock_fd = conn_fd; map->table[index].ep_attr = ep_attr; sock_set_sockopts(conn_fd); if (fi_epoll_add(map->epoll_set, conn_fd, &map->table[index])) SOCK_LOG_ERROR("failed to add to epoll set: %d\n", conn_fd); map->table[index].address_published = addr_published; sock_pe_poll_add(ep_attr->domain->pe, conn_fd); return &map->table[index]; }
static struct sock_conn *sock_conn_map_insert(struct sock_ep *ep, struct sockaddr_in *addr, int conn_fd, int addr_published) { int index; struct sock_conn_map *map = &ep->cmap; if (map->size == map->used) { if (sock_conn_map_increase(map, map->size * 2)) return 0; } index = map->used; map->used++; map->table[index].addr = *addr; map->table[index].sock_fd = conn_fd; map->table[index].ep = ep; sock_set_sockopts(conn_fd); fastlock_acquire(&ep->lock); dlist_insert_tail(&map->table[index].ep_entry, &ep->conn_list); fastlock_release(&ep->lock); if (idm_set(&ep->conn_idm, conn_fd, &map->table[index]) < 0) SOCK_LOG_ERROR("idm_set failed\n"); if (sock_epoll_add(&map->epoll_set, conn_fd)) SOCK_LOG_ERROR("failed to add to epoll set: %d\n", conn_fd); map->table[index].address_published = addr_published; sock_pe_poll_add(ep->domain->pe, conn_fd); return &map->table[index]; }
int sock_conn_listen(struct sock_ep_attr *ep_attr) { struct addrinfo *s_res = NULL, *p; struct addrinfo hints = { 0 }; int listen_fd = 0, ret; socklen_t addr_size; struct sockaddr_in addr; struct sock_conn_listener *listener = &ep_attr->listener; char service[NI_MAXSERV] = {0}; char *port; char ipaddr[24]; hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; memcpy(&addr, ep_attr->src_addr, sizeof(addr)); if (getnameinfo((void *)ep_attr->src_addr, sizeof(*ep_attr->src_addr), NULL, 0, listener->service, sizeof(listener->service), NI_NUMERICSERV)) { SOCK_LOG_ERROR("could not resolve src_addr\n"); return -FI_EINVAL; } if (ep_attr->ep_type == FI_EP_MSG) { memset(listener->service, 0, NI_MAXSERV); port = NULL; addr.sin_port = 0; } else port = listener->service; inet_ntop(addr.sin_family, &addr.sin_addr, ipaddr, sizeof(ipaddr)); ret = getaddrinfo(ipaddr, port, &hints, &s_res); if (ret) { SOCK_LOG_ERROR("no available AF_INET address, service %s, %s\n", listener->service, gai_strerror(ret)); return -FI_EINVAL; } SOCK_LOG_DBG("Binding listener thread to port: %s\n", listener->service); for (p = s_res; p; p = p->ai_next) { listen_fd = ofi_socket(p->ai_family, p->ai_socktype, p->ai_protocol); if (listen_fd >= 0) { sock_set_sockopts(listen_fd); if (!bind(listen_fd, s_res->ai_addr, s_res->ai_addrlen)) break; ofi_close_socket(listen_fd); listen_fd = -1; } } freeaddrinfo(s_res); if (listen_fd < 0) { SOCK_LOG_ERROR("failed to listen to port: %s\n", listener->service); goto err; } if (atoi(listener->service) == 0) { addr_size = sizeof(addr); if (getsockname(listen_fd, (struct sockaddr *) &addr, &addr_size)) goto err; snprintf(listener->service, sizeof listener->service, "%d", ntohs(addr.sin_port)); SOCK_LOG_DBG("Bound to port: %s - %d\n", listener->service, getpid()); ep_attr->msg_src_port = ntohs(addr.sin_port); } if (ep_attr->src_addr->sin_addr.s_addr == 0) { snprintf(service, sizeof service, "%s", listener->service); ret = sock_get_src_addr_from_hostname(ep_attr->src_addr, service); if (ret) goto err; } if (listen(listen_fd, sock_cm_def_map_sz)) { SOCK_LOG_ERROR("failed to listen socket: %s\n", strerror(errno)); goto err; } if (((struct sockaddr_in *) (ep_attr->src_addr))->sin_port == 0) { ((struct sockaddr_in *) (ep_attr->src_addr))->sin_port = htons(atoi(listener->service)); } listener->sock = listen_fd; if (socketpair(AF_UNIX, SOCK_STREAM, 0, listener->signal_fds) < 0) goto err; listener->do_listen = 1; fd_set_nonblock(listener->signal_fds[1]); if (pthread_create(&listener->listener_thread, 0, _sock_conn_listen, ep_attr)) { SOCK_LOG_ERROR("failed to create conn listener thread\n"); goto err; } while (!*((volatile int*)&listener->is_ready)); return 0; err: if (listen_fd >= 0) ofi_close_socket(listen_fd); return -FI_EINVAL; }