Finally I found the issue. In ims_auth module > cxdx_mar.c > async_cdp_callback function, within the done label, there is a call to t_continue function that should find the transaction and execute the callback for ims_www_challenge (REG_MAR_REPLY route), tmb.t_continue(data->tindex, data->tlabel, data->act);
however because the transaction is already put on wait by calling put_on_wait(trans); inside _reply_light function in tm module, the transaction is in terminated phase and that's the reason why the callback is never executed. Strangely, for SAR requests, instead of t_continue, t_continue_skip_timer function is called t_continue_skip_timer: tmb.t_continue_skip_timer(data->tindex, data->tlabel, data->act);
That effectively ignores the transaction state, and calls the respective callback function. I checked the newer version and didn't find any change in the function calls.
I used t_continue_skip_timer for MAR request and everything worked as expected. Can I use the t_continue_skip_timer instead of t_continue for MAR requests too without any concern? Is there any side effect? what about unreleased transactions and memory leak?