MCPcopy Create free account
hub / github.com/PurpleI2P/i2pd / ProcessNextFrame

Method ProcessNextFrame

libi2pd/NTCP2.cpp:1268–1360  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1266 }
1267
1268 void NTCP2Session::ProcessNextFrame (const uint8_t * frame, size_t len)
1269 {
1270 size_t offset = 0;
1271 while (offset < len)
1272 {
1273 uint8_t blk = frame[offset];
1274 offset++;
1275 auto size = bufbe16toh (frame + offset);
1276 offset += 2;
1277 LogPrint (eLogDebug, "NTCP2: Block type ", (int)blk, " of size ", size);
1278 if (offset + size > len)
1279 {
1280 LogPrint (eLogError, "NTCP2: Unexpected block length ", size);
1281 break;
1282 }
1283 switch (blk)
1284 {
1285 case eNTCP2BlkDateTime:
1286 {
1287 LogPrint (eLogDebug, "NTCP2: Datetime");
1288 if (m_IsEstablished)
1289 {
1290 uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
1291 uint64_t tsA = bufbe32toh (frame + offset);
1292 if (tsA < ts - NTCP2_CLOCK_SKEW || tsA > ts + NTCP2_CLOCK_SKEW)
1293 {
1294 LogPrint (eLogWarning, "NTCP2: Established session time difference ", (int)(ts - tsA), " exceeds clock skew");
1295 SendTerminationAndTerminate (eNTCP2ClockSkew);
1296 }
1297 }
1298 break;
1299 }
1300 case eNTCP2BlkOptions:
1301 LogPrint (eLogDebug, "NTCP2: Options");
1302 break;
1303 case eNTCP2BlkRouterInfo:
1304 {
1305 LogPrint (eLogDebug, "NTCP2: RouterInfo flag=", (int)frame[offset]);
1306 if (size <= i2p::data::MAX_RI_BUFFER_SIZE + 1)
1307 {
1308 auto newRi = i2p::data::netdb.AddRouterInfo (frame + offset + 1, size - 1);
1309 if (newRi)
1310 {
1311 auto remoteIdentity = GetRemoteIdentity ();
1312 if (remoteIdentity && remoteIdentity->GetIdentHash () == newRi->GetIdentHash ())
1313 // peer's RouterInfo update
1314 SetRemoteIdentity (newRi->GetIdentity ());
1315 i2p::transport::transports.UpdatePeerParams (newRi);
1316 }
1317 }
1318 else
1319 LogPrint (eLogInfo, "NTCP2: RouterInfo block is too long ", size);
1320 break;
1321 }
1322 case eNTCP2BlkI2NPMessage:
1323 {
1324 LogPrint (eLogDebug, "NTCP2: I2NP");
1325 if (size > I2NP_MAX_MESSAGE_SIZE)

Callers

nothing calls this directly

Calls 13

bufbe16tohFunction · 0.85
LogPrintFunction · 0.85
GetSecondsSinceEpochFunction · 0.85
bufbe32tohFunction · 0.85
NewI2NPTunnelMessageFunction · 0.85
NewI2NPMessageFunction · 0.85
AddRouterInfoMethod · 0.80
UpdatePeerParamsMethod · 0.80
GetNTCP2HeaderMethod · 0.80
FromNTCP2Method · 0.80
PutNextMessageMethod · 0.80
FlushMethod · 0.80

Tested by

no test coverage detected