Uping versions to 1.3.0-SNAPSHOT and moving igmp, pim, mfwd to onos master.
Change-Id: Ibe13587f8f50a5c70a70d8afbfa75f48d5e1d5fd
diff --git a/calendar/pom.xml b/calendar/pom.xml
index 9086036..9c9a5d5 100644
--- a/calendar/pom.xml
+++ b/calendar/pom.xml
@@ -22,7 +22,7 @@
<parent>
<groupId>org.onosproject</groupId>
<artifactId>onos-app-samples</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.4.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
diff --git a/database-perf/pom.xml b/database-perf/pom.xml
index 3f6cfe4..0455227 100644
--- a/database-perf/pom.xml
+++ b/database-perf/pom.xml
@@ -22,7 +22,7 @@
<parent>
<groupId>org.onosproject</groupId>
<artifactId>onos-app-samples</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.4.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
diff --git a/flowtest/pom.xml b/flowtest/pom.xml
index 2abae2a..eea75e8 100644
--- a/flowtest/pom.xml
+++ b/flowtest/pom.xml
@@ -22,7 +22,7 @@
<parent>
<groupId>org.onosproject</groupId>
<artifactId>onos-app-samples</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.4.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
diff --git a/ifwd/pom.xml b/ifwd/pom.xml
index ea809c5..7f82a7a 100644
--- a/ifwd/pom.xml
+++ b/ifwd/pom.xml
@@ -22,7 +22,7 @@
<parent>
<groupId>org.onosproject</groupId>
<artifactId>onos-app-samples</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.4.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
diff --git a/igmp/pom.xml b/igmp/pom.xml
deleted file mode 100644
index 2ecd0b9..0000000
--- a/igmp/pom.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ Copyright 2014 Open Networking Laboratory
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<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/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-app-samples</artifactId>
- <version>1.3.0-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
-
- <artifactId>onos-app-igmp</artifactId>
- <packaging>bundle</packaging>
-
- <description>Internet Group Message Protocol</description>
-
- <properties>
- <onos.app.name>org.onosproject.igmp</onos.app.name>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-api</artifactId>
- <version>${project.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-cli</artifactId>
- <version>${project.version}</version>
- </dependency>
-
-
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onlab-osgi</artifactId>
- <version>${project.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onlab-junit</artifactId>
- <scope>test</scope>
- </dependency>
-
- <!-- This is needed by ComponentContext, used for tunable configuration -->
- <dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.compendium</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.scr.annotations</artifactId>
- <version>1.9.8</version>
- <scope>provided</scope>
- </dependency>
-
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-SymbolicName>
- ${project.groupId}.${project.artifactId}
- </Bundle-SymbolicName>
- <Import-Package>
- org.slf4j,
- org.osgi.framework,
- org.apache.commons.lang.math.*,
- com.google.common.*,
- org.onlab.packet.*,
- org.onlab.rest.*,
- org.onosproject.*,
- org.onosproject.mfwd.impl.*;
- org.onlab.util.*,
- org.jboss.netty.util.*
- </Import-Package>
- </instructions>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.5.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-</project>
diff --git a/igmp/src/main/java/org/onosproject/igmp/impl/IGMPComponent.java b/igmp/src/main/java/org/onosproject/igmp/impl/IGMPComponent.java
deleted file mode 100644
index ae539c6..0000000
--- a/igmp/src/main/java/org/onosproject/igmp/impl/IGMPComponent.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.igmp.impl;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onlab.packet.Ethernet;
-import org.onlab.packet.IPv4;
-import org.onlab.packet.Ip4Address;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.IGMP;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.packet.InboundPacket;
-import org.onosproject.net.packet.PacketContext;
-import org.onosproject.net.packet.PacketPriority;
-import org.onosproject.net.packet.PacketProcessor;
-import org.onosproject.net.packet.PacketService;
-import org.slf4j.Logger;
-
-/**
- * Internet Group Management Protocol.
- */
-@Component(immediate = true)
-public class IGMPComponent {
- private final Logger log = getLogger(getClass());
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected PacketService packetService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected CoreService coreService;
-
- private IGMPPacketProcessor processor = new IGMPPacketProcessor();
- private static ApplicationId appId;
-
- @Activate
- public void activate() {
- appId = coreService.registerApplication("org.onosproject.igmp");
-
- packetService.addProcessor(processor, PacketProcessor.director(1));
-
- // Build a traffic selector for all multicast traffic
- TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
- selector.matchEthType(Ethernet.TYPE_IPV4);
- selector.matchIPProtocol(IPv4.PROTOCOL_IGMP);
- packetService.requestPackets(selector.build(), PacketPriority.REACTIVE, appId);
-
- log.info("Started");
- }
-
- @Deactivate
- public void deactivate() {
- packetService.removeProcessor(processor);
- processor = null;
- log.info("Stopped");
- }
-
- /**
- * Packet processor responsible for handling IGMP packets.
- */
- private class IGMPPacketProcessor implements PacketProcessor {
-
- @Override
- public void process(PacketContext context) {
- // Stop processing if the packet has been handled, since we
- // can't do any more to it.
- if (context.isHandled()) {
- return;
- }
-
- InboundPacket pkt = context.inPacket();
- Ethernet ethPkt = pkt.parsed();
- if (ethPkt == null) {
- return;
- }
-
- /*
- * IPv6 MLD packets are handled by ICMP6. We'll only deal
- * with IPv4.
- */
- if (ethPkt.getEtherType() != Ethernet.TYPE_IPV4) {
- return;
- }
-
- IPv4 ip = (IPv4) ethPkt.getPayload();
- IpAddress gaddr = IpAddress.valueOf(ip.getDestinationAddress());
- IpAddress saddr = Ip4Address.valueOf(ip.getSourceAddress());
- log.debug("Packet (" + saddr.toString() + ", " + gaddr.toString() +
- "\tingress port: " + context.inPacket().receivedFrom().toString());
-
- if (ip.getProtocol() != IPv4.PROTOCOL_IGMP) {
- log.error("IGMP Picked up a non IGMP packet.");
- return;
- }
-
- IpPrefix mcast = IpPrefix.valueOf("224.0.0.0/4");
- if (!mcast.contains(gaddr)) {
- log.error("IGMP Picked up a non multicast packet.");
- return;
- }
-
- if (mcast.contains(saddr)) {
- log.error("IGMP Picked up a packet with a multicast source address.");
- return;
- }
- IpPrefix spfx = IpPrefix.valueOf(saddr, 32);
- IpPrefix gpfx = IpPrefix.valueOf(gaddr, 32);
-
- IGMP igmp = (IGMP) ip.getPayload();
- switch (igmp.getIgmpType()) {
-
- case IGMP.TYPE_IGMPV3_MEMBERSHIP_REPORT:
- IGMPProcessMembership.processMembership(igmp, pkt.receivedFrom());
- break;
-
- case IGMP.TYPE_IGMPV3_MEMBERSHIP_QUERY:
- IGMPProcessQuery.processQuery(igmp, pkt.receivedFrom());
- break;
-
- case IGMP.TYPE_IGMPV1_MEMBERSHIP_REPORT:
- case IGMP.TYPE_IGMPV2_MEMBERSHIP_REPORT:
- case IGMP.TYPE_IGMPV2_LEAVE_GROUP:
- log.debug("IGMP version 1 & 2 message types are not currently supported. Message type: " +
- igmp.getIgmpType());
- break;
-
- default:
- log.debug("Unkown IGMP message type: " + igmp.getIgmpType());
- break;
- }
- }
- }
-}
diff --git a/igmp/src/main/java/org/onosproject/igmp/impl/IGMPProcessMembership.java b/igmp/src/main/java/org/onosproject/igmp/impl/IGMPProcessMembership.java
deleted file mode 100644
index 4c08a74..0000000
--- a/igmp/src/main/java/org/onosproject/igmp/impl/IGMPProcessMembership.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.igmp.impl;
-
-import org.onlab.packet.IGMP;
-import org.onosproject.net.ConnectPoint;
-
-/**
- * Process an IGMP Membership Report.
- */
-public final class IGMPProcessMembership {
-
- // Hide the default constructor.
- private IGMPProcessMembership() {
- }
-
- /**
- * Process the IGMP Membership report.
- *
- * @param igmp the deserialized IGMP message.
- */
- public static void processMembership(IGMP igmp, ConnectPoint recievedFrom) {
- }
-
-}
diff --git a/igmp/src/main/java/org/onosproject/igmp/impl/IGMPProcessQuery.java b/igmp/src/main/java/org/onosproject/igmp/impl/IGMPProcessQuery.java
deleted file mode 100644
index 8407bb1..0000000
--- a/igmp/src/main/java/org/onosproject/igmp/impl/IGMPProcessQuery.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.igmp.impl;
-
-import org.onlab.packet.IGMP;
-import org.onosproject.net.ConnectPoint;
-
-/**
- * Process IGMP Query messages.
- */
-public final class IGMPProcessQuery {
-
- // Hide the default constructor.
- private IGMPProcessQuery() {
- }
-
- /**
- * Process the IGMP Membership Query message.
- *
- * @param igmp The deserialzed IGMP message
- */
- public static void processQuery(IGMP igmp, ConnectPoint receivedFrom) {
- }
-
-}
diff --git a/ipfix/pom.xml b/ipfix/pom.xml
index 20f55c3..24b6505 100644
--- a/ipfix/pom.xml
+++ b/ipfix/pom.xml
@@ -20,7 +20,7 @@
<parent>
<groupId>org.onosproject</groupId>
<artifactId>onos-app-samples</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.4.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
diff --git a/mfwd/pom.xml b/mfwd/pom.xml
deleted file mode 100644
index 11adb86..0000000
--- a/mfwd/pom.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ Copyright 2014 Open Networking Laboratory
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<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.onosproject</groupId>
- <artifactId>onos-app-samples</artifactId>
- <version>1.3.0-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
-
- <artifactId>onos-app-mfwd</artifactId>
- <packaging>bundle</packaging>
-
- <description>Multicast forwarding application</description>
-
- <properties>
- <onos.app.name>org.onosproject.mfwd</onos.app.name>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-cli</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>io.netty</groupId>
- <artifactId>netty</artifactId>
- <version>3.9.0.Final</version>
- </dependency>
-
- <dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.compendium</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.karaf.shell</groupId>
- <artifactId>org.apache.karaf.shell.console</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.core</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onlab-rest</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-rest</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-servlet</artifactId>
- </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.onosproject</groupId>
- <artifactId>onlab-junit</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.easymock</groupId>
- <artifactId>easymock</artifactId>
- <scope>test</scope>
- </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.slf4j,
- 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.apache.commons.lang.math.*,
- com.google.common.*,
- org.onlab.packet.*,
- org.onlab.rest.*,
- org.onosproject.*,
- org.onlab.util.*,
- org.jboss.netty.util.*
- </Import-Package>
- <Web-ContextPath>${web.context}</Web-ContextPath>
- </instructions>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-</project>
-
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/cli/McastDeleteCommand.java b/mfwd/src/main/java/org/onosproject/mfwd/cli/McastDeleteCommand.java
deleted file mode 100644
index ded5a1a..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/cli/McastDeleteCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.cli;
-
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-
-import org.onosproject.mfwd.impl.McastRouteTable;
-
-/**
- * Delete a multicast route.
- */
-@Command(scope = "onos", name = "mcast-delete",
- description = "Delete a multicast route flow")
-public class McastDeleteCommand extends AbstractShellCommand {
-
- @Argument(index = 0, name = "sAddr",
- description = "IP Address of the multicast source. '*' can be used for any source (*, G) entry",
- required = true, multiValued = false)
- String sAddr = null;
-
- @Argument(index = 1, name = "gAddr",
- description = "IP Address of the multicast group",
- required = true, multiValued = false)
- String gAddr = null;
-
- @Override
- protected void execute() {
- McastRouteTable mrib = McastRouteTable.getInstance();
- mrib.removeRoute(sAddr, gAddr);
- }
-}
-
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/cli/McastJoinCommand.java b/mfwd/src/main/java/org/onosproject/mfwd/cli/McastJoinCommand.java
deleted file mode 100644
index 5172691..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/cli/McastJoinCommand.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.cli;
-
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.onlab.packet.IpPrefix;
-import org.onosproject.cli.AbstractShellCommand;
-
-import org.onosproject.mfwd.impl.McastRouteBase;
-import org.onosproject.mfwd.impl.McastRouteTable;
-
-/**
- * Installs a source, multicast group flow.
- */
-@Command(scope = "onos", name = "mcast-join",
- description = "Installs a source, multicast group flow")
-public class McastJoinCommand extends AbstractShellCommand {
-
- @Argument(index = 0, name = "sAddr",
- description = "IP Address of the multicast source. '*' can be used for any source (*, G) entry",
- required = true, multiValued = false)
- String sAddr = null;
-
- @Argument(index = 1, name = "gAddr",
- description = "IP Address of the multicast group",
- required = true, multiValued = false)
- String gAddr = null;
-
- @Argument(index = 2, name = "ingressPort",
- description = "Ingress port and Egress ports",
- required = false, multiValued = false)
- String ingressPort = null;
-
- @Argument(index = 3, name = "ports",
- description = "Ingress port and Egress ports",
- required = false, multiValued = true)
- String[] ports = null;
-
- @Override
- protected void execute() {
- McastRouteTable mrib = McastRouteTable.getInstance();
- IpPrefix mcast = IpPrefix.valueOf("224.0.0.0/4");
- IpPrefix saddr = IpPrefix.valueOf(sAddr);
- if (mcast.contains(saddr)) {
- print("Error: the source address " + sAddr + " must be an IPv4 unicast address");
- return;
- }
-
- IpPrefix gaddr = IpPrefix.valueOf(gAddr);
- if (!mcast.contains(gaddr)) {
- print("Error: " + gAddr + " must be a multicast group address");
- return;
- }
-
- McastRouteBase mr = mrib.addRoute(sAddr, gAddr);
- if (mr == null) {
- print("Error: unable to save the multicast state");
- return;
- }
-
- // Port format "of:0000000000000023/4"
- if (ingressPort != null) {
- String inCP = ingressPort;
- log.debug("Ingress port provided: " + inCP);
- String [] cp = inCP.split("/");
- mr.addIngressPoint(cp[0], Long.parseLong(cp[1]));
- } else {
- return;
- }
-
- if (ports == null) {
- return;
- }
-
- for (int i = 0; i < ports.length; i++) {
- String egCP = ports[i];
- log.debug("Egress port provided: " + egCP);
- String [] cp = egCP.split("/");
- mr.addEgressPoint(cp[0], Long.parseLong(cp[1]));
- }
- print("Added the mcast route");
- }
-}
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/cli/McastShowCommand.java b/mfwd/src/main/java/org/onosproject/mfwd/cli/McastShowCommand.java
deleted file mode 100644
index 750fac9..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/cli/McastShowCommand.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.cli;
-
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.net.ConnectPoint;
-import org.onlab.packet.IpPrefix;
-
-import java.util.Map;
-import java.util.Set;
-
-import org.slf4j.Logger;
-import org.onosproject.mfwd.impl.McastRouteTable;
-import org.onosproject.mfwd.impl.McastRouteGroup;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Displays the source, multicast group flows entries.
- */
-@Command(scope = "onos", name = "mcast-show", description = "Displays the source, multicast group flows")
-public class McastShowCommand extends AbstractShellCommand {
-
- private final Logger log = getLogger(getClass());
-
- @Override
- protected void execute() {
- McastRouteTable mrt = McastRouteTable.getInstance();
- if (outputJson()) {
- print("%s", json(mrt));
- } else {
- printMrib4(mrt);
- }
- }
-
- public JsonNode json(McastRouteTable mrt) {
- ObjectMapper mapper = new ObjectMapper();
- ArrayNode result = mapper.createArrayNode();
- Map<IpPrefix, McastRouteGroup> mrib4 = mrt.getMrib4();
- for (McastRouteGroup mg : mrib4.values()) {
- String sAddr = "";
- String gAddr = "";
- String inPort = "";
- String outPorts = "";
- if (mg.getSaddr() != null) {
- sAddr = mg.getSaddr().toString();
- log.info("Multicast Source: " + sAddr);
- }
- if (mg.getGaddr() != null) {
- gAddr = mg.getGaddr().toString();
- log.info("Multicast Group: " + gAddr);
- }
- if (mg.getIngressPoint() != null) {
- inPort = mg.getIngressPoint().toString();
- log.info("Multicast Ingress: " + inPort);
- }
- Set<ConnectPoint> eps = mg.getEgressPoints();
- if (eps != null && !eps.isEmpty()) {
- outPorts = eps.toString();
- }
- result.add(mapper.createObjectNode()
- .put("src", sAddr)
- .put("grp", gAddr)
- .put("inPort", inPort)
- .put("outPorts", outPorts));
- }
- return result;
- }
-
- /**
- * Displays multicast route table entries.
- *
- * @param mrt route table
- */
- protected void printMrib4(McastRouteTable mrt) {
- print(mrt.printMcastRouteTable());
- }
-}
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/cli/package-info.java b/mfwd/src/main/java/org/onosproject/mfwd/cli/package-info.java
deleted file mode 100644
index 7b5ed39..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/cli/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-/**
- * Sample Multicast forwarding framework using intents.
- */
-package org.onosproject.mfwd.cli;
-
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastForwarding.java b/mfwd/src/main/java/org/onosproject/mfwd/impl/McastForwarding.java
deleted file mode 100644
index bcba060..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastForwarding.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.impl;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-
-import org.onlab.packet.Ethernet;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.Ip4Address;
-import org.onlab.packet.IPv4;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.packet.DefaultOutboundPacket;
-import org.onosproject.net.packet.InboundPacket;
-import org.onosproject.net.packet.OutboundPacket;
-import org.onosproject.net.packet.PacketContext;
-import org.onosproject.net.packet.PacketPriority;
-import org.onosproject.net.packet.PacketProcessor;
-import org.onosproject.net.packet.PacketService;
-import org.slf4j.Logger;
-
-/**
- * WORK-IN-PROGRESS: The multicast forwarding application using intent framework.
- */
-@Component(immediate = true)
-public class McastForwarding {
-
- private final Logger log = getLogger(getClass());
- private final IpPrefix mcast = IpPrefix.valueOf("224.0.0.0/4");
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected PacketService packetService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected CoreService coreService;
-
- private ReactivePacketProcessor processor = new ReactivePacketProcessor();
- private McastRouteTable mrib;
- private static ApplicationId appId;
-
- /**
- * Active MulticastForwardingIntent.
- */
- @Activate
- public void activate() {
- appId = coreService.registerApplication("org.onosproject.mfwd");
-
- packetService.addProcessor(processor, PacketProcessor.director(2));
-
- // Build a traffic selector for all multicast traffic
- TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
- selector.matchEthType(Ethernet.TYPE_IPV4);
- selector.matchIPDst(mcast);
- packetService.requestPackets(selector.build(), PacketPriority.REACTIVE, appId);
-
- mrib = McastRouteTable.getInstance();
- log.info("Started");
- }
-
- /**
- * Deactivate Multicast Forwarding Intent.
- */
- @Deactivate
- public void deactivate() {
- packetService.removeProcessor(processor);
- processor = null;
- log.info("Stopped");
- }
-
- /**
- * Get the application ID, used by the McastIntentManager.
- *
- * @return the application ID
- */
- public static ApplicationId getAppId() {
- return appId;
- }
-
- /**
- * Packet processor responsible for forwarding packets along their paths.
- */
- private class ReactivePacketProcessor implements PacketProcessor {
-
- /**
- * Process incoming packets.
- *
- * @param context packet processing context
- */
- @Override
- public void process(PacketContext context) {
- // Stop processing if the packet has been handled, since we
- // can't do any more to it.
- if (context.isHandled()) {
- return;
- }
-
- InboundPacket pkt = context.inPacket();
- Ethernet ethPkt = pkt.parsed();
-
- if (ethPkt == null) {
- return;
- }
-
- if (ethPkt.getEtherType() != Ethernet.TYPE_IPV4 &&
- ethPkt.getEtherType() != Ethernet.TYPE_IPV6) {
- return;
- }
-
- if (ethPkt.getEtherType() == Ethernet.TYPE_IPV6) {
- // Ignore ipv6 at the moment.
- return;
- }
-
- IPv4 ip = (IPv4) ethPkt.getPayload();
- IpAddress gaddr = IpAddress.valueOf(ip.getDestinationAddress());
- IpAddress saddr = Ip4Address.valueOf(ip.getSourceAddress());
-
- log.debug("Packet ({}, {}) has been punted\n" +
- "\tingress port: {}\n",
- saddr.toString(),
- gaddr.toString(),
- context.inPacket().receivedFrom().toString());
-
- if (!mcast.contains(gaddr)) {
- // Yikes, this is a bad group address
- return;
- }
-
- if (mcast.contains(saddr)) {
- // Yikes, the source address is multicast
- return;
- }
-
- IpPrefix spfx = IpPrefix.valueOf(saddr, 32);
- IpPrefix gpfx = IpPrefix.valueOf(gaddr, 32);
-
- /*
- * Do a best match lookup on the (s, g) of the packet. If an entry does
- * not exist create one and store it's incoming connect point.
- *
- * The connect point is deviceId / portId that the packet entered
- * the SDN network. This differs from traditional mcast where the
- * ingress port would be a specific device.
- */
- McastRoute entry = mrib.findBestMatch(spfx, gpfx);
- if (entry == null || entry.getSaddr().equals(IPv4.fromIPv4Address(0))) {
-
- /*
- * Create an entry that we can fast drop.
- */
- entry = mrib.addRoute(spfx, gpfx);
- entry.addIngressPoint(context.inPacket().receivedFrom());
- }
-
- /*
- * TODO: If we do not have an ingress or any egress connect points we
- * should set up a fast drop entry.
- */
- if (entry.getIngressPoint() == null) {
- return;
- }
-
- if (entry.getEgressPoints().isEmpty()) {
- return;
- }
-
- /*
- * This is odd, we should not have received a punted packet if an
- * intent was installed unless the intent was not installed
- * correctly. However, we are seeing packets get punted after
- * the intent has been installed.
- *
- * Therefore we are going to forward the packets even if they
- * should have already been forwarded by the intent fabric.
- */
- if (entry.getIntentKey() != null) {
- return;
- }
-
- entry.setIntent();
- McastIntentManager im = McastIntentManager.getInstance();
- im.setIntent(entry);
-
- entry.incrementPuntCount();
-
- // Send the pack out each of the egress devices & port
- forwardPacketToDst(context, entry);
- }
- }
-
- /**
- * Forward the packet to it's multicast destinations.
- *
- * @param context The packet context
- * @param entry The multicast route entry matching this packet
- */
- private void forwardPacketToDst(PacketContext context, McastRoute entry) {
-
- // Send the pack out each of the respective egress ports
- for (ConnectPoint egress : entry.getEgressPoints()) {
- TrafficTreatment treatment = DefaultTrafficTreatment.builder()
- .setOutput(egress.port()).build();
-
- OutboundPacket packet = new DefaultOutboundPacket(
- egress.deviceId(),
- treatment,
- context.inPacket().unparsed());
-
- packetService.emit(packet);
- }
- }
-}
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastIntentManager.java b/mfwd/src/main/java/org/onosproject/mfwd/impl/McastIntentManager.java
deleted file mode 100644
index c3709e6..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastIntentManager.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.impl;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onlab.packet.Ethernet;
-import org.onosproject.net.intent.Intent;
-import org.onosproject.net.intent.SinglePointToMultiPointIntent;
-import org.onosproject.net.intent.IntentService;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-
-@Component(immediate = true)
-@Service(value = org.onosproject.mfwd.impl.McastIntentManager.class)
-public class McastIntentManager {
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected IntentService intentService;
-
- private static McastIntentManager instance;
-
- public McastIntentManager() {
- instance = this;
- }
-
- /**
- * Active this component.
- */
- @Activate
- public void activate() { }
-
- /**
- * Deactivate this component.
- */
- @Deactivate
- public void deactivate() {
- withdrawAllIntents();
- }
-
- /**
- * Get instance of this intentManager.
- *
- * @return the instance of this intent manager.
- */
- public static McastIntentManager getInstance() {
- if (instance == null) {
- instance = new McastIntentManager();
- }
- return instance;
- }
-
- /**
- * Install the PointToMultipoint forwarding intent.
- *
- * @param mroute multicast route entry
- * @return the intent that has been set or null otherwise
- */
- public SinglePointToMultiPointIntent setIntent(McastRoute mroute) {
- TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
- TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
-
- if (mroute.getIngressPoint() == null ||
- mroute.getEgressPoints().isEmpty()) {
- return null;
- }
-
- /*
- * Match the group AND source addresses. We will also check ether type to
- * determine if we are doing ipv4 or ipv6.
- *
- * If we really wanted to be pendantic we could put in a
- * condition to make sure the ethernet MAC address was also
- * mcast.
- */
- selector.matchEthType(Ethernet.TYPE_IPV4)
- .matchIPDst(mroute.getGaddr())
- .matchIPSrc(mroute.getSaddr());
-
- SinglePointToMultiPointIntent intent =
- SinglePointToMultiPointIntent.builder()
- .appId(McastForwarding.getAppId())
- .selector(selector.build())
- .treatment(treatment)
- .ingressPoint(mroute.getIngressPoint())
- .egressPoints(mroute.getEgressPoints()).
- build();
-
- intentService.submit(intent);
- return intent;
- }
-
- /**
- * Withdraw the intent represented by this route.
- *
- * @param mroute the mcast route whose intent we want to remove
- */
- public void withdrawIntent(McastRouteBase mroute) {
- Intent intent = intentService.getIntent(mroute.getIntentKey());
- intentService.withdraw(intent);
- }
-
- /**
- * Withdraw all intents.
- *
- * This will be called from the deactivate method so we don't leave
- * a mess behind us after we leave.
- */
- public void withdrawAllIntents() {
- for (Intent intent : intentService.getIntents()) {
- intentService.withdraw(intent);
- }
- }
-}
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRoute.java b/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRoute.java
deleted file mode 100644
index d56488e..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRoute.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.impl;
-
-import org.onlab.packet.IpPrefix;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.intent.Key;
-import org.onosproject.net.intent.SinglePointToMultiPointIntent;
-
-import java.util.Set;
-
-/**
- * This McastRouteBase interface is implemented by the McastRouteBase class which
- * in turn acts as the base class for both the McastRouteGroup and McastRouteSource.
- */
-interface McastRoute {
-
- /**
- * Gets the group addresses.
- *
- * @return group address
- */
- public IpPrefix getGaddr();
-
- /**
- * Gets the source address.
- *
- * @return the source address
- */
- public IpPrefix getSaddr();
-
- /**
- * Determines if this is an IPv4 multicast route.
- *
- * @return true if it is an IPv4 route
- */
- public boolean isIp4();
-
- /**
- * Determines if this is an IPv6 multicast route.
- *
- * @return true if it is an IPv6 route
- */
- public boolean isIp6();
-
- /**
- * Add the ingress ConnectPoint with a ConnectPoint.
- *
- * @param ingress ingress point
- */
- public void addIngressPoint(ConnectPoint ingress);
-
- /**
- * Add the ingress Connect Point using. ..
- *
- * @param deviceId device ID
- * @param portNum port number
- */
- public void addIngressPoint(String deviceId, long portNum);
-
- /**
- * Get the ingress connect point.
- *
- * @return the ingress connect point
- */
- public ConnectPoint getIngressPoint();
-
- /**
- * Add an egress connect point.
- *
- * @param member the egress ConnectPoint to be added
- */
- public void addEgressPoint(ConnectPoint member);
-
- /**
- * Add an egress connect point.
- *
- * @param deviceId the device ID of the connect point
- * @param portNum the port number of the connect point
- */
- public void addEgressPoint(String deviceId, long portNum);
-
- /**
- * Get the egress connect points.
- *
- * @return a set of egress connect points
- */
- public Set<ConnectPoint> getEgressPoints();
-
- /**
- * Increment the punt count.
- */
- public void incrementPuntCount();
-
- /**
- * Get the punt count.
- *
- * @return the punt count
- */
- public int getPuntCount();
-
- /**
- * Have the McastIntentManager create an intent, attempt to
- * install the intent and then save the key.
- */
- public void setIntent();
-
- /**
- * Set the Intent key.
- *
- * @param intent intent
- */
- public void setIntent(SinglePointToMultiPointIntent intent);
-
- /**
- * Withdraw the intent if it has been installed.
- */
- public void withdrawIntent();
-
- /**
- * Get the intent key.
- *
- * @return the intentKey
- */
- public Key getIntentKey();
-
- /**
- * Pretty print the the route.
- *
- * @return a pretty string
- */
- public String toString();
-}
\ No newline at end of file
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteBase.java b/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteBase.java
deleted file mode 100644
index 36582ad..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteBase.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.impl;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import org.onlab.packet.IpPrefix;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.intent.SinglePointToMultiPointIntent;
-import org.onosproject.net.intent.Key;
-
-import java.util.Set;
-import java.util.HashSet;
-
-/**
- * McastRouteBase base class for McastRouteGroup and McastRouteSource.
- */
-public class McastRouteBase implements McastRoute {
- protected final IpPrefix gaddr;
- protected final IpPrefix saddr;
-
- protected ConnectPoint ingressPoint;
- protected Set<ConnectPoint> egressPoints;
-
- protected boolean isGroup = false;
-
- /**
- * How may times has this packet been punted.
- */
- private int puntCount = 0;
-
- /**
- * If the intentKey is null that means no intent has
- * been installed.
- */
- protected Key intentKey = null;
-
- /**
- * Create a multicast route. This is the parent class for both the Group
- * and the source.
- *
- * @param saddr source address
- * @param gaddr multicast group address
- */
- public McastRouteBase(String saddr, String gaddr) {
- this.gaddr = IpPrefix.valueOf(checkNotNull(gaddr));
- if (saddr == null || saddr.equals("*")) {
- this.saddr = IpPrefix.valueOf(0, 0);
- } else {
- this.saddr = IpPrefix.valueOf(checkNotNull(gaddr));
- }
- this.init();
- }
-
- /**
- * Create a multicast group table entry.
- * @param gaddr multicast group address
- */
- public McastRouteBase(String gaddr) {
- this("*", gaddr);
- }
-
- /**
- * Set the source and group address value of a (*, G) group.
- *
- * @param gpfx the group prefix address
- */
- public McastRouteBase(IpPrefix gpfx) {
- this(IpPrefix.valueOf(0, 0), gpfx);
- }
-
- /**
- * Create a multicast route constructor.
- *
- * @param saddr source address
- * @param gaddr group address
- */
- public McastRouteBase(IpPrefix saddr, IpPrefix gaddr) {
- this.saddr = checkNotNull(saddr);
- this.gaddr = checkNotNull(gaddr);
-
- this.init();
- }
-
- private void init() {
- this.isGroup = (this.saddr.prefixLength() == 0);
- this.ingressPoint = null;
- this.egressPoints = new HashSet();
- }
-
- /**
- * Get the multicast group address.
- *
- * @return the multicast group address
- */
- @Override
- public IpPrefix getGaddr() {
- return gaddr;
- }
-
- /**
- * Get the multicast source address.
- *
- * @return the multicast source address
- */
- @Override
- public IpPrefix getSaddr() {
- return saddr;
- }
-
- /**
- * Is this an IPv4 multicast route.
- *
- * @return true if it is an IPv4 route
- */
- @Override
- public boolean isIp4() {
- return gaddr.isIp4();
- }
-
- /**
- * Is this an IPv6 multicast route.
- *
- * @return true if it is an IPv6 route
- */
- @Override
- public boolean isIp6() {
- return gaddr.isIp6();
- }
-
- /**
- * Is this a multicast group route?
- *
- * @return true if it is a multicast group route.
- */
- public boolean isGroup() {
- return isGroup;
- }
-
- /**
- * @return true if this is (S, G) false if it (*, G).
- */
- public boolean isSource() {
- return (!isGroup);
- }
-
- /**
- * Add an ingress point to this route.
- *
- * @param ingress incoming connect point
- */
- @Override
- public void addIngressPoint(ConnectPoint ingress) {
- ingressPoint = checkNotNull(ingress);
- }
-
- /**
- * Add or modify the ingress connect point.
- *
- * @param deviceId the switch device Id
- * @param portNum the ingress port number
- */
- @Override
- public void addIngressPoint(String deviceId, long portNum) {
- ingressPoint = new ConnectPoint(
- DeviceId.deviceId(deviceId),
- PortNumber.portNumber(portNum));
- }
-
- /**
- * Get the ingress ConnectPoint.
- *
- * @return the ingress ConnectPoint
- */
- @Override
- public ConnectPoint getIngressPoint() {
- return this.ingressPoint;
- }
-
- /**
- * Add an egress ConnectPoint.
- *
- * @param member member egress connect point
- */
- @Override
- public void addEgressPoint(ConnectPoint member) {
- egressPoints.add(checkNotNull(member));
- }
-
- /**
- * Add an egress ConnectPoint.
- *
- * @param deviceId deviceId of the connect point
- * @param portNum portNum of the connect point
- */
- @Override
- public void addEgressPoint(String deviceId, long portNum) {
- ConnectPoint cp = new ConnectPoint(DeviceId.deviceId(deviceId), PortNumber.portNumber(portNum));
- this.egressPoints.add(cp);
- }
-
- /**
- * Get egress connect points for the route.
- *
- * @return Set of egress connect points
- */
- @Override
- public Set<ConnectPoint> getEgressPoints() {
- return egressPoints;
- }
-
- /**
- * Get the number of times the packet has been punted.
- *
- * @return the punt count
- */
- @Override
- public int getPuntCount() {
- return puntCount;
- }
-
- /**
- * Increment the punt count.
- *
- * TODO: we need to handle wrapping.
- */
- @Override
- public void incrementPuntCount() {
- puntCount++;
- }
-
- /**
- * Have the McastIntentManager create and set the intent, then save the intent key.
- *
- * If we already have an intent, we will first withdraw the existing intent and
- * replace it with a new one. This will support the case where the ingress connectPoint
- * or group of egress connectPoints change.
- */
- @Override
- public void setIntent() {
- if (this.intentKey != null) {
- this.withdrawIntent();
- }
- McastIntentManager im = McastIntentManager.getInstance();
- SinglePointToMultiPointIntent intent = im.setIntent(this);
- this.intentKey = intent.key();
- }
-
- /**
- * Set the Intent key.
- *
- * @param intent intent
- */
- @Override
- public void setIntent(SinglePointToMultiPointIntent intent) {
- intentKey = intent.key();
- }
-
- /**
- * Get the intent key represented by this route.
- *
- * @return intentKey
- */
- @Override
- public Key getIntentKey() {
- return this.intentKey;
- }
-
-
- /**
- * Withdraw the intent and set the key to null.
- */
- @Override
- public void withdrawIntent() {
- if (intentKey == null) {
- // nothing to withdraw
- return;
- }
- McastIntentManager im = McastIntentManager.getInstance();
- im.withdrawIntent(this);
- this.intentKey = null;
- }
-
- /**
- * Pretty Print this Multicast Route. Works for McastRouteSource and McastRouteGroup.
- *
- * @return pretty string of the multicast route
- */
- @Override
- public String toString() {
- String out = String.format("(%s, %s)\n\t",
- saddr.toString(), gaddr.toString());
-
- out += "intent: ";
- out += (intentKey == null) ? "not installed" : this.intentKey.toString();
- out += "\n\tingress: ";
- out += (ingressPoint == null) ? "NULL" : ingressPoint.toString();
- out += "\n\tegress: {\n";
- if (egressPoints != null && !egressPoints.isEmpty()) {
- for (ConnectPoint eg : egressPoints) {
- out += "\t\t" + eg.toString() + "\n";
- }
- }
- out += ("\t}\n");
- out += ("\tpunted: " + this.getPuntCount() + "\n");
- return out;
- }
-}
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteGroup.java b/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteGroup.java
deleted file mode 100644
index 4a58e1b..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteGroup.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.impl;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import java.util.HashMap;
-import org.onlab.packet.IpPrefix;
-
-/**
- * The McastRouteGroup extends the McastRouteBase class and serves two purposes:
- * first it represents a (*, G) multicast route entry. Second it serves
- * as a container for all (S, G) multicast route entries that belong
- * to the same group address.
- */
-public class McastRouteGroup extends McastRouteBase {
- private HashMap<IpPrefix, McastRouteSource> sources;
-
- /**
- * Class constructor.
- *
- * @param gaddr - String representation of group address.
- */
- public McastRouteGroup(String gaddr) {
- super(checkNotNull(gaddr));
- this.init();
- }
-
- /**
- * Create a multicast group.
- *
- * @param gpfx - Group address
- */
- public McastRouteGroup(IpPrefix gpfx) {
- super(checkNotNull(gpfx));
- this.init();
- }
-
- /**
- * Common initialization used by constructors.
- */
- private void init() {
- this.sources = new HashMap();
- super.isGroup = true;
- }
-
- /**
- * Find a specific multicast source address for this group.
- *
- * @param saddr the source address
- * @return the multicast source route or null if it does not exist
- */
- public McastRouteSource findSource(IpPrefix saddr) {
- return this.sources.get(checkNotNull(saddr));
- }
-
- /**
- * Return the entire set of multicast sources for this group.
- *
- * @return the set of multicast sources
- */
- public HashMap<IpPrefix, McastRouteSource> getSources() {
- return this.sources;
- }
-
- /**
- * Add a new McastRouteSource to this group.
- *
- * @param src the multicast source
- */
- public void addSource(McastRouteSource src) {
- checkNotNull(src);
- this.sources.put(src.getSaddr(), src);
- }
-
- /**
- * Remove the source with this specific IpPrefix from this group entry.
- *
- * @param spfx IP Prefix of the source to be removed
- * @return the source route that was just removed
- */
- public McastRouteSource removeSource(IpPrefix spfx) {
- McastRouteSource src = this.sources.remove(spfx);
- src.withdrawIntent();
- return src;
- }
-
- /**
- * Remove all sources from this.
- */
- public void removeSources() {
- for (McastRouteSource src : this.sources.values()) {
- src.withdrawIntent();
- this.sources.remove(src.getSaddr());
- }
- }
-
-}
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteSource.java b/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteSource.java
deleted file mode 100644
index 68edc2e..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteSource.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.impl;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import org.onlab.packet.IpPrefix;
-
-/**
- * This class represents and specific multicast senders source address. Objects from
- * this class will belong to the sources collection of the multicast group.
- */
-public class McastRouteSource extends McastRouteBase {
-
- // A reference to our parent group
- private McastRouteGroup group;
-
- /**
- * Create a multicast source with IpPrefixes.
- *
- * @param source the source address
- * @param group the group address
- */
- public McastRouteSource(IpPrefix source, IpPrefix group) {
- super(checkNotNull(source), checkNotNull(group));
- }
-
- /**
- * Set our parent multicast group.
- *
- * @param group the group this source belongs to
- */
- public void setGroup(McastRouteGroup group) {
- this.group = group;
- }
-}
\ No newline at end of file
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteTable.java b/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteTable.java
deleted file mode 100644
index ff7a026..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/impl/McastRouteTable.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.impl;
-
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.packet.IpPrefix;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * The Mcast Route Table holds all multicast state for the controller.
- *
- * State for IPv4 and IPv6 are maintained. The tables are sets of McastRouteGroup
- * structures that represent (*, G) state with a series of egress ConnectPoints.
- * Each (*, G) may also have a set of (S, G) that may have there own set of
- * ingress and egress ConnectPoints.
- *
- * TODO: perhaps should probably create two separate singleton for IPv4 and IPv6 respectively.
- */
-@Service(value = org.onosproject.mfwd.impl.McastRouteTable.class)
-public final class McastRouteTable {
-
- /*
- * Create a map of the McastGroups indexed by the multicast group prefix.
- * We may choose to change the map data structure in to some form a radix trie
- * depending on the type of real world usage we see.
- */
- private final Map<IpPrefix, McastRouteGroup> mrib4;
- private final Map<IpPrefix, McastRouteGroup> mrib6;
- private static McastRouteTable instance = null;
-
- private Boolean ipv6Enabled = false;
-
- /**
- * Create the two v4 & v6 tables.
- */
- private McastRouteTable() {
- mrib4 = new ConcurrentHashMap<IpPrefix, McastRouteGroup>();
- if (ipv6Enabled) {
- mrib6 = new ConcurrentHashMap<IpPrefix, McastRouteGroup>();
- } else {
- mrib6 = null;
- }
- }
-
- /**
- * Get the single instance of this multicast group address.
- *
- * @return the multicast route table
- */
- public static McastRouteTable getInstance() {
- if (instance == null) {
- instance = new McastRouteTable();
- }
- return instance;
- }
-
- /**
- * Get the IPv4 MRIB.
- *
- * @return the IPv4 MRIB
- */
- public Map<IpPrefix, McastRouteGroup> getMrib4() {
- return mrib4;
- }
-
- /**
- * Get the IPv6 MRIB.
- *
- * @return Return the set of prefix keyed McastGroups
- */
- public Map<IpPrefix, McastRouteGroup> getMrib6() {
- return mrib6;
- }
-
- /**
- * Save the McastRouteGroup in the address family appropriate mrib.
- *
- * @param group The McastRouteGroup to save
- */
- private void storeGroup(McastRouteGroup group) {
- if (group.isIp4()) {
- mrib4.put(group.getGaddr(), group);
- } else if (group.isIp6() && ipv6Enabled) {
- mrib6.put(group.getGaddr(), group);
- }
- }
-
- /**
- * Remove the group.
- *
- * @param group the group to be removed
- */
- private void removeGroup(McastRouteGroup group) {
- IpPrefix gpfx = group.getGaddr();
- if (gpfx.isIp4()) {
- mrib4.remove(gpfx);
- } else if (gpfx.isIp6() && ipv6Enabled) {
- mrib6.remove(gpfx);
- }
- }
-
- /**
- * Add a multicast route to the MRIB. This function will.
- *
- * @param saddr source address * or x.x.x.x or x.x.x.x/y
- * @param gaddr group address x.x.x.x or x.x.x.x/y
- * @return the multicast route
- */
- public McastRouteBase addRoute(String saddr, String gaddr) {
- IpPrefix gpfx = IpPrefix.valueOf(gaddr);
- IpPrefix spfx = IpPrefix.valueOf(0, 0);
- if (saddr != null && !saddr.equals("*")) {
- spfx = IpPrefix.valueOf(saddr);
- }
- return addRoute(spfx, gpfx);
- }
-
- /**
- * Add a multicast route to the MRIB. This function will store either
- * (S, G) or (*, G) in the mrib if an entry does not already exist. If
- * an entry does exist it is returned to the caller.
- *
- * Every (S, G) is stored as part of it's parent group entry which also represents
- * (*, G) routes. In the case of a (S, G) we will also create the (*, G) entry if needed
- * then save the (S, G) to the (*, G).
- *
- * @param spfx the source prefix
- * @param gpfx the group prefix
- * @return the resulting McastRouteSource or McastRouteGroup accordingly.
- */
- public McastRouteBase addRoute(IpPrefix spfx, IpPrefix gpfx) {
-
- /**
- * If a group route (*, g) does not exist we will need to make so we
- * can start attaching our sources to the group entry.
- */
- McastRouteGroup group = findMcastGroup(gpfx);
- if (group == null) {
- group = new McastRouteGroup(gpfx);
-
- // Save it for later
- if (gpfx.isIp4()) {
- this.mrib4.put(gpfx, group);
- } else if (gpfx.isIp6() && ipv6Enabled) {
- this.mrib6.put(gpfx, group);
- }
- }
-
- /**
- * If the source prefix length is 0 then we have our (*, g) entry, we can
- * just return now.
- */
- if (spfx.prefixLength() == 0) {
- return group;
- }
-
- // See if the source already exists. If so just return it.
- McastRouteSource source = group.findSource(spfx);
- if (source != null) {
- return source;
- }
-
- /**
- * We have the group but no source. We need to create the source then add it
- * to the group.
- */
- source = new McastRouteSource(spfx, gpfx);
-
- // Have the source save it's parent
- source.setGroup(group);
-
- // Save this source as part of this group
- group.addSource(source);
-
- return source;
- }
-
- /**
- * Delete a multicast route from the MRIB.
- *
- * @param saddr source address * or x.x.x.x or x.x.x.x/y
- * @param gaddr group address x.x.x.x or x.x.x.x/y
- */
- public void removeRoute(String saddr, String gaddr) {
- IpPrefix gpfx = IpPrefix.valueOf(gaddr);
- IpPrefix spfx = IpPrefix.valueOf(0, 0);
- if (saddr != null && !saddr.equals("*")) {
- spfx = IpPrefix.valueOf(saddr);
- }
- removeRoute(spfx, gpfx);
- }
-
- /**
- * Remove a multicast route.
- *
- * @param spfx the source prefix
- * @param gpfx the group prefix
- */
- public void removeRoute(IpPrefix spfx, IpPrefix gpfx) {
-
- /**
- * If a group route (*, g) does not exist we will need to make so we
- * can start attaching our sources to the group entry.
- */
- McastRouteGroup group = findMcastGroup(gpfx);
- if (group == null) {
- // The group does not exist, we can't remove it.
- return;
- }
-
- /**
- * If the source prefix length is 0 then we have a (*, g) entry, which
- * means we will remove this group and all of it's sources. We will
- * also withdraw it's intent if need be.
- */
- if (spfx.prefixLength() > 0) {
- group.removeSource(spfx);
-
- /*
- * Now a little house keeping. If this group has no more sources
- * nor egress connectPoints git rid of it.
- */
- if (group.getSources().size() == 0 &&
- group.getEgressPoints().size() == 0) {
- removeGroup(group);
- }
-
- } else {
- // Group remove has been explicitly requested.
- group.removeSources();
- group.withdrawIntent();
- removeGroup(group);
- }
- }
-
- /**
- * Find the specific multicast group entry.
- *
- * @param group the group address
- * @return McastRouteGroup the multicast (*, G) group route
- */
- public McastRouteGroup findMcastGroup(IpPrefix group) {
- McastRouteGroup g = null;
- if (group.isIp4()) {
- g = mrib4.get(group);
- } else if (group.isIp6() && ipv6Enabled) {
- g = mrib6.get(group);
- }
- return g;
- }
-
- /**
- * Find the multicast (S, G) entry if it exists.
- *
- * @param saddr the source address
- * @param gaddr the group address
- * @return The multicast source route entry if it exists, null if it does not.
- */
- public McastRouteSource findMcastSource(IpPrefix saddr, IpPrefix gaddr) {
- McastRouteGroup grp = findMcastGroup(checkNotNull(gaddr));
- if (grp == null) {
- return null;
- }
- return grp.findSource(saddr);
- }
-
- /**
- * This will first look up a Group entry. If no group entry was found null will
- * be returned. If the group entry has been found we will then look up the (s, g) entry.
- * If the (s, g) entry has been found, that will be returned. If no (s, g) was found
- * the (*, g) group entry will be returned.
- *
- * @param saddr the source address
- * @param gaddr the group address
- * @return return the best matching McastRouteSource or McastRouteGroup
- */
- public McastRoute findBestMatch(IpPrefix saddr, IpPrefix gaddr) {
- McastRouteGroup grp = this.findMcastGroup(checkNotNull(gaddr));
- if (grp == null) {
- return null;
- }
-
- // Found a group now look for a source
- McastRouteSource src = grp.findSource(checkNotNull(saddr));
- if (src == null) {
- return grp;
- }
-
- return src;
- }
-
- /**
- * Print out the multicast route table in it's entirety.
- *
- * TODO: Eventually we will have to implement paging and how to handle large tables.
- * @return String
- */
- public String printMcastRouteTable() {
- String out = this.toString() + "\n";
-
- for (McastRouteGroup grp : mrib4.values()) {
- out += grp.toString() + "\n";
- for (McastRouteSource src : grp.getSources().values()) {
- out += src.toString() + "\n";
- }
- }
- return out;
- }
-
- /**
- * Print out a summary of groups in the MRIB.
- *
- * @return String
- */
- public String toString() {
- String out = "Mcast Route Table: ";
- out += mrib4.size() + " IPv4 Multicast Groups\n";
- if (ipv6Enabled) {
- out += mrib6.size() + " IPv6 Multicast Groups\n";
- }
- return out;
- }
-}
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/impl/package-info.java b/mfwd/src/main/java/org/onosproject/mfwd/impl/package-info.java
deleted file mode 100644
index eaef5fc..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/impl/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Sample Multicast forwarding framework using intents.
- */
-package org.onosproject.mfwd.impl;
diff --git a/mfwd/src/main/java/org/onosproject/mfwd/rest/McastResource.java b/mfwd/src/main/java/org/onosproject/mfwd/rest/McastResource.java
deleted file mode 100644
index 878e21d..0000000
--- a/mfwd/src/main/java/org/onosproject/mfwd/rest/McastResource.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.mfwd.rest;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.onlab.packet.IpPrefix;
-import org.onlab.rest.BaseResource;
-import org.onosproject.mfwd.impl.McastRouteGroup;
-import org.onosproject.mfwd.impl.McastRouteTable;
-
-/**
- * Rest API for Multicast Forwarding.
- */
-@Path("mcast")
-public class McastResource extends BaseResource {
-
- /**
- * Retrieve the multicast route table.
- * @return the multicast route table.
- * @throws IOException if an error occurs
- */
- @GET
- @Produces(MediaType.APPLICATION_JSON)
- public Response showAll() throws IOException {
- ObjectMapper mapper = new ObjectMapper();
- McastRouteTable mcastRouteTable = McastRouteTable.getInstance();
- Map<IpPrefix, McastRouteGroup> map = mcastRouteTable.getMrib4();
- return Response.ok(mapper.createObjectNode().toString()).build();
- }
-
- /**
- * Static join of a multicast flow.
- * @param input source, group, ingress connectPoint egress connectPoints
- * @return status of static join
- * @throws IOException if an error occurs
- */
- @POST
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response join(InputStream input) throws IOException {
- ObjectMapper mapper = new ObjectMapper();
- JsonNode cfg = mapper.readTree(input);
- return null;
- }
-}
diff --git a/mfwd/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/mfwd/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 966cb4f..0000000
--- a/mfwd/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
- ~ Copyright 2014 Open Networking Laboratory
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
- <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
- <command>
- <action class="org.onosproject.mfwd.cli.McastJoinCommand"/>
- </command>
- <command>
- <action class="org.onosproject.mfwd.cli.McastDeleteCommand"/>
- </command>
- <command>
- <action class="org.onosproject.mfwd.cli.McastShowCommand"/>
- </command>
- </command-bundle>
-
-</blueprint>
diff --git a/mfwd/src/main/webapp/WEB-INF/web.xml b/mfwd/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index c4c4f45..0000000
--- a/mfwd/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-~ Copyright 2014 Open Networking Laboratory
-~
-~ Licensed under the Apache License, Version 2.0 (the "License");
-~ you may not use this file except in compliance with the License.
-~ You may obtain a copy of the License at
-~
-~ http://www.apache.org/licenses/LICENSE-2.0
-~
-~ Unless required by applicable law or agreed to in writing, software
-~ distributed under the License is distributed on an "AS IS" BASIS,
-~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-~ See the License for the specific language governing permissions and
-~ limitations under the License.
--->
-<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 APP MFWD</display-name>
-
- <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.resourceConfigClass</param-name>
- <param-value>com.sun.jersey.api.core.ClassNamesResourceConfig</param-value>
- </init-param>
- <init-param>
- <param-name>com.sun.jersey.config.property.classnames</param-name>
- <param-value>
- org.onosproject.mfwd.rest.McastResource
- </param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>JAX-RS Service</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
-
-</web-app>
diff --git a/oneping/pom.xml b/oneping/pom.xml
index 5b22d25..eba81f7 100644
--- a/oneping/pom.xml
+++ b/oneping/pom.xml
@@ -22,7 +22,7 @@
<parent>
<groupId>org.onosproject</groupId>
<artifactId>onos-app-samples</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.4.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
diff --git a/pim/pom.xml b/pim/pom.xml
deleted file mode 100644
index 8730b0d..0000000
--- a/pim/pom.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ Copyright 2015 Open Networking Laboratory
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<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/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-app-samples</artifactId>
- <version>1.4.0-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
-
- <artifactId>onos-app-pim</artifactId>
- <packaging>bundle</packaging>
-
- <description>Protocol Independent Multicast Emulation</description>
-
- <properties>
- <onos.app.name>org.onosproject.pim</onos.app.name>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-api</artifactId>
- <version>${project.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-cli</artifactId>
- <version>${project.version}</version>
- </dependency>
-
-
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onlab-osgi</artifactId>
- <version>${project.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onlab-junit</artifactId>
- <scope>test</scope>
- </dependency>
-
- <!-- This is needed by ComponentContext, used for tunable configuration -->
- <dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.compendium</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.karaf.shell</groupId>
- <artifactId>org.apache.karaf.shell.console</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.scr.annotations</artifactId>
- <version>1.9.8</version>
- <scope>provided</scope>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-SymbolicName>
- ${project.groupId}.${project.artifactId}
- </Bundle-SymbolicName>
- <Import-Package>
- org.slf4j,
- org.osgi.framework,
- org.apache.commons.lang.math.*,
- com.google.common.*,
- org.onlab.packet.*,
- org.onlab.rest.*,
- org.onosproject.*,
- org.onosproject.mfwd.impl.*;
- org.onlab.util.*,
- org.jboss.netty.util.*
- </Import-Package>
- </instructions>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.5.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
-</project>
diff --git a/pim/src/main/java/org/onosproject/pim/cli/PIMShowCommand.java b/pim/src/main/java/org/onosproject/pim/cli/PIMShowCommand.java
deleted file mode 100644
index 5effe45..0000000
--- a/pim/src/main/java/org/onosproject/pim/cli/PIMShowCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pim.cli;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.pim.impl.PIMNeighbors;
-import org.onosproject.pim.impl.PIMNeighborsCodec;
-
-import java.util.HashMap;
-
-@Command(scope = "onos", name = "pim-show", description = "Displays the pim neighbors")
-public class PIMShowCommand extends AbstractShellCommand {
-
- // prints either the json or cli version of the hash map connect point
- // neighbors from the PIMNeighbors class.
- @Override
- protected void execute() {
- // grab connect point neighbors hash map to send in to json encoder.
- HashMap<ConnectPoint, PIMNeighbors> pimNbrs = PIMNeighbors.getConnectPointNeighbors();
- if (outputJson()) {
- print("%s", json(pimNbrs));
- } else {
- print(PIMNeighbors.printPimNeighbors());
- }
- }
-
- private JsonNode json(HashMap<ConnectPoint, PIMNeighbors> pimNbrs) {
- return new PIMNeighborsCodec().encode(pimNbrs, this);
- }
-
-}
\ No newline at end of file
diff --git a/pim/src/main/java/org/onosproject/pim/cli/package-info.java b/pim/src/main/java/org/onosproject/pim/cli/package-info.java
deleted file mode 100644
index 954dacb..0000000
--- a/pim/src/main/java/org/onosproject/pim/cli/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * PIM Multicast forwarding framework using intents.
- */
-package org.onosproject.pim.cli;
\ No newline at end of file
diff --git a/pim/src/main/java/org/onosproject/pim/impl/PIMComponent.java b/pim/src/main/java/org/onosproject/pim/impl/PIMComponent.java
deleted file mode 100644
index bd5e148..0000000
--- a/pim/src/main/java/org/onosproject/pim/impl/PIMComponent.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pim.impl;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onlab.packet.Ethernet;
-import org.onlab.packet.IPv4;
-import org.onlab.packet.Ip4Address;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.PIM;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.packet.InboundPacket;
-import org.onosproject.net.packet.PacketContext;
-import org.onosproject.net.packet.PacketPriority;
-import org.onosproject.net.packet.PacketProcessor;
-import org.onosproject.net.packet.PacketService;
-import org.slf4j.Logger;
-
-/**
- * Protocol Independent Multicast Emulation.
- */
-@Component(immediate = true)
-public class PIMComponent {
- private final Logger log = getLogger(getClass());
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected PacketService packetService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected CoreService coreService;
-
- private PIMPacketProcessor processor = new PIMPacketProcessor();
- private static ApplicationId appId;
-
- @Activate
- public void activate() {
- appId = coreService.registerApplication("org.onosproject.pim");
-
- packetService.addProcessor(processor, PacketProcessor.director(1));
-
- // Build a traffic selector for all multicast traffic
- TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
- selector.matchEthType(Ethernet.TYPE_IPV4);
- selector.matchIPProtocol(IPv4.PROTOCOL_PIM);
- packetService.requestPackets(selector.build(), PacketPriority.REACTIVE, appId);
-
- log.info("Started");
- }
-
- @Deactivate
- public void deactivate() {
- packetService.removeProcessor(processor);
- processor = null;
- log.info("Stopped");
- }
-
- /**
- * Packet processor responsible for handling IGMP packets.
- */
- private class PIMPacketProcessor implements PacketProcessor {
-
- @Override
- public void process(PacketContext context) {
- // Stop processing if the packet has been handled, since we
- // can't do any more to it.
- if (context.isHandled()) {
- return;
- }
-
- InboundPacket pkt = context.inPacket();
- if (pkt == null) {
- return;
- }
-
- Ethernet ethPkt = pkt.parsed();
- if (ethPkt == null) {
- return;
- }
-
- /*
- * IPv6 MLD packets are handled by ICMP6. We'll only deal
- * with IPv4.
- */
- if (ethPkt.getEtherType() != Ethernet.TYPE_IPV4) {
- return;
- }
-
- IPv4 ip = (IPv4) ethPkt.getPayload();
- IpAddress gaddr = IpAddress.valueOf(ip.getDestinationAddress());
- IpAddress saddr = Ip4Address.valueOf(ip.getSourceAddress());
- log.debug("Packet (" + saddr.toString() + ", " + gaddr.toString() +
- "\tingress port: " + context.inPacket().receivedFrom().toString());
-
- if (ip.getProtocol() != IPv4.PROTOCOL_PIM) {
- log.debug("PIM Picked up a non PIM packet: IP protocol: " + ip.getProtocol());
- return;
- }
-
- // TODO: check incoming to be PIM.PIM_ADDRESS or "Our" address.
- IpPrefix spfx = IpPrefix.valueOf(saddr, 32);
- IpPrefix gpfx = IpPrefix.valueOf(gaddr, 32);
-
- PIM pim = (PIM) ip.getPayload();
- switch (pim.getPimMsgType()) {
-
- case PIM.TYPE_HELLO:
- PIMNeighbors.processHello(ethPkt, context.inPacket().receivedFrom());
- break;
-
- case PIM.TYPE_JOIN_PRUNE_REQUEST:
- // Create the function
- break;
-
- case PIM.TYPE_ASSERT:
- case PIM.TYPE_BOOTSTRAP:
- case PIM.TYPE_CANDIDATE_RP_ADV:
- case PIM.TYPE_GRAFT:
- case PIM.TYPE_GRAFT_ACK:
- case PIM.TYPE_REGISTER:
- case PIM.TYPE_REGISTER_STOP:
- log.debug("Unsupported PIM message type: " + pim.getPimMsgType());
- break;
-
- default:
- log.debug("Unkown PIM message type: " + pim.getPimMsgType());
- break;
- }
- }
- }
-}
diff --git a/pim/src/main/java/org/onosproject/pim/impl/PIMNeighbor.java b/pim/src/main/java/org/onosproject/pim/impl/PIMNeighbor.java
deleted file mode 100644
index 1a96138..0000000
--- a/pim/src/main/java/org/onosproject/pim/impl/PIMNeighbor.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in reliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pim.impl;
-
-import org.jboss.netty.util.Timeout;
-import org.jboss.netty.util.TimerTask;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.pim.PIMHello;
-import org.onlab.packet.pim.PIMHelloOption;
-import org.onosproject.net.ConnectPoint;
-import org.slf4j.Logger;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.TimeUnit;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * PIMNeighbor represents all the PIM routers that have sent us
- * hello messages, or that possibly have been statically configured.
- */
-public class PIMNeighbor {
- private final Logger log = getLogger(getClass());
-
- // The primary address of this PIM neighbor
- private IpAddress primaryAddr;
-
- // The MacAddress of this neighbor
- private MacAddress macAddress;
-
- // The ConnectPoint this PIM neighbor is connected to.
- private ConnectPoint connectPoint;
-
- // Is this neighbor us?
- private boolean isThisUs = false;
-
- // The option values this neighbor has sent us.
- private int priority = 0;
- private int genId = 0;
- private short holdtime = 0;
-
- // Is this pim neighbor the DR?
- private boolean isDr = false;
-
- // Timeout for this neighbor
- private volatile Timeout timeout;
-
- private boolean reelect = false;
-
- // A back pointer the neighbors list this neighbor belongs to.
- private PIMNeighbors neighbors;
-
- /**
- * Construct this neighbor from the address and connect point.
- *
- * @param ipaddr IP Address of neighbor
- * @param macaddr MAC Address of the neighbor
- * @param cp The ConnectPoint of this neighbor
- */
- public PIMNeighbor(IpAddress ipaddr, MacAddress macaddr, ConnectPoint cp) {
- this.macAddress = macaddr;
- this.primaryAddr = ipaddr;
- this.connectPoint = cp;
- this.resetTimeout();
- }
-
- /**
- * Get the primary address of this neighbor.
- *
- * @return the primary IP address.
- */
- public IpAddress getPrimaryAddr() {
- return primaryAddr;
- }
-
- /**
- * Set the primary address of this neighbor.
- *
- * @param primaryAddr the address we'll use when sending hello messages
- */
- public void setPrimaryAddr(IpAddress primaryAddr) {
- this.primaryAddr = primaryAddr;
- }
-
- /**
- * Get the priority this neighbor has advertised to us.
- *
- * @return the priority
- */
- public int getPriority() {
- return priority;
- }
-
- /**
- * Set the priority for this neighbor.
- *
- * @param priority This neighbors priority.
- */
- public void setPriority(int priority) {
- this.priority = priority;
- }
-
- /**
- * Get the generation ID.
- *
- * @return the generation ID.
- */
- public int getGenId() {
- return genId;
- }
-
- /**
- * Set the generation ID.
- *
- * @param genId the generation ID.
- */
- public void setGenId(int genId) {
- this.genId = genId;
- }
-
- /**
- * Get the holdtime for this neighbor.
- *
- * @return the holdtime
- */
- public short getHoldtime() {
- return holdtime;
- }
-
- /**
- * Set the holdtime for this neighbor.
- *
- * @param holdtime the holdtime.
- */
- public void setholdtime(short holdtime) {
- this.holdtime = holdtime;
- }
-
- /**
- * Is this neighbor the designated router on this connect point?
- *
- * @return true if so, false if not.
- */
- public boolean isDr() {
- return isDr;
- }
-
- /**
- * Set this router as the designated router on this connect point.
- *
- * @param isDr True is this neighbor is the DR false otherwise
- */
- public void setIsDr(boolean isDr) {
- this.isDr = isDr;
- }
-
- /**
- * The ConnectPoint this neighbor is connected to.
- *
- * @return the ConnectPoint
- */
- public ConnectPoint getConnectPoint() {
- return connectPoint;
- }
-
- /**
- * Set the ConnectPoint this router is connected to.
- *
- * @param connectPoint the ConnectPoint this router is connected to.
- */
- public void setConnectPoint(ConnectPoint connectPoint) {
- this.connectPoint = connectPoint;
- }
-
- /**
- * Set a back pointer to the neighbors list this neighbor is a member of.
- *
- * @param neighbors the neighbor list this neighbor belongs to
- */
- public void setNeighbors(PIMNeighbors neighbors) {
- this.neighbors = neighbors;
- }
-
- /**
- * We have received a fresh hello from a neighbor, now we need to process it.
- * Depending on the values received in the the hello options may force a
- * re-election process.
- *
- * We will also refresh the timeout for this neighbor.
- *
- * @param hello copy of the hello we'll be able to extract options from.
- */
- public void refresh(PIMHello hello) {
- checkNotNull(hello);
-
- for (PIMHelloOption opt : hello.getOptions().values()) {
-
- int len = opt.getOptLength();
- byte [] value = new byte[len];
- ByteBuffer bb = ByteBuffer.wrap(value);
-
- switch (opt.getOptType()) {
- case PIMHelloOption.OPT_GENID:
- int newid = bb.getInt();
- if (this.genId != newid) {
- // TODO: we have a newly rebooted neighbor. Send them our joins.
- this.genId = newid;
- }
- break;
-
- case PIMHelloOption.OPT_PRIORITY:
- int newpri = bb.getInt();
- if (this.priority != newpri) {
-
- // The priorities have changed. We may need to re-elect a new DR?
- if (this.isDr || this.neighbors.getDesignatedRouter().getPriority() < priority) {
- reelect = true;
- }
- this.priority = newpri;
- }
- break;
-
- case PIMHelloOption.OPT_HOLDTIME:
- short holdtime = bb.getShort();
- if (this.holdtime != holdtime) {
- this.holdtime = holdtime;
- if (holdtime == 0) {
- // We have a neighbor going down. We can remove all joins
- // we have learned from them.
- // TODO: What else do we need to do when a neighbor goes down?
-
- log.debug("PIM Neighbor has timed out: {}", this.primaryAddr.toString());
- return;
- }
- }
- break;
-
- case PIMHelloOption.OPT_PRUNEDELAY:
- case PIMHelloOption.OPT_ADDRLIST:
- // TODO: implement prune delay and addr list. Fall through for now.
-
- default:
- log.debug("PIM Hello option type: {} not yet supported or unknown.", opt.getOptType());
- break;
- }
- }
-
- if (reelect) {
- this.neighbors.electDR(this);
- }
-
- // Reset the next timeout timer
- this.resetTimeout();
- }
-
- /* --------------------------------------- Timer functions -------------------------- */
-
- /**
- * Restart the timeout task for this neighbor.
- */
- private void resetTimeout() {
-
- if (this.holdtime == 0) {
-
- // Prepare to die.
- log.debug("shutting down timer for nbr {}", this.primaryAddr.toString());
- if (this.timeout != null) {
- this.timeout.cancel();
- this.timeout = null;
- }
- return;
- }
-
- // Cancel the existing timeout and start a fresh new one.
- if (this.timeout != null) {
- this.timeout.cancel();
- }
-
- this.timeout = PIMTimer.getTimer().newTimeout(new NeighborTimeoutTask(this), holdtime, TimeUnit.SECONDS);
- }
-
- /**
- * The task to run when a neighbor timeout expires.
- */
- private final class NeighborTimeoutTask implements TimerTask {
- PIMNeighbor nbr;
-
- NeighborTimeoutTask(PIMNeighbor nbr) {
- this.nbr = nbr;
- }
-
- @Override
- public void run(Timeout timeout) throws Exception {
-
- // TODO: log.debug;
- PIMNeighbors neighbors = nbr.neighbors;
- neighbors.removeNeighbor(nbr.getPrimaryAddr());
- }
- }
-
- /**
- * Stop the timeout timer.
- *
- * This happens when we remove the neighbor.
- */
- private final void stopTimeout() {
- this.timeout.cancel();
- this.timeout = null;
- }
-
- @Override
- public String toString() {
- String out = "";
- if (this.isDr) {
- out += "*NBR:";
- } else {
- out += "NBR:";
- }
- out += "\tIP: " + this.primaryAddr.toString();
- out += "\tPr: " + String.valueOf(this.priority);
- out += "\tHoldTime: " + String.valueOf(this.holdtime);
- out += "\tGenID: " + String.valueOf(this.genId) + "\n";
- return out;
- }
-}
\ No newline at end of file
diff --git a/pim/src/main/java/org/onosproject/pim/impl/PIMNeighbors.java b/pim/src/main/java/org/onosproject/pim/impl/PIMNeighbors.java
deleted file mode 100644
index cad9076..0000000
--- a/pim/src/main/java/org/onosproject/pim/impl/PIMNeighbors.java
+++ /dev/null
@@ -1,395 +0,0 @@
-
-package org.onosproject.pim.impl;
-
-import org.jboss.netty.util.Timeout;
-import org.jboss.netty.util.TimerTask;
-import org.onlab.packet.Ethernet;
-import org.onlab.packet.IPv4;
-import org.onlab.packet.Ip4Address;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.PIM;
-import org.onlab.packet.pim.PIMHello;
-import org.onosproject.net.ConnectPoint;
-import java.util.HashMap;
-import java.util.concurrent.TimeUnit;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * PIMNeighbors is a collection of all neighbors we have received
- * PIM hello messages from. The main structure is a HashMap indexed
- * by ConnectPoint with another HashMap indexed on the PIM neighbors
- * IPAddress, it contains all PIM neighbors attached on that ConnectPoint.
- */
-public final class PIMNeighbors {
-
- private static Logger log = LoggerFactory.getLogger("PIMNeighbors");
-
- /**
- * This is the global container for all PIM neighbors indexed by ConnectPoints.
- *
- * NOTE: We'll have a problem if the same neighbor can show up on two interfaces
- * but that should never happen.
- */
- private static HashMap<ConnectPoint, PIMNeighbors> connectPointNeighbors = new HashMap<>();
-
- // The connect point these neighbors are connected to.
- private ConnectPoint connectPoint;
-
- // Pointer to the current designated router on this ConnectPoint.
- private PIMNeighbor designatedRouter;
-
- // The list of neighbors we have learned on this ConnectPoint.
- private HashMap<IpAddress, PIMNeighbor> neighbors = new HashMap<>();
-
- /*
- * TODO: turn ourIpAddress, ourPriority and OurHoldTime into config options.
- */
- // The IP address we are using to source our PIM hello messages on this connect Point.
- private IpAddress ourIpAddress;
-
- // The priority we use on this ConnectPoint.
- private int ourPriority = 1;
-
- // The holdtime we are sending out.
- private int ourHoldtime = 105;
-
- // Then generation ID we are sending out. 0 means we need to generate a new random ID
- private int ourGenid = 0;
-
- // Hello Timer for sending hello messages per ConnectPoint with neighbors.
- private volatile Timeout helloTimer;
-
- // The period of which we will be sending out PIM hello messages.
- private final int defaultPimHelloInterval = 30; // seconds
-
- /**
- * Create PIMNeighbors object per ConnectPoint.
- *
- * @param cp the ConnectPoint.
- * @return PIMNeighbors structure
- */
- public static PIMNeighbors getConnectPointNeighbors(ConnectPoint cp) {
- return connectPointNeighbors.get(cp);
- }
-
- /**
- * Process incoming hello message, we will need the Macaddress and IP address of the sender.
- *
- * @param ethPkt the ethernet header
- * @param receivedFrom the connect point we recieved this message from
- */
- public static void processHello(Ethernet ethPkt, ConnectPoint receivedFrom) {
- checkNotNull(ethPkt);
- checkNotNull(ethPkt);
-
- MacAddress srcmac = ethPkt.getSourceMAC();
- IPv4 ip = (IPv4) ethPkt.getPayload();
- Ip4Address srcip = Ip4Address.valueOf(ip.getSourceAddress());
-
- PIM pim = (PIM) ip.getPayload();
- checkNotNull(pim);
-
- PIMHello hello = (PIMHello) pim.getPayload();
- checkNotNull(hello);
-
- PIMNeighbor nbr = PIMNeighbors.findOrCreate(srcip, srcmac, receivedFrom);
- if (nbr == null) {
- log.error("Could not create a neighbor for: {1}", srcip.toString());
- return;
- }
-
- nbr.setConnectPoint(receivedFrom);
- nbr.refresh(hello);
- }
-
- /**
- * Create a PIM Neighbor.
- *
- * @param cp The ConnectPoint this neighbor was found on
- */
- public PIMNeighbors(ConnectPoint cp) {
- this.connectPoint = cp;
-
- // TODO: use network config to assign address.
- this.ourIpAddress = IpAddress.valueOf("10.2.2.2");
- this.addIpAddress(this.ourIpAddress);
- }
-
- /**
- * Create a PIM neighbor.
- *
- * @param cp the ConnectPoint this neighbor was found on
- * @param ourIp the IP address of this neighbor
- */
- public PIMNeighbors(ConnectPoint cp, IpAddress ourIp) {
- this.connectPoint = cp;
- this.addIpAddress(ourIp);
- }
-
- /**
- * Start the hello timer when we have been given an IP address.
- *
- * @param ourIp our IP address.
- */
- public void addIpAddress(IpAddress ourIp) {
- this.startHelloTimer();
-
- // Kick off the first pim hello packet
- this.sendHelloPacket();
- }
-
- /**
- * Getter for our IP address.
- *
- * @return our IP address.
- */
- public IpAddress getOurIpAddress() {
- return this.ourIpAddress;
- }
-
- /**
- * Get our priority.
- *
- * @return our priority.
- */
- public int getOurPriority() {
- return this.ourPriority;
- }
-
- /**
- * Get the neighbor list for this specific connectPoint.
- *
- * @return PIM neighbors on this ConnectPoint
- */
- public HashMap<IpAddress, PIMNeighbor> getOurNeighborsList() {
- return this.neighbors;
- }
-
- /**
- * Get the designated router on this connection.
- *
- * @return the PIMNeighbor representing the DR
- */
- public PIMNeighbor getDesignatedRouter() {
- return designatedRouter;
- }
-
- /**
- * Are we the DR on this CP?
- *
- * @return true if we are, false if not
- */
- public boolean weAreTheDr() {
- return (designatedRouter != null &&
- designatedRouter.getPrimaryAddr().equals(ourIpAddress));
- }
-
- /**
- * Find the neighbor with the given IP address on this CP.
- *
- * @param ipaddr the IP address of the neighbor we are interested in
- * @return the pim neighbor if it exists
- */
- public PIMNeighbor findNeighbor(IpAddress ipaddr) {
- PIMNeighbor nbr = neighbors.get(ipaddr);
- return nbr;
- }
-
- /**
- * Add a new PIM neighbor to this list.
- *
- * @param nbr the neighbor to be added.
- */
- public void addNeighbor(PIMNeighbor nbr) {
- if (neighbors.containsKey(nbr.getPrimaryAddr())) {
-
- // TODO: Hmmm, how should this be handled?
- log.debug("We are adding a neighbor that already exists: {}", nbr.toString());
- neighbors.remove(nbr.getPrimaryAddr(), nbr);
- }
- nbr.setNeighbors(this);
- neighbors.put(nbr.getPrimaryAddr(), nbr);
- }
-
- /**
- * Remove the neighbor from our neighbor list.
- *
- * @param ipaddr the IP address of the neighbor to remove
- */
- public void removeNeighbor(IpAddress ipaddr) {
-
- boolean reelect = (designatedRouter == null || designatedRouter.getPrimaryAddr().equals(ipaddr));
- if (neighbors.containsKey(ipaddr)) {
- neighbors.remove(ipaddr);
- }
- this.electDR();
- }
-
- /**
- * Remove the given neighbor from the neighbor list.
- *
- * @param nbr the nbr to be removed.
- */
- public void removeNeighbor(PIMNeighbor nbr) {
-
- boolean reelect = (designatedRouter == null || nbr.isDr());
- neighbors.remove(nbr.getPrimaryAddr(), nbr);
- this.electDR();
- }
-
- /**
- * Elect a new DR on this ConnectPoint.
- *
- * @return the PIM Neighbor that wins
- */
- public PIMNeighbor electDR() {
-
- for (PIMNeighbor nbr : this.neighbors.values()) {
- if (this.designatedRouter == null) {
- this.designatedRouter = nbr;
- continue;
- }
-
- if (nbr.getPriority() > this.designatedRouter.getPriority()) {
- this.designatedRouter = nbr;
- continue;
- }
-
- // We could sort in ascending order
- if (this.designatedRouter.getPrimaryAddr().compareTo(nbr.getPrimaryAddr()) > 0) {
- this.designatedRouter = nbr;
- continue;
- }
- }
-
- return this.designatedRouter;
- }
-
- /**
- * Elect a new DR given the new neighbor.
- *
- * @param nbr the new neighbor to use in DR election.
- * @return the PIM Neighbor that wins DR election
- */
- public PIMNeighbor electDR(PIMNeighbor nbr) {
-
- // Make sure I have
- if (this.designatedRouter == null ||
- this.designatedRouter.getPriority() < nbr.getPriority() ||
- this.designatedRouter.getPrimaryAddr().compareTo(nbr.getPrimaryAddr()) > 0) {
- this.designatedRouter = nbr;
- }
- return this.designatedRouter;
- }
-
- /**
- * Find or create a pim neighbor with a given ip address and connect point.
- *
- * @param ipaddr of the pim neighbor
- * @param mac The mac address of our sending neighbor
- * @param cp the connect point the neighbor was learned from
- * @return an existing or new PIM neighbor
- */
- public static PIMNeighbor findOrCreate(IpAddress ipaddr, MacAddress mac, ConnectPoint cp) {
- PIMNeighbors neighbors = connectPointNeighbors.get(cp);
- if (neighbors == null) {
- neighbors = new PIMNeighbors(cp);
- connectPointNeighbors.put(cp, neighbors);
- }
-
- PIMNeighbor nbr = neighbors.findNeighbor(ipaddr);
- if (nbr == null) {
- nbr = new PIMNeighbor(ipaddr, mac, cp);
- neighbors.addNeighbor(nbr);
- neighbors.electDR(nbr);
- }
- return nbr;
- }
-
- // Returns the connect point neighbors hash map
- public static HashMap<ConnectPoint, PIMNeighbors> getConnectPointNeighbors() {
- return connectPointNeighbors;
- }
-
- /* ---------------------------------- PIM Hello Timer ----------------------------------- */
-
- /**
- * Start a new hello timer for this ConnectPoint.
- */
- private void startHelloTimer() {
- this.helloTimer = PIMTimer.getTimer().newTimeout(
- new HelloTimer(this),
- this.defaultPimHelloInterval,
- TimeUnit.SECONDS);
-
- log.trace("Started Hello Timer: " + this.ourIpAddress.toString());
- }
-
- /**
- * This inner class handles transmitting a PIM hello message on this ConnectPoint.
- */
- private final class HelloTimer implements TimerTask {
- PIMNeighbors neighbors;
-
- HelloTimer(PIMNeighbors neighbors) {
- this.neighbors = neighbors;
- }
-
- @Override
- public void run(Timeout timeout) throws Exception {
-
- // Send off a hello packet
- sendHelloPacket();
-
- // restart the hello timer
- neighbors.startHelloTimer();
- }
- }
-
- private void sendHelloPacket() {
- PIMHello hello = new PIMHello();
-
- // TODO: we will need to implement the network config service to assign ip addresses & options
- /*
- hello.createDefaultOptions();
-
- Ethernet eth = hello.createPIMHello(this.ourIpAddress);
- hello.sendPacket(this.connectPoint);
- */
- }
-
- /**
- * prints the connectPointNeighbors list with each neighbor list.
- *
- * @return string of neighbors.
- */
- public static String printPimNeighbors() {
- String out = "PIM Neighbors Table: \n";
-
- for (PIMNeighbors pn: connectPointNeighbors.values()) {
-
- out += "CP:\n " + pn.toString();
- for (PIMNeighbor nbr : pn.neighbors.values()) {
- out += "\t" + nbr.toString();
- }
- }
- return out;
- }
-
- @Override
- public String toString() {
- String out = "PIM Neighbors: ";
- if (this.ourIpAddress != null) {
- out += "IP: " + this.ourIpAddress.toString();
- } else {
- out += "IP: *Null*";
- }
- out += "\tPR: " + String.valueOf(this.ourPriority) + "\n";
- return out;
- }
-}
\ No newline at end of file
diff --git a/pim/src/main/java/org/onosproject/pim/impl/PIMNeighborsCodec.java b/pim/src/main/java/org/onosproject/pim/impl/PIMNeighborsCodec.java
deleted file mode 100644
index ee62eb7..0000000
--- a/pim/src/main/java/org/onosproject/pim/impl/PIMNeighborsCodec.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pim.impl;
-
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.ConnectPoint;
-
-import java.util.HashMap;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * PIM neighbors Codec.
- */
-public class PIMNeighborsCodec extends JsonCodec<HashMap<ConnectPoint, PIMNeighbors>> {
- // JSON field names
- //Return Name
- private static final String CPNBRLIST = "connect_point_list";
-
- // PIM Neightbors Fields
- private static final String IP = "ip";
- private static final String PRIORITY = "priority";
- private static final String NBRLIST = "neighbor_list";
-
- // PIM neighbor Files
- private static final String DR = "designated";
- private static final String NBR_IP = "ip";
- private static final String PR = "priority";
- private static final String HOLDTIME = "hold_time";
-
- /**
- * Encode the PIM Neighbors.
- *
- * @param cpn ConnectPoint neighbors
- * @param context encoding context
- *
- * @return Encoded neighbors used by CLI and REST
- */
- @Override
- public ObjectNode encode(HashMap<ConnectPoint, PIMNeighbors> cpn, CodecContext context) {
- checkNotNull(cpn, "Pim Neighbors cannot be null");
-
- ObjectNode pimNbrJsonCodec = context.mapper().createObjectNode();
- ArrayNode cpnList = context.mapper().createArrayNode();
-
- for (PIMNeighbors pn: cpn.values()) {
- // get the PimNeighbors Obj, contains Neighbors list
- // create the json object for a single Entry in the Neighbors list
- ObjectNode cp = context.mapper().createObjectNode();
- cp.put(IP, pn.getOurIpAddress().toString());
- cp.put(PRIORITY, String.valueOf(pn.getOurPriority()));
-
- // create the array for the neighbors list
- ArrayNode nbrsList = context.mapper().createArrayNode();
- for (PIMNeighbor nbr : pn.getOurNeighborsList().values()) {
- nbrsList.add(neighbor(nbr, context));
- }
- // adds pim neighbor to list
- cp.set(NBRLIST, nbrsList);
- // adds to arraynode which will represent the connect point neighbors hash map.
- cpnList.add(cp);
- }
- pimNbrJsonCodec.set(CPNBRLIST, cpnList);
- return pimNbrJsonCodec;
- }
-
- /**
- * Encode a single PIM Neighbor.
- *
- * @param nbr the neighbor to be encoded
- * @param context encoding context
- * @return the encoded neighbor
- */
- private ObjectNode neighbor(PIMNeighbor nbr, CodecContext context) {
- return context.mapper().createObjectNode()
- .put(DR, Boolean.toString(nbr.isDr()))
- .put(NBR_IP, nbr.getPrimaryAddr().toString())
- .put(PR, String.valueOf(nbr.getPriority()))
- .put(HOLDTIME, String.valueOf(nbr.getHoldtime()));
- }
-}
diff --git a/pim/src/main/java/org/onosproject/pim/impl/PIMTimer.java b/pim/src/main/java/org/onosproject/pim/impl/PIMTimer.java
deleted file mode 100644
index c131a53..0000000
--- a/pim/src/main/java/org/onosproject/pim/impl/PIMTimer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pim.impl;
-
-import org.jboss.netty.util.HashedWheelTimer;
-
-/**
- * PIM Timer used for PIM Neighbors.
- */
-public final class PIMTimer {
-
- private static volatile HashedWheelTimer timer;
-
- // Ban public construction
- private PIMTimer() {
- }
-
- /**
- * Returns the singleton hashed-wheel timer.
- *
- * @return hashed-wheel timer
- */
- public static HashedWheelTimer getTimer() {
- if (PIMTimer.timer == null) {
- initTimer();
- }
- return PIMTimer.timer;
- }
-
- // Start the PIM timer.
- private static synchronized void initTimer() {
- if (PIMTimer.timer == null) {
-
- // Create and start a new hashed wheel timer, if it does not exist.
- HashedWheelTimer hwTimer = new HashedWheelTimer();
- hwTimer.start();
- PIMTimer.timer = hwTimer;
- }
- }
-}
diff --git a/pim/src/main/java/org/onosproject/pim/impl/package-info.java b/pim/src/main/java/org/onosproject/pim/impl/package-info.java
deleted file mode 100644
index 29d1ce4..0000000
--- a/pim/src/main/java/org/onosproject/pim/impl/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * PIM Emulation speak hello messages and listen to Join/Prunes.
- */
-package org.onosproject.pim.impl;
diff --git a/pim/src/main/resources/OSGI-INF.blueprint/shell-config.xml b/pim/src/main/resources/OSGI-INF.blueprint/shell-config.xml
deleted file mode 100644
index c30e379..0000000
--- a/pim/src/main/resources/OSGI-INF.blueprint/shell-config.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
- ~ Copyright 2015 Open Networking Laboratory
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
- <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
- <command>
- <action class="org.onosproject.pim.cli.PIMShowCommand"/>
- </command>
- </command-bundle>
-
-</blueprint>
diff --git a/pom.xml b/pom.xml
index e8cd462..816958d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,11 +53,8 @@
<module>calendar</module>
<module>database-perf</module>
<module>tvue</module>
- <module>mfwd</module>
- <module>igmp</module>
<module>flowtest</module>
<module>ipfix</module>
- <module>pim</module>
</modules>
<properties>
diff --git a/tvue/pom.xml b/tvue/pom.xml
index 71877e6..a1046ab 100644
--- a/tvue/pom.xml
+++ b/tvue/pom.xml
@@ -22,7 +22,7 @@
<parent>
<groupId>org.onosproject</groupId>
<artifactId>onos-app-samples</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.4.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>