Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stefano-garzarella/74d0432cd2c4f0e5cda7c11d3cc90181 to your computer and use it in GitHub Desktop.
Save stefano-garzarella/74d0432cd2c4f0e5cda7c11d3cc90181 to your computer and use it in GitHub Desktop.
Script to debug a vsock issue. This happen when a connecting socket is bound to a port in the guest, the guest close the socket while the host still have it opened.
#!/usr/bin/python3
import argparse
import sys
import socket
def vsock_server(vsock, args):
vsock.listen()
while True:
vsock_name = vsock.getsockname()
print(f"Waiting on CID: {vsock_name[0]} port: {vsock_name[1]}")
conn, _ = vsock.accept()
print(conn.getpeername())
data = []
while (buf := conn.recv(4096)):
data.append(buf)
# Adding s.close() here fixes the issue
if args.fix:
print("socket closed")
conn.close()
def vsock_client(vsock, args):
vsock.connect((args.host, args.port))
vsock.send(b'Hello, world!\n')
vsock.close()
def parse_args():
parser = argparse.ArgumentParser(
description='VSOCK tests',
epilog='Please report bugs to Stefano Garzarella <sgarzare@redhat.com>.')
group = parser.add_mutually_exclusive_group()
group.add_argument('-s', '--server', dest='server',
action='store_true', default=False,
help='run in server more, listening on port')
group.add_argument('-c', '--client', dest='host', type=str,
help='run in client mode, connecting to HOST')
parser.add_argument('-p', '--port', dest='port', type=int,
help='server port to connect to')
parser.add_argument('--fix', dest='fix',
action='store_true', default=False,
help='enable fix: close socket on the server')
parser.add_argument('--tcp', dest='tcp',
action='store_true', default=False,
help='use tcp instead of vsock')
parser.add_argument('--bind-port', dest='bind_port', type=int, default=socket.VMADDR_PORT_ANY,
help='PORT to bind')
return parser.parse_args()
def main():
args = parse_args()
print(args)
if args.tcp:
if args.bind_port == socket.VMADDR_PORT_ANY:
args.bind_port = 0
vsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
vsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
vsock.bind(('localhost', args.bind_port))
else:
vsock = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
vsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
vsock.bind((socket.VMADDR_CID_ANY, args.bind_port))
if args.host is not None:
args.host=int(args.host)
if args.server:
vsock_server(vsock, args)
elif args.host is not None:
vsock_client(vsock, args)
return 0
if __name__ == '__main__':
sys.exit(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment