smtp: optimized tx iterator

To be more efficient with larger number of transactions.
As was done for FTP.

Ticket: #5927
(cherry picked from commit f5f215dae7)
pull/8664/head
Philippe Antoine 4 years ago committed by Victor Julien
parent 9dfb3baf19
commit 8fd0862f94

@ -1697,6 +1697,44 @@ static AppLayerTxData *SMTPGetTxData(void *vtx)
return &tx->tx_data;
}
/** \brief SMTP tx iterator, specialized for its linked list
*
* \retval txptr or NULL if no more txs in list
*/
static AppLayerGetTxIterTuple SMTPGetTxIterator(const uint8_t ipproto, const AppProto alproto,
void *alstate, uint64_t min_tx_id, uint64_t max_tx_id, AppLayerGetTxIterState *state)
{
SMTPState *smtp_state = (SMTPState *)alstate;
AppLayerGetTxIterTuple no_tuple = { NULL, 0, false };
if (smtp_state) {
SMTPTransaction *tx_ptr;
if (state->un.ptr == NULL) {
tx_ptr = TAILQ_FIRST(&smtp_state->tx_list);
} else {
tx_ptr = (SMTPTransaction *)state->un.ptr;
}
if (tx_ptr) {
while (tx_ptr->tx_id < min_tx_id) {
tx_ptr = TAILQ_NEXT(tx_ptr, next);
if (!tx_ptr) {
return no_tuple;
}
}
if (tx_ptr->tx_id >= max_tx_id) {
return no_tuple;
}
state->un.ptr = TAILQ_NEXT(tx_ptr, next);
AppLayerGetTxIterTuple tuple = {
.tx_ptr = tx_ptr,
.tx_id = tx_ptr->tx_id,
.has_next = (state->un.ptr != NULL),
};
return tuple;
}
}
return no_tuple;
}
/**
* \brief Register the SMTP Protocol parser.
*/
@ -1736,6 +1774,7 @@ void RegisterSMTPParsers(void)
AppLayerParserRegisterGetStateProgressFunc(IPPROTO_TCP, ALPROTO_SMTP, SMTPStateGetAlstateProgress);
AppLayerParserRegisterGetTxCnt(IPPROTO_TCP, ALPROTO_SMTP, SMTPStateGetTxCnt);
AppLayerParserRegisterGetTx(IPPROTO_TCP, ALPROTO_SMTP, SMTPStateGetTx);
AppLayerParserRegisterGetTxIterator(IPPROTO_TCP, ALPROTO_SMTP, SMTPGetTxIterator);
AppLayerParserRegisterTxDataFunc(IPPROTO_TCP, ALPROTO_SMTP, SMTPGetTxData);
AppLayerParserRegisterGetStateProgressCompletionStatus(ALPROTO_SMTP,
SMTPStateGetAlstateProgressCompletionStatus);

Loading…
Cancel
Save