Performacne improvements via adding a netty-based openflowj and openflow plugin;...
[controller.git] / opendaylight / protocol_plugins / openflow_netty / src / main / java / org / opendaylight / controller / protocol_plugin / openflow / internal / InventoryServiceHelper.java
diff --git a/opendaylight/protocol_plugins/openflow_netty/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceHelper.java b/opendaylight/protocol_plugins/openflow_netty/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceHelper.java
new file mode 100644 (file)
index 0000000..79973ee
--- /dev/null
@@ -0,0 +1,167 @@
+
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.controller.protocol_plugin.openflow.internal;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.opendaylight.controller.sal.core.Bandwidth;
+import org.opendaylight.controller.sal.core.AdvertisedBandwidth;
+import org.opendaylight.controller.sal.core.SupportedBandwidth;
+import org.opendaylight.controller.sal.core.PeerBandwidth;
+import org.opendaylight.controller.sal.core.Config;
+import org.opendaylight.controller.sal.core.Name;
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.controller.sal.core.NodeConnector;
+import org.opendaylight.controller.sal.core.Property;
+import org.opendaylight.controller.sal.core.State;
+
+import org.opendaylight.controller.sal.utils.NodeCreator;
+
+import org.opendaylight.controller.protocol_plugin.openflow.core.ISwitch;
+import org.openflow.protocol.OFPhysicalPort;
+import org.openflow.protocol.OFPhysicalPort.OFPortConfig;
+import org.openflow.protocol.OFPhysicalPort.OFPortFeatures;
+import org.openflow.protocol.OFPhysicalPort.OFPortState;
+
+/**
+ * The class provides helper functions to retrieve inventory properties from
+ * OpenFlow messages
+ */
+public class InventoryServiceHelper {
+    /*
+     * Returns BandWidth property from OpenFlow OFPhysicalPort features
+     */
+    public static Bandwidth OFPortToBandWidth(int portFeatures) {
+        Bandwidth bw = null;
+        int value = portFeatures
+                & (OFPortFeatures.OFPPF_10MB_FD.getValue()
+                        | OFPortFeatures.OFPPF_10MB_HD.getValue()
+                        | OFPortFeatures.OFPPF_100MB_FD.getValue()
+                        | OFPortFeatures.OFPPF_100MB_HD.getValue()
+                        | OFPortFeatures.OFPPF_1GB_FD.getValue()
+                        | OFPortFeatures.OFPPF_1GB_HD.getValue() | OFPortFeatures.OFPPF_10GB_FD
+                        .getValue());
+
+        switch (value) {
+        case 1:
+        case 2:
+            bw = new Bandwidth(Bandwidth.BW10Mbps);
+            break;
+        case 4:
+        case 8:
+            bw = new Bandwidth(Bandwidth.BW100Mbps);
+            break;
+        case 16:
+        case 32:
+            bw = new Bandwidth(Bandwidth.BW1Gbps);
+            break;
+        case 64:
+            bw = new Bandwidth(Bandwidth.BW10Gbps);
+            break;
+        default:
+            break;
+        }
+        return bw;
+    }
+
+    /*
+     * Returns Config property from OpenFLow OFPhysicalPort config
+     */
+    public static Config OFPortToConfig(int portConfig) {
+        Config config;
+        if ((OFPortConfig.OFPPC_PORT_DOWN.getValue() & portConfig) != 0)
+            config = new Config(Config.ADMIN_DOWN);
+        else
+            config = new Config(Config.ADMIN_UP);
+        return config;
+    }
+
+    /*
+     * Returns State property from OpenFLow OFPhysicalPort state
+     */
+    public static State OFPortToState(int portState) {
+        State state;
+        if ((OFPortState.OFPPS_LINK_DOWN.getValue() & portState) != 0)
+            state = new State(State.EDGE_DOWN);
+        else
+            state = new State(State.EDGE_UP);
+        return state;
+    }
+
+    /*
+     * Returns set of properties from OpenFLow OFPhysicalPort
+     */
+    public static Set<Property> OFPortToProps(OFPhysicalPort port) {
+        Set<Property> props = new HashSet<Property>();
+        Bandwidth bw = InventoryServiceHelper.OFPortToBandWidth(port
+                .getCurrentFeatures());
+        if (bw != null) {
+            props.add(bw);
+        }
+
+        Bandwidth abw = InventoryServiceHelper.OFPortToBandWidth(port.getAdvertisedFeatures());
+        if (abw != null) {
+            AdvertisedBandwidth a = new AdvertisedBandwidth(abw.getValue());
+            if (a != null) {
+                props.add(a);
+            }
+        }
+        Bandwidth sbw = InventoryServiceHelper.OFPortToBandWidth(port.getSupportedFeatures());
+        if (sbw != null) {
+            SupportedBandwidth s = new SupportedBandwidth(sbw.getValue());
+            if (s != null) {
+                props.add(s);
+            }
+        }
+        Bandwidth pbw = InventoryServiceHelper.OFPortToBandWidth(port.getPeerFeatures());
+        if (pbw != null) {
+            PeerBandwidth p = new PeerBandwidth(pbw.getValue());
+            if (p != null) {
+                props.add(p);
+            }
+        }
+        props.add(new Name(port.getName()));
+        props.add(InventoryServiceHelper.OFPortToConfig(port.getConfig()));
+        props.add(InventoryServiceHelper.OFPortToState(port.getState()));
+        return props;
+    }
+
+    /*
+     * Returns set of properties for each nodeConnector in an OpenFLow switch
+     */
+    public static Map<NodeConnector, Set<Property>> OFSwitchToProps(ISwitch sw) {
+        Map<NodeConnector, Set<Property>> ncProps = new HashMap<NodeConnector, Set<Property>>();
+
+        if (sw == null) {
+            return ncProps;
+        }
+
+        Node node = NodeCreator.createOFNode(sw.getId());
+        if (node == null) {
+            return ncProps;
+        }
+
+        Set<Property> props;
+        NodeConnector nodeConnector;
+        OFPhysicalPort port;
+        Map<Short, OFPhysicalPort> ports = sw.getPhysicalPorts();
+        for (Map.Entry<Short, OFPhysicalPort> entry : ports.entrySet()) {
+            nodeConnector = PortConverter.toNodeConnector(entry.getKey(), node);
+            port = entry.getValue();
+            props = InventoryServiceHelper.OFPortToProps(port);
+            ncProps.put(nodeConnector, props);
+        }
+
+        return ncProps;
+    }
+}