more iwp tweaking

pull/1/head
Jeff Becker 6 years ago
parent 70d19621ee
commit 4231243931
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -283,7 +283,7 @@ namespace iwp
{ {
if(msginfo.numfrags() == 0) if(msginfo.numfrags() == 0)
return true; return true;
return status.count() % (1 + (msginfo.numfrags() / 3)) == 0; return status.count() % (1 + (msginfo.numfrags() / 2)) == 0;
} }
bool bool
@ -393,7 +393,7 @@ namespace iwp
uint64_t rxids = 0; uint64_t rxids = 0;
uint64_t txids = 0; uint64_t txids = 0;
llarp_time_t lastEvent = 0; llarp_time_t lastEvent = 0;
std::map< uint64_t, transit_message > rx; std::map< uint64_t, transit_message * > rx;
std::map< uint64_t, transit_message * > tx; std::map< uint64_t, transit_message * > tx;
typedef std::queue< sendbuf_t > sendqueue_t; typedef std::queue< sendbuf_t > sendqueue_t;
@ -413,6 +413,8 @@ namespace iwp
void void
clear() clear()
{ {
for(auto &item : rx)
delete item.second;
rx.clear(); rx.clear();
for(auto &item : tx) for(auto &item : tx)
delete item.second; delete item.second;
@ -462,14 +464,14 @@ namespace iwp
if(x.flags() & 0x01) if(x.flags() & 0x01)
{ {
auto id = x.msgid(); auto id = x.msgid();
auto itr = rx.emplace(id, x); auto itr = rx.find(id);
if(itr.second) if(itr == rx.end())
{ {
rx[id] = new transit_message(x);
llarp::Debug("got message XMIT with ", (int)x.numfrags(), llarp::Debug("got message XMIT with ", (int)x.numfrags(),
" fragments"); " fragments");
// inserted, put last fragment // inserted, put last fragment
itr.first->second.put_lastfrag(hdr.data() + sizeof(x.buffer), rx[id]->put_lastfrag(hdr.data() + sizeof(x.buffer), x.lastfrag());
x.lastfrag());
push_ackfor(id, 0); push_ackfor(id, 0);
if(x.numfrags() == 0) if(x.numfrags() == 0)
{ {
@ -522,25 +524,25 @@ namespace iwp
llarp::Warn("no such RX fragment, msgid=", msgid); llarp::Warn("no such RX fragment, msgid=", msgid);
return false; return false;
} }
auto fragsize = itr->second.msginfo.fragsize(); auto fragsize = itr->second->msginfo.fragsize();
if(fragsize != sz - 9) if(fragsize != sz - 9)
{ {
llarp::Warn("RX fragment size missmatch ", fragsize, " != ", sz - 9); llarp::Warn("RX fragment size missmatch ", fragsize, " != ", sz - 9);
return false; return false;
} }
if(!itr->second.put_frag(fragno, hdr.data() + 9)) if(!itr->second->put_frag(fragno, hdr.data() + 9))
{ {
llarp::Warn("inbound message does not have fragment msgid=", msgid, llarp::Warn("inbound message does not have fragment msgid=", msgid,
" fragno=", (int)fragno); " fragno=", (int)fragno);
return false; return false;
} }
auto mask = itr->second.get_bitmask(); auto mask = itr->second->get_bitmask();
if(itr->second.completed()) if(itr->second->completed())
{ {
push_ackfor(msgid, mask); push_ackfor(msgid, mask);
return inbound_frame_complete(msgid); return inbound_frame_complete(msgid);
} }
else if(itr->second.should_send_ack()) else if(itr->second->should_send_ack())
{ {
push_ackfor(msgid, mask); push_ackfor(msgid, mask);
} }
@ -1468,7 +1470,7 @@ namespace iwp
{ {
bool success = false; bool success = false;
std::vector< byte_t > msg; std::vector< byte_t > msg;
if(rx[id].reassemble(msg)) if(rx[id]->reassemble(msg))
{ {
auto buf = llarp::Buffer< decltype(msg) >(msg); auto buf = llarp::Buffer< decltype(msg) >(msg);
success = router->HandleRecvLinkMessage(parent, buf); success = router->HandleRecvLinkMessage(parent, buf);
@ -1484,12 +1486,16 @@ namespace iwp
} }
impl->serv->MapAddr(impl->addr, impl->remote_router.pubkey); impl->serv->MapAddr(impl->addr, impl->remote_router.pubkey);
} }
llarp::Info("handled message ", id);
} }
else
llarp::Warn("failed to handle inbound message ", id);
} }
else else
{ {
llarp::Warn("failed to reassemble message ", id); llarp::Warn("failed to reassemble message ", id);
} }
delete rx[id];
rx.erase(id); rx.erase(id);
return success; return success;
} }

Loading…
Cancel
Save