An Overlay-based
Virtual Network Substrate
SpoVNet

source: source/ariba/communication/BaseCommunication.cpp @ 5638

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

adress detection aufgeräumt, network info für bleutooth, data stream (hopeful crash fix), logging auf maemo nur warn, ...

File size: 21.5 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 "BaseCommunication.h"
40#include "networkinfo/AddressDiscovery.h"
41
42#ifdef UNDERLAY_OMNET
43  #include "ariba/communication/modules/transport/omnet/AribaOmnetModule.h"
44  #include "ariba/communication/modules/network/omnet/OmnetNetworkProtocol.h"
45  #include "ariba/utility/system/StartupWrapper.h"
46
47  using ariba::communication::AribaOmnetModule;
48  using ariba::communication::OmnetNetworkProtocol;
49  using ariba::utility::StartupWrapper;
50#endif
51
52namespace ariba {
53namespace communication {
54
55use_logging_cpp(BaseCommunication);
56
57/// adds an endpoint to the list
58void BaseCommunication::add_endpoint( const address_v* endpoint ) {
59        if (endpoint==NULL) return;
60        BOOST_FOREACH( endpoint_reference& ref, remote_endpoints ) {
61                if (ref.endpoint->type_id() == endpoint->type_id() && *ref.endpoint == *endpoint) {
62                        ref.count++;
63                        return;
64                }
65        }
66        endpoint_reference ref;
67        ref.endpoint = endpoint->clone();
68        ref.count = 1;
69        remote_endpoints.push_back(ref);
70}
71
72/// removes an endpoint from the list
73void BaseCommunication::remove_endpoint( const address_v* endpoint ) {
74        if (endpoint==NULL) return;
75        for (vector<endpoint_reference>::iterator i = remote_endpoints.begin();
76                i != remote_endpoints.end(); i++) {
77                if (*i->endpoint == *endpoint) {
78                        i->count--;
79                        if (i->count==0) {
80                                logging_info("No more links to " << i->endpoint->to_string() << ": terminating transports!");
81                                transport->terminate(i->endpoint);
82                                delete i->endpoint;
83                                remote_endpoints.erase(i);
84                        }
85                        return;
86                }
87        }
88}
89
90BaseCommunication::BaseCommunication() {
91        this->transport = NULL;
92        this->started = false;
93}
94
95BaseCommunication::~BaseCommunication(){
96}
97
98void BaseCommunication::start() {
99        logging_info( "Starting up ..." );
100        currentSeqnum = 0;
101
102        // creating transports
103        logging_info( "Creating transports ..." );
104
105#ifdef UNDERLAY_OMNET
106        AribaOmnetModule* module = StartupWrapper::getCurrentModule();
107        module->setServerPort( listenport );
108
109        transport = module;
110        network = new OmnetNetworkProtocol( module );
111#else
112        transport = new transport_peer( localDescriptor.getEndpoints() );
113#endif
114
115        logging_info( "Searching for local locators ..." );
116        AddressDiscovery::discover_endpoints( localDescriptor.getEndpoints() );
117        logging_info( "Done. Local endpoints = " << localDescriptor.toString() );
118
119        transport->register_listener( this );
120        transport->start();
121
122#ifndef UNDERLAY_OMNET
123        // bind to the network change detection
124        networkMonitor.registerNotification( this );
125#endif
126
127        // base comm startup done
128        started = true;
129        logging_info( "Started up." );
130}
131
132void BaseCommunication::stop() {
133        logging_info( "Stopping transports ..." );
134
135        transport->stop();
136        delete transport;
137        started = false;
138
139        logging_info( "Stopped." );
140}
141
142bool BaseCommunication::isStarted(){
143        return started;
144}
145
146/// Sets the endpoints
147void BaseCommunication::setEndpoints( string& _endpoints ) {
148        localDescriptor.getEndpoints().assign(_endpoints);
149        logging_info("Setting local end-points: "
150                << localDescriptor.getEndpoints().to_string());
151}
152
153const LinkID BaseCommunication::establishLink(
154        const EndpointDescriptor& descriptor,
155        const LinkID& link_id,
156        const QoSParameterSet& qos,
157        const SecurityParameterSet& sec) {
158
159        // copy link id
160        LinkID linkid = link_id;
161
162        // debug
163        logging_debug( "Request to establish link" );
164
165        // create link identifier
166        if (linkid.isUnspecified())     linkid = LinkID::create();
167
168        // create link descriptor
169        logging_debug( "Creating new descriptor entry with local link id=" << linkid.toString() );
170        LinkDescriptor* ld = new LinkDescriptor();
171        ld->localLink = linkid;
172        addLink( ld );
173
174        // send a message to request new link to remote
175        logging_debug( "Send messages with request to open link to " << descriptor.toString() );
176        AribaBaseMsg baseMsg( AribaBaseMsg::typeLinkRequest, linkid );
177        baseMsg.getLocalDescriptor() = localDescriptor;
178
179        // serialize and send message
180        send( &baseMsg, descriptor );
181
182        return linkid;
183}
184
185void BaseCommunication::dropLink(const LinkID link) {
186
187        logging_debug( "Starting to drop link " + link.toString() );
188
189        // see if we have the link
190        LinkDescriptor& ld = queryLocalLink( link );
191        if( ld.isUnspecified() ) {
192                logging_error( "Don't know the link you want to drop "+ link.toString() );
193                return;
194        }
195
196        // tell the registered listeners
197        BOOST_FOREACH( CommunicationEvents* i, eventListener ) {
198                i->onLinkDown( link, ld.localLocator, ld.remoteLocator );
199        }
200
201        // create message to drop the link
202        logging_debug( "Sending out link close request. for us, the link is closed now" );
203        AribaBaseMsg msg( AribaBaseMsg::typeLinkClose, ld.localLink, ld.remoteLink );
204
205        // send message to drop the link
206        send( &msg, ld );
207
208        // remove from map
209        removeLink(link);
210}
211
212seqnum_t BaseCommunication::sendMessage( const LinkID lid, const Message* message) {
213
214        logging_debug( "Sending out message to link " << lid.toString() );
215
216        // query local link info
217        LinkDescriptor& ld = queryLocalLink(lid);
218        if( ld.isUnspecified() ){
219                logging_error( "Don't know the link with id " << lid.toString() );
220                return -1;
221        }
222
223        // link not up-> error
224        if( !ld.up ) {
225                logging_error("Can not send on link " << lid.toString() << ": link not up");
226                return -1;
227        }
228
229        // create message
230        AribaBaseMsg msg( AribaBaseMsg::typeData, ld.localLink, ld.remoteLink );
231
232        // encapsulate the payload message
233        msg.encapsulate( const_cast<Message*>(message) );
234
235        // send message
236        send( &msg, ld );
237
238        // return sequence number
239        return ++currentSeqnum;
240}
241
242const EndpointDescriptor& BaseCommunication::getEndpointDescriptor(const LinkID link) const {
243        if( link == LinkID::UNSPECIFIED){
244                return localDescriptor;
245        } else {
246                LinkDescriptor& linkDesc = queryLocalLink(link);
247                if (linkDesc.isUnspecified()) return EndpointDescriptor::UNSPECIFIED();
248                return linkDesc.remoteEndpoint;
249        }
250}
251
252void BaseCommunication::registerEventListener(CommunicationEvents* _events){
253        if( eventListener.find( _events ) == eventListener.end() )
254                eventListener.insert( _events );
255}
256
257void BaseCommunication::unregisterEventListener(CommunicationEvents* _events){
258        EventListenerSet::iterator i = eventListener.find( _events );
259        if( i != eventListener.end() )
260                eventListener.erase( i );
261}
262
263SystemEventType TransportEvent("Transport");
264SystemEventType MessageDispatchEvent("MessageDispatchEvent", TransportEvent );
265
266class DispatchMsg {
267public:
268        address_v* local;
269        address_v* remote;
270        Message* message;
271};
272
273/// called when a system event is emitted by system queue
274void BaseCommunication::handleSystemEvent(const SystemEvent& event) {
275
276        // dispatch received messages
277        if ( event.getType() == MessageDispatchEvent ){
278                logging_debug( "Forwarding message receiver" );
279                DispatchMsg* dmsg = event.getData<DispatchMsg>();
280                Message* msg = dmsg->message;
281                receiveMessage(msg, dmsg->local, dmsg->remote);
282                msg->dropPayload();
283                delete dmsg;
284                delete msg;
285        }
286}
287
288/// called when a message is received from transport_peer
289void BaseCommunication::receive_message(transport_protocol* transport,
290        const address_vf local, const address_vf remote, const uint8_t* data,
291        size_t size) {
292
293//      logging_debug( "Dispatching message" );
294
295        // convert data
296        Data data_( const_cast<uint8_t*>(data), size * 8 );
297        DispatchMsg* dmsg = new DispatchMsg();
298
299        Message* msg = new Message(data_);
300        dmsg->local = local->clone();
301        dmsg->remote = remote->clone();
302        dmsg->message = msg;
303
304        SystemQueue::instance().scheduleEvent(
305                SystemEvent( this, MessageDispatchEvent, dmsg )
306        );
307}
308
309/// handles a message from the underlay transport
310void BaseCommunication::receiveMessage(const Message* message,
311        const address_v* local, const address_v* remote ){
312
313        /// decapsulate message
314        AribaBaseMsg* msg = ((Message*)message)->decapsulate<AribaBaseMsg>();
315        logging_debug( "Receiving message of type " << msg->getTypeString() );
316
317        // handle message
318        switch (msg->getType()) {
319
320                // ---------------------------------------------------------------------
321                // data message
322                // ---------------------------------------------------------------------
323                case AribaBaseMsg::typeData: {
324                        logging_debug( "Received data message, forwarding to overlay" );
325                        if( messageReceiver != NULL ) {
326                                messageReceiver->receiveMessage(
327                                        msg, msg->getRemoteLink(), NodeID::UNSPECIFIED
328                                );
329                        }
330                        break;
331                }
332
333                // ---------------------------------------------------------------------
334                // handle link request from remote
335                // ---------------------------------------------------------------------
336                case AribaBaseMsg::typeLinkRequest: {
337                        logging_debug( "Received link open request" );
338
339                        /// only answer the first request
340                        if (!queryRemoteLink(msg->getLocalLink()).isUnspecified()) {
341                                logging_debug("Link request already received. Ignore!");
342                                break;
343                        }
344
345                        /// create link ids
346                        LinkID localLink  = LinkID::create();
347                        LinkID remoteLink = msg->getLocalLink();
348                        logging_debug( "local=" << local->to_string()
349                                << " remote=" << remote->to_string()
350                        );
351
352                        // check if link creation is allowed by ALL listeners
353                        bool allowlink = true;
354                        BOOST_FOREACH( CommunicationEvents* i, eventListener ){
355                                allowlink &= i->onLinkRequest( localLink, local, remote );
356                        }
357
358                        // not allowed-> warn
359                        if( !allowlink ){
360                                logging_warn( "Overlay denied creation of link" );
361                                return;
362                        }
363
364                        // create descriptor
365                        LinkDescriptor* ld = new LinkDescriptor();
366                        ld->localLink = localLink;
367                        ld->remoteLink = remoteLink;
368                        ld->localLocator = local->clone();
369                        ld->remoteLocator = remote->clone();
370                        ld->remoteEndpoint = msg->getLocalDescriptor();
371                        add_endpoint(ld->remoteLocator);
372
373                        // add layer 1-3 addresses
374                        ld->remoteEndpoint.getEndpoints().add(
375                                ld->remoteLocator, endpoint_set::Layer1_3);
376                        localDescriptor.getEndpoints().add(
377                                local, endpoint_set::Layer1_3
378                        );
379
380                        // link is now up-> add it
381                        ld->up = true;
382                        addLink(ld);
383
384                        // link is up!
385                        logging_debug( "Link (initiated from remote) is up with "
386                                << "local(id=" << ld->localLink.toString() << ","
387                                << "locator=" << ld->localLocator->to_string() << ") "
388                                << "remote(id=" << ld->remoteLink.toString() << ", "
389                                << "locator=" << ld->remoteLocator->to_string() << ")"
390                        );
391
392                        // sending link request reply
393                        logging_debug( "Sending link request reply with ids "
394                                << "local=" << localLink.toString() << ", "
395                                << "remote=" << remoteLink.toString() );
396                        AribaBaseMsg reply( AribaBaseMsg::typeLinkReply, localLink, remoteLink );
397                        reply.getLocalDescriptor() = localDescriptor;
398                        reply.getRemoteDescriptor() = ld->remoteEndpoint;
399
400                        send( &reply, *ld );
401
402                        // inform listeners about new open link
403                        BOOST_FOREACH( CommunicationEvents* i, eventListener ) {
404                                i->onLinkUp( localLink, ld->localLocator, ld->remoteLocator);
405                        }
406
407                        // done
408                        break;
409                }
410
411                // ---------------------------------------------------------------------
412                // handle link request reply
413                // ---------------------------------------------------------------------
414                case AribaBaseMsg::typeLinkReply: {
415                        logging_debug( "Received link open reply for a link we initiated" );
416
417                        // this is a reply to a link open request, so we have already
418                        // a link mapping and can now set the remote link to valid
419                        LinkDescriptor& ld = queryLocalLink( msg->getRemoteLink() );
420
421                        // no link found-> warn!
422                        if (ld.isUnspecified()) {
423                                logging_warn("Failed to find local link " << msg->getRemoteLink().toString());
424                                return;
425                        }
426
427                        // set remote locator and link id
428                        ld.remoteLink = msg->getLocalLink();
429                        ld.remoteLocator = remote->clone();
430                        localDescriptor.getEndpoints().add(
431                                msg->getRemoteDescriptor().getEndpoints(),
432                                endpoint_set::Layer1_3
433                        );
434                        ld.up = true;
435                        add_endpoint(ld.remoteLocator);
436
437                        logging_debug( "Link is now up with local id "
438                                << ld.localLink.toString() << " and remote id "
439                                << ld.remoteLink.toString() );
440
441
442                        // inform lisneters about link up event
443                        BOOST_FOREACH( CommunicationEvents* i, eventListener ){
444                                i->onLinkUp( ld.localLink, ld.localLocator, ld.remoteLocator );
445                        }
446
447                        // done
448                        break;
449                }
450
451                // ---------------------------------------------------------------------
452                // handle link close requests
453                // ---------------------------------------------------------------------
454                case AribaBaseMsg::typeLinkClose: {
455                        // get remote link
456                        const LinkID& localLink = msg->getRemoteLink();
457                        logging_debug( "Received link close request for link " << localLink.toString() );
458
459                        // searching for link, not found-> warn
460                        LinkDescriptor& linkDesc = queryLocalLink( localLink );
461                        if (linkDesc.isUnspecified()) {
462                                logging_warn("Failed to find local link " << localLink.toString());
463                                return;
464                        }
465
466                        // inform listeners
467                        BOOST_FOREACH( CommunicationEvents* i, eventListener ){
468                                i->onLinkDown( linkDesc.localLink,
469                                                linkDesc.localLocator, linkDesc.remoteLocator );
470                        }
471
472                        // remove the link descriptor
473                        removeLink( localLink );
474
475                        // done
476                        break;
477                }
478
479                // ---------------------------------------------------------------------
480                // handle link locator changes
481                // ---------------------------------------------------------------------
482                case AribaBaseMsg::typeLinkUpdate: {
483                        const LinkID& localLink = msg->getRemoteLink();
484                        logging_debug( "Received link update for link "
485                                << localLink.toString() );
486
487                        // find the link description
488                        LinkDescriptor& linkDesc = queryLocalLink( localLink );
489                        if (linkDesc.isUnspecified()) {
490                                logging_warn("Failed to update local link "
491                                        << localLink.toString());
492                                return;
493                        }
494
495                        // update the remote locator
496                        const address_v* oldremote = linkDesc.remoteLocator;
497                        linkDesc.remoteLocator = remote->clone();
498
499                        // inform the listeners (local link has _not_ changed!)
500                        BOOST_FOREACH( CommunicationEvents* i, eventListener ){
501                                i->onLinkChanged(
502                                        linkDesc.localLink,     // linkid
503                                        linkDesc.localLocator,  // old local
504                                        linkDesc.localLocator,  // new local
505                                        oldremote,              // old remote
506                                        linkDesc.remoteLocator  // new remote
507                                );
508                        }
509
510                        // done
511                        break;
512                }
513        }
514}
515
516/// add a newly allocated link to the set of links
517void BaseCommunication::addLink( LinkDescriptor* link ) {
518        linkSet.push_back( link );
519}
520
521/// remove a link from set
522void BaseCommunication::removeLink( const LinkID& localLink ) {
523        for(LinkSet::iterator i=linkSet.begin(); i != linkSet.end(); i++){
524                if( (*i)->localLink != localLink) continue;
525                remove_endpoint((*i)->remoteLocator);
526                delete *i;
527                linkSet.erase( i );
528                break;
529        }
530}
531
532/// query a descriptor by local link id
533BaseCommunication::LinkDescriptor& BaseCommunication::queryLocalLink( const LinkID& link ) const {
534        for (int i=0; i<linkSet.size();i++)
535                if (linkSet[i]->localLink == link) return (LinkDescriptor&)*linkSet[i];
536
537        return LinkDescriptor::UNSPECIFIED();
538}
539
540/// query a descriptor by remote link id
541BaseCommunication::LinkDescriptor& BaseCommunication::queryRemoteLink( const LinkID& link ) const {
542        for (int i=0; i<linkSet.size();i++)
543                if (linkSet[i]->remoteLink == link) return (LinkDescriptor&)*linkSet[i];
544
545        return LinkDescriptor::UNSPECIFIED();
546}
547
548LinkIDs BaseCommunication::getLocalLinks( const address_v* addr ) const {
549        LinkIDs ids;
550        for (int i=0; i<linkSet.size(); i++){
551                if( addr == NULL ){
552                        ids.push_back( linkSet[i]->localLink );
553                } else {
554                        if ( *linkSet[i]->remoteLocator == *addr )
555                                ids.push_back( linkSet[i]->localLink );
556                }
557        }
558        return ids;
559}
560
561void BaseCommunication::onNetworkChange(const NetworkChangeInterface::NetworkChangeInfo& info){
562
563#ifdef UNDERLAY_OMNET
564
565        // we have no mobility support for simulations
566        return
567
568#endif // UNDERLAY_OMNET
569
570/*- disabled!
571
572        // we only care about address changes, not about interface changes
573        // as address changes are triggered by interface changes, we are safe here
574        if( info.type != NetworkChangeInterface::EventTypeAddressNew &&
575                info.type != NetworkChangeInterface::EventTypeAddressDelete ) return;
576
577        logging_info( "base communication is handling network address changes" );
578
579        // get all now available addresses
580        NetworkInformation networkInformation;
581        AddressInformation addressInformation;
582
583        NetworkInterfaceList interfaces = networkInformation.getInterfaces();
584        AddressList addresses;
585
586        for( NetworkInterfaceList::iterator i = interfaces.begin(); i != interfaces.end(); i++ ){
587                AddressList newaddr = addressInformation.getAddresses(*i);
588                addresses.insert( addresses.end(), newaddr.begin(), newaddr.end() );
589        }
590
591        //
592        // get current locators for the local endpoint
593        // TODO: this code is dublicate of the ctor code!!! cleanup!
594        //
595
596        NetworkProtocol::NetworkLocatorSet locators = network->getAddresses();
597        NetworkProtocol::NetworkLocatorSet::iterator i = locators.begin();
598        NetworkProtocol::NetworkLocatorSet::iterator iend = locators.end();
599
600        //
601        // remember the old local endpoint, in case it changes
602        //
603
604        EndpointDescriptor oldLocalDescriptor( localDescriptor );
605
606        //
607        // look for local locators that we can use in communication
608        //
609        // choose the first locator that is not localhost
610        //
611
612        bool foundLocator = false;
613        bool changedLocator = false;
614
615        for( ; i != iend; i++){
616                logging_debug( "local locator found " << (*i)->toString() );
617                IPv4Locator* ipv4locator = dynamic_cast<IPv4Locator*>(*i);
618
619                if( *ipv4locator != IPv4Locator::LOCALHOST &&
620                    *ipv4locator != IPv4Locator::ANY       &&
621                    *ipv4locator != IPv4Locator::BROADCAST  ){
622
623                        ipv4locator->setPort( listenport );
624                        changedLocator = *localDescriptor.locator != *ipv4locator;
625                        localDescriptor.locator = ipv4locator;
626                        logging_info( "binding to addr = " << ipv4locator->toString() );
627                        foundLocator = true;
628                        break;
629                }
630        } // for( ; i != iend; i++)
631
632        //
633        // if we found no locator, bind to localhost
634        //
635
636        if( !foundLocator ){
637                changedLocator = *localDescriptor.locator != IPv4Locator::LOCALHOST;
638                localDescriptor.locator = new IPv4Locator( IPv4Locator::LOCALHOST );
639                ((IPv4Locator*)(localDescriptor.locator))->setPort( listenport );
640                logging_info( "found no good local lcoator, binding to addr = " <<
641                                                localDescriptor.locator->toString() );
642        }
643
644        //
645        // if we have connections that have no more longer endpoints
646        // close these. they will be automatically built up again.
647        // also update the local locator in the linkset mapping
648        //
649
650        if( changedLocator ){
651
652                logging_debug( "local endp locator has changed to " << localDescriptor.toString() <<
653                                ", resettings connections that end at old locator " <<
654                                        oldLocalDescriptor.toString());
655
656                LinkSet::iterator i = linkSet.begin();
657                LinkSet::iterator iend = linkSet.end();
658
659                for( ; i != iend; i++ ){
660
661                        logging_debug( "checking connection for locator change: " <<
662                                        " local " << (*i).localLocator->toString() <<
663                                        " old " << oldLocalDescriptor.locator->toString() );
664
665                        if( *((*i).localLocator) == *(oldLocalDescriptor.locator) ){
666
667                                logging_debug("terminating connection to " << (*i).remoteLocator->toString() );
668                                transport->terminate( oldLocalDescriptor.locator, (*i).remoteLocator );
669
670                                (*i).localLocator = localDescriptor.locator;
671                        }
672                } // for( ; i != iend; i++ )
673
674                // wait 500ms to give the sockets time to shut down
675                usleep( 500000 );
676
677        } else {
678
679                logging_debug( "locator has not changed, not resetting connections" );
680
681        }
682
683        //
684        // handle the connections that have no longer any
685        // valid locator. send update messages with the new
686        // locator,  so the remote node updates its locator/link mapping
687        //
688
689        LinkSet::iterator iAffected = linkSet.begin();
690        LinkSet::iterator endAffected = linkSet.end();
691
692        for( ; iAffected != endAffected; iAffected++ ){
693                LinkDescriptor descr = *iAffected;
694                logging_debug( "sending out link locator update to " << descr.remoteLocator->toString() );
695
696                AribaBaseMsg updateMsg(         descr.remoteLocator,
697                                                AribaBaseMsg::LINK_STATE_UPDATE,
698                                                descr.localLink, descr.remoteLink );
699
700                transport->sendMessage( &updateMsg );
701        }
702*/
703}
704
705/// sends a message to all end-points in the end-point descriptor
706void BaseCommunication::send(Message* message, const EndpointDescriptor& endpoint) {
707        Data data = data_serialize( message, DEFAULT_V );
708        transport->send( endpoint.getEndpoints(), data.getBuffer(), data.getLength() / 8);
709}
710
711/// sends a message to the remote locator inside the link descriptor
712void BaseCommunication::send(Message* message, const LinkDescriptor& desc) {
713        Data data = data_serialize( message, DEFAULT_V );
714        transport->send( desc.remoteLocator, data.getBuffer(), data.getLength() / 8);
715}
716
717}} // namespace ariba, communication
Note: See TracBrowser for help on using the repository browser.