Created
June 20, 2023 10:09
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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