Skip to content
No description, website, or topics provided.
Python Java JavaScript HTML CSS Makefile Other
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
documentation
firedex-dynamic
firedex-static
plugins/networkx
.DS_Store
README.md

README.md

Firedex

FireDeX is a cross-layer middleware that facilitates timely and effective exchange of data for coordinating emergency response activities. Emergency scenarios may challenge/congest the network infrastructure. FireDeX addresses these situations by prioritizing event delivery and by dropping some low priority events. It adopts a publish-subscribe data exchange paradigm with brokers at the network edge to manage prioritized delivery of mission-critical data from IoT sources to relevant subscribers.

See [1, 2] for more details on the FireDeX middleware.

Getting started

These instructions will get you a copy of the FireDeX project up and running on your local machine.

Prerequisites

Install VirtualBox.
Install Ubuntu 14.04.

Installing - Option 1 (easy, recommended)

Download the FireDeX Virtual Machine. Then, import the FireDeX.ova file in VirtualBox and launch the Virtual Machine.

Note:
username = firedex
password = firedex

Installing - Option 2 (advanced, from source)

These steps will walk you trough the installation of the FireDeX project from scratch (clean Ubuntu Virtual Machine).

To install:

  • Java
  • Git
  • Mininet
  • Modified version of OVS
  • PyCharm and Eclipse
  • Get the FireDeX source code

Java

To install Java type the following commands on your terminal.

sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

Git

To install Git type the following command on your terminal.

sudo apt-get install git

Mininet

To install Mininet type the following commands on your terminal.

git clone git://github.com/mininet/mininet
sudo mininet/util/install.sh -nfv

OVS

To install the modified version of OVS take the following steps:

  • remove the OVS version installed with Mininet
sudo apt-get remove openvswitch-common openvswitch-datapath-dkms openvswitch-controller openvswitch-pki openvswitch-switch
  • download the new OVS version
sudo wget http://openvswitch.org/releases/openvswitch-2.1.0.tar.gz
sudo tar zxfv openvswitch-2.1.0.tar.gz
cd openvswitch-2.1.0/
  • make minimal changes to OVS_HOME/ofproto/ofproto-dpif-xlate.c as follows [3]:

    • add headers
    #include <stdlib.h>
    #include <time.h>
    
    • add global variable
    static bool is_srand_initialized = false;
    
    • modify functions
    static void
    xlate_select_group(struct xlate_ctx *ctx, struct group_dpif *group)
    {
        struct flow_wildcards *wc = &ctx->xout->wc;
        const struct ofputil_bucket *bucket;
        uint32_t basis;
    
        // The following tells the caching code that every packet in
        // the flow in question must go to the userspace "slow path".
        ctx->xout->slow |= SLOW_CONTROLLER;
    
        basis = hash_bytes(ctx->xin->flow.dl_dst, sizeof ctx->xin->flow.dl_dst, 0);
        bucket = group_best_live_bucket(ctx, group, basis);
        if (bucket) {
            memset(&wc->masks.dl_dst, 0xff, sizeof wc->masks.dl_dst);
            xlate_group_bucket(ctx, bucket);
        }
    }
    
    static const struct ofputil_bucket *
    group_best_live_bucket(const struct xlate_ctx *ctx,
                       const struct group_dpif *group,
                       uint32_t basis) // basis in not being used
    {
        uint32_t rand_num = 0, sum = 0;
        const struct ofputil_bucket *bucket = NULL;
        const struct list *buckets;
    
        // initialize random seed once
        if (!is_srand_initialized) {
            srand(time(NULL));
            is_srand_initialized = true;
        }
    
        // generate a random number in [1, 100]
        rand_num = (rand() % 100) + 1;
    
        group_dpif_get_buckets(group, &buckets);
        LIST_FOR_EACH (bucket, list_node, buckets) {
            if (bucket_is_alive(ctx, bucket, 0)) {
                sum += bucket->weight;
                if (rand_num <= sum) {
                    return bucket; // return this bucket
                }
            }
        }
    
        return bucket; // return NULL
    }
    
  • compile the OVS source code

sudo apt-get install build-essential fakeroot
sudo apt-get install debhelper autoconf automake libssl-dev pkg-config bzip2 openssl python-all procps python-qt4 python-zopeinterface python-twisted-conch dh-autoreconf
`DEB_BUILD_OPTIONS='parallel=8 nocheck' fakeroot debian/rules binary`
  • install OVS
cd ..
sudo dpkg -i openvswitch-common*.deb openvswitch-pki*.deb openvswitch-switch*.deb

PyCharm and Eclipse

Install PyCharm and Eclipse.

Get the FireDeX source code

Download the FireDeX repository.

