| 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) |
nothing calls this directly
no test coverage detected