| 1592 | } |
| 1593 | |
| 1594 | void NTCP2Session::SendRouterInfo () |
| 1595 | { |
| 1596 | if (!IsEstablished ()) return; |
| 1597 | auto riBuffer = i2p::context.CopyRouterInfoBuffer (); |
| 1598 | auto riLen = riBuffer->GetBufferLen (); |
| 1599 | size_t payloadLen = riLen + 3 + 1 + 7; // 3 bytes block header + 1 byte RI flag + 7 bytes DateTime |
| 1600 | m_NextSendBuffer = new uint8_t[payloadLen + 16 + 2 + 64]; // up to 64 bytes padding |
| 1601 | // DateTime block |
| 1602 | m_NextSendBuffer[2] = eNTCP2BlkDateTime; |
| 1603 | htobe16buf (m_NextSendBuffer + 3, 4); |
| 1604 | htobe32buf (m_NextSendBuffer + 5, (i2p::util::GetMillisecondsSinceEpoch () + 500)/1000); |
| 1605 | // RouterInfo block |
| 1606 | m_NextSendBuffer[9] = eNTCP2BlkRouterInfo; |
| 1607 | htobe16buf (m_NextSendBuffer + 10, riLen + 1); // size |
| 1608 | m_NextSendBuffer[12] = 0; // flag |
| 1609 | memcpy (m_NextSendBuffer + 13, riBuffer->data (), riLen); // TODO: eliminate extra copy |
| 1610 | // padding block |
| 1611 | auto paddingSize = CreatePaddingBlock (payloadLen, m_NextSendBuffer + 2 + payloadLen, 64); |
| 1612 | payloadLen += paddingSize; |
| 1613 | // encrypt and send |
| 1614 | EncryptAndSendNextBuffer (payloadLen); |
| 1615 | } |
| 1616 | |
| 1617 | void NTCP2Session::SendTermination (NTCP2TerminationReason reason) |
| 1618 | { |
nothing calls this directly
no test coverage detected