aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java')
-rw-r--r--framework/src/onos/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java389
1 files changed, 0 insertions, 389 deletions
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) {
- }
- }
-
-}