[ Previous Section | Documentation Home | Next Section ]
Synopsis
This section describes the classes and packages used by OVX to represent various network elements and OpenFlow messages.
2.1 Overview
2.2 Component State Machines
2.3 Component Persistence
2.4 Switches
2.5 Ports
2.6 Links and Routes
2.7 Addresses
2.8 Hosts
2.9 Network Topologies
2.10 Shared Global Mappings
2.11 Messages
2.1 Overview
OVX network representations, both phsyical and virtual, are a collection of switch, port, link, host, and address objects. To a tenant, these components appear no different from actual datapaths, ports, links, and hosts. The global map described in the previous section builds n-to-1 mappings between objects representing physical and virtual components to map tenant topologies onto the infrastructure.
In order to reduce confusion about infrastructure and OVX objects, we follow several conventions throughout these docs:
- ‘infrastructure’ refers to an operator or provider’s actual network
- ‘datapath’ will always be used with respect to infrastructure, with ‘switch’ used interchangeably
- ‘network’ by itself refers to the infrastructure, with ‘physical network’ and ‘virtual network’ referring to OVX’s representation
- Anything capitalised, such as ‘Switch’ and ‘Link’, are OVX constructs.
- ‘tenant controller’,’controller’,’Network OS’, and ‘NOS’ are used interchangeably.
2.1.1 Implementing Classes
The current iteration of OVX is implemented in Java. The components are defined as classes within packages under [net.onrc.openvirtex.elements.*], and each component is defined by a base class. The base classes are shown in the table below.
Base Class | Representation | Definition |
---|---|---|
Network | The full network topology | public abstract class Network<T1 extends Switch, T2 extends Port, T3 extends Link> |
Switch | A switch | public abstract class Switch<T extends Port> |
Port | A port on a switch | public class Port<T1 extends Switch, T2 extends Link> |
Link | A connection between two ports | public abstract class Link<T1 extends Port, T2 extends Switch> |
Host | A network host | public class Host |
IPAddress | An IP Address | public abstract class IPAddress |
These classes are subclassed to implement physical and virtual versions of each component. The current component classes, and their parent classes, are shown below:
Base Class | Physical Component Class | Virtual Component Class(es) |
---|---|---|
Network | PhysicalNetwork | OVXNetwork |
Switch | PhysicalSwitch | OVXSwitch (child classes OVXSingleSwitch, OVXBigSwitch) |
Port | PhysicalPort | OVXPort |
Link | PhysicalLink | OVXLink, SwitchRoute |
Host | – | Host |
IPAddress | PhysicalIPAddress | OVXIPAddress |
For example, ‘PhysicalPort’ is a port found on a switch in the network, and an ‘OVXSwitch’ is a virtual switch presented by OVX to a tenant. As a convention, most components that represent the infrastructure have names starting with ‘Physical’, and those in tenant networks, ‘OVX’. Note that Host only has a Virtual representation.
OVX builds up its knowledge of the physical network by populating a PhysicalNetwork
instance. The PhysicalNetwork
instance is populated by instances of switch, link, and port objects as they are discovered in the infrastructure, via various network discovery techniques. Virtual network representations, or OVXNetwork
instances, are created by the operator through API calls that create network objects and maps them onto the PhysicalNetwork components spawned by OVX. Network discovery and the JSONRPC API are described in Sections 3.4 and 3.9, respectively.
2.2 Component State Machines
Network elements are associated with several states that are interdependent on the states of other elements. For example, if a switch in the network is powered off, all of its ports and any links from those ports are also torn down, changing the network topology perceived by OVX.
In order to allow OVX to track and describe the states of the various components and how they interact, component classes implement finite state machines (FSMs) whose state transitions are driven by one another. Which FSM drives which is determined by an implicit dependency graph.
This section gives an overview of these FSMs.
2.2.1 Base FSM States
With the exception of Address
classes and OVXSwitch
child classes, each component class currently possesses four states:
INIT
: Just created, i.e. its constuructor was just calledINACTIVE
: Inert to network events i.e. OpenFlow messages and network discovery.ACTIVE
: Normal operating state, where all events are handled as expected.STOPPED
: Destroyed. The object must be created again to be usable.
For example, an administratively disabled Port is INACTVE, and a OVXSwitch removed from the Network by an operator is STOPPED.
The FSMs are currently implemented as a Java Enums. This approach was chosen for the ease of modification – if a new state is needed, we just simply add another state and a (set of) default behaviors to the FSM. The FSMs for each component class is named SwitchState
for the FSMs for PhysicalSwitch
and OVXSwitch
.
2.2.2 Component FSM Interface
Component classes with FSMs implement Interface Component
, which defines a set of methods for moving between states. For uniformity, each method is associated with a general set of actions required to functionally move a component between states:
register()
[INIT -> INACTIVE] : add component to mappings and storage, checking that dependencies are met (Example: A new port may not be created if a switch doesn’t exist)boot()
[INACTIVE -> ACTIVE] : open control channels, activate dependent components (Example: bring a link up if the ports on both end are boot()ed)teardown()
[ACTIVE -> INACTIVE] : close control channels, deactivate dependent components (Example: If a port is torn down, links to/from it are also torn down)unregister()
[INACTIVE -> STOPPED] : remove from mappings and storage, deactivating or unregistering dependent components as necessary (Example: A link will no longer exist, so must be unregister()ed if either one or both ports it connects is unregister()ed)
Fig.2.1 summarizes a generic Component
FSM and associated methods for moving between states. Each OVX class derived from the components in the previous section implements Component
and an FSM in some form or another.
Fig.2.1
Note, a component can only be activated/stopped from the INACTIVE state to guarantee that dependencies are handled safely before something is put to work or removed from the network representation(s). This section discusses how component FSMs are coupled together in order to fulfill component dependencies and to implement network state synchronization.
2.3 Component Persistence
Virtual components are configured by an administrator. The administrator might want the configurations to persist across reboots of OVX. OVX has the ability to store configurations in a remote database for recovery after reboot.
The classes of components that can be stored implement the interface Persistable
, which has the following abstract methods:
Method | Return | Description | Example |
---|---|---|---|
getDBName() | String | Database name | “VNET” |
getDBIndex() | Map<String,Object> | Unique index of document in which a Component’s data is stored | Key=”tenantId”, Value=Tenant ID (Integer) |
getDBKey() | String | Key of document in which a virtual component’s data is stored | “switches”, “links”, “ports”, “routes”, “hosts” |
getDBObject() | Map<String,Object> | List element which is added to the list of the value | (see the details below) |
Persistable
is defined in [net.onrc.openvirtex.elements]. These methods enable each component that implements Persistable
to be serialized/deserialized to/from the database. Further detail can be found here.
The remaining subsections describe the various packages containing the definitions of the classes that implement various elements.
2.4 Switches [package net.onrc.openvirtex.elements.datapath]
A Switch is a representation of a datapath, described by a set of ports, a switch ID (DPID), and descriptions of capabilities/attributes, and a channel:
protected boolean isConnected = false; // Channel liveness indication
protected OVXDescriptionStatistics desc = null; // Switch statistics
// T extends Port.
protected HashMap<Short, T> portMap // The ports on this switch, keyed by port number
protected OFFeaturesReply featuresReply // The Features Reply
protected Long switchId // The DPID of the switch
protected Channel channel // The control channel to the datapath
Switch subclasses serve as ‘anchor points’ for the OpenFlow channel between OVX and the tenant NOS (OVXSwitch) and OVX and datapaths (PhysicalSwitch). All messages that reach OVX are either handled directly in the north- or south-bound event loops, or passed through a Switch via the sendMsg()
and handleIO()
methods for message-specific handling. The following classes extend Switch:
PhysicalSwitch (extends Switch
components:
StatisticsManager statsMan
: statistics collection from associated datapathAtomicReference<Map<Integer, List<OVXFlowStatisticsReply>>> flowStats
: Flow table, entries keyed by tenantAtomicReference<Map<Short, OVXPortStatisticsReply>> portStats
: port statistics keyed by port numberXidTranslator<OVXSwitch> translator
: XID (de)multiplexerSwitchState state
: the FSM for the PhysicalSwitch instance
PhysicalSwitch also contains an inner class, SwitchDeregAction
, for synchronizing the state of virtual elements with that of the PhysicalSwitch(es) that they map to. Section 3.6 delves further into state management within OVX.
OVXSwitch (extends Switch
components:
LRULinkedHashMap<Integer, OVXPacketIn>
bufferMapInteger tenantId
: The ID of the tenant network this switch belongs toOVXFlowTable flowTable
: The structure holding the switch’s flow entriesXidTranslator<Channel> channelMux
: Channel (de)multiplexer, for multiple NOS connectionsRoleManager roleMan
: management of Role messages from tenant controllersSwitchState state
: the FSM for the OVXSwitch instance
In addition, OVXSwitch directly implements some OFFeaturesReply
fields :
// Note, some attributes of a virtual switch are fixed:
protected static int supportedActions = 0xFFF; // The supported actions.
protected static int bufferDimension = 4096; // The buffer dimension.
protected Short missSendLen = 128; // The miss send len. Default in spec is 128
protected OVXSwitchCapabilities capabilities; // The capabilities.
The two child classes of OVXSwitch represent two modes of switch virtualization:
OVXSingleSwitch : A virtual switch that maps to a single switch in the network
OVXBigSwitch : A virtual switch that maps to multiple switches in the network, and treats the group of switches as the crossbars within a single Big Virtual Switch (BVS). OVXBigSwitch
maintains a route table for paths across its virtual crossbar.
components:
RoutingAlgorithms alg
: Algorithm for calculating paths, either manually specified (manual) or shortest path (spf)HashMap<OVXPort, HashMap<OVXPort, SwitchRoute>> routeMap
: Map of routes through the BVS, given ingress and egress ports
Fig 2.2 shows the three Switch classes in context to a virtualized network.
Fig 2.2 : Each PhysicalSwitch (psw1, 2 and 3) directly maps to a switch (switch1, 2, and 3) in the infrastructure. Virtual switch vsw1 is an OVXSingleSwitch instance mapped directly onto PhysicalSwitch psw1. vsw2 is an OVXBigSwitch instance mapped to psw2 and psw3, and uses the link between them as a SwitchRoute. A tenant network can have both types of OVXSwitch as long as they don’t use the same PhysicalSwitches i.e. overlap in the PhysicalNetwork. Finally, Switch instances are the termination points of the OpenFlow channels (blue).
2.5 Ports [package net.onrc.openvirtex.elements.port]
Switch ports are represented as Port subclass instances stored in the Switch portMap
structure. Ports have attributes inherited from the OpenFlow ofp_phy_port
structure. OVX adds the following for context:
// T1 extends Switch, T2 extends Link
protected MACAddress mac // the hardware address of the port
protected Boolean isEdge // true if this port is an edge
protected T1 parentSwitch // the switch that this port belongs to
protected LinkPair<T2> portLink // if not an edge, the Links to/from this port
For detail about ofp_phy_port
, refer to the OpenFlow specifications. The flag isEdge
is true for a Port if no links are attached to it. Note, Ports also have a state
attribute that is part of ofp_phy_port
that is unrelated to a Port’s FSM, but whose value is affected by the Port child class FSM. This is described in Section 3.6.
OVX implements the following two Port child classes:
PhysicalPort (extends Port<PhysicalSwitch, PhysicalLink>) is a port on a PhysicalSwitch. The number of ports and their properties are found from the switch’s Features Reply. The PhysicalPort maintains the mapping between it and the virtual ports that map to it in ovxPortMap
. One PhysicalPort maps to at most one OVXPort per tenant network.
components:
Map<Integer, HashMap<Integer, OVXPort>> ovxPortMap
PortState pstate
: the state of the port according to its FSM
OVXPort (extends Port<OVXSwitch, OVXLink>) is a port on a OVXSwitch. OVXPorts are instantiated via administrative configuration.
components:
Integer tenantId
: tenant ID of the network that this port’s OVXSwitch belongs toPhysicalPort physicalPort
: The PhysicalPort the port maps toPortState pstate
: the state of the port according to its FSM
2.6 Links and Routes [package net.onrc.openvirtex.elements.link/net.onrc.openvirtex.routing]
OVX represents interconnects between Switches and Ports with Links. Links are defined by two endpoints, a source and destination Switch/Port pair:
protected T1 srcPort // source Port
protected T1 distort // destination Port
// endpoint Switches are fetched from the parentSwitch attributes of the Ports
public T2 getSrcSwitch() {
return (T2) this.srcPort.getParentSwitch();
}
public T2 getDstSwitch() {
return (T2) this.dstPort.getParentSwitch();
}
Links are directional, so a pair of them is used to represent a bidirectional link. This is the LinkPair
referred to by Port. There are three classes that extend Link:
- PhysicalLink (extends Link<PhysicalPort, PhysicalSwitch>) interconnects two PhysicalSwitches via PhysicalPorts, and maps 1:1 onto links in the network. OVX finds PhysicalLinks through topology discovery during runtime.
components:
Integer linkId
: Globally-unique ID of linkAtomicInteger linkIds
: global ID counter, for linkId generationLinkState state
: The FSM associated with a PhysicalLink-
OVXLink (extends Link<OVXPort, OVXSwitch>) interconnects two OVXPorts on two OVXSwitches within the same tenant network. An OVXLink may map onto one or more adjacent PhysicalLinks. OVXLinks are configured by the tenant.
components:
Integer linkId
: link ID, unique to a tenant networkInteger tenantId
: unique ID of tenant networkMappable map
: pointer to global mapLinkState state
: The FSM associated with an OVXLinkRoutingAlgorithms alg
: The method for mapping an OVXLink onto a set of PhysicalLinks. The two current options are static (manual) or shortest path (spf).-
SwitchRoute (extends Link<OVXPort, PhysicalSwitch>) interconnects two OVXPorts on the same OVXBigSwitch, defining a traffic path across its crossbars. SwitchRoutes may map onto one or more adjacent PhysicalLinks, and are defined by two types of endpoints:
-
BVS ingress/egress port : OVXPorts visible to the tenant as ports on the switch
- SwitchRoute endpoints : PhysicalPorts internal to the BVS at either ends of the chain of PhysicalLinks
components:
Integer routeId
: SwitchRoute’s ID, unique within an OVXBigSwitchOVXSwitch sw
: the switch the SwitchRoute belongs toRouteState state
: the SwitchRoute’s FSMPhysicalPort inPort
: ingress SwitchRoute endpointPhysicalPort outPort
: egress SwitchRoute endpoint
SwitchRoutes may be specified by a tenant, or generated through the OVXBigSwitch instance’s RoutingAlgorithm. Figures 2.3 and 2.4 summarize the structures and relationships between the three types of links.
Fig 2.3 : Top) Two PhysicalLinks connecting PhysicalPorts (white circles) on three PhysicalSwitches (ps1, ps2, and ps3). Middle) An OVXLink connects two OVXSwitches (vs1, vs2) by their OVXPorts (black circles). vs1 and vs2 map to ps1 and ps3, respectively. The OVXLink maps over two PhysicalLinks, but appears as a single hop to a tenant, to which ps2 is invisible. Bottom) A SwitchRoute internally connects two OVXPorts on the same BVS. A SwitchRoute has an external (OVXPort) and internal (PhysicalPort) endpoints.
Fig 2.4 : various Links with respect to the network mappings. On the top are two tenants, and bottom, OVX’s network view (PhysicalNetwork). Note, there is only one PhysicalNetwork instance but we show two for clarity. Right) Tenant 1 has two OVXLinks, vlink1 and vlink2. Vlink1 corresponds to the path ps1-ps3-ps2 across PhysicalLinks l2 and l3, whereas vlink2 is a 1:1 mapping onto l5. Left) Tenant 2 contains both OVXLinks (red) and a SwitchRoute joining the ports in the OVXBigSwitch vs2, the latter mapped to l3 (blue).
2.6.1 Virtual Link Resilience
Virtual Links (OVXLinks and SwitchRoutes) are associated with one or more lists of PhysicalLinks. We refer to these lists as paths. The priority of a Virtual Link is the priority value of its primary path. The primary path is either the only path set for the Virtual Link, or the path with the highest priority. When multiple paths are tied to a Virtual Link, the unused paths can be used to introduce component resilience, facilitated by the following:
private byte priority
: The current priority of the Virtual Linkprivate final TreeMap<Byte, List<PhysicalLink>> backupRoutes
: container holding alternative paths, keyed on priorityprivate final TreeMap<Byte, List<PhysicalLink>> unusableRoutes
: container holding failed paths, keyed on priority
The details of resilience are discussed in Section 3.8.
2.7 Addresses [package net.onrc.openvirtex.elements.address]
IP addresses are formatted integers associated with network hosts. OVX identifies two types of IP address, used in the virtualization process:
- The OVXIPAddress is a network host’s IP address, assigned to the host through external means. The OVXIPAddress is unique to a tenant network.
- The PhysicalIPAddress is assigned by OVX and is unique to the whole network. OVXIPAddresses are mapped to PhysicalIPAddresses in the core of the network in order to distinguish traffic from different tenants. This process is described further in Section 3.5, Address Virtualization.
2.8 Hosts [package net.onrc.openvirtex.elements.host]
Hosts represent endpoints for traffic flows across tenant networks. Hosts are defined by attachment points, addresses, and a unique ID:
private final Integer hostId; // OVX-asigned UUID
private final MACAddress mac; // MAC address of host in the network
private final OVXPort port; // Attachment point
private OVXIPAddress ipAddress; // Network address
private HostState state // Host FSM
OVX Hosts are virtual constructs, and do not have separate physical and virtual representations. A physical representations of a hosts is generated by finding Physical equivalents of its attachment point and network address:
public HashMap<String, Object> convertToPhysical() {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("hostId", this.hostId);
map.put("dpid", this.port.getPhysicalPort().getParentSwitch().getSwitchName());
// Find Physical attachment point that corresponds to Host's virtual one
map.put("port", port.getPhysicalPortNumber());
map.put("mac", this.mac.toString());
// Find Host's PhysicalIP, if it has one
if (this.ipAddress.getIp() != 0)
try {
map.put("ipAddress", OVXMap.getInstance().getPhysicalIP(this.ipAddress, this.port.getTenantId()).toSimpleString());
...
Note, isEdge
stays true
for an OVXPort that is a Host attachment point.
2.9 Networks [package net.onrc.openvirtex.elements.network]
Bringing everything together, the Network class stores mappings that describe the relationships amongst switches, links, ports, and hosts within a network:
protected final Set<T1> switchSet; // set of all switches found in this network
protected final Set<T3> linkSet; // set of all links within this network
protected final Map<Long, T1> dpidMap; // mapping between switches and their DPIDs
protected final Map<T2, T2> neighborPortMap; // mapping between ports that are endpoints of the same link
protected final Map<T1, HashSet<T1>> neighborMap; // mapping between a switch and its adjacencies
Note that Networks don’t record SwitchRoute or which Port belongs on which Switch, as they are stored in (i.e. subcomponents of) Switch. Currently there are two network representations derived from the Network class:
PhysicalNetwork is the singleton class that represents OVX’s view of the network. Ideally, PhysicalNetwork is an exact, one-to-one copy of the infrastructure and its state. PhysicalNetwork maintains LLDP-based topology discovery on a per-switch basis, and a HashedWheelTimer to drive the topology discovery and statistics collection processes. We detail network discovery in Section 3.4.
components:
PhysicalNetwork instance
: singleton instance of PhysicalNetworkArrayList<Uplink> uplinkList
:ConcurrentHashMap<Long, SwitchDiscoveryManager> discoveryManager
: mapping between switches (by DPID) and topology/port state discovery managersHashedWheelTimer timer
: timer for launching periodic tasksNetworkState state
: The PhysicalNetwork FSM
OVXNetwork is the network representation presented to a tenant. OVX maintains a OVXNetwork instance per tenant, identified by a unique tenant ID and mapped back to PhysicalNetwork. The topology of virtual networks are configured via OVX’s API. We look at the API in Section 3.9. OVXNetwork instances maintain unique identifiers for its components, as well as notions of traffic flows between hosts, which require them to be aware of network hosts.
components:
Integer tenantId
: the unique ID of this tenant networkHashSet<String> controllerUrls
: The tenant’s controller(s)IPAddress network
: the network address block used by tenantshort mask
: the network mask used by tenantHashMap<IPAddress, MACAddress> gwsMap
:BitSetIndex dpidCounter, linkCounter, ipCounter, hostCounter
: Generators for unique DPIDs, link IDs, IP addresses, and Host IDsMap<OVXPort, Host> hostMap
: map of hosts and their attachment points in the virtual networkOVXFlowManager flowManager
: tracks flows based on Ethernet source and destinationNetworkState state
: The OVXNetwork FSM
2.10 Shared Global Mappings: [package net.onrc.openvirtex.elements], ovxPortMap
The mapping between the physical network and the tenant networks are stored in the globally accessible, single-instance OVXMap structure. The Mappable interface defines the methods available for manipulating the mappings.
OVXMap holds a collection of Java Maps keyed on various Network components or their identifiers:
HashMap | Key | Values |
---|---|---|
virtualSwitchMap | OVXSwitch | PhysicalSwitches |
physicalSwitchMap | PhysicalSwitch | Map<TenantID,OVXSwitch> |
virtualLinkMap | OVXLink | PhysicalLinks |
physicalLinkMap | PhysicalLink | Map<TenantID,OVXLink> |
routetoLinkMap | SwitchRoute | PhysicalLinks |
phyLinktoRouteMap | PhysicalLink | SwitchRoutes using PhysicalLink, keyed on TenantID |
networkMap | TenantID | OVXNetwork |
physicalIPMap | PhysicalIPAddress (as String) | OVXIPAddress |
virtualIPMap | OVXIPAddress | PhysicalIPAddress |
macMap | MACAddress (as String) | Tenant ID as integral value |
In addition to OVXMap, PhysicalPort’s ovxPortMap
stores the OVXPorts mapped to a PhysicalPort directly in the PhysicalPort instance.
2.11 Messages [package net.onrc.openvirtex.messages]
OVX handles OpenFlow messages as specialized message class instances. Each OpenFlow message [org.openflow.protocol] has an OVX equivalent i.e. a class with a name that begins with with ‘OVX’ instead of ‘OF’ that subclasses the message class. These message classes implement either one of the following interfaces:
* Virtualizable (public void virtualize(PhysicalSwitch sw)) : handle tenant-bound messages from the datapath represented by PhysicalSwitch sw. This involves determining which tenant(s) should receive the message, and for each tenant that should, rewriting message contents to correspond with what is consistent with the tenant’s OVXNetwork topology.
* Devirtualizable (public void devirtualize(OVXSwitch sw)) : handle network-bound messages written to OVXSwitch sw by a tenant controller. This involves determining which datapaths the messages apply to, and rewriting message contents to fit the context of the network.
Fig.1.2 from the previous section illustrates this. Section 3.3 describes the core event loop that invokes these methods, and Section 3.5 describes the message (de)virtualization process.
[ Previous Section | Documentation Home | Next Section ]
Please send feedback and questions to ovx-discuss – at – googlegroups.com