xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/bpf/tcp_server.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/usr/bin/env python3
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun
6*4882a593Smuzhiyunimport sys, os, os.path, getopt
7*4882a593Smuzhiyunimport socket, time
8*4882a593Smuzhiyunimport subprocess
9*4882a593Smuzhiyunimport select
10*4882a593Smuzhiyun
11*4882a593Smuzhiyundef read(sock, n):
12*4882a593Smuzhiyun    buf = b''
13*4882a593Smuzhiyun    while len(buf) < n:
14*4882a593Smuzhiyun        rem = n - len(buf)
15*4882a593Smuzhiyun        try: s = sock.recv(rem)
16*4882a593Smuzhiyun        except (socket.error) as e: return b''
17*4882a593Smuzhiyun        buf += s
18*4882a593Smuzhiyun    return buf
19*4882a593Smuzhiyun
20*4882a593Smuzhiyundef send(sock, s):
21*4882a593Smuzhiyun    total = len(s)
22*4882a593Smuzhiyun    count = 0
23*4882a593Smuzhiyun    while count < total:
24*4882a593Smuzhiyun        try: n = sock.send(s)
25*4882a593Smuzhiyun        except (socket.error) as e: n = 0
26*4882a593Smuzhiyun        if n == 0:
27*4882a593Smuzhiyun            return count;
28*4882a593Smuzhiyun        count += n
29*4882a593Smuzhiyun    return count
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun
32*4882a593SmuzhiyunSERVER_PORT = 12877
33*4882a593SmuzhiyunMAX_PORTS = 2
34*4882a593Smuzhiyun
35*4882a593SmuzhiyunserverPort = SERVER_PORT
36*4882a593SmuzhiyunserverSocket = None
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun# create passive socket
39*4882a593SmuzhiyunserverSocket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
40*4882a593Smuzhiyun
41*4882a593Smuzhiyuntry: serverSocket.bind(('::1', 0))
42*4882a593Smuzhiyunexcept socket.error as msg:
43*4882a593Smuzhiyun    print('bind fails: ' + str(msg))
44*4882a593Smuzhiyun
45*4882a593Smuzhiyunsn = serverSocket.getsockname()
46*4882a593SmuzhiyunserverPort = sn[1]
47*4882a593Smuzhiyun
48*4882a593SmuzhiyuncmdStr = ("./tcp_client.py %d &") % (serverPort)
49*4882a593Smuzhiyunos.system(cmdStr)
50*4882a593Smuzhiyun
51*4882a593Smuzhiyunbuf = b''
52*4882a593Smuzhiyunn = 0
53*4882a593Smuzhiyunwhile n < 500:
54*4882a593Smuzhiyun    buf += b'.'
55*4882a593Smuzhiyun    n += 1
56*4882a593Smuzhiyun
57*4882a593SmuzhiyunserverSocket.listen(MAX_PORTS)
58*4882a593SmuzhiyunreadList = [serverSocket]
59*4882a593Smuzhiyun
60*4882a593Smuzhiyunwhile True:
61*4882a593Smuzhiyun    readyRead, readyWrite, inError = \
62*4882a593Smuzhiyun        select.select(readList, [], [], 2)
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun    if len(readyRead) > 0:
65*4882a593Smuzhiyun        waitCount = 0
66*4882a593Smuzhiyun        for sock in readyRead:
67*4882a593Smuzhiyun            if sock == serverSocket:
68*4882a593Smuzhiyun                (clientSocket, address) = serverSocket.accept()
69*4882a593Smuzhiyun                address = str(address[0])
70*4882a593Smuzhiyun                readList.append(clientSocket)
71*4882a593Smuzhiyun            else:
72*4882a593Smuzhiyun                sock.settimeout(1);
73*4882a593Smuzhiyun                s = read(sock, 1000)
74*4882a593Smuzhiyun                n = send(sock, buf)
75*4882a593Smuzhiyun                sock.close()
76*4882a593Smuzhiyun                serverSocket.close()
77*4882a593Smuzhiyun                sys.exit(0)
78*4882a593Smuzhiyun    else:
79*4882a593Smuzhiyun        print('Select timeout!')
80*4882a593Smuzhiyun        sys.exit(1)
81