source: source/ariba/communication/BaseCommunication.h@ 5920

Last change on this file since 5920 was 5874, checked in by Christoph Mayer, 15 years ago

fehlerhaftes include entfernt

File size: 9.1 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#ifndef BASECOMMUNICATION_H_
40#define BASECOMMUNICATION_H_
41
42// boost & std includes
43#include <ext/hash_map>
44#include <ext/hash_set>
45#include <map>
46#include <set>
47#include <vector>
48#include <iostream>
49#include <algorithm>
50#include <boost/foreach.hpp>
51
52// utilities
53#include "ariba/utility/types.h"
54#include "ariba/utility/messages.h"
55#include "ariba/utility/logging/Logging.h"
56#include "ariba/utility/misc/Demultiplexer.hpp"
57#include "ariba/utility/system/SystemEventListener.h"
58
59// new transport and addressing
60#include "ariba/utility/addressing/addressing.hpp"
61#include "ariba/utility/transport/transport.hpp"
62
63// communication
64#include "ariba/communication/CommunicationEvents.h"
65#include "ariba/communication/EndpointDescriptor.h"
66#include "ariba/communication/messages/AribaBaseMsg.h"
67
68// network changes
69#include "ariba/communication/networkinfo/NetworkChangeInterface.h"
70#include "ariba/communication/networkinfo/NetworkChangeDetection.h"
71#include "ariba/communication/networkinfo/NetworkInformation.h"
72
73// disabled
74//#ifndef UNDERLAY_OMNET
75// #include "ariba/communication/modules/transport/tcp/TCPTransport.h"
76// #include "ariba/communication/modules/network/ip/IPv4NetworkProtocol.h"
77// using ariba::communication::IPv4NetworkProtocol;
78// using ariba::communication::TCPTransport;
79//#endif
80
81namespace ariba {
82 class SideportListener;
83}
84
85namespace ariba {
86namespace communication {
87
88using namespace std;
89using namespace ariba::addressing;
90using namespace ariba::transport;
91using namespace ariba::utility;
92
93// use base ariba types (clarifies multiple definitions)
94using ariba::utility::Message;
95using ariba::utility::seqnum_t;
96
97/**
98 * This class implements the Ariba Base Communication<br />
99 *
100 * Its primary task is to provide an abstraction to existing
101 * protocols and addressing schemes.
102 *
103 * @author Sebastian Mies, Christoph Mayer
104 */
105class BaseCommunication:
106 public NetworkChangeInterface,
107 public SystemEventListener,
108 public transport_listener {
109
110 use_logging_h(BaseCommunication);
111 friend class ariba::SideportListener;
112
113public:
114 /// Default ctor that just creates an non-functional base communication
115 BaseCommunication();
116
117 /// Default dtor that does nothing
118 virtual ~BaseCommunication();
119
120 /// Startup the base communication, start modules etc.
121 void start();
122
123 /// Stops the base communication, stop modules etc.
124 void stop();
125
126 /// Sets the endpoints
127 void setEndpoints( string& endpoints );
128
129 /// Check whether the base communication has been started up
130 bool isStarted();
131
132 /// Establishes a link to another end-point.
133 const LinkID establishLink(const EndpointDescriptor& descriptor,
134 const LinkID& linkid = LinkID::UNSPECIFIED, const QoSParameterSet& qos =
135 QoSParameterSet::DEFAULT, const SecurityParameterSet& sec =
136 SecurityParameterSet::DEFAULT);
137
138 /// Drops a link
139 void dropLink(const LinkID link);
140
141 /**
142 * Sends a message though an existing link to an end-point.
143 *
144 * @param lid The link identifier
145 * @param message The message to be sent
146 * @return A sequence number for this message
147 */
148 seqnum_t sendMessage(const LinkID lid, const Message* message);
149
150 /**
151 * Returns the end-point descriptor
152 *
153 * @param link the link id of the requested end-point
154 * @return The end-point descriptor of the link's end-point
155 */
156 const EndpointDescriptor& getEndpointDescriptor(const LinkID link =
157 LinkID::UNSPECIFIED) const;
158
159 /**
160 * Get local links to the given endpoint of all local link
161 * using the default parameter EndpointDescriptor::UNSPECIFIED
162 * @param ep The remote endpoint to get all links to.
163 * @return List of LinkID
164 */
165 LinkIDs getLocalLinks(const address_v* addr) const;
166
167 /**
168 * Registers a receiver.
169 *
170 * @param _receiver The receiving side
171 */
172 void registerMessageReceiver(MessageReceiver* receiver) {
173 messageReceiver = receiver;
174 }
175
176 /**
177 * Unregister a receiver.
178 *
179 * @param _receiver The receiving side
180 */
181 void unregisterMessageReceiver(MessageReceiver* receiver) {
182 messageReceiver = NULL;
183 }
184
185 void registerEventListener(CommunicationEvents* _events);
186
187 void unregisterEventListener(CommunicationEvents* _events);
188
189 /// called when a system event is emitted by system queue
190 virtual void handleSystemEvent(const SystemEvent& event);
191
192 /// called when a message is received form transport_peer
193 virtual void receive_message(transport_protocol* transport,
194 const address_vf local, const address_vf remote, const uint8_t* data,
195 size_t size);
196
197protected:
198
199 /// handle received message from a transport module
200 void receiveMessage(const Message* message,
201 const address_v* local, const address_v* remote );
202
203 /// called when a network interface change happens
204 virtual void onNetworkChange(
205 const NetworkChangeInterface::NetworkChangeInfo& info);
206
207private:
208 /**
209 * A link descriptor consisting of the end-point descriptor and currently
210 * used underlay address.
211 */
212 class LinkDescriptor {
213 public:
214
215 /// default constructor
216 LinkDescriptor() :
217 localLink(LinkID::UNSPECIFIED), localLocator(NULL),
218 remoteLink(LinkID::UNSPECIFIED), remoteLocator(NULL),
219 up(false) {
220 }
221
222 ~LinkDescriptor() {
223 if (localLocator!=NULL) delete localLocator;
224 if (remoteLocator!=NULL) delete remoteLocator;
225 }
226
227 bool isUnspecified() const {
228 return (this == &UNSPECIFIED());
229 }
230
231 static LinkDescriptor& UNSPECIFIED(){
232 static LinkDescriptor* unspec = NULL;
233 if(unspec == NULL) unspec = new LinkDescriptor();
234 return *unspec;
235 }
236
237 bool unspecified;
238
239 /// link identifiers
240 LinkID localLink;
241 LinkID remoteLink;
242
243 /// used underlay addresses for the link
244 const address_v* localLocator;
245 const address_v* remoteLocator;
246
247 /// the remote end-point descriptor
248 EndpointDescriptor remoteEndpoint;
249
250 /// flag, whether this link is up
251 bool up;
252 };
253
254 /// Link management: list of links
255 typedef vector<LinkDescriptor*> LinkSet;
256
257 /// Link management: the set of currently managed links
258 LinkSet linkSet;
259
260 /// Link management: add a link
261 void addLink( LinkDescriptor* link );
262
263 /// Link management: remove a link
264 void removeLink(const LinkID& localLink);
265
266 /// Link management: get link information using the local link
267 LinkDescriptor& queryLocalLink(const LinkID& localLink) const;
268
269 /// Link management: get link information using the remote link
270 LinkDescriptor& queryRemoteLink(const LinkID& remoteLink) const;
271
272 /// The local end-point descriptor
273 EndpointDescriptor localDescriptor;
274
275#ifndef UNDERLAY_OMNET
276 /// network change detector
277 NetworkChangeDetection networkMonitor;
278#endif
279 /// list of all remote addresses of links to end-points
280 class endpoint_reference {
281 public:
282 int count; ///< the number of open links to this end-point
283 const address_v* endpoint; ///< the end-point itself
284 };
285 vector<endpoint_reference> remote_endpoints;
286
287 /// adds an end-point to the list
288 void add_endpoint( const address_v* endpoint );
289
290 /// removes an end-point from the list
291 void remove_endpoint( const address_v* endpoint );
292
293 /// event listener
294 typedef set<CommunicationEvents*> EventListenerSet;
295 EventListenerSet eventListener;
296
297 /// sequence numbers
298 seqnum_t currentSeqnum;
299
300 /// transport peer
301 transport_peer* transport;
302
303 /// the base overlay message receiver
304 MessageReceiver* messageReceiver;
305
306 /// convenience: send message to peer
307 void send( Message* message, const EndpointDescriptor& endpoint );
308 void send( Message* message, const LinkDescriptor& descriptor );
309
310
311
312 /// state of the base communication
313 bool started;
314
315};
316
317}} // namespace ariba, communication
318
319#endif /* BASECOMMUNICATION_H_ */
Note: See TracBrowser for help on using the repository browser.