sim/Connectivity.h
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sim/Connectivity.h	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,124 @@
+/*
+ *    Copyright 2005-2006 Intel Corporation
+ * 
+ *    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.
+ */
+
+#ifndef _CONNECTIVITY_H_
+#define _CONNECTIVITY_H_
+
+#include "SimEventHandler.h"
+#include <oasys/debug/DebugUtils.h>
+#include <oasys/debug/Logger.h>
+#include <oasys/util/StringUtils.h>
+
+namespace dtnsim {
+
+class Node;
+
+
+/**
+ * Helper struct to store the current connectivity settings
+ * between a pair (or set) of nodes.
+ */
+struct ConnState {
+    /**
+     * Default constructor, also implicitly the default connectivity
+     * state.
+     */
+    ConnState(): open_(true), bw_(100000), latency_(0.01) {}
+
+    /**
+     * Constructor with explicit settings.
+     */
+    ConnState(bool open, int bw, int latency)
+        : open_(open), bw_(bw), latency_(latency) {}
+
+    /**
+     * Utility function to parse a time specification.
+     */
+    bool parse_time(const char* time_str, double* time);
+
+    /**
+     * Utility function to fill in the values from a set of options
+     * (e.g. bw=10kbps, latency=10ms).
+     */
+    bool parse_options(int argc, const char** argv, const char** invalidp);
+
+    bool      open_;
+    u_int64_t bw_;      // in bps
+    double    latency_; // in seconds
+};
+
+/**
+ * Base class for the underlying connectivity management between nodes
+ * in the simulation.
+ */
+class Connectivity : public oasys::Logger {
+public:
+    /**
+     * Singleton accessor.
+     */
+    static Connectivity* instance()
+    {
+        if (!instance_) {
+            ASSERT(type_ != ""); // type must be set;
+            instance_ = create_conn();
+        }
+        
+        return instance_;
+    }
+
+    /**
+     * Constructor.
+     */
+    Connectivity();
+
+    /**
+     * Destructor.
+     */
+    virtual ~Connectivity() {}
+    
+    /**
+     * Get the current connectivity state between two nodes.
+     */
+    const ConnState* lookup(Node* n1, Node* n2);
+
+protected:
+    friend class ConnCommand;
+    
+    /**
+     * The state structures are stored in a table indexed by strings
+     * of the form NODE1,NODE2. Defaults can be set in the config with
+     * a node name of '*' (and are stored in the table as such).
+     */
+    typedef oasys::StringHashMap<ConnState> StateTable;
+    StateTable state_;
+
+    /**
+     * Static bootstrap initializer.
+     */
+    static Connectivity* create_conn();
+
+    /**
+     * Set the current connectivity state.
+     */
+    void set_state(const char* n1, const char* n2, const ConnState& s);
+    
+    static std::string type_;		///< The module type
+    static Connectivity* instance_;	///< Singleton instance
+};
+
+} // namespace dtnsim
+
+#endif /* _CONNECTIVITY_H_ */