An Overlay-based
Virtual Network Substrate
SpoVNet

source: source/ariba/AribaModule.cpp @ 5767

Last change on this file since 5767 was 5767, checked in by Christoph Mayer, 14 years ago

major gui update

File size: 6.0 KB
Line 
1// [License]
2// The Ariba-Underlay Copyright
3//
4// Copyright (c) 2008-2009, Institute of Telematics, UniversitÀt Karlsruhe (TH)
5//
6// Institute of Telematics
7// UniversitÀt Karlsruhe (TH)
8// Zirkel 2, 76128 Karlsruhe
9// Germany
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
22// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
25// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32//
33// The views and conclusions contained in the software and documentation
34// are those of the authors and should not be interpreted as representing
35// official policies, either expressed or implied, of the Institute of
36// Telematics.
37// [License]
38
39#include "AribaModule.h"
40
41// boost/std includes
42#include <assert.h>
43#include <boost/regex.hpp>
44#include <boost/foreach.hpp>
45
46// ariba includes
47#include "ariba/SideportListener.h"
48#include "ariba/utility/misc/Helper.h"
49#include "ariba/utility/misc/StringFormat.h"
50#include "ariba/communication/BaseCommunication.h"
51#include "ariba/communication/EndpointDescriptor.h"
52
53using namespace ariba::utility::Helper;
54using ariba::communication::BaseCommunication;
55using ariba::communication::EndpointDescriptor;
56
57namespace ariba {
58
59use_logging_cpp(AribaModule);
60
61AribaModule::AribaModule()
62        : base_comm(NULL), sideport_sniffer(NULL), started(false) {
63
64        endpoints = "tcp{41322};rfcomm{10};";
65
66        //srand( time(NULL) );
67        //uint16_t tcpport = (rand() + 1024) % 50000;
68        //uint16_t udpport = (rand() + 1024) % 50000;
69}
70
71AribaModule::~AribaModule() {
72}
73
74string AribaModule::getBootstrapHints(const Name& spoVNetName) const {
75        std::ostringstream o;
76        BOOST_FOREACH( const BootstrapInfo& info, bootstrapNodes ) {
77                o << info.spovnetName.toString() << "{";
78                int i=0;
79                BOOST_FOREACH( const BootstrapNode& node, info.nodes ) {
80                        if (i!=0) o << ",";
81                        if( node.desc != NULL ) o << node.desc->toString();
82                        i++;
83                }
84                o << "}";
85        }
86        return o.str();
87}
88
89void AribaModule::addBootstrapHints(string boot_info) {
90        using namespace boost::xpressive;
91        using namespace ariba::utility::string_format;
92        using namespace ariba::utility::Helper;
93        using namespace std;
94
95        smatch match;
96        if (regex_search(boot_info, match, robjects)) {
97                regex_nav nav = match;
98                for (int i = 0; i < nav.size(); i++) {
99                        string type = nav[i][robject_id].str();
100                        string data = nav[i][robject_data].str();
101                        data = data.substr(1, data.size() - 2);
102                        Name name(type);
103                        EndpointDescriptor* desc = EndpointDescriptor::fromString(data);
104                        logging_debug("Added bootstap info for " << type << ": " << desc->toString() );
105                        addBootstrapNode(name, desc);
106                }
107        }
108}
109
110void AribaModule::addBootstrapNode(const Name& spovnet,
111                communication::EndpointDescriptor* desc) {
112
113        // set bootstrap node
114        BootstrapNode node;
115        node.timestamp = 0;
116        node.desc = desc;
117        bool added = false;
118
119        // add node to existing bootstrap list
120        BOOST_FOREACH( BootstrapInfo& info, bootstrapNodes ){
121                if (info.spovnetName == spovnet) {
122                        info.nodes.push_back(node);
123                        added = true;
124                        break;
125                }
126        }
127
128        // create new entry
129        if (!added) {
130                BootstrapInfo info;
131                info.spovnetName = spovnet;
132                info.nodes.push_back(node);
133                bootstrapNodes.push_back(info);
134        }
135
136        logging_debug( "Added bootstrap info: " << getBootstrapHints() );
137}
138
139const communication::EndpointDescriptor* AribaModule::getBootstrapNode(
140                const Name& spovnet) const {
141        BOOST_FOREACH( const BootstrapInfo& info, bootstrapNodes ) {
142                if( info.spovnetName == spovnet ) {
143                        BOOST_FOREACH( const BootstrapNode& node, info.nodes ) {
144                                if( node.desc != NULL ) return node.desc;
145                        }
146                }
147        }
148        return NULL;
149}
150
151void AribaModule::registerSideportListener(SideportListener* sideport){
152        sideport_sniffer = sideport;
153}
154
155// @see Module.h
156void AribaModule::initialize() {
157
158        // preconditions
159        assert(!started);
160
161        // init variables
162        base_comm = NULL;
163}
164
165// @see Module.h
166void AribaModule::start() {
167
168        // preconditions
169        assert(base_comm == NULL);
170        assert(!started);
171
172        // create the base communication component
173        started = true;
174        base_comm = new BaseCommunication();
175        base_comm->setEndpoints(endpoints);
176}
177
178// @see Module.h
179void AribaModule::stop() {
180
181        // preconditions
182        assert(base_comm != NULL);
183        assert(started);
184
185        // delete base communication component
186        started = false;
187        delete base_comm;
188}
189
190// @see Module.h
191string AribaModule::getName() const {
192        return "ariba";
193}
194
195// @see Module.h
196void AribaModule::setProperty(string key, string value) {
197        if (key == "endpoints") endpoints = value;
198        else if (key == "bootstrap.hints") addBootstrapHints(value);
199}
200
201// @see Module.h
202const string AribaModule::getProperty(string key) const {
203        if (key == "endpoints") return endpoints; // TODO: return local endpoints
204        else if (key == "bootstrap.hints") return getBootstrapHints();
205}
206
207// @see Module.h
208const vector<string> AribaModule::getProperties() const {
209        vector<string> properties;
210        properties.push_back("endpoints");
211        properties.push_back("bootstrap.hints");
212        return properties;
213}
214
215const string AribaModule::getLocalEndpoints() {
216        return base_comm->getEndpointDescriptor().toString();
217}
218
219} // namespace ariba
Note: See TracBrowser for help on using the repository browser.