25 #include <ibrcommon/net/lowpansocket.h>
26 #include <ibrcommon/net/lowpanstream.h>
28 #include <ibrcommon/Logger.h>
37 const std::string LOWPANDatagramService::TAG =
"LOWPANDatagramService";
40 : _panid(panid), _iface(iface)
54 _addr_broadcast = ibrcommon::vaddress(
"65535", ss.str(), AF_IEEE802154);
71 _vsocket.add(
new ibrcommon::lowpansocket(_panid, _iface));
73 }
catch (
const std::bad_cast&) {
74 throw DatagramException(
"bind failed");
75 }
catch (
const ibrcommon::Exception&) {
76 throw DatagramException(
"bind failed");
98 if (length > _params.max_msg_length)
100 IBRCOMMON_LOGGER_TAG(LOWPANDatagramService::TAG, error) <<
"send buffer to big to be transferred (" << length <<
")."<< IBRCOMMON_LOGGER_ENDL;
104 ibrcommon::socketset socks = _vsocket.getAll();
105 if (socks.size() == 0)
return;
106 ibrcommon::lowpansocket &sock =
dynamic_cast<ibrcommon::lowpansocket&
>(**socks.begin());
109 ibrcommon::vaddress destaddr;
110 LOWPANDatagramService::decode(identifier, destaddr);
113 std::vector<char> tmp(length + 1);
127 tmp[0] |=
static_cast<char>((0x03 & seqno) << 2);
135 ::memcpy(&tmp[1], buf, length);
138 IBRCOMMON_LOGGER_DEBUG_TAG(LOWPANDatagramService::TAG, 20) <<
"sendto() type: " << std::hex << (int)type <<
"; flags: " << std::hex << (
int)flags <<
"; seqno: " << seqno <<
"; address: " << identifier << IBRCOMMON_LOGGER_ENDL;
141 sock.sendto(&tmp[0], length + 1, 0, destaddr);
142 }
catch (
const ibrcommon::Exception&) {
155 if (length > _params.max_msg_length)
157 IBRCOMMON_LOGGER_TAG(LOWPANDatagramService::TAG, error) <<
"send buffer to big to be transferred (" << length <<
")."<< IBRCOMMON_LOGGER_ENDL;
161 ibrcommon::socketset socks = _vsocket.getAll();
162 if (socks.size() == 0)
return;
163 ibrcommon::lowpansocket &sock =
dynamic_cast<ibrcommon::lowpansocket&
>(**socks.begin());
166 std::vector<char> tmp(length + 1);
180 tmp[0] |=
static_cast<char>((0x03 & seqno) << 2);
188 ::memcpy(&tmp[1], buf, length);
192 sock.setAutoAck(
false);
194 IBRCOMMON_LOGGER_DEBUG_TAG(LOWPANDatagramService::TAG, 20) <<
"sendto() type: " << std::hex << (int)type <<
"; flags: " << std::hex << (
int)flags <<
"; seqno: " << seqno <<
"; address: broadcast" << IBRCOMMON_LOGGER_ENDL;
197 sock.sendto(&tmp[0], length + 1, 0, _addr_broadcast);
200 sock.setAutoAck(
true);
201 }
catch (
const ibrcommon::Exception&) {
217 ibrcommon::socketset readfds;
218 _vsocket.select(&readfds, NULL, NULL, NULL);
220 for (ibrcommon::socketset::iterator iter = readfds.begin(); iter != readfds.end(); ++iter) {
221 ibrcommon::lowpansocket &sock =
dynamic_cast<ibrcommon::lowpansocket&
>(**iter);
223 std::vector<char> tmp(length + 1);
226 ibrcommon::vaddress fromaddr;
229 size_t ret = sock.recvfrom(&tmp[0], length + 1, 0, fromaddr);
238 switch (tmp[0] & (0x03 << 4)) {
263 seqno = (tmp[0] & (0x03 << 2)) >> 2;
267 ::memcpy(buf, &tmp[1], ret);
271 address = LOWPANDatagramService::encode(fromaddr);
273 IBRCOMMON_LOGGER_DEBUG_TAG(LOWPANDatagramService::TAG, 20) <<
"recvfrom() type: " << std::hex << (int)type <<
"; flags: " << std::hex << (
int)flags <<
"; seqno: " << seqno <<
"; address: " << address << IBRCOMMON_LOGGER_ENDL;
277 }
catch (
const ibrcommon::Exception&) {
291 std::stringstream ss_pan; ss_pan << _panid;
294 ibrcommon::vaddress addr;
295 ibrcommon::lowpansocket::getAddress(_iface, ss_pan.str(), addr);
297 return LOWPANDatagramService::encode(addr);
323 const std::string LOWPANDatagramService::encode(
const ibrcommon::vaddress &addr)
325 std::stringstream ss;
326 ss <<
"addr=" << addr.address() <<
";pan=" << addr.service() <<
";";
330 void LOWPANDatagramService::decode(
const std::string &identifier, ibrcommon::vaddress &addr)
337 std::vector<string>::const_iterator param_iter = parameters.begin();
339 while (param_iter != parameters.end())
343 if (p[0].compare(
"addr") == 0)
348 if (p[0].compare(
"pan") == 0)
356 addr = ibrcommon::vaddress(address, service, AF_IEEE802154);
virtual const ibrcommon::vinterface & getInterface() const
virtual ~LOWPANDatagramService()
virtual void send(const char &type, const char &flags, const unsigned int &seqno, const std::string &address, const char *buf, size_t length)
virtual size_t recvfrom(char *buf, size_t length, char &type, char &flags, unsigned int &seqno, std::string &address)
LOWPANDatagramService(const ibrcommon::vinterface &iface, uint16_t panid)
unsigned int max_seq_numbers
virtual dtn::core::Node::Protocol getProtocol() const
virtual const DatagramService::Parameter & getParameter() const
virtual const std::string getServiceDescription() const
static std::vector< std::string > tokenize(const std::string &token, const std::string &data, const std::string::size_type max=std::string::npos)