On 11/09/2016 01:11 PM, [email protected] wrote:
Hi,

I have a customer who is running 12.8.2 and since their software needs to be 
certified at considerable expense and time will not be upgrading Asterisk 
anytime soon. In addition due to security requirements the only connection 
between their Asterisks is a single IAX2 peer. They would like to support BFCP 
(Binary Floor Control Protocol – RFC 4582). The issue is BFCP sends information 
in the SIP SDP such as TCP connection and port info and then assumes the two 
endpoints have set up a socket between them to exchange BFCP protocol messages. 
I am not allowed to open a direct socket between the BFCP endpoints due to 
security concerns, all traffic, signaling, messaging must go over the single 
IAX2 connection. So I can open a socket from asterisk to the BFCP client/server 
using the port information received the SIP SDP. Then the BFCP endpoint sends 
the protocol message to the asterisk and I need to send it across the IAX2 
connection to the other asterisk who will then send it on to its intended 
destination. What I am trying to do is create a new  ast_control_frame_type and 
send the BFCP protocol message as data in a control frame. The problem I am 
running into is determining how to send a message to a peer outside a call. All 
the methods I have found such as ast_queue_control_data assume an active call 
that has been bridged. I also tried to use the socket send method using the 
sockfd defined in the iax2_peer structure, but it returned a -1. So what I am 
looking for is the base methods for sending/reading data to/from an IAX2 peer. 
Is this possible? If so, can anyone point me to some code that does what I want?

The hard part for answering this determining what you mean when you say you want to convey information to another party "outside a call" . I can read this a couple of ways:

1) A SIP endpoint will send Asterisk arbitrary data in some sort of request (like maybe an OPTIONS request), and you then want to send this data over IAX2 to the other side. The endpoints involved are not calling each other at all. It's just that information received in Asterisk by one endpoint has to then be conveyed out another interface.

2) A SIP endpoint will initiate a call that will end up going out the IAX2 side. Prior to call establishment, you need to send information out the IAX2 side

Let's go over each of these.

For situation (1), there are no ast_channel structures involved at all. So there's no way to be queuing frames or sending frames between channels. Instead, you'll need to use other methods within Asterisk. Since you're using Asterisk 12, your best bet is to make use o the Stasis message bus. The idea would be that the SIP channel driver that receives the incoming messages would raise a Stasis event. The IAX2 channel driver would be subscribed to those events and potentially react by sending messages out where necessary. If you want to learn more about the Stasis message bus, there is a real good explanation of the API in include/asterisk/stasis.h in the comments at the top of the file. If you want to see examples of it in action, I think device state is a good place to look. You can look in main/devicestate.c to see where the topics and messages get created, as well as transmission of events. You can grep for "ast_device_state_message_type()" to find places that subscribe to device state messages.

For situation (2), You'll have a channel making an incoming call, presumably with some BFCP information in the incoming SDP. However at the point where you want to make an outbound call, the channels involved are not communicating via frames. That doesn't start happening until the outbound call gets established. In such a case, you'll have several options for getting the necessary information from the inbound channel to the outbound channel. One way I'll recommend is to make dialplan functions to retrieve BFCP information, set channel variables (preceded by "__" so they get inherited on the outbound channels), and then have chan_iax2 read those channel variables and communicate what is necessary prior to making the outbound call.

As far as the mechanics for sending information on the IAX2 socket, I'm afraid I can't help you there. I don't have much direct experience with the inner workings of chan_iax2, and the best I could offer would be speculation of what might work based on my reading of the code.


--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
  http://lists.digium.com/mailman/listinfo/asterisk-dev

Reply via email to