From 8b957f4eeda9e58fc287750b333d28c585425626 Mon Sep 17 00:00:00 2001 From: Jordi Subira Nieto Date: Thu, 29 Feb 2024 15:46:13 +0100 Subject: [PATCH] pass refactor topology endhost_port_range --- acceptance/router_multi/conf/topology.json | 3 +- acceptance/topo_common/topology.json | 3 +- .../testdata/topology_reload.json | 3 +- .../testdata/topology_reload.json | 3 +- control/beaconing/testdata/topology-core.json | 3 +- control/beaconing/testdata/topology.json | 3 +- .../hiddenpath/testdata/topology.json | 3 +- pkg/snet/snet.go | 8 +++- private/topology/json/json.go | 3 +- private/topology/json/json_test.go | 3 +- .../testdata/topology-deprecated-attrs.json | 3 +- private/topology/json/testdata/topology.json | 3 +- private/topology/testdata/basic.json | 3 +- private/topology/testdata/core.json | 3 +- private/topology/topology.go | 40 ++++++++++++++----- router/control/testdata/topology.json | 3 +- tools/topology/config.py | 8 ++-- tools/topology/defines.py | 3 +- tools/topology/net.py | 2 +- tools/topology/topo.py | 9 ++--- 20 files changed, 57 insertions(+), 55 deletions(-) diff --git a/acceptance/router_multi/conf/topology.json b/acceptance/router_multi/conf/topology.json index f766349a25..fdb2bb11b9 100644 --- a/acceptance/router_multi/conf/topology.json +++ b/acceptance/router_multi/conf/topology.json @@ -2,8 +2,7 @@ "isd_as": "1-ff00:0:1", "mtu": 1472, "attributes": [], - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "border_routers": { "brA": { "internal_addr": "192.168.0.11:30001", diff --git a/acceptance/topo_common/topology.json b/acceptance/topo_common/topology.json index cf7d69df28..3a66b2146d 100644 --- a/acceptance/topo_common/topology.json +++ b/acceptance/topo_common/topology.json @@ -1,8 +1,7 @@ { "isd_as": "1-ff00:0:110", "mtu": 1400, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [ "core" ], diff --git a/acceptance/topo_cs_reload/testdata/topology_reload.json b/acceptance/topo_cs_reload/testdata/topology_reload.json index 5aa41d421f..b7a52001b9 100644 --- a/acceptance/topo_cs_reload/testdata/topology_reload.json +++ b/acceptance/topo_cs_reload/testdata/topology_reload.json @@ -1,8 +1,7 @@ { "isd_as": "1-ff00:0:110", "mtu": 1400, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [ "core" ], diff --git a/acceptance/topo_daemon_reload/testdata/topology_reload.json b/acceptance/topo_daemon_reload/testdata/topology_reload.json index 1cc9fe9eac..15ebfd7c2f 100644 --- a/acceptance/topo_daemon_reload/testdata/topology_reload.json +++ b/acceptance/topo_daemon_reload/testdata/topology_reload.json @@ -1,8 +1,7 @@ { "isd_as": "1-ff00:0:110", "mtu": 1400, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [ "core" ], diff --git a/control/beaconing/testdata/topology-core.json b/control/beaconing/testdata/topology-core.json index 16aa404a3c..c87b30988f 100644 --- a/control/beaconing/testdata/topology-core.json +++ b/control/beaconing/testdata/topology-core.json @@ -1,8 +1,7 @@ { "isd_as": "1-ff00:0:110", "mtu": 1472, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [ "core" ], diff --git a/control/beaconing/testdata/topology.json b/control/beaconing/testdata/topology.json index a95a7d0867..e8a8adf82b 100644 --- a/control/beaconing/testdata/topology.json +++ b/control/beaconing/testdata/topology.json @@ -1,8 +1,7 @@ { "isd_as": "1-ff00:0:111", "mtu": 1472, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [], "border_routers": { "br1-ff00_0_111-1": { diff --git a/pkg/experimental/hiddenpath/testdata/topology.json b/pkg/experimental/hiddenpath/testdata/topology.json index b86100d64f..6ee0982216 100644 --- a/pkg/experimental/hiddenpath/testdata/topology.json +++ b/pkg/experimental/hiddenpath/testdata/topology.json @@ -1,8 +1,7 @@ { "isd_as": "1-ff00:0:111", "mtu": 1472, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [], "border_routers": { "br1-ff00_0_111-1": { diff --git a/pkg/snet/snet.go b/pkg/snet/snet.go index 84266c33c9..8e16697ad9 100644 --- a/pkg/snet/snet.go +++ b/pkg/snet/snet.go @@ -126,7 +126,7 @@ func listenUDPRange(addr *net.UDPAddr, start, end uint16) (*net.UDPConn, error) } return pconn, nil } - return nil, serrors.New("There are no UDP ports available in range", "start", start, "end", end) + return nil, serrors.WrapStr("binding to port range", syscall.EADDRINUSE) } var _ Network = (*SCIONNetwork)(nil) @@ -182,7 +182,11 @@ func (n *SCIONNetwork) Dial(ctx context.Context, network string, listen *net.UDP // // The context is used for connection setup, it doesn't affect the returned // connection. -func (n *SCIONNetwork) Listen(ctx context.Context, network string, listen *net.UDPAddr) (*Conn, error) { +func (n *SCIONNetwork) Listen( + ctx context.Context, + network string, + listen *net.UDPAddr, +) (*Conn, error) { metrics.CounterInc(n.Metrics.Listens) diff --git a/private/topology/json/json.go b/private/topology/json/json.go index fb133242d4..d1ab413c54 100644 --- a/private/topology/json/json.go +++ b/private/topology/json/json.go @@ -75,8 +75,7 @@ type Topology struct { TimestampHuman string `json:"timestamp_human,omitempty"` IA string `json:"isd_as"` MTU int `json:"mtu"` - EndhostStartPort int `json:"endhost_start_port"` - EndhostEndPort int `json:"endhost_end_port"` + EndhostPortRange string `json:"endhost_port_range"` // Attributes specify whether this is a core AS or not. Attributes Attributes `json:"attributes"` BorderRouters map[string]*BRInfo `json:"border_routers,omitempty"` diff --git a/private/topology/json/json_test.go b/private/topology/json/json_test.go index a2673dee5a..38b66933b0 100644 --- a/private/topology/json/json_test.go +++ b/private/topology/json/json_test.go @@ -41,8 +41,7 @@ func TestLoadRawFromFile(t *testing.T) { TimestampHuman: "May 6 00:00:00 CET 1975", IA: "6-ff00:0:362", MTU: 1472, - EndhostStartPort: 1024, - EndhostEndPort: 1<<16 - 1, + EndhostPortRange: "1024-65535", Attributes: []jsontopo.Attribute{jsontopo.AttrCore}, BorderRouters: map[string]*jsontopo.BRInfo{ "borderrouter6-f00:0:362-1": { diff --git a/private/topology/json/testdata/topology-deprecated-attrs.json b/private/topology/json/testdata/topology-deprecated-attrs.json index d38e1ee8b1..04bf147bf8 100644 --- a/private/topology/json/testdata/topology-deprecated-attrs.json +++ b/private/topology/json/testdata/topology-deprecated-attrs.json @@ -3,8 +3,7 @@ "timestamp_human": "May 6 00:00:00 CET 1975", "isd_as": "6-ff00:0:362", "mtu": 1472, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [ "authoritative", "core", diff --git a/private/topology/json/testdata/topology.json b/private/topology/json/testdata/topology.json index c80dde9165..9747cb4ee7 100644 --- a/private/topology/json/testdata/topology.json +++ b/private/topology/json/testdata/topology.json @@ -3,8 +3,7 @@ "timestamp_human": "May 6 00:00:00 CET 1975", "isd_as": "6-ff00:0:362", "mtu": 1472, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [ "core" ], diff --git a/private/topology/testdata/basic.json b/private/topology/testdata/basic.json index 941ae8efe1..42999f80d1 100644 --- a/private/topology/testdata/basic.json +++ b/private/topology/testdata/basic.json @@ -3,8 +3,7 @@ "timestamp_human": "1975-05-06 01:02:03.000000+0000", "isd_as": "1-ff00:0:311", "mtu": 1472, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [], "border_routers": { "br1-ff00:0:311-1": { diff --git a/private/topology/testdata/core.json b/private/topology/testdata/core.json index 9bd1e18d6e..5f9e0ee745 100644 --- a/private/topology/testdata/core.json +++ b/private/topology/testdata/core.json @@ -3,8 +3,7 @@ "timestamp_human": "May 6 00:00:00 CET 1975", "isd_as": "6-ff00:0:362", "mtu": 1472, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [ "core" ], diff --git a/private/topology/topology.go b/private/topology/topology.go index a00225e00d..438884110a 100644 --- a/private/topology/topology.go +++ b/private/topology/topology.go @@ -22,6 +22,8 @@ import ( "net" "os" "sort" + "strconv" + "strings" "time" "github.com/scionproto/scion/pkg/addr" @@ -205,18 +207,10 @@ func (t *RWTopology) populateMeta(raw *jsontopo.Topology) error { } t.MTU = raw.MTU - if raw.EndhostStartPort < 1 || raw.EndhostStartPort > (1<<16-1) { - return serrors.New("Invalid value for start port", "start port", raw.EndhostStartPort) - } - if raw.EndhostEndPort < 1 || raw.EndhostEndPort > (1<<16-1) { - return serrors.New("Invalid value for end port", "end port", raw.EndhostEndPort) - } - if raw.EndhostStartPort > raw.EndhostEndPort { - return serrors.New("Start port is bigger than end port for the SCION port range", - "start port", raw.EndhostStartPort, "end port", raw.EndhostEndPort) + t.EndhostStartPort, t.EndhostEndPort, err = validatePortRange(raw.EndhostPortRange) + if err != nil { + return err } - t.EndhostStartPort = uint16(raw.EndhostStartPort) - t.EndhostEndPort = uint16(raw.EndhostEndPort) isCore := false for _, attr := range raw.Attributes { @@ -229,6 +223,30 @@ func (t *RWTopology) populateMeta(raw *jsontopo.Topology) error { return nil } +func validatePortRange(portRange string) (uint16, uint16, error) { + ports := strings.Split(portRange, "-") + if len(ports) != 2 { + return 0, 0, serrors.New("invalid format: expected startPort-endPort", "got", portRange) + } + startPort, errStart := strconv.Atoi(ports[0]) + endPort, errEnd := strconv.Atoi(ports[1]) + if errStart != nil || errEnd != nil { + return 0, 0, serrors.New("invalid port numbers", "got", portRange) + } + + if startPort < 1 || startPort > (1<<16-1) { + return 0, 0, serrors.New("Invalid value for start port", "start port", startPort) + } + if endPort < 1 || endPort > (1<<16-1) { + return 0, 0, serrors.New("Invalid value for end port", "end port", endPort) + } + if startPort > endPort { + return 0, 0, serrors.New("Start port is bigger than end port for the SCION port range", + "start port", startPort, "end port", endPort) + } + return uint16(startPort), uint16(endPort), nil +} + func (t *RWTopology) populateBR(raw *jsontopo.Topology) error { for name, rawBr := range raw.BorderRouters { if rawBr.InternalAddr == "" { diff --git a/router/control/testdata/topology.json b/router/control/testdata/topology.json index 9e078f84c9..494c650f36 100644 --- a/router/control/testdata/topology.json +++ b/router/control/testdata/topology.json @@ -1,8 +1,7 @@ { "isd_as": "1-ff00:0:110", "mtu": 1472, - "endhost_start_port": 1024, - "endhost_end_port": 65535, + "endhost_port_range": "1024-65535", "attributes": [ "core" ], diff --git a/tools/topology/config.py b/tools/topology/config.py index f0ed4afe31..1031b59c03 100644 --- a/tools/topology/config.py +++ b/tools/topology/config.py @@ -31,8 +31,7 @@ DEFAULT_MTU, DEFAULT6_NETWORK, NETWORKS_FILE, - DEFAULT_ENDHOST_START_PORT, - DEFAULT_ENDHOST_END_PORT, + DEFAULT_ENDHOST_PORT_RANGE, ) from topology.scion_addr import ISD_AS from topology.util import write_file @@ -88,8 +87,7 @@ def _read_defaults(self, network): self.subnet_gen4 = SubnetGenerator(DEFAULT_NETWORK, self.args.docker) self.subnet_gen6 = SubnetGenerator(DEFAULT6_NETWORK, self.args.docker) self.default_mtu = defaults.get("mtu", DEFAULT_MTU) - self.endhost_start_port = defaults.get("endhost_start_port", DEFAULT_ENDHOST_START_PORT) - self.endhost_end_port = defaults.get("endhost_end_port", DEFAULT_ENDHOST_END_PORT) + self.endhost_port_range = defaults.get("endhost_port_range", DEFAULT_ENDHOST_PORT_RANGE) def generate_all(self): """ @@ -151,7 +149,7 @@ def _generate_topology(self): def _topo_args(self): return TopoGenArgs(self.args, self.topo_config, self.subnet_gen4, self.subnet_gen6, self.default_mtu, - self.endhost_start_port, self.endhost_end_port) + self.endhost_port_range) def _generate_supervisor(self, topo_dicts): args = self._supervisor_args(topo_dicts) diff --git a/tools/topology/defines.py b/tools/topology/defines.py index 5ab580fcc4..86b0f080f3 100644 --- a/tools/topology/defines.py +++ b/tools/topology/defines.py @@ -33,8 +33,7 @@ #: Default SCION router UDP port. SCION_ROUTER_PORT = 50000 -DEFAULT_ENDHOST_START_PORT = 1024 -DEFAULT_ENDHOST_END_PORT = (1 << 16) - 1 +DEFAULT_ENDHOST_PORT_RANGE = "1024-65535" #: Default MTU - assumes overlay is ipv4+udp DEFAULT_MTU = 1500 - 20 - 8 diff --git a/tools/topology/net.py b/tools/topology/net.py index 88ca39af42..1eba6ac1c6 100644 --- a/tools/topology/net.py +++ b/tools/topology/net.py @@ -177,7 +177,7 @@ def _exclude_net(self, alloc, net): class PortGenerator(object): # TODO(JordiSubira): It probably makes more sense to also feed the port - # range for CP services, so that it is within [endhost_start_port, endhost_end_port] + # range for CP services, so that it is within endhost_port_range def __init__(self): self.iter = iter(range(31000, 35000)) self._ports = defaultdict(lambda: next(self.iter)) diff --git a/tools/topology/topo.py b/tools/topology/topo.py index 155ed7b1ee..3a64f181b8 100644 --- a/tools/topology/topo.py +++ b/tools/topology/topo.py @@ -67,8 +67,7 @@ def __init__(self, subnet_gen4: SubnetGenerator, subnet_gen6: SubnetGenerator, default_mtu: int, - start_port: int, - end_port: int): + endhost_port_range: str): """ :param ArgsBase args: Contains the passed command line arguments. :param dict topo_config: The parsed topology config. @@ -83,8 +82,7 @@ def __init__(self, ADDR_TYPE_6: subnet_gen6, } self.default_mtu = default_mtu - self.endhost_start_port = start_port - self.endhost_end_port = end_port + self.endhost_port_range = endhost_port_range self.port_gen = PortGenerator() @@ -247,8 +245,7 @@ def _generate_as_topo(self, topo_id, as_conf): 'isd_as': str(topo_id), 'mtu': mtu, 'test_dispatcher': as_conf.get('test_dispatcher', True), - 'endhost_start_port': as_conf.get('endhost_start_port', self.args.endhost_start_port), - 'endhost_end_port': as_conf.get('endhost_end_port', self.args.endhost_end_port), + 'endhost_port_range': as_conf.get('endhost_port_range', self.args.endhost_port_range), } for i in SCION_SERVICE_NAMES: self.topo_dicts[topo_id][i] = {}