hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/vmw_vsock/vmci_transport.c
....@@ -1,16 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * VMware vSockets Driver
34 *
45 * Copyright (C) 2007-2013 VMware, Inc. All rights reserved.
5
- *
6
- * This program is free software; you can redistribute it and/or modify it
7
- * under the terms of the GNU General Public License as published by the Free
8
- * Software Foundation version 2 and no later version.
9
- *
10
- * This program is distributed in the hope that it will be useful, but WITHOUT
11
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13
- * more details.
146 */
157
168 #include <linux/types.h>
....@@ -65,6 +57,7 @@
6557 static u16 vmci_transport_new_proto_supported_versions(void);
6658 static bool vmci_transport_proto_to_notify_struct(struct sock *sk, u16 *proto,
6759 bool old_pkt_proto);
60
+static bool vmci_check_transport(struct vsock_sock *vsk);
6861
6962 struct vmci_transport_recv_pkt_info {
7063 struct work_struct work;
....@@ -81,15 +74,6 @@
8174 static u32 vmci_transport_qp_resumed_sub_id = VMCI_INVALID_ID;
8275
8376 static int PROTOCOL_OVERRIDE = -1;
84
-
85
-#define VMCI_TRANSPORT_DEFAULT_QP_SIZE_MIN 128
86
-#define VMCI_TRANSPORT_DEFAULT_QP_SIZE 262144
87
-#define VMCI_TRANSPORT_DEFAULT_QP_SIZE_MAX 262144
88
-
89
-/* The default peer timeout indicates how long we will wait for a peer response
90
- * to a control message.
91
- */
92
-#define VSOCK_DEFAULT_CONNECT_TIMEOUT (2 * HZ)
9377
9478 /* Helper function to convert from a VMCI error code to a VSock error code. */
9579
....@@ -663,7 +647,7 @@
663647 static bool vmci_transport_stream_allow(u32 cid, u32 port)
664648 {
665649 static const u32 non_socket_contexts[] = {
666
- VMADDR_CID_RESERVED,
650
+ VMADDR_CID_LOCAL,
667651 };
668652 int i;
669653
....@@ -1020,8 +1004,7 @@
10201004 return -ECONNREFUSED;
10211005 }
10221006
1023
- pending = __vsock_create(sock_net(sk), NULL, sk, GFP_KERNEL,
1024
- sk->sk_type, 0);
1007
+ pending = vsock_create_connected(sk);
10251008 if (!pending) {
10261009 vmci_transport_send_reset(sk, pkt);
10271010 return -ENOMEM;
....@@ -1034,14 +1017,24 @@
10341017 vsock_addr_init(&vpending->remote_addr, pkt->dg.src.context,
10351018 pkt->src_port);
10361019
1020
+ err = vsock_assign_transport(vpending, vsock_sk(sk));
1021
+ /* Transport assigned (looking at remote_addr) must be the same
1022
+ * where we received the request.
1023
+ */
1024
+ if (err || !vmci_check_transport(vpending)) {
1025
+ vmci_transport_send_reset(sk, pkt);
1026
+ sock_put(pending);
1027
+ return err;
1028
+ }
1029
+
10371030 /* If the proposed size fits within our min/max, accept it. Otherwise
10381031 * propose our own size.
10391032 */
1040
- if (pkt->u.size >= vmci_trans(vpending)->queue_pair_min_size &&
1041
- pkt->u.size <= vmci_trans(vpending)->queue_pair_max_size) {
1033
+ if (pkt->u.size >= vpending->buffer_min_size &&
1034
+ pkt->u.size <= vpending->buffer_max_size) {
10421035 qp_size = pkt->u.size;
10431036 } else {
1044
- qp_size = vmci_trans(vpending)->queue_pair_size;
1037
+ qp_size = vpending->buffer_size;
10451038 }
10461039
10471040 /* Figure out if we are using old or new requests based on the
....@@ -1105,12 +1098,12 @@
11051098 }
11061099
11071100 vsock_add_pending(sk, pending);
1108
- sk->sk_ack_backlog++;
1101
+ sk_acceptq_added(sk);
11091102
11101103 pending->sk_state = TCP_SYN_SENT;
11111104 vmci_trans(vpending)->produce_size =
11121105 vmci_trans(vpending)->consume_size = qp_size;
1113
- vmci_trans(vpending)->queue_pair_size = qp_size;
1106
+ vpending->buffer_size = qp_size;
11141107
11151108 vmci_trans(vpending)->notify_ops->process_request(pending);
11161109
....@@ -1404,8 +1397,8 @@
14041397 vsk->ignore_connecting_rst = false;
14051398
14061399 /* Verify that we're OK with the proposed queue pair size */
1407
- if (pkt->u.size < vmci_trans(vsk)->queue_pair_min_size ||
1408
- pkt->u.size > vmci_trans(vsk)->queue_pair_max_size) {
1400
+ if (pkt->u.size < vsk->buffer_min_size ||
1401
+ pkt->u.size > vsk->buffer_max_size) {
14091402 err = -EINVAL;
14101403 goto destroy;
14111404 }
....@@ -1510,8 +1503,7 @@
15101503 vsk->sent_request = false;
15111504 vsk->ignore_connecting_rst = true;
15121505
1513
- err = vmci_transport_send_conn_request(
1514
- sk, vmci_trans(vsk)->queue_pair_size);
1506
+ err = vmci_transport_send_conn_request(sk, vsk->buffer_size);
15151507 if (err < 0)
15161508 err = vmci_transport_error_to_vsock_error(err);
15171509 else
....@@ -1595,21 +1587,6 @@
15951587 INIT_LIST_HEAD(&vmci_trans(vsk)->elem);
15961588 vmci_trans(vsk)->sk = &vsk->sk;
15971589 spin_lock_init(&vmci_trans(vsk)->lock);
1598
- if (psk) {
1599
- vmci_trans(vsk)->queue_pair_size =
1600
- vmci_trans(psk)->queue_pair_size;
1601
- vmci_trans(vsk)->queue_pair_min_size =
1602
- vmci_trans(psk)->queue_pair_min_size;
1603
- vmci_trans(vsk)->queue_pair_max_size =
1604
- vmci_trans(psk)->queue_pair_max_size;
1605
- } else {
1606
- vmci_trans(vsk)->queue_pair_size =
1607
- VMCI_TRANSPORT_DEFAULT_QP_SIZE;
1608
- vmci_trans(vsk)->queue_pair_min_size =
1609
- VMCI_TRANSPORT_DEFAULT_QP_SIZE_MIN;
1610
- vmci_trans(vsk)->queue_pair_max_size =
1611
- VMCI_TRANSPORT_DEFAULT_QP_SIZE_MAX;
1612
- }
16131590
16141591 return 0;
16151592 }
....@@ -1733,7 +1710,11 @@
17331710 if (!dg)
17341711 return -ENOMEM;
17351712
1736
- memcpy_from_msg(VMCI_DG_PAYLOAD(dg), msg, len);
1713
+ err = memcpy_from_msg(VMCI_DG_PAYLOAD(dg), msg, len);
1714
+ if (err) {
1715
+ kfree(dg);
1716
+ return err;
1717
+ }
17371718
17381719 dg->dst = vmci_make_handle(remote_addr->svm_cid,
17391720 remote_addr->svm_port);
....@@ -1825,8 +1806,7 @@
18251806
18261807 if (vmci_transport_old_proto_override(&old_pkt_proto) &&
18271808 old_pkt_proto) {
1828
- err = vmci_transport_send_conn_request(
1829
- sk, vmci_trans(vsk)->queue_pair_size);
1809
+ err = vmci_transport_send_conn_request(sk, vsk->buffer_size);
18301810 if (err < 0) {
18311811 sk->sk_state = TCP_CLOSE;
18321812 return err;
....@@ -1834,8 +1814,7 @@
18341814 } else {
18351815 int supported_proto_versions =
18361816 vmci_transport_new_proto_supported_versions();
1837
- err = vmci_transport_send_conn_request2(
1838
- sk, vmci_trans(vsk)->queue_pair_size,
1817
+ err = vmci_transport_send_conn_request2(sk, vsk->buffer_size,
18391818 supported_proto_versions);
18401819 if (err < 0) {
18411820 sk->sk_state = TCP_CLOSE;
....@@ -1886,46 +1865,6 @@
18861865 static bool vmci_transport_stream_is_active(struct vsock_sock *vsk)
18871866 {
18881867 return !vmci_handle_is_invalid(vmci_trans(vsk)->qp_handle);
1889
-}
1890
-
1891
-static u64 vmci_transport_get_buffer_size(struct vsock_sock *vsk)
1892
-{
1893
- return vmci_trans(vsk)->queue_pair_size;
1894
-}
1895
-
1896
-static u64 vmci_transport_get_min_buffer_size(struct vsock_sock *vsk)
1897
-{
1898
- return vmci_trans(vsk)->queue_pair_min_size;
1899
-}
1900
-
1901
-static u64 vmci_transport_get_max_buffer_size(struct vsock_sock *vsk)
1902
-{
1903
- return vmci_trans(vsk)->queue_pair_max_size;
1904
-}
1905
-
1906
-static void vmci_transport_set_buffer_size(struct vsock_sock *vsk, u64 val)
1907
-{
1908
- if (val < vmci_trans(vsk)->queue_pair_min_size)
1909
- vmci_trans(vsk)->queue_pair_min_size = val;
1910
- if (val > vmci_trans(vsk)->queue_pair_max_size)
1911
- vmci_trans(vsk)->queue_pair_max_size = val;
1912
- vmci_trans(vsk)->queue_pair_size = val;
1913
-}
1914
-
1915
-static void vmci_transport_set_min_buffer_size(struct vsock_sock *vsk,
1916
- u64 val)
1917
-{
1918
- if (val > vmci_trans(vsk)->queue_pair_size)
1919
- vmci_trans(vsk)->queue_pair_size = val;
1920
- vmci_trans(vsk)->queue_pair_min_size = val;
1921
-}
1922
-
1923
-static void vmci_transport_set_max_buffer_size(struct vsock_sock *vsk,
1924
- u64 val)
1925
-{
1926
- if (val < vmci_trans(vsk)->queue_pair_size)
1927
- vmci_trans(vsk)->queue_pair_size = val;
1928
- vmci_trans(vsk)->queue_pair_max_size = val;
19291868 }
19301869
19311870 static int vmci_transport_notify_poll_in(
....@@ -2083,7 +2022,8 @@
20832022 return vmci_get_context_id();
20842023 }
20852024
2086
-static const struct vsock_transport vmci_transport = {
2025
+static struct vsock_transport vmci_transport = {
2026
+ .module = THIS_MODULE,
20872027 .init = vmci_transport_socket_init,
20882028 .destruct = vmci_transport_destruct,
20892029 .release = vmci_transport_release,
....@@ -2110,14 +2050,25 @@
21102050 .notify_send_pre_enqueue = vmci_transport_notify_send_pre_enqueue,
21112051 .notify_send_post_enqueue = vmci_transport_notify_send_post_enqueue,
21122052 .shutdown = vmci_transport_shutdown,
2113
- .set_buffer_size = vmci_transport_set_buffer_size,
2114
- .set_min_buffer_size = vmci_transport_set_min_buffer_size,
2115
- .set_max_buffer_size = vmci_transport_set_max_buffer_size,
2116
- .get_buffer_size = vmci_transport_get_buffer_size,
2117
- .get_min_buffer_size = vmci_transport_get_min_buffer_size,
2118
- .get_max_buffer_size = vmci_transport_get_max_buffer_size,
21192053 .get_local_cid = vmci_transport_get_local_cid,
21202054 };
2055
+
2056
+static bool vmci_check_transport(struct vsock_sock *vsk)
2057
+{
2058
+ return vsk->transport == &vmci_transport;
2059
+}
2060
+
2061
+static void vmci_vsock_transport_cb(bool is_host)
2062
+{
2063
+ int features;
2064
+
2065
+ if (is_host)
2066
+ features = VSOCK_TRANSPORT_F_H2G;
2067
+ else
2068
+ features = VSOCK_TRANSPORT_F_G2H;
2069
+
2070
+ vsock_core_register(&vmci_transport, features);
2071
+}
21212072
21222073 static int __init vmci_transport_init(void)
21232074 {
....@@ -2135,7 +2086,6 @@
21352086 pr_err("Unable to create datagram handle. (%d)\n", err);
21362087 return vmci_transport_error_to_vsock_error(err);
21372088 }
2138
-
21392089 err = vmci_event_subscribe(VMCI_EVENT_QP_RESUMED,
21402090 vmci_transport_qp_resumed_cb,
21412091 NULL, &vmci_transport_qp_resumed_sub_id);
....@@ -2146,12 +2096,21 @@
21462096 goto err_destroy_stream_handle;
21472097 }
21482098
2149
- err = vsock_core_init(&vmci_transport);
2099
+ /* Register only with dgram feature, other features (H2G, G2H) will be
2100
+ * registered when the first host or guest becomes active.
2101
+ */
2102
+ err = vsock_core_register(&vmci_transport, VSOCK_TRANSPORT_F_DGRAM);
21502103 if (err < 0)
21512104 goto err_unsubscribe;
21522105
2106
+ err = vmci_register_vsock_callback(vmci_vsock_transport_cb);
2107
+ if (err < 0)
2108
+ goto err_unregister;
2109
+
21532110 return 0;
21542111
2112
+err_unregister:
2113
+ vsock_core_unregister(&vmci_transport);
21552114 err_unsubscribe:
21562115 vmci_event_unsubscribe(vmci_transport_qp_resumed_sub_id);
21572116 err_destroy_stream_handle:
....@@ -2177,7 +2136,8 @@
21772136 vmci_transport_qp_resumed_sub_id = VMCI_INVALID_ID;
21782137 }
21792138
2180
- vsock_core_exit();
2139
+ vmci_register_vsock_callback(NULL);
2140
+ vsock_core_unregister(&vmci_transport);
21812141 }
21822142 module_exit(vmci_transport_exit);
21832143