Skip to content

Commit

Permalink
tools/comm_udp/litex_server: add --udp-scan args to scan network for …
Browse files Browse the repository at this point in the history
…available Etherbone/UDP devices.

litex_server --udp --udp-scan --udp-ip=192.168.1.x --udp-port=1234
Etherbone scan on 192.168.1.x network:
- 192.168.1.20
- 192.168.1.50
  • Loading branch information
enjoy-digital committed Nov 26, 2020
1 parent 4a748a5 commit b02753e
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 16 deletions.
18 changes: 15 additions & 3 deletions litex/tools/litex_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ def main():
parser.add_argument("--udp", action="store_true", help="Select UDP interface")
parser.add_argument("--udp-ip", default="192.168.1.50", help="Set UDP remote IP address")
parser.add_argument("--udp-port", default=1234, help="Set UDP remote port")
parser.add_argument("--udp-scan", action="store_true", help="Scan network for available UDP devices.")

# PCIe arguments
parser.add_argument("--pcie", action="store_true", help="Select PCIe interface")
Expand Down Expand Up @@ -205,10 +206,21 @@ def main():
# UDP mode
elif args.udp:
from litex.tools.remote.comm_udp import CommUDP
udp_ip = args.udp_ip
udp_ip = args.udp_ip
udp_port = int(args.udp_port)
print("[CommUDP] ip: {} / port: {} / ".format(udp_ip, udp_port), end="")
comm = CommUDP(udp_ip, udp_port, debug=args.debug)
if args.udp_scan:
udp_ip = udp_ip.split(".")
assert len(udp_ip) == 4
udp_ip[3] = "x"
udp_ip = ".".join(udp_ip)
comm = CommUDP(udp_ip, udp_port, debug=args.debug)
comm.open(probe=False)
comm.scan(udp_ip)
comm.close()
exit()
else:
print("[CommUDP] ip: {} / port: {} / ".format(udp_ip, udp_port), end="")
comm = CommUDP(udp_ip, udp_port, debug=args.debug)

# PCIe mode
elif args.pcie:
Expand Down
39 changes: 26 additions & 13 deletions litex/tools/remote/comm_udp.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#
# This file is part of LiteX.
#
# Copyright (c) 2015-2019 Florent Kermarrec <[email protected]>
# Copyright (c) 2015-2020 Florent Kermarrec <[email protected]>
# Copyright (c) 2016 Tim 'mithro' Ansell <[email protected]>
# SPDX-License-Identifier: BSD-2-Clause

Expand All @@ -21,36 +21,49 @@ def __init__(self, server="192.168.1.50", port=1234, csr_csv=None, debug=False):
self.port = port
self.debug = debug

def open(self):
def open(self, probe=True):
if hasattr(self, "socket"):
return
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.socket.bind(("", self.port))
self.socket.settimeout(1)
self.probe()
if probe:
self.probe(self.server, self.port)

def close(self):
if not hasattr(self, "socket"):
return
self.socket.close()
del self.socket

def probe(self):
# Send probe request to server...
packet = EtherbonePacket()
packet.pf = 1
packet.encode()
self.socket.sendto(packet.bytes, (self.server, self.port))

# ...and get/check server's response.
def probe(self, ip, port, loose=False):
try:
# Send probe request to server...
packet = EtherbonePacket()
packet.pf = 1
packet.encode()
self.socket.sendto(packet.bytes, (ip, port))

# ...and get/check server's response.
datas, dummy = self.socket.recvfrom(8192)
packet = EtherbonePacket(datas)
packet.decode()
assert packet.pr == 1
return 1
except:
self.close()
raise Exception(f"Unable to probe Etherbone server at {self.server}.")
if not loose:
self.close()
raise Exception(f"Unable to probe Etherbone server at {self.server}.")
return 0

def scan(self, ip="192.168.1.x"):
print(f"Etherbone scan on {ip} network:")
ip = ip.replace("x", "{}")
self.socket.settimeout(0.01)
for i in range(1, 255):
if self.probe(ip=ip.format(str(i)), port=self.port, loose=True):
print("- {}".format(ip.format(i)))
self.socket.settimeout(1)

def read(self, addr, length=None, burst="incr"):
assert burst == "incr"
Expand Down

0 comments on commit b02753e

Please sign in to comment.