git clone git://github.com/boulouk/firedex

Finishing up

Finally you need to import the project dependencies (make sure that you are using Python 2.7).

FireDeX static dependencies

Run PyCharm (file PY_CHARM_HOME/bin/pycharm.sh) as root (sudo) and open the following projects in the firedex-static directory:

  • experimental-framework
  • sdn-controller
  • firedex-coordinator-service

Import the following dependencies:

  • experimental-framework -> numpy, requests, matplotlib, pandas (add the Mininet project as a dependency)
  • sdn-controller -> ryu, decorator (mark the application directory as Sources Root, add the NetworkX project as a dependency)
  • firedex-coordinator-service -> flask, numpy, requests

FireDeX dynamic dependencies

Run PyCharm (file PY_CHARM_HOME/bin/pycharm.sh) as root (sudo) and open the following projects in the firedex-dynamic directory:

  • experimental-framework
  • sdn-controller
  • firedex-coordinator-service

Import the following dependencies:

  • experimental-framework -> numpy, requests (add the Mininet project as a dependency)
  • sdn-controller -> ryu, decorator (mark the application directory as Sources Root, add the NetworkX project as a dependency)
  • firedex-coordinator-service -> flask, numpy, cvxpy, requests

Running - FireDeX static

Run PyCharm (file PY_CHARM_HOME/bin/pycharm.sh) as root (sudo) and open the following projects in the firedex-static directory:

  • experimental-framework
  • sdn-controller
  • firedex-coordinator-service

The configuration parameters are in the scenario directory of the experimental-framework project:

  • experiment_scenario.py
    • RUN defines the type of experiment to run (analytical model, Mininet simulation, both)
  • firedex_scenario.py
    • EXPERIMENT_DURATION sets the duration of the experiment
    • NETWORK_FLOWS and PRIORITIES allow to set respectively the number of network flows and the number of priorities
    • NETWORK_FLOW_ALGORITHM, PRIORITY_ALGORITHM and DROP_RATE_ALGORITHM apply the various FireDeX algorithms
    • TOLERANCE represents the percentage of bandwidth reserved for temporary traffic peaks
  • network_scenario.py
    • BANDWIDTH defines the available bandwidth between broker and subscribers
  • topology_scenario.py
    • SUBSCRIBER allows to modify the number of subscribers and their subscriptions (topic and utility function)
    • PUBLISHER allows to modify the number of publishers and their publications (topic, publication rate and message size)

Note: run the applications in the following order:

  • firedex-coordinator-service (file to run: firedex_middleware.py)
  • sdn-controller (file to run: sdn_controller.py)
  • experimental-framework (file to run: experimental_framework.py - to plot the results: analysis_framework.py)

The default configuration runs 10 subscribers with ρ = 1.5 (network load).

The following images show the performance of the system (response time and success rate) of the default configuration.

Response time

Success rate

Running - FireDeX dynamic

Run PyCharm (file PY_CHARM_HOME/bin/pycharm.sh) as root (sudo) and open the following projects in the firedex-dynamic directory:

  • experimental-framework
  • sdn-controller
  • firedex-coordinator-service

The configuration parameters are in the scenario directory of the experimental-framework project:

  • experiment_scenario.py
    • EXPERIMENT_DURATION sets the duration of the experiment
    • SUBSCRIBER allows to modify the number of subscribers and their subscriptions (topic and utility function)
    • PUBLISHER allows to modify the number of publishers and their publications (topic, publication rate and message size)
  • firedex_scenario.py
    • NETWORK_FLOWS and PRIORITIES allow to set respectively the number of network flows and the number of priorities
    • NETWORK_FLOW_ALGORITHM, PRIORITY_ALGORITHM and DROP_RATE_ALGORITHM apply the various FireDeX algorithms
    • RHO_TOLERANCE represents the percentage of bandwidth reserved for temporary traffic peaks
  • network_scenario.py
    • BANDWIDTH defines the available bandwidth between broker and subscribers

Note: run the applications in the following order:

  • firedex-coordinator-service (file to run: firedex_middleware.py)
  • sdn-controller (file to run: sdn_controller.py)
  • experimental-framework (file to run: experimental_framework.py - to plot the results use the dashboard)

The default configuration runs 5 subscribers with ρ = 1.2 (network load).

The following images show the performance experienced by subscriptions with different importance (high importance/priority vs. low importance/priority).

High priority subscription

Low priority subscription

References

[1] https://hal.inria.fr/hal-01877555
[2] https://hal.inria.fr/hal-01895274
[3] https://github.com/saeenali/openvswitch/wiki/Stochastic-Switching-using-Open-vSwitch-in-Mininet

You can’t perform that action at this time.