Lines Matching refs:tcp

15 #include <linux/tcp.h>
83 struct tcp_handle *tcp = NULL;
88 tcp = (struct tcp_handle *)(conn_impl->connect_handle);
89 if (tcp->sock)
90 rtt_us = tcp_sk(tcp->sock->sk)->srtt_us >> 3;
117 hmdfs_err("tcp recv error %d", rc);
153 hmdfs_err("tcp recv error %d", rc);
219 struct tcp_handle *tcp = NULL;
226 hmdfs_err("tcp connect == NULL");
230 tcp = (struct tcp_handle *)(connect->connect_handle);
234 hmdfs_warning("tcp: readpage from peer %llu ret err %d",
249 ret = hmdfs_get_readpage_buffer(tcp->sock, recv, page);
264 ret = hmdfs_drop_readpage_buffer(tcp->sock, recv);
397 struct tcp_handle *tcp = NULL;
404 tcp = (struct tcp_handle *)(connect->connect_handle);
426 ret = tcp_read_buffer_from_socket(tcp->sock, cipherbuffer,
456 struct tcp_handle *tcp = NULL;
461 tcp = (struct tcp_handle *)(connect->connect_handle);
476 ret = tcp_read_buffer_from_socket(tcp->sock, outdata, outlen);
481 tcp->connect->stat.recv_bytes += outlen;
493 static int tcp_receive_from_sock(struct tcp_handle *tcp)
498 if (!tcp) {
499 hmdfs_info("tcp recv thread !tcp");
503 if (!tcp->sock) {
504 hmdfs_info("tcp recv thread !sock");
508 recv = kmem_cache_alloc(tcp->recv_cache, GFP_KERNEL);
510 hmdfs_info("tcp recv thread !cache");
514 ret = tcp_read_head_from_socket(tcp->sock, recv,
519 tcp->connect->stat.recv_bytes += sizeof(struct hmdfs_head_cmd);
520 tcp->connect->stat.recv_message_count++;
523 hmdfs_info_ratelimited("tcp recv fd %d wrong magic. drop message",
524 tcp->fd);
531 hmdfs_info("tcp recv fd %d length error. drop message",
532 tcp->fd);
536 if (tcp->connect->status == CONNECT_STAT_WORKING &&
539 ret = tcp_recvpage_tls(tcp->connect, recv);
543 if (tcp->connect->status == CONNECT_STAT_WORKING)
544 ret = tcp_recvbuffer_tls(tcp->connect, recv);
546 ret = tcp_recvbuffer_cipher(tcp->connect, recv);
549 kmem_cache_free(tcp->recv_cache, recv);
553 static bool tcp_handle_is_available(struct tcp_handle *tcp)
560 if (!tcp || !tcp->sock || !tcp->sock->sk) {
561 hmdfs_err("Invalid tcp connection");
565 if (tcp->sock->sk->sk_state != TCP_ESTABLISHED) {
567 tcp->fd, tcp->sock->sk->sk_state);
571 if (tcp->sock->state != SS_CONNECTING &&
572 tcp->sock->state != SS_CONNECTED) {
574 tcp->fd, tcp->sock->state);
579 tls_ctx = tls_get_ctx(tcp->sock->sk);
585 tcp->fd);
596 struct tcp_handle *tcp = (struct tcp_handle *)arg;
599 WARN_ON(!tcp);
600 WARN_ON(!tcp->sock);
603 old_cred = hmdfs_override_creds(tcp->connect->node->sbi->system_cred);
611 if (tcp_handle_is_available(tcp) &&
612 list_empty(&tcp->connect->list))
614 if (!mutex_trylock(&tcp->close_mutex))
616 if (tcp_handle_is_available(tcp))
617 ret = tcp_receive_from_sock(tcp);
626 tcp->recv_task = NULL;
627 mutex_unlock(&tcp->close_mutex);
629 hmdfs_node_inc_evt_seq(tcp->connect->node);
630 tcp->connect->status = CONNECT_STAT_STOP;
631 if (tcp->connect->node->status != NODE_STAT_OFFLINE)
632 hmdfs_reget_connection(tcp->connect);
640 hmdfs_info("Exiting. Now, sock state = %d", tcp->sock->state);
642 connection_put(tcp->connect);
646 static int tcp_send_message_sock_cipher(struct tcp_handle *tcp,
658 if (!tcp || !tcp->sock) {
659 hmdfs_err("encrypt tcp socket = NULL");
671 hmdfs_err("tcp send message encrypt fail to alloc outdata");
674 ret = aeadcipher_encrypt_buffer(tcp->connect, msg->data, msg->len,
684 mutex_lock(&tcp->send_mutex);
685 send_len = sendmsg_nofs(tcp->sock, &tcp_msg, iov, send_vec_cnt,
687 mutex_unlock(&tcp->send_mutex);
703 static int tcp_send_message_sock_tls(struct tcp_handle *tcp,
712 if (!tcp || !tcp->sock) {
713 hmdfs_err("tcp socket = NULL");
731 mutex_lock(&tcp->send_mutex);
732 send_len = sendmsg_nofs(tcp->sock, &tcp_msg, iov, send_vec_cnt,
734 mutex_unlock(&tcp->send_mutex);
743 tcp->connect->stat.send_bytes += send_len;
746 tcp->connect->stat.send_bytes += send_len;
747 tcp->connect->stat.send_message_count++;
756 struct tcp_handle *tcp = connect->connect_handle;
788 ret = tcp_send_message_sock_tls(tcp, &msg);
803 struct tcp_handle *tcp = NULL;
806 hmdfs_err("tcp connection = NULL ");
817 tcp = (struct tcp_handle *)(connect->connect_handle);
824 ret = tcp_send_message_sock_tls(tcp, msg);
826 ret = tcp_send_message_sock_cipher(tcp, msg);
846 void tcp_close_socket(struct tcp_handle *tcp)
849 if (!tcp)
851 mutex_lock(&tcp->close_mutex);
852 if (tcp->recv_task) {
853 ret = kthread_stop(tcp->recv_task);
856 connection_put(tcp->connect);
857 tcp->recv_task = NULL;
859 mutex_unlock(&tcp->close_mutex);
890 static bool is_tcp_socket(struct tcp_handle *tcp)
894 if (!tcp || !tcp->sock || !tcp->sock->sk) {
895 hmdfs_err("invalid tcp handle");
899 lock_sock(tcp->sock->sk);
900 if (tcp->sock->sk->sk_protocol != IPPROTO_TCP ||
901 tcp->sock->type != SOCK_STREAM ||
902 tcp->sock->sk->sk_family != AF_INET) {
904 release_sock(tcp->sock->sk);
908 icsk = inet_csk(tcp->sock->sk);
911 release_sock(tcp->sock->sk);
915 release_sock(tcp->sock->sk);
919 static int tcp_update_socket(struct tcp_handle *tcp, int fd,
928 tcp->sock = socket;
929 tcp->fd = fd;
931 if (!is_tcp_socket(tcp)) {
936 if (!tcp_handle_is_available(tcp)) {
945 tcp->recv_cache = kmem_cache_create("hmdfs_socket",
946 tcp->recvbuf_maxsize,
948 if (!tcp->recv_cache) {
955 hmdfs_err("tcp set timeout error");
960 memcpy(tcp->connect->master_key, master_key, HMDFS_KEY_SIZE);
961 memcpy(tcp->connect->send_key, master_key, HMDFS_KEY_SIZE);
962 memcpy(tcp->connect->recv_key, master_key, HMDFS_KEY_SIZE);
963 tcp->connect->tfm = crypto_alloc_aead("gcm(aes)", 0, 0);
964 if (IS_ERR(tcp->connect->tfm)) {
965 err = PTR_ERR(tcp->connect->tfm);
966 tcp->connect->tfm = NULL;
971 err = set_tfm(master_key, tcp->connect->tfm);
977 connection_get(tcp->connect);
979 node = tcp->connect->node;
980 tcp->recv_task = kthread_create(tcp_recv_thread, (void *)tcp,
983 if (IS_ERR(tcp->recv_task)) {
984 err = PTR_ERR(tcp->recv_task);
985 hmdfs_err("tcp->rcev_task %d", err);
992 tcp->recv_task = NULL;
993 connection_put(tcp->connect);
995 crypto_free_aead(tcp->connect->tfm);
996 tcp->connect->tfm = NULL;
998 kmem_cache_destroy(tcp->recv_cache);
999 tcp->recv_cache = NULL;
1001 tcp->sock = NULL;
1002 tcp->fd = 0;
1011 struct tcp_handle *tcp = kzalloc(sizeof(*tcp), GFP_KERNEL);
1013 if (!tcp)
1015 tcp->connect = connect;
1016 tcp->connect->connect_handle = (void *)tcp;
1017 tcp->recvbuf_maxsize = MAX_RECV_SIZE;
1018 tcp->recv_task = NULL;
1019 tcp->recv_cache = NULL;
1020 tcp->sock = NULL;
1021 mutex_init(&tcp->close_mutex);
1022 mutex_init(&tcp->send_mutex);
1023 ret = tcp_update_socket(tcp, socket_fd, master_key, socket);
1025 kfree(tcp);
1028 return tcp;
1047 struct tcp_handle *tcp = NULL;
1049 tcp = conn->connect_handle;
1054 param.fd = tcp->fd;
1061 struct tcp_handle *tcp = NULL;
1086 tcp = conn->connect_handle;
1087 if (tcp) {
1088 recv_task = tcp->recv_task;
1098 if (tcp) {
1099 if (tcp->sock) {
1101 tcp->fd, file_count(tcp->sock->file),
1103 kernel_sock_shutdown(tcp->sock, SHUT_RDWR);
1107 tcp_close_socket(tcp);
1109 if (tcp->fd != INVALID_SOCKET_FD)
1119 struct tcp_handle *tcp = NULL;
1123 tcp = (struct tcp_handle *)(tcp_conn->connect_handle);
1124 if (tcp->sock == socket) {
1200 struct tcp_handle *tcp = NULL;
1213 hmdfs_info("Got a existing tcp conn: fsocket_fd = %d",
1221 hmdfs_info("Failed to alloc a tcp conn, socket_fd %d", fd);
1229 tcp = tcp_conn->connect_handle;
1231 hmdfs_info("Got a newly allocated tcp conn: socket_fd = %d", fd);
1232 wake_up_process(tcp->recv_task);
1238 hmdfs_info("Got a existing tcp conn: socket_fd = %d", fd);
1239 tcp->fd = INVALID_SOCKET_FD;
1240 tcp_close_socket(tcp);