The segment routing use case is built on an older internal release of ONOS (Sept 2014). The following instructions do not apply to ONOS 1.0.0 (Avocet), and are meant only for the SPRING-OPEN project. |
There is no IP network in the world that can run without configuration. In SPRING-OPEN, instead of configuring each switch individually (with IP addresses, subnets, labels etc.) we configure the controller. Such configuration should be possible via the controller CLI. However we have limited configuration capabilities currently in the controller CLI (just tunnels and policies). Thus all startup-configuration happens via a configuration file loaded at controller startup. Please note that without this config file (or with the wrong config file) the network will not work correctly.
First you need to edit ~/spring-open/conf/onos.properties
If you create a new network configuration file, you need to specify the file in net.onrc.onos.core.configmanager.NetworkConfigManager.networkConfigFile field. In the example below, conf/sr-3node.conf file was specified.
floodlight.modules = net.floodlightcontroller.core.FloodlightProvider,\ net.floodlightcontroller.threadpool.ThreadPool,\ net.onrc.onos.core.topology.TopologyPublisher, \ net.onrc.onos.core.datagrid.HazelcastDatagrid,\ net.onrc.onos.core.flowprogrammer.FlowProgrammer,\ net.onrc.onos.core.intent.runtime.PathCalcRuntimeModule,\ net.onrc.onos.core.intent.runtime.PlanInstallModule,\ net.onrc.onos.core.registry.ZookeeperRegistry, \ net.onrc.onos.core.metrics.OnosMetricsModule, \ net.onrc.onos.apps.websocket.WebSocketModule, \ net.onrc.onos.core.main.config.DefaultConfiguration, \ net.onrc.onos.apps.segmentrouting.SegmentRoutingManager net.floodlightcontroller.restserver.RestApiServer.port = 8080 net.floodlightcontroller.core.FloodlightProvider.openflowport = 6633 net.floodlightcontroller.core.FloodlightProvider.workerthreads = 16 net.floodlightcontroller.core.FloodlightProvider.cpqdUsePipeline13 = true net.floodlightcontroller.forwarding.Forwarding.idletimeout = 5 net.floodlightcontroller.forwarding.Forwarding.hardtimeout = 0 net.onrc.onos.apps.websocket.WebSocketModule.port = 8081 net.floodlightcontroller.core.FloodlightProvider.cpqdUsePipeline13 = true # NOTE: Do NOT modify or remove the line below. This value will be overwritten by onos.sh script. net.onrc.onos.core.datagrid.HazelcastDatagrid.datagridConfig = # Uncomment and list all the ZooKeeper instances after localhost on multi-instance deployment. #net.onrc.onos.core.registry.ZookeeperRegistry.connectionString = localhost:2181,otherhost:2181 # Specify a network configuration file to be used by the NetworkConfigManager net.onrc.onos.core.configmanager.NetworkConfigManager.networkConfigFile = conf/sr-3node.conf |
Then, edit network configuration file
The following example (sr-3node.conf) shows the network configuration for the topology with three switches and three links (refer to figure below).
{ "comment": " Segment routing topology description and configuration", "restrictSwitches": true, "restrictLinks": true, "switchConfig": [ { "nodeDpid": "00:01", "name": "Dallas-R1", "type": "Router_SR", "allowed": true, "latitude": 80.80, "longitude": 90.10, "params": { "routerIp": "192.168.0.1/32", "routerMac": "00:00:01:01:01:80", "nodeSid": 101, "isEdgeRouter" : true, "subnets": [ { "portNo": 1, "subnetIp": "10.0.1.128/24" }, { "portNo": 4, "subnetIp": "10.0.2.128/24" }, { "portNo": 5, "subnetIp": "10.0.3.128/24" } ], "adjacencySids": [ { "adjSid": 77777, "ports": [ 6 ,7 ] } ] } }, { "nodeDpid": "00:02", "name": "Dallas-R2", "type": "Router_SR", "allowed": true, "latitude": 80.80, "longitude": 90.10, "params": { "routerIp": "192.168.0.2/32", "routerMac": "00:00:02:02:02:80", "nodeSid": 102, "isEdgeRouter" : false } }, { "nodeDpid": "00:03", "name": "Dallas-R3", "type": "Router_SR", "allowed": true, "latitude": 80.80, "longitude": 90.10, "params": { "routerIp": "192.168.0.3/32", "routerMac": "00:00:07:07:07:80", "nodeSid": 103, "isEdgeRouter" : true, "subnets": [ { "portNo": 1, "subnetIp": "7.7.7.128/24" } ] } } ], "linkConfig":[ { "type": "pktLink", "allowed": true, "nodeDpid1": "01", "nodeDpid2": "02", "params": { "port1": 6, "port2": 1 } }, { "type": "pktLink", "allowed": true, "nodeDpid1": "01", "nodeDpid2": "02", "params": { "port1": 7, "port2": 3 } }, { "type": "pktLink", "allowed": true, "nodeDpid1": "02", "nodeDpid2": "03", "params": { "port1": 2, "port2": 2 } } ] } |
Here is what you need to know for network configuration:
The first two lines are global params
While the controller configuration allows a lot of flexibility, we have currently not tested configs where restrictSwitches and restrictLinks are not 'true'. In other words, only switches and links that are configured are 'allowed' in the network. We will always need to configure the switches, but we do hope to remove the need for configuring links soon.
To configure the switches as Segment Routers we need to do the following
subnets (optional): subnet information (can be specified only if isEdgeRouter is true). Specify the interface ("portNo": 1) for the attached subnet ("subnetIp": "10.0.1.128/24"). In the example, port 1 is assigned the subnet 10.0.1.0/24, and the IP address assigned to the interface is 10.0.1.128/32. Only interfaces on which attached-subnets are configured need IP addresses. All other interfaces (i.e. those connected to other segment-routers) are consider unnumbered interfaces and do not need IP addresses.
adjSid: configure an Adjacency Segment ID. This is a locally significant label, assigned to more than one router interface. Note that the controller automatically assigns adjacency labels for single interfaces. Only when the operator needs an adjacency-label to represent more than one outgoing interface, should this be used. Please use a number between 10000 and 99999. In the example above, '77777' is used on ports 6 and 7.
To configure bidirectional links between Segment Routers we need to do the following (the need to do this configuration will be removed in the future)
To replicate the prototype shown in the videos with software switches, use this config file at the controller: sr-cpqd-full.conf. Note that you would also need to follow the directions to launch the related network topology in Mininet described in the config file.
To replicate the prototype shown in the videos with hardware switches, you would need to use a config file that reflects the DPIDs of the hardware switches in your setup. To see an example of the config file we used in our setup see: sr-dell-full.conf. Note that you would also need to follow the directions to launch an OpenFlow instance in the Dell Hardware.