source: source/ariba/Node.h@ 3374

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

-Integration of Branch 20090424-mayer-sideport

File size: 10.6 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 INSTITUTE OF TELEMATICS 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 NODE_H_
40#define NODE_H_
41
42// forward declarations
43namespace ariba {
44 class Node;
45 namespace overlay {
46 class BaseOverlay;
47 }
48}
49
50#include <vector>
51#include "Module.h"
52#include "Identifiers.h"
53#include "SpoVNetProperties.h"
54#include "NodeListener.h"
55#include "Name.h"
56#include "AribaModule.h"
57#include "CommunicationListener.h"
58#include "DataMessage.h"
59#include "SideportListener.h"
60
61using std::vector;
62using ariba::overlay::BaseOverlay;
63
64namespace ariba {
65
66/**
67 * This class should implement all ariba node functionality.
68 *
69 * @author Sebastian Mies <mies@tm.uka.de>
70 * @author Christoph Mayer <mayer@tm.uka.de>
71 */
72class Node: public Module {
73public:
74 /**
75 * Constructs a new node using a given ariba module
76 *
77 * @param ariba_mod The ariba module
78 * @param name The canonical node name of the new node. When NULL a
79 * randomly chosen name is created.
80 * @param len The length of the canonical node name or -1, if the name
81 * is a zero-terminated char-string.
82 */
83 Node(AribaModule& ariba_mod, const Name& node_name = Name::UNSPECIFIED);
84
85 /**
86 * Destroys the node. Before destruction some pre-conditions
87 * must be met:<br />
88 *
89 * 1. The node is not part of any SpoVNet <br />
90 * 2. All listeners must be unbound from this node <br />
91 * 3. The module has been stopped<br />
92 */
93 ~Node();
94
95 //--- node control ---
96
97 /**
98 * This method instructs the node to join a particular spovnet.
99 * Callees may bind with a NodeListener to receive events, when
100 * a node has been successfully joined.
101 *
102 * @param vnetId The SpoVNet name
103 */
104 void join(const Name& name);
105
106 /**
107 * This method initiates a new SpoVNet with the given SpoVNetID and
108 * parameters.
109 *
110 * @param name The SpoVNet name
111 * @param param The SpoVNet properties
112 */
113 void initiate(const Name& name, const SpoVNetProperties& parm =
114 SpoVNetProperties::DEFAULT);
115
116 /**
117 * This method initiates the leave procedure of this node.
118 */
119 void leave();
120
121 /**
122 * This method is used to bind a node listener to this node.
123 *
124 * @param listener The node listener
125 * @return boolean indicating success of failure
126 */
127 bool bind(NodeListener* listener);
128
129 /**
130 * This method is used to unbind a node listener to this node.
131 *
132 * @param listener The node listener
133 * @return boolean indicating success of failure
134 */
135 bool unbind(NodeListener* listener);
136
137 //--- spovnet properties ---
138
139 /**
140 * Returns the properties of the spovnet the node has joined.
141 *
142 * @return The properties of the spovnet the node has joined
143 */
144 const SpoVNetProperties& getSpoVNetProperties() const;
145
146 /**
147 * Returns the spovnet identifier
148 *
149 * @return The spovnet idenfifier
150 */
151 const SpoVNetID& getSpoVNetId() const;
152
153 /**
154 * Returns true, if the node is part of a spovnet.
155 *
156 * @return True, if the node is part of a spovnet
157 */
158 bool isJoined() const;
159
160 //--- addressing ---
161
162 /**
163 * Returns the node id of this node if the link id is unspecified or
164 * the node id of the remote node.
165 *
166 * @return The local or the remote node identifier
167 */
168 const NodeID& getNodeId(const LinkID& lid = LinkID::UNSPECIFIED) const;
169
170 /**
171 * Returns the node id to a node name according to the currently joined
172 * spovnet (usually derives a node identifier by hashing the name).
173 *
174 * @return The node identifier to the given name
175 */
176 NodeID generateNodeId(const Name& name) const;
177
178 /**
179 * Returns the name of this node if the link id is unspecified or
180 * the node name of the remote node, if known -- otherwise it returns
181 * an unspecified name.
182 *
183 * TODO: RFE -- send request to remote node and inform service.
184 *
185 * @return A node's name or an unspecified name, if unknown
186 */
187 const Name getNodeName(const LinkID& lid = LinkID::UNSPECIFIED) const;
188
189 /**
190 * Get a list of neighboring nodes in the overlay structure.
191 * The number and identities of nodes depends highly on the
192 * used overlay structure.
193 *
194 * @return a list of NodeIDs that are neighbors in the overlay structure
195 * @see sendBroadcastMessage
196 */
197 vector<NodeID> getNeighborNodes() const;
198
199 //--- communication ---
200
201 /**
202 * Establishes a new link to another node and service with the given
203 * link properties. An optional message could be sent with the request.
204 *
205 * @param nid The remote node identifier
206 * @param sid The remote service identifier
207 * @param req The required link properties
208 * @param msg An optional message that is sent with the request
209 * @return A new link id
210 */
211 LinkID establishLink(const NodeID& nid, const ServiceID& sid,
212 const LinkProperties& req = LinkProperties::DEFAULT,
213 const DataMessage& msg = DataMessage::UNSPECIFIED);
214
215 /**
216 * This method drops an established link.
217 *
218 * @param lnk The link identifier of an active link
219 */
220 void dropLink(const LinkID& lnk);
221
222 // message sending
223
224 /**
225 * Sends a one-shot message to a service. If link properties are specified,
226 * the node tries to fulfill those requirements. This may cause the node
227 * to first establish a temporary link, second sending the message and last
228 * dropping the link. This would result in a small amount of extra latency
229 * until the message is delivered. If reliable transport was selected,
230 * the method returns a sequence number and a communication event is
231 * triggered on message delivery or loss.
232 *
233 * @param msg The message to be sent
234 * @param nid The remote node identifier
235 * @param sid The remote service identifier
236 * @param req The requirements associated with the message
237 * @return A sequence number
238 */
239 seqnum_t sendMessage(const DataMessage& msg, const NodeID& nid, const ServiceID& sid,
240 const LinkProperties& req = LinkProperties::DEFAULT);
241
242 /**
243 * Sends a message via an established link. If reliable transport was
244 * selected, the method returns a sequence number and a communication event
245 * is triggered on message delivery or loss.
246 *
247 * @param msg The message to be sent
248 * @param lnk The link to be used for sending the message
249 */
250 seqnum_t sendMessage(const DataMessage& msg, const LinkID& lnk);
251
252 /**
253 * Sends a message to all known hosts in the overlay structure
254 * the nodes that are reached here depend on the overlay structure.
255 *
256 * @param msg The message to be send
257 * @param sid The id of the service that should receive the message
258 * @see getNeighborNodes
259 */
260 void sendBroadcastMessage(const DataMessage& msg, const ServiceID& sid);
261
262 // --- communication listeners ---
263
264 /**
265 * Binds a listener to a specifed service identifier.
266 * Whenever a link is established/dropped or messages are received the
267 * events inside the interface are called.
268 *
269 * @param listener The listener to be registered
270 * @param sid The service identifier
271 * @return boolean indicating success of failure
272 */
273 bool bind(CommunicationListener* listener, const ServiceID& sid);
274
275 /**
276 * Un-binds a listener from this node.
277 *
278 * @param The listener to be unbound
279 * @return boolean indicating success of failure
280 */
281 bool unbind(CommunicationListener* listener, const ServiceID& sid);
282
283 // --- extension proposal: service directory --
284 // main-idea: use this methods to register groups/rendevous points inside
285 // the base overlay via a distributed storage service.
286 //
287 //void put(const KeyID& key, Message* value);
288 //void get(const KeyID& key);
289 //-------------------------------------------------------------------------
290 //
291 // --- optimization proposal: allow direct endpoint descriptor exchange ---
292 // main-idea: directly allow exchanging endpoint descriptors to establish
293 // links. Depending on the overlay structure used in the base overlay, this
294 // allows a node to directly establish links between two nodes when an
295 // endpoint descriptor is known.
296 //
297 //const EndpointDescriptor& getEndpointDescriptor( const LinkID& lid );
298 //void sendMessage( EndpointDescriptor& epd, Message* msg );
299 //LinkID setupLink( const EndpointDescriptor& endpointDesc,
300 // const LinkProperties& req = LinkProperties::UNSPECIFIED,
301 // const Message* msg = NULL );
302 //
303 //-------------------------------------------------------------------------
304
305 // --- module implementation ---
306 //
307 // main-idea: use module properties to configure nodeid, spovnetid etc. and
308 // select start/stop procedures. This allows simulations to start a
309 // node without manually calling join etc.
310
311 /** @see Module.h */
312 void initialize();
313
314 /** @see Module.h */
315 void start();
316
317 /** @see Module.h */
318 void stop();
319
320 /** @see Module.h */
321 string getName() const;
322
323 /** @see Module.h */
324 void setProperty(string key, string value);
325
326 /** @see Module.h */
327 const string getProperty(string key) const;
328
329 /** @see Module.h */
330 const vector<string> getProperties() const;
331
332protected:
333 // friends
334 friend class AribaModule;
335
336 // member variables
337 Name name; //< node name
338 AribaModule& ariba_mod; //< ariba module
339 SpoVNetID spovnetId; //< current spovnet id
340 NodeID nodeId; //< current node id
341 overlay::BaseOverlay* base_overlay; //< the base overlay
342};
343
344} // namespace ariba
345
346#endif /* NODE_H_ */
Note: See TracBrowser for help on using the repository browser.