An Overlay-based
Virtual Network Substrate
SpoVNet

source: source/ariba/utility/transport/transport_peer.cpp @ 10653

Last change on this file since 10653 was 10653, checked in by Michael Tänzer, 7 years ago

Merge the ASIO branch back into trunk

File size: 4.1 KB
Line 
1
2#include "ariba/config.h"
3#include "transport_peer.hpp"
4#include "transport.hpp"
5#include "ariba/utility/logging/Logging.h"
6#include <boost/asio/ip/tcp.hpp>
7#include <boost/asio/error.hpp>
8#include <boost/foreach.hpp>
9
10#ifdef ECLIPSE_PARSER
11    #define foreach(a, b) for(a : b)
12#else
13    #define foreach(a, b) BOOST_FOREACH(a, b)
14#endif
15
16// namespace ariba::transport
17namespace ariba {
18namespace transport {
19
20using namespace ariba::addressing;
21using boost::asio::ip::tcp;
22
23#ifdef HAVE_LIBBLUETOOTH
24using boost::asio::bluetooth::rfcomm;
25#endif
26
27use_logging_cpp(transport_peer);
28
29transport_peer::transport_peer( endpoint_set& local_set ) : local(local_set) {
30   
31    // setup tcp transports
32    foreach(tcp_port_address port, local.tcp) {
33       
34        if (local.ip.size() > 0) {
35            foreach(ip_address ip_addr, local.ip) {
36               
37                tcp::endpoint endp(ip_addr.asio(), port.asio());
38                create_service(endp);
39            }
40        } else {
41            tcp::endpoint endp_v6(tcp::v6(), port.asio());
42            tcp::endpoint endp_v4(tcp::v4(), port.asio());
43           
44            create_service(endp_v6);
45            create_service(endp_v4);
46        }
47       
48    }
49   
50        #ifdef HAVE_LIBBLUETOOTH
51    foreach(rfcomm_channel_address channel, local.rfcomm) {
52        if (local.bluetooth.size() > 0) {
53                foreach(mac_address mac, local.bluetooth) {
54                        rfcomm::endpoint endp(mac.bluetooth(), channel.value());
55                        create_service(endp);
56                }
57        } else {
58                rfcomm::endpoint endp(channel.value());
59                create_service(endp);
60        }
61    }
62        #endif
63}
64
65void transport_peer::create_service(tcp::endpoint endp) {
66    try {
67        TcpIpPtr tmp_ptr(new tcpip(endp));
68        tcps.push_back(tmp_ptr);
69        logging_info("Listening on IP/TCP " << endp);
70       
71    } catch (boost::system::system_error& e) {
72        if (e.code() == boost::asio::error::address_in_use) {
73            logging_warn("[WARN] Address already in use: "
74                    << endp << ". Endpoint will be ignored!");
75        } else {
76            // Rethrow
77            throw;
78        }
79    }
80}
81
82#ifdef HAVE_LIBBLUETOOTH
83void transport_peer::create_service(rfcomm::endpoint endp) {
84    try {
85        rfcomm_transport::sptr tmp_ptr(new rfcomm_transport(endp));
86        rfcomms.push_back(tmp_ptr);
87        logging_info("Listening on bluetooth/RFCOMM " << endp);
88       
89    } catch (boost::system::system_error& e) {
90        if (e.code() == boost::asio::error::address_in_use) {
91            logging_warn("[WARN] Address already in use: "
92                    << endp << ". Endpoint will be ignored!");
93        } else {
94            // Rethrow
95            throw;
96        }
97    }
98}
99#endif
100
101transport_peer::~transport_peer() {
102}
103
104void transport_peer::start() {
105    foreach(TcpIpPtr tcp, tcps) {
106        tcp->start();
107    }
108   
109#ifdef HAVE_LIBBLUETOOTH
110    foreach(rfcomm_transport::sptr x, rfcomms) {
111        x->start();
112    }
113#endif
114}
115
116void transport_peer::stop() {
117    foreach(TcpIpPtr tcp, tcps) {
118        tcp->stop();
119    }
120   
121#ifdef HAVE_LIBBLUETOOTH
122        foreach(rfcomm_transport::sptr x, rfcomms) {
123                x->stop();
124        }
125#endif
126}
127
128
129void transport_peer::send(
130        const endpoint_set& endpoints,
131        reboost::message_t message,
132        uint8_t priority)
133{
134    foreach(TcpIpPtr tcp, tcps) {
135        tcp->send(endpoints, message, priority);
136    }
137   
138#ifdef HAVE_LIBBLUETOOTH
139    foreach(rfcomm_transport::sptr x, rfcomms) {
140                x->send(endpoints, message, priority);
141        }
142#endif
143}
144
145void transport_peer::terminate( const address_v* remote ) {
146        if (remote->instanceof<tcpip_endpoint>())// TODO direkt auf der richtigen verbindung
147        {
148            foreach(TcpIpPtr tcp, tcps) {
149                tcp->terminate(remote);
150            }
151        }
152#ifdef HAVE_LIBBLUETOOTH
153        if (remote->instanceof<rfcomm_endpoint>()) {
154                foreach(rfcomm_transport::sptr x, rfcomms) {
155                        x->terminate(remote);
156                }
157        }
158#endif
159}
160
161void transport_peer::register_listener( transport_listener* listener ) {
162    foreach(TcpIpPtr tcp, tcps) {
163        tcp->register_listener(listener);
164    }
165   
166#ifdef HAVE_LIBBLUETOOTH
167    foreach(rfcomm_transport::sptr x, rfcomms) {
168        x->register_listener(listener);
169    }
170#endif
171}
172
173}} // namespace ariba::transport
Note: See TracBrowser for help on using the repository browser.