tun+ip: clarify what happens where

pull/21/head
cathugger 6 years ago
parent eb9150431f
commit 4cba59f3c4

@ -153,9 +153,13 @@ namespace llarp
Header()->daddr = htonl(ip); Header()->daddr = htonl(ip);
} }
// update ip packet checksum // update ip packet checksum (after packet gets out of network)
void void
UpdateChecksum(); UpdateChecksumsOnDst();
// update ip packet checksum (before packet gets inserted into network)
void
UpdateChecksumsOnSrc();
}; };
} // namespace net } // namespace net

@ -329,7 +329,7 @@ namespace llarp
memcpy(pkt.buf, buf.base, pkt.sz); memcpy(pkt.buf, buf.base, pkt.sz);
pkt.src(themIP); pkt.src(themIP);
pkt.dst(usIP); pkt.dst(usIP);
pkt.UpdateChecksum(); pkt.UpdateChecksumsOnDst();
return true; return true;
})) }))
@ -440,11 +440,12 @@ namespace llarp
// called in the isolated network thread // called in the isolated network thread
TunEndpoint *self = static_cast< TunEndpoint * >(tun->user); TunEndpoint *self = static_cast< TunEndpoint * >(tun->user);
self->m_NetworkToUserPktQueue.Process([self, tun](net::IPv4Packet &pkt) { self->m_NetworkToUserPktQueue.Process([self, tun](net::IPv4Packet &pkt) {
// prepare packet for insertion into network
pkg.UpdateChecksumsOnSrc();
// clear addresses // clear addresses
pkt.src(0); pkt.src(0);
pkt.dst(0); pkt.dst(0);
// clear checksum
pkt.Header()->check = 0;
if(!llarp_ev_tun_async_write(tun, pkt.buf, pkt.sz)) if(!llarp_ev_tun_async_write(tun, pkt.buf, pkt.sz))
llarp::LogWarn("packet dropped"); llarp::LogWarn("packet dropped");
}); });

@ -78,12 +78,15 @@ namespace llarp
*check = ipchksum(pktbuf, 12 + pktsz); *check = ipchksum(pktbuf, 12 + pktsz);
}}}; }}};
void void
IPv4Packet::UpdateChecksum() IPv4Packet::UpdateChecksumsOnDst()
{ {
// IPv4 checksum
auto hdr = Header(); auto hdr = Header();
hdr->check = 0; hdr->check = 0;
auto len = hdr->ihl * 4; auto len = hdr->ihl * 4;
hdr->check = ipchksum(buf, len); hdr->check = ipchksum(buf, len);
// L4 checksum
auto proto = hdr->protocol; auto proto = hdr->protocol;
auto itr = protoCheckSummer.find(proto); auto itr = protoCheckSummer.find(proto);
if(itr != protoCheckSummer.end()) if(itr != protoCheckSummer.end())
@ -91,5 +94,12 @@ namespace llarp
itr->second(hdr, buf, sz); itr->second(hdr, buf, sz);
} }
} }
void
IPv4Packet::UpdateChecksumsOnSrc()
{
// IPv4
Header()->check = 0;
}
} // namespace net } // namespace net
} // namespace llarp } // namespace llarp

Loading…
Cancel
Save