In case rtp-bridge is used, tones cannot be generated. Instead,
a message is forwarded to SIP endpoint, so it generates it itself.
/* DTMF INDICATION */
void Pgsm_bs::start_dtmf_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc *mncc)
{
/* DTMF INDICATION */
void Pgsm_bs::start_dtmf_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc *mncc)
{
- struct lcr_msg *message;
struct gsm_mncc *resp;
gsm_trace_header(p_g_interface_name, this, msg_type, DIRECTION_IN);
struct gsm_mncc *resp;
gsm_trace_header(p_g_interface_name, this, msg_type, DIRECTION_IN);
send_and_free_mncc(p_g_lcr_gsm, resp->msg_type, resp);
if (p_g_rtp_bridge) {
send_and_free_mncc(p_g_lcr_gsm, resp->msg_type, resp);
if (p_g_rtp_bridge) {
- /* send dtmf information, because we bridge RTP directly */
- message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_DTMF);
- message->param.dtmf = mncc->keypad;
- message_put(message);
+ class Port *remote = bridge_remote();
+
+ if (remote) {
+ struct lcr_msg *message;
+
+ /* send dtmf information, because we bridge RTP directly */
+ message = message_create(0, remote->p_serial, EPOINT_TO_PORT, MESSAGE_DTMF);
+ message->param.dtmf = mncc->keypad;
+ message_put(message);
+ }
} else {
/* generate DTMF tones, since we do audio forwarding inside LCR */
switch (mncc->keypad) {
} else {
/* generate DTMF tones, since we do audio forwarding inside LCR */
switch (mncc->keypad) {
-/* send data to remote Port */
-int Port::bridge_tx(unsigned char *data, int len)
+class Port *Port::bridge_remote(void)
- class Port *to_port = NULL;
+ class Port *remote = NULL;
/* get remote port from bridge */
if (!p_bridge)
/* get remote port from bridge */
if (!p_bridge)
if (p_bridge->sunrise == this)
if (p_bridge->sunrise == this)
- to_port = p_bridge->sunset;
+ remote = p_bridge->sunset;
if (p_bridge->sunset == this)
if (p_bridge->sunset == this)
- to_port = p_bridge->sunrise;
- if (!to_port)
+ remote = p_bridge->sunrise;
+
+ return remote;
+}
+
+/* send data to remote Port */
+int Port::bridge_tx(unsigned char *data, int len)
+{
+ class Port *remote = bridge_remote();
+
+ if (!remote)
return -EINVAL;
// printf("Traffic: %u -> %u (bridge %u)\n", p_serial, to_port->p_serial, p_bridge->bridge_id);
return -EINVAL;
// printf("Traffic: %u -> %u (bridge %u)\n", p_serial, to_port->p_serial, p_bridge->bridge_id);
- return to_port->bridge_rx(data, len);
+ return remote->bridge_rx(data, len);
}
/* receive data from remote Port (dummy, needs to be inherited) */
}
/* receive data from remote Port (dummy, needs to be inherited) */
/* audio bridging */
struct port_bridge *p_bridge; /* linked to a port bridge or NULL */
void bridge(unsigned int bridge_id); /* join a bridge */
/* audio bridging */
struct port_bridge *p_bridge; /* linked to a port bridge or NULL */
void bridge(unsigned int bridge_id); /* join a bridge */
+ class Port *bridge_remote(void); /* get remote port */
int bridge_tx(unsigned char *data, int len); /* used to transmit data to remote port */
virtual int bridge_rx(unsigned char *data, int len); /* function to be inherited, so data is received */
int bridge_tx(unsigned char *data, int len); /* used to transmit data to remote port */
virtual int bridge_rx(unsigned char *data, int len); /* function to be inherited, so data is received */
int Psip::message_epoint(unsigned int epoint_id, int message_id, union parameter *param)
{
int Psip::message_epoint(unsigned int epoint_id, int message_id, union parameter *param)
{
- class Endpoint *epoint;
-
if (Port::message_epoint(epoint_id, message_id, param))
return 1;
if (Port::message_epoint(epoint_id, message_id, param))
return 1;
- epoint = find_epoint_id(epoint_id);
- if (!epoint) {
- PDEBUG(DEBUG_SIP, "PORT(%s) no endpoint object found where the message is from.\n", p_name);
- return 0;
- }
-
switch(message_id) {
case MESSAGE_ALERTING: /* call is ringing on LCR side */
if (p_state != PORT_STATE_IN_SETUP
switch(message_id) {
case MESSAGE_ALERTING: /* call is ringing on LCR side */
if (p_state != PORT_STATE_IN_SETUP