Wei Wang
2021-Nov-25 07:15 UTC
[PATCH] virtio/vsock: fix the transport to work with VMADDR_CID_ANY
The VMADDR_CID_ANY flag used by a socket means that the socket isn't bound to any specific CID. For example, a host vsock server may want to be bound with VMADDR_CID_ANY, so that a guest vsock client can connect to the host server with CID=VMADDR_CID_HOST (i.e. 2), and meanwhile, a host vsock client can connect to the same local server with CID=VMADDR_CID_LOCAL (i.e. 1). The current implementation sets the destination socket's svm_cid to a fixed CID value after the first client's connection, which isn't an expected operation. For example, if the guest client first connects to the host server, the server's svm_cid gets set to VMADDR_CID_HOST, then other host clients won't be able to connect to the server anymore. Reproduce steps: 1. Run the host server: socat VSOCK-LISTEN:1234,fork - 2. Run a guest client to connect to the host server: socat - VSOCK-CONNECT:2:1234 3. Run a host client to connect to the host server: socat - VSOCK-CONNECT:1:1234 Without this patch, step 3. above fails to connect, and socat complains "socat[1720] E connect(5, AF=40 cid:1 port:1234, 16): Connection reset by peer". With this patch, the above works well. Signed-off-by: Wei Wang <wei.w.wang at intel.com> --- net/vmw_vsock/virtio_transport_common.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index 59ee1be5a6dd..5c60fae10569 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -1298,9 +1298,6 @@ void virtio_transport_recv_pkt(struct virtio_transport *t, space_available = virtio_transport_space_update(sk, pkt); - /* Update CID in case it has changed after a transport reset event */ - vsk->local_addr.svm_cid = dst.svm_cid; - if (space_available) sk->sk_write_space(sk); -- 2.25.1
Wang, Wei W
2021-Nov-25 09:27 UTC
[PATCH] virtio/vsock: fix the transport to work with VMADDR_CID_ANY
On Thursday, November 25, 2021 3:16 PM, Wang, Wei W wrote:> - /* Update CID in case it has changed after a transport reset event */ > - vsk->local_addr.svm_cid = dst.svm_cid; > - > if (space_available) > sk->sk_write_space(sk); >Not sure if anybody knows how this affects the transport reset. Thanks, Wei
kernel test robot
2021-Nov-25 22:54 UTC
[PATCH] virtio/vsock: fix the transport to work with VMADDR_CID_ANY
Hi Wei,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on mst-vhost/linux-next]
[also build test WARNING on net-next/master net/master linus/master v5.16-rc2
next-20211125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url:
https://github.com/0day-ci/linux/commits/Wei-Wang/virtio-vsock-fix-the-transport-to-work-with-VMADDR_CID_ANY/20211125-163238
base: https://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git linux-next
config: riscv-allyesconfig
(https://download.01.org/0day-ci/archive/20211126/202111260614.IaGWVZYm-lkp at
intel.com/config)
compiler: riscv64-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O
~/bin/make.cross
chmod +x ~/bin/make.cross
#
https://github.com/0day-ci/linux/commit/007dbd2e6e604bf8b17a4cec1357113a26983838
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review
Wei-Wang/virtio-vsock-fix-the-transport-to-work-with-VMADDR_CID_ANY/20211125-163238
git checkout 007dbd2e6e604bf8b17a4cec1357113a26983838
# save the config file to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross
ARCH=riscv
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp at intel.com>
All warnings (new ones prefixed by >>):
net/vmw_vsock/virtio_transport_common.c: In function
'virtio_transport_recv_pkt':>> net/vmw_vsock/virtio_transport_common.c:1246:28: warning: variable
'vsk' set but not used [-Wunused-but-set-variable]
1246 | struct vsock_sock *vsk;
| ^~~
vim +/vsk +1246 net/vmw_vsock/virtio_transport_common.c
e4b1ef152f53d5e Arseny Krasnov 2021-06-11 1238
06a8fc78367d070 Asias He 2016-07-28 1239 /* We are under the
virtio-vsock's vsock->rx_lock or vhost-vsock's vq->mutex
06a8fc78367d070 Asias He 2016-07-28 1240 * lock.
06a8fc78367d070 Asias He 2016-07-28 1241 */
4c7246dc45e2706 Stefano Garzarella 2019-11-14 1242 void
virtio_transport_recv_pkt(struct virtio_transport *t,
4c7246dc45e2706 Stefano Garzarella 2019-11-14 1243 struct
virtio_vsock_pkt *pkt)
06a8fc78367d070 Asias He 2016-07-28 1244 {
06a8fc78367d070 Asias He 2016-07-28 1245 struct sockaddr_vm src,
dst;
06a8fc78367d070 Asias He 2016-07-28 @1246 struct vsock_sock *vsk;
06a8fc78367d070 Asias He 2016-07-28 1247 struct sock *sk;
06a8fc78367d070 Asias He 2016-07-28 1248 bool space_available;
06a8fc78367d070 Asias He 2016-07-28 1249
f83f12d660d1171 Michael S. Tsirkin 2016-12-06 1250 vsock_addr_init(&src,
le64_to_cpu(pkt->hdr.src_cid),
06a8fc78367d070 Asias He 2016-07-28 1251
le32_to_cpu(pkt->hdr.src_port));
f83f12d660d1171 Michael S. Tsirkin 2016-12-06 1252 vsock_addr_init(&dst,
le64_to_cpu(pkt->hdr.dst_cid),
06a8fc78367d070 Asias He 2016-07-28 1253
le32_to_cpu(pkt->hdr.dst_port));
06a8fc78367d070 Asias He 2016-07-28 1254
06a8fc78367d070 Asias He 2016-07-28 1255
trace_virtio_transport_recv_pkt(src.svm_cid, src.svm_port,
06a8fc78367d070 Asias He 2016-07-28 1256 dst.svm_cid,
dst.svm_port,
06a8fc78367d070 Asias He 2016-07-28 1257
le32_to_cpu(pkt->hdr.len),
06a8fc78367d070 Asias He 2016-07-28 1258
le16_to_cpu(pkt->hdr.type),
06a8fc78367d070 Asias He 2016-07-28 1259
le16_to_cpu(pkt->hdr.op),
06a8fc78367d070 Asias He 2016-07-28 1260
le32_to_cpu(pkt->hdr.flags),
06a8fc78367d070 Asias He 2016-07-28 1261
le32_to_cpu(pkt->hdr.buf_alloc),
06a8fc78367d070 Asias He 2016-07-28 1262
le32_to_cpu(pkt->hdr.fwd_cnt));
06a8fc78367d070 Asias He 2016-07-28 1263
e4b1ef152f53d5e Arseny Krasnov 2021-06-11 1264 if
(!virtio_transport_valid_type(le16_to_cpu(pkt->hdr.type))) {
4c7246dc45e2706 Stefano Garzarella 2019-11-14 1265
(void)virtio_transport_reset_no_sock(t, pkt);
06a8fc78367d070 Asias He 2016-07-28 1266 goto free_pkt;
06a8fc78367d070 Asias He 2016-07-28 1267 }
06a8fc78367d070 Asias He 2016-07-28 1268
06a8fc78367d070 Asias He 2016-07-28 1269 /* The socket must be in
connected or bound table
06a8fc78367d070 Asias He 2016-07-28 1270 * otherwise send reset
back
06a8fc78367d070 Asias He 2016-07-28 1271 */
06a8fc78367d070 Asias He 2016-07-28 1272 sk =
vsock_find_connected_socket(&src, &dst);
06a8fc78367d070 Asias He 2016-07-28 1273 if (!sk) {
06a8fc78367d070 Asias He 2016-07-28 1274 sk =
vsock_find_bound_socket(&dst);
06a8fc78367d070 Asias He 2016-07-28 1275 if (!sk) {
4c7246dc45e2706 Stefano Garzarella 2019-11-14 1276
(void)virtio_transport_reset_no_sock(t, pkt);
06a8fc78367d070 Asias He 2016-07-28 1277 goto free_pkt;
06a8fc78367d070 Asias He 2016-07-28 1278 }
06a8fc78367d070 Asias He 2016-07-28 1279 }
06a8fc78367d070 Asias He 2016-07-28 1280
e4b1ef152f53d5e Arseny Krasnov 2021-06-11 1281 if
(virtio_transport_get_type(sk) != le16_to_cpu(pkt->hdr.type)) {
e4b1ef152f53d5e Arseny Krasnov 2021-06-11 1282
(void)virtio_transport_reset_no_sock(t, pkt);
e4b1ef152f53d5e Arseny Krasnov 2021-06-11 1283 sock_put(sk);
e4b1ef152f53d5e Arseny Krasnov 2021-06-11 1284 goto free_pkt;
e4b1ef152f53d5e Arseny Krasnov 2021-06-11 1285 }
e4b1ef152f53d5e Arseny Krasnov 2021-06-11 1286
06a8fc78367d070 Asias He 2016-07-28 1287 vsk = vsock_sk(sk);
06a8fc78367d070 Asias He 2016-07-28 1288
06a8fc78367d070 Asias He 2016-07-28 1289 lock_sock(sk);
06a8fc78367d070 Asias He 2016-07-28 1290
3fe356d58efae54 Stefano Garzarella 2020-11-20 1291 /* Check if sk has been
closed before lock_sock */
3fe356d58efae54 Stefano Garzarella 2020-11-20 1292 if (sock_flag(sk,
SOCK_DONE)) {
8692cefc433f282 Jia He 2020-05-30 1293
(void)virtio_transport_reset_no_sock(t, pkt);
8692cefc433f282 Jia He 2020-05-30 1294 release_sock(sk);
8692cefc433f282 Jia He 2020-05-30 1295 sock_put(sk);
8692cefc433f282 Jia He 2020-05-30 1296 goto free_pkt;
8692cefc433f282 Jia He 2020-05-30 1297 }
8692cefc433f282 Jia He 2020-05-30 1298
ce7536bc7398e2a Stefano Garzarella 2021-02-08 1299 space_available =
virtio_transport_space_update(sk, pkt);
ce7536bc7398e2a Stefano Garzarella 2021-02-08 1300
06a8fc78367d070 Asias He 2016-07-28 1301 if (space_available)
06a8fc78367d070 Asias He 2016-07-28 1302
sk->sk_write_space(sk);
06a8fc78367d070 Asias He 2016-07-28 1303
06a8fc78367d070 Asias He 2016-07-28 1304 switch (sk->sk_state) {
3b4477d2dcf2709 Stefan Hajnoczi 2017-10-05 1305 case TCP_LISTEN:
c0cfa2d8a788fcf Stefano Garzarella 2019-11-14 1306
virtio_transport_recv_listen(sk, pkt, t);
06a8fc78367d070 Asias He 2016-07-28 1307
virtio_transport_free_pkt(pkt);
06a8fc78367d070 Asias He 2016-07-28 1308 break;
3b4477d2dcf2709 Stefan Hajnoczi 2017-10-05 1309 case TCP_SYN_SENT:
06a8fc78367d070 Asias He 2016-07-28 1310
virtio_transport_recv_connecting(sk, pkt);
06a8fc78367d070 Asias He 2016-07-28 1311
virtio_transport_free_pkt(pkt);
06a8fc78367d070 Asias He 2016-07-28 1312 break;
3b4477d2dcf2709 Stefan Hajnoczi 2017-10-05 1313 case TCP_ESTABLISHED:
06a8fc78367d070 Asias He 2016-07-28 1314
virtio_transport_recv_connected(sk, pkt);
06a8fc78367d070 Asias He 2016-07-28 1315 break;
3b4477d2dcf2709 Stefan Hajnoczi 2017-10-05 1316 case TCP_CLOSING:
06a8fc78367d070 Asias He 2016-07-28 1317
virtio_transport_recv_disconnecting(sk, pkt);
06a8fc78367d070 Asias He 2016-07-28 1318
virtio_transport_free_pkt(pkt);
06a8fc78367d070 Asias He 2016-07-28 1319 break;
06a8fc78367d070 Asias He 2016-07-28 1320 default:
df12eb6d6cd920a Sebastien Boeuf 2020-02-14 1321
(void)virtio_transport_reset_no_sock(t, pkt);
06a8fc78367d070 Asias He 2016-07-28 1322
virtio_transport_free_pkt(pkt);
06a8fc78367d070 Asias He 2016-07-28 1323 break;
06a8fc78367d070 Asias He 2016-07-28 1324 }
c0cfa2d8a788fcf Stefano Garzarella 2019-11-14 1325
06a8fc78367d070 Asias He 2016-07-28 1326 release_sock(sk);
06a8fc78367d070 Asias He 2016-07-28 1327
06a8fc78367d070 Asias He 2016-07-28 1328 /* Release refcnt obtained
when we fetched this socket out of the
06a8fc78367d070 Asias He 2016-07-28 1329 * bound or connected
list.
06a8fc78367d070 Asias He 2016-07-28 1330 */
06a8fc78367d070 Asias He 2016-07-28 1331 sock_put(sk);
06a8fc78367d070 Asias He 2016-07-28 1332 return;
06a8fc78367d070 Asias He 2016-07-28 1333
06a8fc78367d070 Asias He 2016-07-28 1334 free_pkt:
06a8fc78367d070 Asias He 2016-07-28 1335
virtio_transport_free_pkt(pkt);
06a8fc78367d070 Asias He 2016-07-28 1336 }
06a8fc78367d070 Asias He 2016-07-28 1337
EXPORT_SYMBOL_GPL(virtio_transport_recv_pkt);
06a8fc78367d070 Asias He 2016-07-28 1338
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all at lists.01.org