aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/providers/openflow/group
diff options
context:
space:
mode:
authorCNlucius <lukai1@huawei.com>2016-09-13 11:40:12 +0800
committerCNlucius <lukai1@huawei.com>2016-09-13 11:41:53 +0800
commitb731e2f1dd0972409b136aebc7b463dd72c9cfad (patch)
tree5107d7d80c19ad8076c2c97c2b5ef8d1cf3ab903 /framework/src/onos/providers/openflow/group
parentee93993458266114c29271a481ef9ce7ce621b2a (diff)
ONOSFW-171
O/S-SFC-ONOS scenario documentation Change-Id: I51ae1cf736ea24ab6680f8edca1b2bf5dd598365 Signed-off-by: CNlucius <lukai1@huawei.com>
Diffstat (limited to 'framework/src/onos/providers/openflow/group')
-rw-r--r--framework/src/onos/providers/openflow/group/pom.xml34
-rw-r--r--framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupBucketEntryBuilder.java347
-rw-r--r--framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java443
-rw-r--r--framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupStatsCollector.java111
-rw-r--r--framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java389
-rw-r--r--framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/package-info.java20
-rw-r--r--framework/src/onos/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java412
7 files changed, 0 insertions, 1756 deletions
diff --git a/framework/src/onos/providers/openflow/group/pom.xml b/framework/src/onos/providers/openflow/group/pom.xml
deleted file mode 100644
index c63a016d..00000000
--- a/framework/src/onos/providers/openflow/group/pom.xml
+++ /dev/null
@@ -1,34 +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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-of-providers</artifactId>
- <version>1.4.0-rc1</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
-
- <artifactId>onos-of-provider-group</artifactId>
- <packaging>bundle</packaging>
-
- <description>ONOS OpenFlow protocol group provider</description>
-
-</project> \ No newline at end of file
diff --git a/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupBucketEntryBuilder.java b/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupBucketEntryBuilder.java
deleted file mode 100644
index d3a23782..00000000
--- a/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupBucketEntryBuilder.java
+++ /dev/null
@@ -1,347 +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.provider.of.group.impl;
-
-import com.google.common.collect.Lists;
-
-import org.onlab.packet.Ip4Address;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.MplsLabel;
-import org.onlab.packet.VlanId;
-import org.onosproject.core.DefaultGroupId;
-import org.onosproject.core.GroupId;
-import org.onosproject.net.Lambda;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.instructions.Instructions;
-import org.onosproject.net.group.DefaultGroupBucket;
-import org.onosproject.net.group.GroupBucket;
-import org.onosproject.net.group.GroupBuckets;
-import org.projectfloodlight.openflow.protocol.OFBucket;
-import org.projectfloodlight.openflow.protocol.OFGroupType;
-import org.projectfloodlight.openflow.protocol.action.OFAction;
-import org.projectfloodlight.openflow.protocol.action.OFActionCircuit;
-import org.projectfloodlight.openflow.protocol.action.OFActionCopyTtlIn;
-import org.projectfloodlight.openflow.protocol.action.OFActionCopyTtlOut;
-import org.projectfloodlight.openflow.protocol.action.OFActionDecMplsTtl;
-import org.projectfloodlight.openflow.protocol.action.OFActionDecNwTtl;
-import org.projectfloodlight.openflow.protocol.action.OFActionExperimenter;
-import org.projectfloodlight.openflow.protocol.action.OFActionGroup;
-import org.projectfloodlight.openflow.protocol.action.OFActionOutput;
-import org.projectfloodlight.openflow.protocol.action.OFActionPopMpls;
-import org.projectfloodlight.openflow.protocol.action.OFActionPushMpls;
-import org.projectfloodlight.openflow.protocol.action.OFActionSetDlDst;
-import org.projectfloodlight.openflow.protocol.action.OFActionSetDlSrc;
-import org.projectfloodlight.openflow.protocol.action.OFActionSetField;
-import org.projectfloodlight.openflow.protocol.action.OFActionSetNwDst;
-import org.projectfloodlight.openflow.protocol.action.OFActionSetNwSrc;
-import org.projectfloodlight.openflow.protocol.action.OFActionSetVlanPcp;
-import org.projectfloodlight.openflow.protocol.action.OFActionSetVlanVid;
-import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
-import org.projectfloodlight.openflow.protocol.oxm.OFOxmOchSigidBasic;
-import org.projectfloodlight.openflow.types.IPv4Address;
-import org.projectfloodlight.openflow.types.OFVlanVidMatch;
-import org.projectfloodlight.openflow.types.U32;
-import org.projectfloodlight.openflow.types.U8;
-import org.projectfloodlight.openflow.types.VlanPcp;
-import org.slf4j.Logger;
-
-import java.util.List;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/*
- * Builder for GroupBucketEntry.
- */
-public class GroupBucketEntryBuilder {
-
- private List<OFBucket> ofBuckets;
- private OFGroupType type;
-
- private final Logger log = getLogger(getClass());
-
- /**
- * Creates a builder.
- *
- * @param ofBuckets list of OFBucket
- * @param type Group type
- */
- public GroupBucketEntryBuilder(List<OFBucket> ofBuckets, OFGroupType type) {
- this.ofBuckets = ofBuckets;
- this.type = type;
- }
-
- /**
- * Builds a GroupBuckets.
- *
- * @return GroupBuckets object, a list of GroupBuckets
- */
- public GroupBuckets build() {
- List<GroupBucket> bucketList = Lists.newArrayList();
-
- for (OFBucket bucket: ofBuckets) {
- TrafficTreatment treatment = buildTreatment(bucket.getActions());
- // TODO: Use GroupBucketEntry
- GroupBucket groupBucket = null;
- switch (type) {
- case INDIRECT:
- groupBucket =
- DefaultGroupBucket.createIndirectGroupBucket(treatment);
- break;
- case SELECT:
- groupBucket =
- DefaultGroupBucket.createSelectGroupBucket(treatment);
- break;
- case FF:
- PortNumber port =
- PortNumber.portNumber(bucket.getWatchPort().getPortNumber());
- GroupId groupId =
- new DefaultGroupId(bucket.getWatchGroup().getGroupNumber());
- groupBucket =
- DefaultGroupBucket.createFailoverGroupBucket(treatment,
- port, groupId);
- break;
- case ALL:
- groupBucket =
- DefaultGroupBucket.createAllGroupBucket(treatment);
- break;
- default:
- log.error("Unsupported Group type : {}", type);
- }
- if (groupBucket != null) {
- bucketList.add(groupBucket);
- }
- }
- return new GroupBuckets(bucketList);
- }
-
-
- private TrafficTreatment buildTreatment(List<OFAction> actions) {
- TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
- // If this is a drop rule
- if (actions.size() == 0) {
- builder.drop();
- return builder.build();
- }
- for (OFAction act : actions) {
- switch (act.getType()) {
- case OUTPUT:
- OFActionOutput out = (OFActionOutput) act;
- builder.setOutput(
- PortNumber.portNumber(out.getPort().getPortNumber()));
- break;
- case SET_VLAN_VID:
- OFActionSetVlanVid vlan = (OFActionSetVlanVid) act;
- builder.setVlanId(VlanId.vlanId(vlan.getVlanVid().getVlan()));
- break;
- case SET_VLAN_PCP:
- OFActionSetVlanPcp pcp = (OFActionSetVlanPcp) act;
- builder.setVlanPcp(pcp.getVlanPcp().getValue());
- break;
- case POP_VLAN:
- builder.popVlan();
- break;
- case PUSH_VLAN:
- builder.pushVlan();
- break;
- case SET_DL_DST:
- OFActionSetDlDst dldst = (OFActionSetDlDst) act;
- builder.setEthDst(
- MacAddress.valueOf(dldst.getDlAddr().getLong()));
- break;
- case SET_DL_SRC:
- OFActionSetDlSrc dlsrc = (OFActionSetDlSrc) act;
- builder.setEthSrc(
- MacAddress.valueOf(dlsrc.getDlAddr().getLong()));
-
- break;
- case SET_NW_DST:
- OFActionSetNwDst nwdst = (OFActionSetNwDst) act;
- IPv4Address di = nwdst.getNwAddr();
- builder.setIpDst(Ip4Address.valueOf(di.getInt()));
- break;
- case SET_NW_SRC:
- OFActionSetNwSrc nwsrc = (OFActionSetNwSrc) act;
- IPv4Address si = nwsrc.getNwAddr();
- builder.setIpSrc(Ip4Address.valueOf(si.getInt()));
- break;
- case EXPERIMENTER:
- OFActionExperimenter exp = (OFActionExperimenter) act;
- if (exp.getExperimenter() == 0x80005A06 ||
- exp.getExperimenter() == 0x748771) {
- OFActionCircuit ct = (OFActionCircuit) exp;
- short lambda = ((OFOxmOchSigidBasic) ct.getField()).getValue().getChannelNumber();
- builder.add(Instructions.modL0Lambda(Lambda.indexedLambda(lambda)));
- } else {
- log.warn("Unsupported OFActionExperimenter {}", exp.getExperimenter());
- }
- break;
- case SET_FIELD:
- OFActionSetField setField = (OFActionSetField) act;
- handleSetField(builder, setField.getField());
- break;
- case POP_MPLS:
- OFActionPopMpls popMpls = (OFActionPopMpls) act;
- builder.popMpls((short) popMpls.getEthertype().getValue());
- break;
- case PUSH_MPLS:
- OFActionPushMpls pushMpls = (OFActionPushMpls) act;
- builder.pushMpls();
- break;
- case COPY_TTL_IN:
- OFActionCopyTtlIn copyTtlIn = (OFActionCopyTtlIn) act;
- builder.copyTtlIn();
- break;
- case COPY_TTL_OUT:
- OFActionCopyTtlOut copyTtlOut = (OFActionCopyTtlOut) act;
- builder.copyTtlOut();
- break;
- case DEC_MPLS_TTL:
- OFActionDecMplsTtl decMplsTtl = (OFActionDecMplsTtl) act;
- builder.decMplsTtl();
- break;
- case DEC_NW_TTL:
- OFActionDecNwTtl decNwTtl = (OFActionDecNwTtl) act;
- builder.decNwTtl();
- break;
- case GROUP:
- OFActionGroup grp = (OFActionGroup) act;
- builder.group(new DefaultGroupId(grp.getGroup().getGroupNumber()));
- break;
- case SET_TP_DST:
- case SET_TP_SRC:
- case POP_PBB:
- case PUSH_PBB:
- case SET_MPLS_LABEL:
- case SET_MPLS_TC:
- case SET_MPLS_TTL:
- case SET_NW_ECN:
- case SET_NW_TOS:
- case SET_NW_TTL:
- case SET_QUEUE:
- case STRIP_VLAN:
- case ENQUEUE:
- default:
- log.warn("Action type {} not yet implemented.", act.getType());
- }
- }
-
- return builder.build();
- }
-
- private void handleSetField(TrafficTreatment.Builder builder, OFOxm<?> oxm) {
- switch (oxm.getMatchField().id) {
- case VLAN_PCP:
- @SuppressWarnings("unchecked")
- OFOxm<VlanPcp> vlanpcp = (OFOxm<VlanPcp>) oxm;
- builder.setVlanPcp(vlanpcp.getValue().getValue());
- break;
- case VLAN_VID:
- @SuppressWarnings("unchecked")
- OFOxm<OFVlanVidMatch> vlanvid = (OFOxm<OFVlanVidMatch>) oxm;
- builder.setVlanId(VlanId.vlanId(vlanvid.getValue().getVlan()));
- break;
- case ETH_DST:
- @SuppressWarnings("unchecked")
- OFOxm<org.projectfloodlight.openflow.types.MacAddress> ethdst =
- (OFOxm<org.projectfloodlight.openflow.types.MacAddress>) oxm;
- builder.setEthDst(MacAddress.valueOf(ethdst.getValue().getLong()));
- break;
- case ETH_SRC:
- @SuppressWarnings("unchecked")
- OFOxm<org.projectfloodlight.openflow.types.MacAddress> ethsrc =
- (OFOxm<org.projectfloodlight.openflow.types.MacAddress>) oxm;
- builder.setEthSrc(MacAddress.valueOf(ethsrc.getValue().getLong()));
- break;
- case IPV4_DST:
- @SuppressWarnings("unchecked")
- OFOxm<IPv4Address> ip4dst = (OFOxm<IPv4Address>) oxm;
- builder.setIpDst(Ip4Address.valueOf(ip4dst.getValue().getInt()));
- break;
- case IPV4_SRC:
- @SuppressWarnings("unchecked")
- OFOxm<IPv4Address> ip4src = (OFOxm<IPv4Address>) oxm;
- builder.setIpSrc(Ip4Address.valueOf(ip4src.getValue().getInt()));
- break;
- case MPLS_LABEL:
- @SuppressWarnings("unchecked")
- OFOxm<U32> labelId = (OFOxm<U32>) oxm;
- builder.setMpls(MplsLabel.mplsLabel((int) labelId.getValue().getValue()));
- break;
- case MPLS_BOS:
- @SuppressWarnings("unchecked")
- OFOxm<U8> mplsBos = (OFOxm<U8>) oxm;
- builder.setMplsBos(mplsBos.getValue() == U8.ZERO ? false : true);
- break;
- case ARP_OP:
- case ARP_SHA:
- case ARP_SPA:
- case ARP_THA:
- case ARP_TPA:
- case BSN_EGR_PORT_GROUP_ID:
- case BSN_GLOBAL_VRF_ALLOWED:
- case BSN_IN_PORTS_128:
- case BSN_L3_DST_CLASS_ID:
- case BSN_L3_INTERFACE_CLASS_ID:
- case BSN_L3_SRC_CLASS_ID:
- case BSN_LAG_ID:
- case BSN_TCP_FLAGS:
- case BSN_UDF0:
- case BSN_UDF1:
- case BSN_UDF2:
- case BSN_UDF3:
- case BSN_UDF4:
- case BSN_UDF5:
- case BSN_UDF6:
- case BSN_UDF7:
- case BSN_VLAN_XLATE_PORT_GROUP_ID:
- case BSN_VRF:
- case ETH_TYPE:
- case ICMPV4_CODE:
- case ICMPV4_TYPE:
- case ICMPV6_CODE:
- case ICMPV6_TYPE:
- case IN_PHY_PORT:
- case IN_PORT:
- case IPV6_DST:
- case IPV6_FLABEL:
- case IPV6_ND_SLL:
- case IPV6_ND_TARGET:
- case IPV6_ND_TLL:
- case IPV6_SRC:
- case IP_DSCP:
- case IP_ECN:
- case IP_PROTO:
- case METADATA:
- case MPLS_TC:
- case OCH_SIGID:
- case OCH_SIGID_BASIC:
- case OCH_SIGTYPE:
- case OCH_SIGTYPE_BASIC:
- case SCTP_DST:
- case SCTP_SRC:
- case TCP_DST:
- case TCP_SRC:
- case TUNNEL_ID:
- case UDP_DST:
- case UDP_SRC:
- default:
- log.warn("Set field type {} not yet implemented.", oxm.getMatchField().id);
- break;
- }
- }
-}
diff --git a/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java b/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
deleted file mode 100644
index 9c93844a..00000000
--- a/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
+++ /dev/null
@@ -1,443 +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.provider.of.group.impl;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Optional;
-
-import org.onlab.packet.Ip4Address;
-import org.onlab.packet.Ip6Address;
-import org.onosproject.core.GroupId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.driver.DefaultDriverData;
-import org.onosproject.net.driver.DefaultDriverHandler;
-import org.onosproject.net.driver.Driver;
-import org.onosproject.net.driver.DriverService;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.instructions.ExtensionTreatment;
-import org.onosproject.net.flow.instructions.Instruction;
-import org.onosproject.net.flow.instructions.Instructions;
-import org.onosproject.net.flow.instructions.L0ModificationInstruction;
-import org.onosproject.net.flow.instructions.L2ModificationInstruction;
-import org.onosproject.net.flow.instructions.L3ModificationInstruction;
-import org.onosproject.net.group.GroupBucket;
-import org.onosproject.net.group.GroupBuckets;
-import org.onosproject.net.group.GroupDescription;
-import org.onosproject.openflow.controller.ExtensionTreatmentInterpreter;
-import org.projectfloodlight.openflow.protocol.OFBucket;
-import org.projectfloodlight.openflow.protocol.OFFactory;
-import org.projectfloodlight.openflow.protocol.OFGroupAdd;
-import org.projectfloodlight.openflow.protocol.OFGroupDelete;
-import org.projectfloodlight.openflow.protocol.OFGroupMod;
-import org.projectfloodlight.openflow.protocol.OFGroupType;
-import org.projectfloodlight.openflow.protocol.action.OFAction;
-import org.projectfloodlight.openflow.protocol.action.OFActionGroup;
-import org.projectfloodlight.openflow.protocol.action.OFActionOutput;
-import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
-import org.projectfloodlight.openflow.types.CircuitSignalID;
-import org.projectfloodlight.openflow.types.EthType;
-import org.projectfloodlight.openflow.types.IPv4Address;
-import org.projectfloodlight.openflow.types.IPv6Address;
-import org.projectfloodlight.openflow.types.IPv6FlowLabel;
-import org.projectfloodlight.openflow.types.MacAddress;
-import org.projectfloodlight.openflow.types.OFBooleanValue;
-import org.projectfloodlight.openflow.types.OFGroup;
-import org.projectfloodlight.openflow.types.OFPort;
-import org.projectfloodlight.openflow.types.OFVlanVidMatch;
-import org.projectfloodlight.openflow.types.U32;
-import org.projectfloodlight.openflow.types.VlanPcp;
-import org.slf4j.Logger;
-
-/*
- * Builder for GroupMod.
- */
-public final class GroupModBuilder {
-
- private GroupBuckets buckets;
- private GroupId groupId;
- private GroupDescription.Type type;
- private OFFactory factory;
- private Long xid;
- private Optional<DriverService> driverService;
-
- private final Logger log = getLogger(getClass());
-
- private static final int OFPCML_NO_BUFFER = 0xffff;
-
- private GroupModBuilder(GroupBuckets buckets, GroupId groupId,
- GroupDescription.Type type, OFFactory factory,
- Optional<Long> xid) {
- this.buckets = buckets;
- this.groupId = groupId;
- this.type = type;
- this.factory = factory;
- this.xid = xid.orElse((long) 0);
- }
-
- private GroupModBuilder(GroupBuckets buckets, GroupId groupId,
- GroupDescription.Type type, OFFactory factory,
- Optional<Long> xid, Optional<DriverService> driverService) {
- this.buckets = buckets;
- this.groupId = groupId;
- this.type = type;
- this.factory = factory;
- this.xid = xid.orElse((long) 0);
- this.driverService = driverService;
- }
- /**
- * Creates a builder for GroupMod.
- *
- * @param buckets GroupBuckets object
- * @param groupId Group Id to create
- * @param type Group type
- * @param factory OFFactory object
- * @param xid transaction ID
- * @return GroupModBuilder object
- */
- public static GroupModBuilder builder(GroupBuckets buckets, GroupId groupId,
- GroupDescription.Type type, OFFactory factory,
- Optional<Long> xid) {
-
- return new GroupModBuilder(buckets, groupId, type, factory, xid);
- }
-
- /**
- * Creates a builder for GroupMod.
- *
- * @param buckets GroupBuckets object
- * @param groupId Group Id to create
- * @param type Group type
- * @param factory OFFactory object
- * @param xid transaction ID
- * @param driverService driver Service
- * @return GroupModBuilder object
- */
- public static GroupModBuilder builder(GroupBuckets buckets, GroupId groupId,
- GroupDescription.Type type, OFFactory factory,
- Optional<Long> xid, Optional<DriverService> driverService) {
-
- return new GroupModBuilder(buckets, groupId, type, factory, xid, driverService);
- }
-
- /**
- * Builds the GroupAdd OF message.
- *
- * @return GroupAdd OF message
- */
- public OFGroupAdd buildGroupAdd() {
-
- List<OFBucket> ofBuckets = new ArrayList<OFBucket>();
- for (GroupBucket bucket: buckets.buckets()) {
- List<OFAction> actions = buildActions(bucket.treatment());
-
- OFBucket.Builder bucketBuilder = factory.buildBucket();
- bucketBuilder.setActions(actions);
- if (type == GroupDescription.Type.SELECT) {
- bucketBuilder.setWeight(1);
- }
-
- if (type == GroupDescription.Type.FAILOVER && bucket.watchPort() != null) {
- bucketBuilder.setWatchPort(OFPort.of((int) bucket.watchPort().toLong()));
- } else {
- bucketBuilder.setWatchPort(OFPort.ANY);
- }
- if (type == GroupDescription.Type.FAILOVER && bucket.watchGroup() != null) {
- bucketBuilder.setWatchGroup(OFGroup.of(bucket.watchGroup().id()));
- } else {
- bucketBuilder.setWatchGroup(OFGroup.ANY);
- }
- OFBucket ofBucket = bucketBuilder.build();
- ofBuckets.add(ofBucket);
- }
-
- OFGroupAdd groupMsg = factory.buildGroupAdd()
- .setGroup(OFGroup.of(groupId.id()))
- .setBuckets(ofBuckets)
- .setGroupType(getOFGroupType(type))
- .setXid(xid)
- .build();
-
- return groupMsg;
- }
-
- /**
- * Builds the GroupMod OF message.
- *
- * @return GroupMod OF message
- */
- public OFGroupMod buildGroupMod() {
- List<OFBucket> ofBuckets = new ArrayList<OFBucket>();
- for (GroupBucket bucket: buckets.buckets()) {
- List<OFAction> actions = buildActions(bucket.treatment());
-
- OFBucket.Builder bucketBuilder = factory.buildBucket();
- bucketBuilder.setActions(actions);
- if (type == GroupDescription.Type.SELECT) {
- bucketBuilder.setWeight(1);
- }
- bucketBuilder.setWatchGroup(OFGroup.ANY);
- bucketBuilder.setWatchPort(OFPort.ANY);
- OFBucket ofBucket = bucketBuilder.build();
- ofBuckets.add(ofBucket);
- }
-
- OFGroupMod groupMsg = factory.buildGroupModify()
- .setGroup(OFGroup.of(groupId.id()))
- .setBuckets(ofBuckets)
- .setGroupType(getOFGroupType(type))
- .setXid(xid)
- .build();
-
- return groupMsg;
- }
-
- /**
- * Builds the GroupDel OF message.
- *
- * @return GroupDel OF message
- */
- public OFGroupDelete buildGroupDel() {
-
- OFGroupDelete groupMsg = factory.buildGroupDelete()
- .setGroup(OFGroup.of(groupId.id()))
- .setGroupType(OFGroupType.SELECT)
- .setXid(xid)
- .build();
-
- return groupMsg;
- }
-
- private List<OFAction> buildActions(TrafficTreatment treatment) {
- if (treatment == null) {
- return Collections.emptyList();
- }
-
- List<OFAction> actions = new LinkedList<>();
- for (Instruction i : treatment.allInstructions()) {
- switch (i.type()) {
- case DROP:
- log.warn("Saw drop action; assigning drop action");
- return Collections.emptyList();
- case L0MODIFICATION:
- actions.add(buildL0Modification(i));
- break;
- case L2MODIFICATION:
- actions.add(buildL2Modification(i));
- break;
- case L3MODIFICATION:
- actions.add(buildL3Modification(i));
- break;
- case OUTPUT:
- Instructions.OutputInstruction out =
- (Instructions.OutputInstruction) i;
- OFActionOutput.Builder action = factory.actions().buildOutput()
- .setPort(OFPort.of((int) out.port().toLong()));
- if (out.port().equals(PortNumber.CONTROLLER)) {
- action.setMaxLen(OFPCML_NO_BUFFER);
- }
- actions.add(action.build());
- break;
- case GROUP:
- Instructions.GroupInstruction grp =
- (Instructions.GroupInstruction) i;
- OFActionGroup.Builder actgrp = factory.actions().buildGroup()
- .setGroup(OFGroup.of(grp.groupId().id()));
- actions.add(actgrp.build());
- break;
- case EXTENSION:
- Instructions.ExtensionInstructionWrapper wrapper =
- (Instructions.ExtensionInstructionWrapper) i;
- actions.add(buildExtensionAction(
- wrapper.extensionInstruction(), wrapper.deviceId()));
- break;
- default:
- log.warn("Instruction type {} not yet implemented.", i.type());
- }
- }
-
- return actions;
- }
-
- private OFAction buildL0Modification(Instruction i) {
- L0ModificationInstruction l0m = (L0ModificationInstruction) i;
- switch (l0m.subtype()) {
- case LAMBDA:
- L0ModificationInstruction.ModLambdaInstruction ml =
- (L0ModificationInstruction.ModLambdaInstruction) i;
- return factory.actions().circuit(factory.oxms().ochSigidBasic(
- new CircuitSignalID((byte) 1, (byte) 2, ml.lambda(), (short) 1)));
- default:
- log.warn("Unimplemented action type {}.", l0m.subtype());
- break;
- }
- return null;
- }
-
- private OFAction buildL2Modification(Instruction i) {
- L2ModificationInstruction l2m = (L2ModificationInstruction) i;
- L2ModificationInstruction.ModEtherInstruction eth;
- OFOxm<?> oxm = null;
- switch (l2m.subtype()) {
- case ETH_DST:
- eth = (L2ModificationInstruction.ModEtherInstruction) l2m;
- oxm = factory.oxms().ethDst(MacAddress.of(eth.mac().toLong()));
- break;
- case ETH_SRC:
- eth = (L2ModificationInstruction.ModEtherInstruction) l2m;
- oxm = factory.oxms().ethSrc(MacAddress.of(eth.mac().toLong()));
- break;
- case VLAN_ID:
- L2ModificationInstruction.ModVlanIdInstruction vlanId =
- (L2ModificationInstruction.ModVlanIdInstruction) l2m;
- oxm = factory.oxms().vlanVid(OFVlanVidMatch.ofVlan(vlanId.vlanId().toShort()));
- break;
- case VLAN_PCP:
- L2ModificationInstruction.ModVlanPcpInstruction vlanPcp =
- (L2ModificationInstruction.ModVlanPcpInstruction) l2m;
- oxm = factory.oxms().vlanPcp(VlanPcp.of(vlanPcp.vlanPcp()));
- break;
- case VLAN_POP:
- return factory.actions().popVlan();
- case VLAN_PUSH:
- L2ModificationInstruction.PushHeaderInstructions pushVlanInstruction
- = (L2ModificationInstruction.PushHeaderInstructions) l2m;
- return factory.actions().pushVlan(
- EthType.of(pushVlanInstruction.ethernetType().toShort()));
- case MPLS_PUSH:
- L2ModificationInstruction.PushHeaderInstructions pushHeaderInstructions =
- (L2ModificationInstruction.PushHeaderInstructions) l2m;
- return factory.actions().pushMpls(EthType.of(pushHeaderInstructions
- .ethernetType().toShort()));
- case MPLS_POP:
- L2ModificationInstruction.PushHeaderInstructions popHeaderInstructions =
- (L2ModificationInstruction.PushHeaderInstructions) l2m;
- return factory.actions().popMpls(EthType.of(popHeaderInstructions
- .ethernetType().toShort()));
- case MPLS_LABEL:
- L2ModificationInstruction.ModMplsLabelInstruction mplsLabel =
- (L2ModificationInstruction.ModMplsLabelInstruction) l2m;
- oxm = factory.oxms().mplsLabel(U32.of(mplsLabel.mplsLabel().toInt()));
- break;
- case MPLS_BOS:
- L2ModificationInstruction.ModMplsBosInstruction mplsBos =
- (L2ModificationInstruction.ModMplsBosInstruction) l2m;
- oxm = factory.oxms()
- .mplsBos(mplsBos.mplsBos() ? OFBooleanValue.TRUE
- : OFBooleanValue.FALSE);
- break;
- case DEC_MPLS_TTL:
- return factory.actions().decMplsTtl();
- default:
- log.warn("Unimplemented action type {}.", l2m.subtype());
- break;
- }
-
- if (oxm != null) {
- return factory.actions().buildSetField().setField(oxm).build();
- }
- return null;
- }
-
- private OFAction buildL3Modification(Instruction i) {
- L3ModificationInstruction l3m = (L3ModificationInstruction) i;
- L3ModificationInstruction.ModIPInstruction ip;
- Ip4Address ip4;
- Ip6Address ip6;
- OFOxm<?> oxm = null;
- switch (l3m.subtype()) {
- case IPV4_SRC:
- ip = (L3ModificationInstruction.ModIPInstruction) i;
- ip4 = ip.ip().getIp4Address();
- oxm = factory.oxms().ipv4Src(IPv4Address.of(ip4.toInt()));
- break;
- case IPV4_DST:
- ip = (L3ModificationInstruction.ModIPInstruction) i;
- ip4 = ip.ip().getIp4Address();
- oxm = factory.oxms().ipv4Dst(IPv4Address.of(ip4.toInt()));
- break;
- case IPV6_SRC:
- ip = (L3ModificationInstruction.ModIPInstruction) i;
- ip6 = ip.ip().getIp6Address();
- oxm = factory.oxms().ipv6Src(IPv6Address.of(ip6.toOctets()));
- break;
- case IPV6_DST:
- ip = (L3ModificationInstruction.ModIPInstruction) i;
- ip6 = ip.ip().getIp6Address();
- oxm = factory.oxms().ipv6Dst(IPv6Address.of(ip6.toOctets()));
- break;
- case IPV6_FLABEL:
- L3ModificationInstruction.ModIPv6FlowLabelInstruction flowLabelInstruction =
- (L3ModificationInstruction.ModIPv6FlowLabelInstruction) i;
- int flowLabel = flowLabelInstruction.flowLabel();
- oxm = factory.oxms().ipv6Flabel(IPv6FlowLabel.of(flowLabel));
- break;
- case DEC_TTL:
- return factory.actions().decNwTtl();
- case TTL_IN:
- return factory.actions().copyTtlIn();
- case TTL_OUT:
- return factory.actions().copyTtlOut();
- default:
- log.warn("Unimplemented action type {}.", l3m.subtype());
- break;
- }
-
- if (oxm != null) {
- return factory.actions().buildSetField().setField(oxm).build();
- }
- return null;
- }
-
- private OFGroupType getOFGroupType(GroupDescription.Type groupType) {
- switch (groupType) {
- case INDIRECT:
- return OFGroupType.INDIRECT;
- case SELECT:
- return OFGroupType.SELECT;
- case FAILOVER:
- return OFGroupType.FF;
- case ALL:
- return OFGroupType.ALL;
- default:
- log.error("Unsupported group type : {}", groupType);
- break;
- }
- return null;
- }
-
- private OFAction buildExtensionAction(ExtensionTreatment i, DeviceId deviceId) {
- if (!driverService.isPresent()) {
- log.error("No driver service present");
- return null;
- }
- Driver driver = driverService.get().getDriver(deviceId);
- if (driver.hasBehaviour(ExtensionTreatmentInterpreter.class)) {
- DefaultDriverHandler handler =
- new DefaultDriverHandler(new DefaultDriverData(driver, deviceId));
- ExtensionTreatmentInterpreter interpreter = handler.behaviour(ExtensionTreatmentInterpreter.class);
- return interpreter.mapInstruction(factory, i);
- }
-
- return null;
- }
-}
-
diff --git a/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupStatsCollector.java b/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupStatsCollector.java
deleted file mode 100644
index 9816426b..00000000
--- a/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupStatsCollector.java
+++ /dev/null
@@ -1,111 +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.provider.of.group.impl;
-
-import org.jboss.netty.util.HashedWheelTimer;
-import org.jboss.netty.util.Timeout;
-import org.jboss.netty.util.TimerTask;
-import org.onlab.util.Timer;
-import org.onosproject.openflow.controller.OpenFlowSwitch;
-import org.onosproject.openflow.controller.RoleState;
-import org.projectfloodlight.openflow.protocol.OFGroupDescStatsRequest;
-import org.projectfloodlight.openflow.protocol.OFGroupStatsRequest;
-import org.projectfloodlight.openflow.types.OFGroup;
-import org.slf4j.Logger;
-
-import java.util.concurrent.TimeUnit;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/*
- * Sends Group Stats Request and collect the group statistics with a time interval.
- */
-public class GroupStatsCollector implements TimerTask {
-
- private final HashedWheelTimer timer = Timer.getTimer();
- private final OpenFlowSwitch sw;
- private final Logger log = getLogger(getClass());
- private final int refreshInterval;
-
- private Timeout timeout;
-
- private boolean stopTimer = false;
-
- /**
- * Creates a GroupStatsCollector object.
- *
- * @param sw Open Flow switch
- * @param interval time interval for collecting group statistic
- */
- public GroupStatsCollector(OpenFlowSwitch sw, int interval) {
- this.sw = sw;
- this.refreshInterval = interval;
- }
-
- @Override
- public void run(Timeout timeout) throws Exception {
- log.trace("Collecting stats for {}", sw.getStringId());
-
- sendGroupStatistic();
-
- if (!this.stopTimer) {
- log.trace("Scheduling stats collection in {} seconds for {}",
- this.refreshInterval, this.sw.getStringId());
- timeout.getTimer().newTimeout(this, refreshInterval,
- TimeUnit.SECONDS);
- }
- }
-
- private void sendGroupStatistic() {
- if (log.isTraceEnabled()) {
- log.trace("sendGroupStatistics {}:{}", sw.getStringId(), sw.getRole());
- }
- if (sw.getRole() != RoleState.MASTER) {
- return;
- }
- Long statsXid = OpenFlowGroupProvider.getXidAndAdd(2);
- OFGroupStatsRequest statsRequest = sw.factory().buildGroupStatsRequest()
- .setGroup(OFGroup.ALL)
- .setXid(statsXid)
- .build();
- sw.sendMsg(statsRequest);
-
- Long descXid = statsXid + 1;
- OFGroupDescStatsRequest descStatsRequest =
- sw.factory().buildGroupDescStatsRequest()
- .setXid(descXid)
- .build();
- sw.sendMsg(descStatsRequest);
- }
-
- /**
- * Starts the collector.
- */
- public void start() {
- log.info("Starting Group Stats collection thread for {}", sw.getStringId());
- timeout = timer.newTimeout(this, 1, TimeUnit.SECONDS);
- }
-
- /**
- * Stops the collector.
- */
- public void stop() {
- log.info("Stopping Group Stats collection thread for {}", sw.getStringId());
- this.stopTimer = true;
- timeout.cancel();
- }
-}
diff --git a/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java b/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
deleted file mode 100644
index 6c646d0d..00000000
--- a/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
+++ /dev/null
@@ -1,389 +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.provider.of.group.impl;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicLong;
-
-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.onosproject.core.DefaultGroupId;
-import org.onosproject.core.GroupId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.driver.DriverService;
-import org.onosproject.net.group.DefaultGroup;
-import org.onosproject.net.group.Group;
-import org.onosproject.net.group.GroupBuckets;
-import org.onosproject.net.group.GroupDescription;
-import org.onosproject.net.group.GroupOperation;
-import org.onosproject.net.group.GroupOperations;
-import org.onosproject.net.group.GroupProvider;
-import org.onosproject.net.group.GroupProviderRegistry;
-import org.onosproject.net.group.GroupProviderService;
-import org.onosproject.net.group.StoredGroupBucketEntry;
-import org.onosproject.net.provider.AbstractProvider;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.openflow.controller.Dpid;
-import org.onosproject.openflow.controller.OpenFlowController;
-import org.onosproject.openflow.controller.OpenFlowEventListener;
-import org.onosproject.openflow.controller.OpenFlowSwitch;
-import org.onosproject.openflow.controller.OpenFlowSwitchListener;
-import org.onosproject.openflow.controller.RoleState;
-import org.projectfloodlight.openflow.protocol.OFBucketCounter;
-import org.projectfloodlight.openflow.protocol.OFErrorMsg;
-import org.projectfloodlight.openflow.protocol.OFErrorType;
-import org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry;
-import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
-import org.projectfloodlight.openflow.protocol.OFGroupMod;
-import org.projectfloodlight.openflow.protocol.OFGroupStatsEntry;
-import org.projectfloodlight.openflow.protocol.OFGroupStatsReply;
-import org.projectfloodlight.openflow.protocol.OFGroupType;
-import org.projectfloodlight.openflow.protocol.OFMessage;
-import org.projectfloodlight.openflow.protocol.OFPortStatus;
-import org.projectfloodlight.openflow.protocol.OFStatsReply;
-import org.projectfloodlight.openflow.protocol.OFStatsType;
-import org.projectfloodlight.openflow.protocol.OFVersion;
-import org.slf4j.Logger;
-
-import com.google.common.collect.Maps;
-
-/**
- * Provider which uses an OpenFlow controller to handle Group.
- */
-@Component(immediate = true)
-public class OpenFlowGroupProvider extends AbstractProvider implements GroupProvider {
-
- private final Logger log = getLogger(getClass());
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected OpenFlowController controller;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected GroupProviderRegistry providerRegistry;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected DriverService driverService;
-
- private GroupProviderService providerService;
-
- static final int POLL_INTERVAL = 10;
-
- private final InternalGroupProvider listener = new InternalGroupProvider();
-
- private static final AtomicLong XID_COUNTER = new AtomicLong(1);
- private final Map<Dpid, GroupStatsCollector> collectors = Maps.newHashMap();
- private final Map<Long, OFStatsReply> groupStats = Maps.newConcurrentMap();
- private final Map<GroupId, GroupOperation> pendingGroupOperations =
- Maps.newConcurrentMap();
-
- /* Map<Group ID, Transaction ID> */
- private final Map<GroupId, Long> pendingXidMaps = Maps.newConcurrentMap();
-
- /**
- * Creates a OpenFlow group provider.
- */
- public OpenFlowGroupProvider() {
- super(new ProviderId("of", "org.onosproject.provider.group"));
- }
-
- @Activate
- public void activate() {
- providerService = providerRegistry.register(this);
- controller.addListener(listener);
- controller.addEventListener(listener);
-
- for (OpenFlowSwitch sw : controller.getSwitches()) {
- if (isGroupSupported(sw)) {
- GroupStatsCollector gsc = new GroupStatsCollector(sw, POLL_INTERVAL);
- gsc.start();
- collectors.put(new Dpid(sw.getId()), gsc);
- }
- }
-
- log.info("Started");
- }
-
- @Deactivate
- public void deactivate() {
- providerRegistry.unregister(this);
- providerService = null;
- collectors.values().forEach(GroupStatsCollector::stop);
- collectors.clear();
- log.info("Stopped");
- }
-
- @Override
- public void performGroupOperation(DeviceId deviceId, GroupOperations groupOps) {
- Map<OFGroupMod, OpenFlowSwitch> mods = Maps.newIdentityHashMap();
- final Dpid dpid = Dpid.dpid(deviceId.uri());
- OpenFlowSwitch sw = controller.getSwitch(dpid);
- for (GroupOperation groupOperation: groupOps.operations()) {
- if (sw == null) {
- log.error("SW {} is not found", dpid);
- return;
- }
- final Long groupModXid = XID_COUNTER.getAndIncrement();
- GroupModBuilder builder = null;
- if (driverService == null) {
- builder = GroupModBuilder.builder(groupOperation.buckets(),
- groupOperation.groupId(),
- groupOperation.groupType(),
- sw.factory(),
- Optional.of(groupModXid));
- } else {
- builder = GroupModBuilder.builder(groupOperation.buckets(),
- groupOperation.groupId(),
- groupOperation.groupType(),
- sw.factory(),
- Optional.of(groupModXid),
- Optional.of(driverService));
- }
- OFGroupMod groupMod = null;
- switch (groupOperation.opType()) {
- case ADD:
- groupMod = builder.buildGroupAdd();
- break;
- case MODIFY:
- groupMod = builder.buildGroupMod();
- break;
- case DELETE:
- groupMod = builder.buildGroupDel();
- break;
- default:
- log.error("Unsupported Group operation");
- return;
- }
- sw.sendMsg(groupMod);
- GroupId groudId = new DefaultGroupId(groupMod.getGroup().getGroupNumber());
- pendingGroupOperations.put(groudId, groupOperation);
- pendingXidMaps.put(groudId, groupModXid);
- }
- }
-
- private void pushGroupMetrics(Dpid dpid, OFStatsReply statsReply) {
- DeviceId deviceId = DeviceId.deviceId(Dpid.uri(dpid));
-
- OFGroupStatsReply groupStatsReply = null;
- OFGroupDescStatsReply groupDescStatsReply = null;
-
- synchronized (groupStats) {
- if (statsReply.getStatsType() == OFStatsType.GROUP) {
- OFStatsReply reply = groupStats.get(statsReply.getXid() + 1);
- if (reply != null) {
- groupStatsReply = (OFGroupStatsReply) statsReply;
- groupDescStatsReply = (OFGroupDescStatsReply) reply;
- groupStats.remove(statsReply.getXid() + 1);
- } else {
- groupStats.put(statsReply.getXid(), statsReply);
- }
- } else if (statsReply.getStatsType() == OFStatsType.GROUP_DESC) {
- OFStatsReply reply = groupStats.get(statsReply.getXid() - 1);
- if (reply != null) {
- groupStatsReply = (OFGroupStatsReply) reply;
- groupDescStatsReply = (OFGroupDescStatsReply) statsReply;
- groupStats.remove(statsReply.getXid() - 1);
- } else {
- groupStats.put(statsReply.getXid(), statsReply);
- }
- }
- }
-
- if (groupStatsReply != null && groupDescStatsReply != null) {
- Collection<Group> groups = buildGroupMetrics(deviceId,
- groupStatsReply, groupDescStatsReply);
- providerService.pushGroupMetrics(deviceId, groups);
- for (Group group: groups) {
- pendingGroupOperations.remove(group.id());
- pendingXidMaps.remove(group.id());
- }
- }
- }
-
- private Collection<Group> buildGroupMetrics(DeviceId deviceId,
- OFGroupStatsReply groupStatsReply,
- OFGroupDescStatsReply groupDescStatsReply) {
-
- Map<Integer, Group> groups = Maps.newHashMap();
-
-
- for (OFGroupDescStatsEntry entry: groupDescStatsReply.getEntries()) {
- int id = entry.getGroup().getGroupNumber();
- GroupId groupId = new DefaultGroupId(id);
- GroupDescription.Type type = getGroupType(entry.getGroupType());
- GroupBuckets buckets = new GroupBucketEntryBuilder(entry.getBuckets(),
- entry.getGroupType()).build();
- DefaultGroup group = new DefaultGroup(groupId, deviceId, type, buckets);
- groups.put(id, group);
- }
-
- for (OFGroupStatsEntry entry: groupStatsReply.getEntries()) {
- int groupId = entry.getGroup().getGroupNumber();
- DefaultGroup group = (DefaultGroup) groups.get(groupId);
- if (group != null) {
- group.setBytes(entry.getByteCount().getValue());
- group.setLife(entry.getDurationSec());
- group.setPackets(entry.getPacketCount().getValue());
- group.setReferenceCount(entry.getRefCount());
- int bucketIndex = 0;
- for (OFBucketCounter bucketStats:entry.getBucketStats()) {
- ((StoredGroupBucketEntry) group.buckets().buckets()
- .get(bucketIndex))
- .setPackets(bucketStats
- .getPacketCount().getValue());
- ((StoredGroupBucketEntry) group.buckets().buckets()
- .get(bucketIndex))
- .setBytes(entry.getBucketStats()
- .get(bucketIndex)
- .getByteCount().getValue());
- bucketIndex++;
- }
- }
- }
-
- return groups.values();
- }
-
- private GroupDescription.Type getGroupType(OFGroupType type) {
- switch (type) {
- case ALL:
- return GroupDescription.Type.ALL;
- case INDIRECT:
- return GroupDescription.Type.INDIRECT;
- case SELECT:
- return GroupDescription.Type.SELECT;
- case FF:
- return GroupDescription.Type.FAILOVER;
- default:
- log.error("Unsupported OF group type : {}", type);
- break;
- }
- return null;
- }
-
- /**
- * Returns a transaction ID for entire group operations and increases
- * the counter by the number given.
- *
- * @param increase the amount to increase the counter by
- * @return a transaction ID
- */
- public static long getXidAndAdd(int increase) {
- return XID_COUNTER.getAndAdd(increase);
- }
-
- private boolean isGroupSupported(OpenFlowSwitch sw) {
- if (sw.factory().getVersion() == OFVersion.OF_10 ||
- sw.factory().getVersion() == OFVersion.OF_11 ||
- sw.factory().getVersion() == OFVersion.OF_12) {
- return false;
- }
-
- return true;
- }
-
- private class InternalGroupProvider
- implements OpenFlowSwitchListener, OpenFlowEventListener {
-
- @Override
- public void handleMessage(Dpid dpid, OFMessage msg) {
- switch (msg.getType()) {
- case STATS_REPLY:
- pushGroupMetrics(dpid, (OFStatsReply) msg);
- break;
- case ERROR:
- OFErrorMsg errorMsg = (OFErrorMsg) msg;
- if (errorMsg.getErrType() == OFErrorType.GROUP_MOD_FAILED) {
- GroupId pendingGroupId = null;
- for (Map.Entry<GroupId, Long> entry: pendingXidMaps.entrySet()) {
- if (entry.getValue() == errorMsg.getXid()) {
- pendingGroupId = entry.getKey();
- break;
- }
- }
- if (pendingGroupId == null) {
- log.warn("Error for unknown group operation: {}",
- errorMsg.getXid());
- } else {
- GroupOperation operation =
- pendingGroupOperations.get(pendingGroupId);
- DeviceId deviceId = DeviceId.deviceId(Dpid.uri(dpid));
- if (operation != null) {
- providerService.groupOperationFailed(deviceId,
- operation);
- pendingGroupOperations.remove(pendingGroupId);
- pendingXidMaps.remove(pendingGroupId);
- log.warn("Received an group mod error {}", msg);
- } else {
- log.error("Cannot find pending group operation with group ID: {}",
- pendingGroupId);
- }
- }
- break;
- }
- default:
- break;
- }
- }
-
- @Override
- public void switchAdded(Dpid dpid) {
- OpenFlowSwitch sw = controller.getSwitch(dpid);
- if (sw == null) {
- return;
- }
- if (isGroupSupported(sw)) {
- GroupStatsCollector gsc = new GroupStatsCollector(
- controller.getSwitch(dpid), POLL_INTERVAL);
- gsc.start();
- collectors.put(dpid, gsc);
- }
-
- //figure out race condition
- if (controller.getSwitch(dpid) == null) {
- switchRemoved(dpid);
- }
- }
-
- @Override
- public void switchRemoved(Dpid dpid) {
- GroupStatsCollector collector = collectors.remove(dpid);
- if (collector != null) {
- collector.stop();
- }
- }
-
- @Override
- public void switchChanged(Dpid dpid) {
- }
-
- @Override
- public void portChanged(Dpid dpid, OFPortStatus status) {
- }
-
- @Override
- public void receivedRoleReply(Dpid dpid, RoleState requested, RoleState response) {
- }
- }
-
-}
diff --git a/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/package-info.java b/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/package-info.java
deleted file mode 100644
index 9fda4a31..00000000
--- a/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/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.
- */
-
-/**
- * Provider that uses OpenFlow controller as a means of device port group management.
- */
-package org.onosproject.provider.of.group.impl; \ No newline at end of file
diff --git a/framework/src/onos/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java b/framework/src/onos/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
deleted file mode 100644
index f923c6f8..00000000
--- a/framework/src/onos/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
+++ /dev/null
@@ -1,412 +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.provider.of.group.impl;
-
-import com.google.common.collect.Lists;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onosproject.core.DefaultGroupId;
-import org.onosproject.core.GroupId;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.group.DefaultGroupBucket;
-import org.onosproject.net.group.Group;
-import org.onosproject.net.group.GroupBucket;
-import org.onosproject.net.group.GroupBuckets;
-import org.onosproject.net.group.GroupDescription;
-import org.onosproject.net.group.GroupOperation;
-import org.onosproject.net.group.GroupOperations;
-import org.onosproject.net.group.GroupProvider;
-import org.onosproject.net.group.GroupProviderRegistry;
-import org.onosproject.net.group.GroupProviderService;
-import org.onosproject.net.provider.AbstractProviderService;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.openflow.controller.Dpid;
-import org.onosproject.openflow.controller.OpenFlowController;
-import org.onosproject.openflow.controller.OpenFlowEventListener;
-import org.onosproject.openflow.controller.OpenFlowSwitch;
-import org.onosproject.openflow.controller.OpenFlowSwitchListener;
-import org.onosproject.openflow.controller.PacketListener;
-import org.onosproject.openflow.controller.RoleState;
-import org.projectfloodlight.openflow.protocol.OFFactories;
-import org.projectfloodlight.openflow.protocol.OFFactory;
-import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
-import org.projectfloodlight.openflow.protocol.OFGroupMod;
-import org.projectfloodlight.openflow.protocol.OFGroupModFailedCode;
-import org.projectfloodlight.openflow.protocol.OFGroupStatsReply;
-import org.projectfloodlight.openflow.protocol.OFGroupType;
-import org.projectfloodlight.openflow.protocol.OFMessage;
-import org.projectfloodlight.openflow.protocol.OFPortDesc;
-import org.projectfloodlight.openflow.protocol.OFVersion;
-import org.projectfloodlight.openflow.protocol.errormsg.OFGroupModFailedErrorMsg;
-import org.projectfloodlight.openflow.types.OFGroup;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-import static org.junit.Assert.*;
-
-public class OpenFlowGroupProviderTest {
-
- OpenFlowGroupProvider provider = new OpenFlowGroupProvider();
- private final OpenFlowController controller = new TestController();
- GroupProviderRegistry providerRegistry = new TestGroupProviderRegistry();
- GroupProviderService providerService;
-
- private DeviceId deviceId = DeviceId.deviceId("of:0000000000000001");
- private Dpid dpid1 = Dpid.dpid(deviceId.uri());
-
- @Before
- public void setUp() {
- provider.controller = controller;
- provider.providerRegistry = providerRegistry;
- provider.activate();
- }
-
- @Test
- public void basics() {
- assertNotNull("registration expected", providerService);
- assertEquals("incorrect provider", provider, providerService.provider());
- }
-
- @Test
- public void addGroup() {
-
- GroupId groupId = new DefaultGroupId(1);
-
- List<GroupBucket> bucketList = Lists.newArrayList();
- TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
- builder.setOutput(PortNumber.portNumber(1));
- GroupBucket bucket =
- DefaultGroupBucket.createSelectGroupBucket(builder.build());
- bucketList.add(bucket);
- GroupBuckets buckets = new GroupBuckets(bucketList);
-
- List<GroupOperation> operationList = Lists.newArrayList();
- GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
- GroupDescription.Type.SELECT, buckets);
- operationList.add(operation);
- GroupOperations operations = new GroupOperations(operationList);
-
- provider.performGroupOperation(deviceId, operations);
-
- final Dpid dpid = Dpid.dpid(deviceId.uri());
- TestOpenFlowSwitch sw = (TestOpenFlowSwitch) controller.getSwitch(dpid);
- assertNotNull("Switch should not be nul", sw);
- assertNotNull("OFGroupMsg should not be null", sw.msg);
-
- }
-
-
- @Test
- public void groupModFailure() {
- TestOpenFlowGroupProviderService testProviderService =
- (TestOpenFlowGroupProviderService) providerService;
-
- GroupId groupId = new DefaultGroupId(1);
- List<GroupBucket> bucketList = Lists.newArrayList();
- TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
- builder.setOutput(PortNumber.portNumber(1));
- GroupBucket bucket =
- DefaultGroupBucket.createSelectGroupBucket(builder.build());
- bucketList.add(bucket);
- GroupBuckets buckets = new GroupBuckets(bucketList);
- List<GroupOperation> operationList = Lists.newArrayList();
- GroupOperation operation = GroupOperation.createAddGroupOperation(groupId,
- GroupDescription.Type.SELECT, buckets);
- operationList.add(operation);
- GroupOperations operations = new GroupOperations(operationList);
-
- provider.performGroupOperation(deviceId, operations);
-
- OFGroupModFailedErrorMsg.Builder errorBuilder =
- OFFactories.getFactory(OFVersion.OF_13).errorMsgs().buildGroupModFailedErrorMsg();
- OFGroupMod.Builder groupBuilder = OFFactories.getFactory(OFVersion.OF_13).buildGroupModify();
- groupBuilder.setGroupType(OFGroupType.ALL);
- groupBuilder.setGroup(OFGroup.of(1));
- errorBuilder.setCode(OFGroupModFailedCode.GROUP_EXISTS);
- errorBuilder.setXid(provider.getXidAndAdd(0) - 1);
-
- controller.processPacket(dpid1, errorBuilder.build());
-
- assertNotNull("Operation failed should not be null",
- testProviderService.failedOperation);
- }
-
-
- @Test
- public void groupStatsEvent() {
- TestOpenFlowGroupProviderService testProviderService =
- (TestOpenFlowGroupProviderService) providerService;
-
- OFGroupStatsReply.Builder rep1 =
- OFFactories.getFactory(OFVersion.OF_13).buildGroupStatsReply();
- rep1.setXid(1);
- controller.processPacket(dpid1, rep1.build());
- OFGroupDescStatsReply.Builder rep2 =
- OFFactories.getFactory(OFVersion.OF_13).buildGroupDescStatsReply();
- assertNull("group entries is not set yet", testProviderService.getGroupEntries());
-
- rep2.setXid(2);
- controller.processPacket(dpid1, rep2.build());
- assertNotNull("group entries should be set", testProviderService.getGroupEntries());
- }
-
-
-
- @After
- public void tearDown() {
- provider.deactivate();
- provider.providerRegistry = null;
- provider.controller = null;
- }
-
- private class TestOpenFlowGroupProviderService
- extends AbstractProviderService<GroupProvider>
- implements GroupProviderService {
-
- Collection<Group> groups = null;
- GroupOperation failedOperation = null;
-
- protected TestOpenFlowGroupProviderService(GroupProvider provider) {
- super(provider);
- }
-
- @Override
- public void groupOperationFailed(DeviceId deviceId, GroupOperation operation) {
- this.failedOperation = operation;
- }
-
- @Override
- public void pushGroupMetrics(DeviceId deviceId, Collection<Group> groupEntries) {
- this.groups = groupEntries;
- }
-
- public Collection<Group> getGroupEntries() {
- return groups;
- }
- }
-
- private class TestController implements OpenFlowController {
-
- OpenFlowEventListener eventListener = null;
- List<OpenFlowSwitch> switches = Lists.newArrayList();
-
- public TestController() {
- OpenFlowSwitch testSwitch = new TestOpenFlowSwitch();
- switches.add(testSwitch);
- }
-
- @Override
- public void addListener(OpenFlowSwitchListener listener) {
- }
-
- @Override
- public void removeListener(OpenFlowSwitchListener listener) {
-
- }
-
- @Override
- public void addPacketListener(int priority, PacketListener listener) {
-
- }
-
- @Override
- public void removePacketListener(PacketListener listener) {
-
- }
-
- @Override
- public void addEventListener(OpenFlowEventListener listener) {
- this.eventListener = listener;
- }
-
- @Override
- public void removeEventListener(OpenFlowEventListener listener) {
-
- }
-
- @Override
- public void write(Dpid dpid, OFMessage msg) {
-
- }
-
- @Override
- public void processPacket(Dpid dpid, OFMessage msg) {
- eventListener.handleMessage(dpid, msg);
- }
-
- @Override
- public void setRole(Dpid dpid, RoleState role) {
-
- }
-
- @Override
- public Iterable<OpenFlowSwitch> getSwitches() {
- return switches;
- }
-
- @Override
- public Iterable<OpenFlowSwitch> getMasterSwitches() {
- return null;
- }
-
- @Override
- public Iterable<OpenFlowSwitch> getEqualSwitches() {
- return null;
- }
-
- @Override
- public OpenFlowSwitch getSwitch(Dpid dpid) {
- return switches.get(0);
- }
-
- @Override
- public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
- return null;
- }
-
- @Override
- public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
- return null;
- }
-
- }
-
- private class TestGroupProviderRegistry implements GroupProviderRegistry {
-
- @Override
- public GroupProviderService register(GroupProvider provider) {
- providerService = new TestOpenFlowGroupProviderService(provider);
- return providerService;
- }
-
- @Override
- public void unregister(GroupProvider provider) {
- }
-
- @Override
- public Set<ProviderId> getProviders() {
- return null;
- }
- }
-
- private class TestOpenFlowSwitch implements OpenFlowSwitch {
-
- OFMessage msg = null;
-
- @Override
- public void sendMsg(OFMessage msg) {
- this.msg = msg;
- }
-
- @Override
- public void sendMsg(List<OFMessage> msgs) {
-
- }
-
- @Override
- public void handleMessage(OFMessage fromSwitch) {
-
- }
-
- @Override
- public void setRole(RoleState role) {
-
- }
-
- @Override
- public RoleState getRole() {
- return null;
- }
-
- @Override
- public List<OFPortDesc> getPorts() {
- return null;
- }
-
- @Override
- public OFFactory factory() {
- return OFFactories.getFactory(OFVersion.OF_13);
- }
-
- @Override
- public String getStringId() {
- return null;
- }
-
- @Override
- public long getId() {
- return 0;
- }
-
- @Override
- public String manufacturerDescription() {
- return null;
- }
-
- @Override
- public String datapathDescription() {
- return null;
- }
-
- @Override
- public String hardwareDescription() {
- return null;
- }
-
- @Override
- public String softwareDescription() {
- return null;
- }
-
- @Override
- public String serialNumber() {
- return null;
- }
-
- @Override
- public boolean isConnected() {
- return false;
- }
-
- @Override
- public void disconnectSwitch() {
-
- }
-
- @Override
- public void returnRoleReply(RoleState requested, RoleState response) {
-
- }
-
- @Override
- public Device.Type deviceType() {
- return Device.Type.SWITCH;
- }
-
- @Override
- public String channelId() {
- return null;
- }
-
- }
-} \ No newline at end of file