Actually I'm migrating my call routing module of version 1.5.0 of kamailio to version 3.1.2. I want to understand why the tm module registers an event callback after the INVITE message is processed by my routing module. When I use the dispatcher module for routing, no event callback is registered by the tm module.
I do not quite understand this process callback, I study a little more ...
Regards,
2011/6/3 Timo Reimann timo.reimann@1und1.de
Hey Bruno,
On 03.06.2011 16:21, Bruno Bresciani wrote:
In file t_hook.c line 386 "*cbp->callback( trans, cbp->types, params )*" calls the function to record register_tmcb when I received a INVITE. I'd like to now how register_tmcb function is call by the function callback.
register_tmcb() isn't called by a callback function, it rather works the other way around. For clarity, here's the call flow:
(1) A user is interested in being called back on a particular tm event, e.g., TMCB_DESTROY. To be notified of such events, he calls tmcb_register() and passes the set of events (callback types) he is interested in (e.g., TMCB_DESTROY and possibly others) together with the desired callback function and a few other parameters. (2) In tmcb_register(), a few sanity checks are done first (e.g., callback type is valid, callback function is not NULL, transaction exists, etc.). If they pass, the callback function and the parameters are stored in a list of callbacks (called cb_list in register_tmcb()). (3) When a particular tm event occurs, the tm module checks if any callbacks were registered for that specific event. If so, it executes each registered callback function in sequence, with each function being passed the callback type and callback-specific parameter. The call of the callback is exactly what
cbp->callback( trans, type, params )
does, at least for call types other than TMCB_REQUEST_IN.
For TMCB_REQUEST_IN, the handling is slightly different because callbacks for new SIP requests cannot be associated with an already existing transaction (after all, they are new). With regards to how TMCB_REQUEST_IN-typed callback functions are called, the only difference is that the callback function is being passed the set of all callback types the registering user was interested in, and not just TMCB_REQUEST_IN:
cbp->callback( trans, cbp->types, params )
(This is line 386.) Actually, I am not quite sure why the extent of returned callback types differs here. I'm using tm callbacks myself but never had to take advantage of that.
Anyways, if all you want to do is use tm callbacks from a module of yours, just call register_tmcb() passing
- a callback function,
- a transaction cell (unless you're registering for TMCB_REQUEST_IN),
- a void pointer to something you want to be passed back on callback
execution, and
- an optional release function for cleanup purposes.
Implement your callback-specific logic in the callback function, and that's it. Naturally, your callback function must fit the callback signature defined in t_hooks.h.
I hope this answers your question. If not, let us know what you specifically have in mind, i.e., whether you would like to use tm callbacks, change the framework, or whatever.
Cheers,
--Timo
2011/6/3 Timo Reimann <timo.reimann@1und1.de <mailto:
timo.reimann@1und1.de>>
Hi Bruno, On 03.06.2011 00:07, Bruno Bresciani wrote: > I'm having doubts in the implementation of the callback function module > tm. As she calls the function to record register_tmcb ()? > Can someome help me? Could you be more specific on which part of the tm module you are
having
trouble with? If you need an example on how to use tm's callbacks you may take a
look
at the dialog module, specifically the files dialog.c and dlg_handlers.c. Cheers, --Timo