int client_do_pollin(int sockfd, struct link *ln) { if (sockfd == ln->local_sockfd) { if (ln->state & SERVER_PENDING) { sock_debug(sockfd, "%s: server pending", __func__); goto out; } else if (client_do_local_read(sockfd, ln) == -1) { goto clean; } } else if (sockfd == ln->server_sockfd) { if (ln->state & LOCAL_PENDING) { sock_debug(sockfd, "%s: local pending", __func__); goto out; } else if (client_do_server_read(sockfd, ln) == -1) { goto clean; } } out: return 0; clean: sock_info(sockfd, "%s close", __func__); destroy_link(sockfd); return -1; }
static ssize_t sock_cq_entry_size(struct sock_cq *sock_cq) { ssize_t size; switch(sock_cq->attr.format) { case FI_CQ_FORMAT_CONTEXT: size = sizeof(struct fi_cq_entry); break; case FI_CQ_FORMAT_MSG: size = sizeof(struct fi_cq_msg_entry); break; case FI_CQ_FORMAT_DATA: size = sizeof(struct fi_cq_data_entry); break; case FI_CQ_FORMAT_TAGGED: size = sizeof(struct fi_cq_tagged_entry); break; case FI_CQ_FORMAT_UNSPEC: default: size = -1; sock_debug(SOCK_ERROR, "CQ: Invalid CQ format\n"); break; } return size; }
static void sock_cq_set_report_fn(struct sock_cq *sock_cq) { switch(sock_cq->attr.format) { case FI_CQ_FORMAT_CONTEXT: sock_cq->report_completion = &sock_cq_report_context; break; case FI_CQ_FORMAT_MSG: sock_cq->report_completion = &sock_cq_report_msg; break; case FI_CQ_FORMAT_DATA: sock_cq->report_completion = &sock_cq_report_data; break; case FI_CQ_FORMAT_TAGGED: sock_cq->report_completion = &sock_cq_report_tagged; break; case FI_CQ_FORMAT_UNSPEC: default: sock_debug(SOCK_ERROR, "CQ: Invalid CQ format\n"); break; } }
/* read cipher from server, decrypt and send to local */ int client_do_server_read(int sockfd, struct link *ln) { int ret; if (ln->state & SERVER_SEND_PENDING) { return 0; } /* if iv isn't received, wait to receive bigger than iv_len * bytes before go to next step */ if (ln->state & SERVER_READ_PENDING) { sock_debug(sockfd, "%s: server read pending", __func__); pr_link_debug(ln); ret = do_read(sockfd, ln, "cipher", ln->cipher_len); if (ret == -2) { goto out; } else if (ret == -1) { return 0; } if (ln->cipher_len <= iv_len) { return 0; } else { ln->state &= ~SERVER_READ_PENDING; } } else { ret = do_read(sockfd, ln, "cipher", 0); if (ret == -2) { goto out; } else if (ret == -1) { return 0; } if (!(ln->state & SS_IV_RECEIVED)) { if (ln->cipher_len <= iv_len) { ln->state |= SERVER_READ_PENDING; return 0; } } } if (decrypt(sockfd, ln) == -1) goto out; if (ln->state & SS_UDP) { if (add_data(sockfd, ln, "text", rsv_frag, sizeof(rsv_frag)) == -1) goto out; } ret = do_send(ln->local_sockfd, ln, "text", 0); if (ret == -2) { goto out; } else if (ret == -1) { ln->state |= LOCAL_SEND_PENDING; } return 0; out: return -1; }