Added a set of abstractions for flow rule subsystem.
Added an apps source subtree.
diff --git a/apps/pom.xml b/apps/pom.xml
new file mode 100644
index 0000000..bd155f3
--- /dev/null
+++ b/apps/pom.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onlab.onos</groupId>
+ <artifactId>onos</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>onos-apps</artifactId>
+ <packaging>pom</packaging>
+
+ <description>ONOS sample applications</description>
+
+ <modules>
+ <module>tvue</module>
+ </modules>
+
+ <properties>
+ <web.context>default</web.context>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.onlab.onos</groupId>
+ <artifactId>onos-api</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.onlab.onos</groupId>
+ <artifactId>onlab-osgi</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.onlab.onos</groupId>
+ <artifactId>onlab-rest</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-servlet</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey.jersey-test-framework</groupId>
+ <artifactId>jersey-test-framework-core</artifactId>
+ <version>1.18.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey.jersey-test-framework</groupId>
+ <artifactId>jersey-test-framework-grizzly2</artifactId>
+ <version>1.18.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.scr.annotations</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <_wab>src/main/webapp/</_wab>
+ <Bundle-SymbolicName>
+ ${project.groupId}.${project.artifactId}
+ </Bundle-SymbolicName>
+ <Import-Package>
+ org.osgi.framework,
+ javax.ws.rs,javax.ws.rs.core,
+ com.sun.jersey.api.core,
+ com.sun.jersey.spi.container.servlet,
+ com.sun.jersey.server.impl.container.servlet,
+ com.fasterxml.jackson.databind,
+ com.fasterxml.jackson.databind.node,
+ org.onlab.rest.*,
+ org.onlab.onos.*
+ </Import-Package>
+ <Web-ContextPath>${web.context}</Web-ContextPath>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/apps/tvue/pom.xml b/apps/tvue/pom.xml
new file mode 100644
index 0000000..d0380a3
--- /dev/null
+++ b/apps/tvue/pom.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onlab.onos</groupId>
+ <artifactId>onos-apps</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>onos-tvue</artifactId>
+ <packaging>bundle</packaging>
+
+ <description>ONOS simple topology viewer</description>
+
+ <properties>
+ <web.context>/onos/tvue</web.context>
+ </properties>
+
+</project>
diff --git a/apps/tvue/src/main/java/org/onlab/onos/tvue/TopologyResource.java b/apps/tvue/src/main/java/org/onlab/onos/tvue/TopologyResource.java
new file mode 100644
index 0000000..996a81f
--- /dev/null
+++ b/apps/tvue/src/main/java/org/onlab/onos/tvue/TopologyResource.java
@@ -0,0 +1,153 @@
+package org.onlab.onos.tvue;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.ElementId;
+import org.onlab.onos.net.Link;
+import org.onlab.onos.net.device.DeviceService;
+import org.onlab.onos.net.host.HostService;
+import org.onlab.onos.net.link.LinkService;
+import org.onlab.onos.net.topology.Topology;
+import org.onlab.onos.net.topology.TopologyGraph;
+import org.onlab.onos.net.topology.TopologyService;
+import org.onlab.onos.net.topology.TopologyVertex;
+import org.onlab.rest.BaseResource;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Topology viewer resource.
+ */
+@Path("topology")
+public class TopologyResource extends BaseResource {
+
+ @Path("/graph")
+ @GET
+ @Produces("application/json")
+ public Response graph() {
+ ObjectMapper mapper = new ObjectMapper();
+
+ // Fetch the services we'll be using.
+ DeviceService deviceService = get(DeviceService.class);
+ HostService hostService = get(HostService.class);
+ TopologyService topologyService = get(TopologyService.class);
+
+ // Fetch the current topology and its graph that we'll use to render.
+ Topology topo = topologyService.currentTopology();
+ TopologyGraph graph = topologyService.getGraph(topo);
+
+ // Build all interior vertexes, i.e. no end-station hosts yet
+ ArrayNode vertexesNode = mapper.createArrayNode();
+ for (TopologyVertex vertex : graph.getVertexes()) {
+ vertexesNode.add(json(mapper, vertex.deviceId(), 2,
+ deviceService.isAvailable(vertex.deviceId())));
+ }
+
+ // Now scan all links and count number of them between the same devices
+ // using a normalized link key.
+ Map<String, AggLink> linkRecords = aggregateLinks();
+
+ // Now build all interior edges using the aggregated links.
+ ArrayNode edgesNode = mapper.createArrayNode();
+ for (AggLink lr : linkRecords.values()) {
+ edgesNode.add(json(mapper, lr.links.size(), lr.link.src(), lr.link.dst()));
+ }
+
+ // Merge the exterior and interior vertexes and inject host links as
+ // the exterior edges.
+// Iterator<Host> hosts = hostService.getHosts();
+// while (hosts.hasNext()) {
+// Host host = hosts.next();
+// vertexesNode.add(json(mapper, host.id().ip().toString(), 3, true));
+// edgesNode.add(json(mapper, 1, host.ip().toString(),
+// host.location().elementId().uri()));
+// }
+
+ // Now put the vertexes and edges into a root node and ship them off
+ ObjectNode rootNode = mapper.createObjectNode();
+ rootNode.put("vertexes", vertexesNode);
+ rootNode.put("edges", edgesNode);
+ return Response.ok(rootNode.toString()).build();
+ }
+
+ // Scan all links and counts number of them between the same devices
+ // using a normalized link key.
+ private Map<String, AggLink> aggregateLinks() {
+ Map<String, AggLink> aggLinks = new HashMap<>();
+ LinkService linkService = get(LinkService.class);
+ for (Link link : linkService.getLinks()) {
+ String key = key(link);
+ AggLink lr = aggLinks.get(key);
+ if (lr == null) {
+ lr = new AggLink(key);
+ aggLinks.put(key, lr);
+ }
+ lr.addLink(link);
+ }
+ return aggLinks;
+ }
+
+ // Produces JSON for a graph vertex.
+ private ObjectNode json(ObjectMapper mapper, ElementId id, int group,
+ boolean isOnline) {
+ return mapper.createObjectNode()
+ .put("name", id.uri().toString())
+ .put("group", group)
+ .put("online", isOnline);
+ }
+
+ // Produces JSON for a graph edge.
+ private ObjectNode json(ObjectMapper mapper, int count,
+ ConnectPoint src, ConnectPoint dst) {
+ return json(mapper, count, id(src), id(dst));
+ }
+
+ // Produces JSON for a graph edge.
+ private ObjectNode json(ObjectMapper mapper, int count, String src, String dst) {
+ return mapper.createObjectNode()
+ .put("source", src).put("target", dst).put("value", count);
+ }
+
+ // Aggregate link of all links between the same devices regardless of
+ // their direction.
+ private class AggLink {
+ Link link; // representative links
+
+ final String key;
+ final Set<Link> links = new HashSet<>();
+
+ AggLink(String key) {
+ this.key = key;
+ }
+
+ void addLink(Link link) {
+ links.add(link);
+ if (this.link == null) {
+ this.link = link;
+ }
+ }
+ }
+
+ // Returns a canonical key for the specified link.
+ static String key(Link link) {
+ String s = id(link.src());
+ String d = id(link.dst());
+ return s.compareTo(d) > 0 ? d + s : s + d;
+ }
+
+ // Returns a formatted string for the element associated with the given
+ // connection point.
+ private static String id(ConnectPoint cp) {
+ return cp.elementId().uri().toString();
+ }
+
+}
diff --git a/apps/tvue/src/main/webapp/WEB-INF/web.xml b/apps/tvue/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..d958283
--- /dev/null
+++ b/apps/tvue/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ id="ONOS" version="2.5">
+ <display-name>ONOS GUI</display-name>
+
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+
+ <servlet>
+ <servlet-name>JAX-RS Service</servlet-name>
+ <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.packages</param-name>
+ <param-value>org.onlab.onos.gui</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>JAX-RS Service</servlet-name>
+ <url-pattern>/rs/*</url-pattern>
+ </servlet-mapping>
+
+</web-app>
\ No newline at end of file
diff --git a/apps/tvue/src/main/webapp/index.html b/apps/tvue/src/main/webapp/index.html
new file mode 100644
index 0000000..f959f93
--- /dev/null
+++ b/apps/tvue/src/main/webapp/index.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>ONOS GUI</title>
+</head>
+<body>
+ <h1>ONOS GUI</h1>
+ Sort of...
+</body>
+</html>
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/Criteria.java b/core/api/src/main/java/org/onlab/onos/net/flow/Criteria.java
new file mode 100644
index 0000000..9595797
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/Criteria.java
@@ -0,0 +1,25 @@
+package org.onlab.onos.net.flow;
+
+/**
+ * Factory class to create various traffic selection criteria.
+ */
+public final class Criteria {
+
+ // Ban construction
+ private Criteria() {
+ }
+
+ /**
+ * Creates a match on ETH_SRC field using the specified value. This value
+ * may be a wildcard mask.
+ *
+ * @param macValue MAC address value or wildcard mask
+ * @return match criterion
+ */
+ public static Criterion matchEthSrc(MACValue macValue) {
+ return null;
+ }
+
+ // Dummy to illustrate the concept for now; delete ASAP
+ private static class MACValue { }
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/Criterion.java b/core/api/src/main/java/org/onlab/onos/net/flow/Criterion.java
new file mode 100644
index 0000000..0b55a42
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/Criterion.java
@@ -0,0 +1,98 @@
+package org.onlab.onos.net.flow;
+
+/**
+ * Representation of a single header field selection.
+ */
+public interface Criterion {
+
+ /**
+ * Types of fields to which the selection criterion may apply.
+ */
+ // From page 42 of OpenFlow 1.3.x spec
+ public enum Type {
+ /** Switch input port. */
+ IN_PORT,
+ /** Switch physical input port. */
+ IN_PHY_PORT,
+ /** Metadata passed between tables. */
+ METADATA,
+ /** Ethernet destination address. */
+ ETH_DST,
+ /** Ethernet source address. */
+ ETH_SRC,
+ /** Ethernet frame type. */
+ ETH_TYPE,
+ /** VLAN id. */
+ VLAN_VID,
+ /** VLAN priority. */
+ VLAN_PCP,
+ /** IP DSCP (6 bits in ToS field). */
+ IP_DSCP,
+ /** IP ECN (2 bits in ToS field). */
+ IP_ECN,
+ /** IP protocol. */
+ IP_PROTO,
+ /** IPv4 source address. */
+ IPV4_SRC,
+ /** IPv4 destination address. */
+ IPV4_DST,
+ /** TCP source port. */
+ TCP_SRC,
+ /** TCP destination port. */
+ TCP_DST,
+ /** UDP source port. */
+ UDP_SRC,
+ /** UDP destination port. */
+ UDP_DST,
+ /** SCTP source port. */
+ SCTP_SRC,
+ /** SCTP destination port. */
+ SCTP_DST,
+ /** ICMP type. */
+ ICMPV4_TYPE,
+ /** ICMP code. */
+ ICMPV4_CODE,
+ /** ARP opcode. */
+ ARP_OP,
+ /** ARP source IPv4 address. */
+ ARP_SPA,
+ /** ARP target IPv4 address. */
+ ARP_TPA,
+ /** ARP source hardware address. */
+ ARP_SHA,
+ /** ARP target hardware address. */
+ ARP_THA,
+ /** IPv6 source address. */
+ IPV6_SRC,
+ /** IPv6 destination address. */
+ IPV6_DST,
+ /** IPv6 Flow Label. */
+ IPV6_FLABEL,
+ /** ICMPv6 type. */
+ ICMPV6_TYPE,
+ /** ICMPv6 code. */
+ ICMPV6_CODE,
+ /** Target address for ND. */
+ IPV6_ND_TARGET,
+ /** Source link-layer for ND. */
+ IPV6_ND_SLL,
+ /** Target link-layer for ND. */
+ IPV6_ND_TLL,
+ /** MPLS label. */
+ MPLS_LABEL,
+ /** MPLS TC. */
+ MPLS_TC,
+ /** MPLS BoS bit. */
+ MPLS_BOS,
+ /** PBB I-SID. */
+ PBB_ISID,
+ /** Logical Port Metadata. */
+ TUNNEL_ID,
+ /** IPv6 Extension Header pseudo-field. */
+ IPV6_EXTHDR
+ }
+
+ // TODO: Create factory class 'Criteria' that will have various factory
+ // to create specific criterions.
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowDescription.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowDescription.java
deleted file mode 100644
index 2a64815..0000000
--- a/core/api/src/main/java/org/onlab/onos/net/flow/FlowDescription.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.onlab.onos.net.flow;
-
-import org.onlab.onos.net.Description;
-
-/**
- * Information about a flow rule.
- */
-public interface FlowDescription extends Description {
-
- // Match and action, possibly reason for flow rule, unless reason is too OF-specific.
-
-}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowEntry.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowEntry.java
new file mode 100644
index 0000000..12a8cb4
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/FlowEntry.java
@@ -0,0 +1,36 @@
+package org.onlab.onos.net.flow;
+
+/**
+ * Represents a flow rule and its associated accumulated metrics.
+ */
+public interface FlowEntry extends FlowRule {
+
+ /**
+ * Returns the number of milliseconds this flow rule has been applied.
+ *
+ * @return number of millis
+ */
+ long lifeMillis();
+
+ /**
+ * Returns the number of milliseconds this flow rule has been idle.
+ *
+ * @return number of millis
+ */
+ long idleMillis();
+
+ /**
+ * Returns the number of packets this flow rule has matched.
+ *
+ * @return number of packets
+ */
+ long packets();
+
+ /**
+ * Returns the number of bytes this flow rule has matched.
+ *
+ * @return number of bytes
+ */
+ long bytes();
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRule.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRule.java
new file mode 100644
index 0000000..7204745
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRule.java
@@ -0,0 +1,43 @@
+package org.onlab.onos.net.flow;
+
+import org.onlab.onos.net.DeviceId;
+
+import java.util.List;
+
+/**
+ * Represents a generalized match & action pair to be applied to
+ * an infrastucture device.
+ */
+public interface FlowRule {
+
+ /**
+ * Returns the flow rule priority given in natural order; higher numbers
+ * mean higher priorities.
+ *
+ * @return flow rule priority
+ */
+ int priority();
+
+ /**
+ * Returns the identity of the device where this rule applies.
+ *
+ * @return device identifier
+ */
+ DeviceId deviceId();
+
+ /**
+ * Returns the traffic selector that identifies what traffic this
+ * rule should apply to.
+ *
+ * @return traffic selector
+ */
+ TrafficSelector selector();
+
+ /**
+ * Returns the traffic treatment that applies to selected traffic.
+ *
+ * @return traffic treatment
+ */
+ List<Treatment> treatments();
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleEvent.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleEvent.java
new file mode 100644
index 0000000..566c2b4
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleEvent.java
@@ -0,0 +1,47 @@
+package org.onlab.onos.net.flow;
+
+import org.onlab.onos.event.AbstractEvent;
+
+/**
+ * Describes flow rule event.
+ */
+public class FlowRuleEvent extends AbstractEvent<FlowRuleEvent.Type, FlowRule> {
+
+ /**
+ * Type of flow rule events.
+ */
+ public enum Type {
+ /**
+ * Signifies that a new flow rule has been detected.
+ */
+ RULE_ADDED,
+
+ /**
+ * Signifies that a flow rule has been removed.
+ */
+ RULE_REMOVED,
+ }
+
+ /**
+ * Creates an event of a given type and for the specified flow rule and the
+ * current time.
+ *
+ * @param type flow rule event type
+ * @param flowRule event flow rule subject
+ */
+ public FlowRuleEvent(Type type, FlowRule flowRule) {
+ super(type, flowRule);
+ }
+
+ /**
+ * Creates an event of a given type and for the specified flow rule and time.
+ *
+ * @param type flow rule event type
+ * @param flowRule event flow rule subject
+ * @param time occurrence time
+ */
+ public FlowRuleEvent(Type type, FlowRule flowRule, long time) {
+ super(type, flowRule, time);
+ }
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleListener.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleListener.java
new file mode 100644
index 0000000..114732b
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleListener.java
@@ -0,0 +1,9 @@
+package org.onlab.onos.net.flow;
+
+import org.onlab.onos.event.EventListener;
+
+/**
+ * Entity capable of receiving flow rule related events.
+ */
+public interface FlowRuleListener extends EventListener<FlowRuleEvent> {
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProvider.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProvider.java
index 894e245..9d31631 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProvider.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProvider.java
@@ -1,5 +1,6 @@
package org.onlab.onos.net.flow;
+import org.onlab.onos.net.DeviceId;
import org.onlab.onos.net.provider.Provider;
/**
@@ -7,6 +8,23 @@
*/
public interface FlowRuleProvider extends Provider {
- // TODO: pushFlowRule
+ /**
+ * Instructs the provider to apply the specified flow rules to their
+ * respective devices.
+ * @param flowRules one or more flow rules
+ * throws SomeKindOfException that indicates which ones were applied and
+ * which ones failed
+ */
+ void applyFlowRule(FlowRule... flowRules);
+
+
+ /**
+ * Returns the collection of flow entries currently applied on the given
+ * device.
+ *
+ * @param deviceId device identifier
+ * @return collection of flow entries
+ */
+ Iterable<FlowEntry> getFlowMetrics(DeviceId deviceId);
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProviderService.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProviderService.java
index a483d92..76689c2 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProviderService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleProviderService.java
@@ -3,33 +3,23 @@
import org.onlab.onos.net.provider.ProviderService;
/**
- * Service through which flowrule providers can inject flowrule information into
+ * Service through which flow rule providers can inject information into
* the core.
*/
public interface FlowRuleProviderService extends ProviderService<FlowRuleProvider> {
/**
- * Signals that a flow that was previously installed has been removed.
+ * Signals that a flow rule that was previously installed has been removed.
*
- * @param flowDescription information about the removed flow
+ * @param flowRule information about the removed flow
*/
- void flowRemoved(FlowDescription flowDescription);
+ void flowRemoved(FlowRule flowRule);
/**
- * Signals that a flowrule is missing for some network traffic.
+ * Signals that a flow rule is missing for some network traffic.
*
- * @param flowDescription information about traffic in need of flow rule(s)
+ * @param flowRule information about traffic in need of flow rule(s)
*/
- void flowMissing(FlowDescription flowDescription);
-
- /**
- * Signals that a flowrule has been added.
- *
- * TODO think about if this really makes sense, e.g. if stats collection or
- * something can leverage it.
- *
- * @param flowDescription the rule that was added
- */
- void flowAdded(FlowDescription flowDescription);
+ void flowMissing(FlowRule flowRule);
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleService.java b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleService.java
new file mode 100644
index 0000000..ccb6a51
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/FlowRuleService.java
@@ -0,0 +1,42 @@
+package org.onlab.onos.net.flow;
+
+import org.onlab.onos.net.DeviceId;
+
+/**
+ * Service for injecting flow rules into the environment and for obtaining
+ * information about flow rules already in the environment.
+ */
+public interface FlowRuleService {
+
+ /**
+ * Returns the collection of flow entries applied on the specified device.
+ *
+ * @param deviceId device identifier
+ * @return collection of flow rules
+ */
+ Iterable<FlowEntry> getFlowEntries(DeviceId deviceId);
+
+ /**
+ * Applies the specified flow rules onto their respective devices.
+ *
+ * @param flowRules one or more flow rules
+ * throws SomeKindOfException that indicates which ones were applied and
+ * which ones failed
+ */
+ void applyFlowRules(FlowRule... flowRules);
+
+ /**
+ * Adds the specified flow rule listener.
+ *
+ * @param listener flow rule listener
+ */
+ void addListener(FlowRuleListener listener);
+
+ /**
+ * Removes the specified flow rule listener.
+ *
+ * @param listener flow rule listener
+ */
+ void removeListener(FlowRuleListener listener);
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/Instruction.java b/core/api/src/main/java/org/onlab/onos/net/flow/Instruction.java
new file mode 100644
index 0000000..9fc1489
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/Instruction.java
@@ -0,0 +1,36 @@
+package org.onlab.onos.net.flow;
+
+/**
+ * Abstraction of a single traffic treatment step.
+ */
+public interface Instruction {
+
+ /**
+ * Represents the type of traffic treatment.
+ */
+ public enum Type {
+ /**
+ * Signifies that the traffic should be dropped.
+ */
+ DROP,
+
+ /**
+ * Signifies that the traffic should be output to a port.
+ */
+ OUTPUT,
+
+ /**
+ * Signifies that.... (do we need this?)
+ */
+ GROUP,
+
+ /**
+ * Signifies that the traffic should be modified in some way.
+ */
+ MODIFICATION
+ }
+
+ // TODO: Create factory class 'Instructions' that will have various factory
+ // to create specific instructions.
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/Instructions.java b/core/api/src/main/java/org/onlab/onos/net/flow/Instructions.java
new file mode 100644
index 0000000..13114c3
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/Instructions.java
@@ -0,0 +1,27 @@
+package org.onlab.onos.net.flow;
+
+import org.onlab.onos.net.PortNumber;
+
+/**
+ * Factory class for creating various traffic treatment instructions.
+ */
+public final class Instructions {
+
+ // Ban construction
+ private Instructions() {
+ }
+
+ /**
+ * Creates an output instruction using the specified port number. This can
+ * include logical ports such as CONTROLLER, FLOOD, etc.
+ *
+ * @param number port number
+ * @return output instruction
+ */
+ public static Instruction createOutput(PortNumber number) {
+ return null;
+ }
+
+ // TODO: add create methods
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
new file mode 100644
index 0000000..c024e9c
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
@@ -0,0 +1,38 @@
+package org.onlab.onos.net.flow;
+
+import java.util.List;
+
+/**
+ * Abstraction of a slice of network traffic.
+ */
+public interface TrafficSelector {
+
+ /**
+ * Returns selection criteria as an ordered list.
+ *
+ * @return list of criteria
+ */
+ List<Criterion> criteria();
+
+ /**
+ * Builder of traffic selector entities.
+ */
+ public interface Builder {
+
+ /**
+ * Adds a traffic selection criterion. If a same type criterion has
+ * already been added, it will be replaced by this one.
+ *
+ * @param criterion new criterion
+ */
+ void add(Criterion criterion);
+
+ /**
+ * Builds an immutable traffic selector.
+ *
+ * @return traffic selector
+ */
+ TrafficSelector build();
+ }
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/TrafficTreatment.java b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficTreatment.java
new file mode 100644
index 0000000..0eb5299
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficTreatment.java
@@ -0,0 +1,38 @@
+package org.onlab.onos.net.flow;
+
+import java.util.List;
+
+/**
+ * Abstraction of network traffic treatment.
+ */
+public interface TrafficTreatment {
+
+ /**
+ * Returns list of instructions on how to treat traffic.
+ *
+ * @return list of treatment instructions
+ */
+ List<Instruction> instructions();
+
+ /**
+ * Builder of traffic treatment entities.
+ */
+ public interface Builder {
+
+ /**
+ * Adds a traffic treatment instruction. If a same type instruction has
+ * already been added, it will be replaced by this one.
+ *
+ * @param instruction new instruction
+ */
+ void add(Instruction instruction);
+
+ /**
+ * Builds an immutable traffic treatment descriptor.
+ *
+ * @return traffic treatment
+ */
+ TrafficTreatment build();
+ }
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/Treatment.java b/core/api/src/main/java/org/onlab/onos/net/flow/Treatment.java
similarity index 92%
rename from core/api/src/main/java/org/onlab/onos/net/packet/Treatment.java
rename to core/api/src/main/java/org/onlab/onos/net/flow/Treatment.java
index 411ec38..8318b66 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/Treatment.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/Treatment.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.net.packet;
+package org.onlab.onos.net.flow;
import org.onlab.onos.net.PortNumber;
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
index 7a55f32..8c2495c 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
@@ -1,31 +1,30 @@
package org.onlab.onos.net.packet;
import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.flow.TrafficTreatment;
import java.nio.ByteBuffer;
-import java.util.List;
/**
* Default implementation of an immutable outbound packet.
*/
public class DefaultOutboundPacket implements OutboundPacket {
private final DeviceId sendThrough;
- private final List<Treatment> treatments;
+ private final TrafficTreatment treatment;
private final ByteBuffer data;
/**
* Creates an immutable outbound packet.
*
* @param sendThrough identifier through which to send the packet
- * @param treatments list of packet treatments
+ * @param treatment list of packet treatments
* @param data raw packet data
*/
public DefaultOutboundPacket(DeviceId sendThrough,
- List<Treatment> treatments, ByteBuffer data) {
+ TrafficTreatment treatment, ByteBuffer data) {
this.sendThrough = sendThrough;
- this.treatments = ImmutableList.copyOf(treatments);
+ this.treatment = treatment;
this.data = data;
}
@@ -35,8 +34,8 @@
}
@Override
- public List<Treatment> treatments() {
- return treatments;
+ public TrafficTreatment treatment() {
+ return treatment;
}
@Override
@@ -49,7 +48,7 @@
public String toString() {
return MoreObjects.toStringHelper(this)
.add("sendThrough", sendThrough)
- .add("treatments", treatments)
+ .add("treatment", treatment)
.toString();
}
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/OutboundPacket.java b/core/api/src/main/java/org/onlab/onos/net/packet/OutboundPacket.java
index 5307f00..05a5074 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/OutboundPacket.java
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/OutboundPacket.java
@@ -1,9 +1,9 @@
package org.onlab.onos.net.packet;
import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.flow.TrafficTreatment;
import java.nio.ByteBuffer;
-import java.util.List;
/**
* Represents an outbound data packet that is to be emitted to network via
@@ -20,14 +20,14 @@
DeviceId sendThrough();
/**
- * Returns list of treatments for the outbound packet.
+ * Returns how the outbound packet should be treated.
*
* @return output treatment
*/
- List<Treatment> treatments();
+ TrafficTreatment treatment();
/**
- * Returns the raw data to be sent.
+ * Returns immutable view of the raw data to be sent.
*
* @return data to emit
*/
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/PacketContext.java b/core/api/src/main/java/org/onlab/onos/net/packet/PacketContext.java
index a9af312..b77635b 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/PacketContext.java
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/PacketContext.java
@@ -1,5 +1,7 @@
package org.onlab.onos.net.packet;
+import org.onlab.onos.net.flow.TrafficTreatment;
+
/**
* Represents context for processing an inbound packet, and (optionally)
* emitting a corresponding outbound packet.
@@ -28,11 +30,11 @@
OutboundPacket outPacket();
/**
- * Appends a new treatment to be applied to the outbound packet.
+ * Returns a builder for constructing traffic treatment.
*
- * @param treatment output treatment
+ * @return traffic treatment builder
*/
- void appendTreatment(Treatment treatment);
+ TrafficTreatment.Builder treatmentBuilder();
/**
* Triggers the outbound packet to be sent.
diff --git a/pom.xml b/pom.xml
index 3e872e4..4934186 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,6 +19,7 @@
<module>cli</module>
<module>providers</module>
<module>of</module>
+ <module>apps</module>
<module>features</module>
</modules>
@@ -355,6 +356,12 @@
org.onlab.onos.gui:org.onlab.onos.rest:org.onlab.onos.cli:org.onlab.onos.gui.*:org.onlab.onos.rest.*:org.onlab.onos.cli.*
</packages>
</group>
+ <group>
+ <title>Sample Applications</title>
+ <packages>
+ org.onlab.onos.tvue
+ </packages>
+ </group>
</groups>
</configuration>
</plugin>