Added TOS in RTP
git-svn-id: http://voip.null.ro/svn/yate@557 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
parent
5953dfd62c
commit
da0ae347c2
|
@ -1,3 +1,8 @@
|
||||||
|
Wed Nov 02 2005 Paul Chitescu <paulc-devel@null.ro>
|
||||||
|
- TOS setting support and configuration improvments in RTP
|
||||||
|
- Fixed time parsing of messages from external modules
|
||||||
|
- Abnormal CDR timestamps are adjusted to avoid negative time intervals
|
||||||
|
|
||||||
Sun Oct 30 2005 Paul Chitescu <paulc-devel@null.ro>
|
Sun Oct 30 2005 Paul Chitescu <paulc-devel@null.ro>
|
||||||
- Fixed H.323, IAX and ISDN to include outgoing caller and called in CDR
|
- Fixed H.323, IAX and ISDN to include outgoing caller and called in CDR
|
||||||
- The CDR builder emits time and intervals in milliseconds
|
- The CDR builder emits time and intervals in milliseconds
|
||||||
|
|
|
@ -7,6 +7,10 @@
|
||||||
; port: int: UDP port for incoming connections
|
; port: int: UDP port for incoming connections
|
||||||
;port=4569
|
;port=4569
|
||||||
|
|
||||||
|
; tos: keyword: Type Of Service to set in outgoing UDP packets
|
||||||
|
; numeric TOS value or: lowdelay, throughput, reliability, mincost
|
||||||
|
;tos=0
|
||||||
|
|
||||||
|
|
||||||
[formats]
|
[formats]
|
||||||
; This section allows to individually enable or disable the codecs
|
; This section allows to individually enable or disable the codecs
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
[general]
|
||||||
|
; This section sets global network level variables
|
||||||
|
|
||||||
|
; minport: int: Minimum port range to allocate
|
||||||
|
;minport=16384
|
||||||
|
|
||||||
|
; maxport: int: Maximum port range to allocate
|
||||||
|
;maxport=32768
|
||||||
|
|
||||||
|
; tos: keyword: Type Of Service to set in outgoing UDP packets
|
||||||
|
; numeric TOS value or: lowdelay, throughput, reliability, mincost
|
||||||
|
;tos=0
|
||||||
|
|
||||||
|
; buffer: int: Maximum buffer size - used to fragment octet (G.711) audio streams
|
||||||
|
;buffer=240
|
||||||
|
|
|
@ -225,6 +225,14 @@ public:
|
||||||
*/
|
*/
|
||||||
bool remoteAddr(SocketAddr& addr, bool sniff = false);
|
bool remoteAddr(SocketAddr& addr, bool sniff = false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the Type Of Service for the RTP socket
|
||||||
|
* @param tos Type Of Service bits to set
|
||||||
|
* @return True if operation was successfull, false if an error occured
|
||||||
|
*/
|
||||||
|
inline bool setTOS(int tos)
|
||||||
|
{ return m_rtpSock.setTOS(tos); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Method called periodically to read data out of sockets
|
* Method called periodically to read data out of sockets
|
||||||
|
@ -797,6 +805,14 @@ public:
|
||||||
inline bool remoteAddr(SocketAddr& addr, bool sniff = false)
|
inline bool remoteAddr(SocketAddr& addr, bool sniff = false)
|
||||||
{ return m_transport && m_transport->remoteAddr(addr,sniff); }
|
{ return m_transport && m_transport->remoteAddr(addr,sniff); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the Type Of Service for the RTP transport socket
|
||||||
|
* @param tos Type Of Service bits to set
|
||||||
|
* @return True if operation was successfull, false if an error occured
|
||||||
|
*/
|
||||||
|
inline bool setTOS(int tos)
|
||||||
|
{ return m_transport && m_transport->setTOS(tos); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Method called periodically to push any asynchronous data or statistics
|
* Method called periodically to push any asynchronous data or statistics
|
||||||
|
|
|
@ -29,6 +29,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define MIN_PORT 16384
|
||||||
|
#define MAX_PORT 32768
|
||||||
|
#define BUF_SIZE 240
|
||||||
|
|
||||||
using namespace TelEngine;
|
using namespace TelEngine;
|
||||||
|
|
||||||
|
@ -60,7 +63,18 @@ static TokenDict dict_yrtp_dir[] = {
|
||||||
{ 0 , 0 },
|
{ 0 , 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static Configuration s_cfg;
|
static TokenDict dict_tos[] = {
|
||||||
|
{ "lowdelay", Socket::LowDelay },
|
||||||
|
{ "throughput", Socket::MaxThroughput },
|
||||||
|
{ "reliability", Socket::MaxReliability },
|
||||||
|
{ "mincost", Socket::MinCost },
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static int s_minport = MIN_PORT;
|
||||||
|
static int s_maxport = MAX_PORT;
|
||||||
|
static int s_bufsize = BUF_SIZE;
|
||||||
|
static String s_tos;
|
||||||
|
|
||||||
class YRTPSource;
|
class YRTPSource;
|
||||||
class YRTPConsumer;
|
class YRTPConsumer;
|
||||||
|
@ -75,7 +89,7 @@ public:
|
||||||
YRTPWrapper(const char *localip, CallEndpoint* conn = 0, const char* media = "audio", RTPSession::Direction direction = RTPSession::SendRecv);
|
YRTPWrapper(const char *localip, CallEndpoint* conn = 0, const char* media = "audio", RTPSession::Direction direction = RTPSession::SendRecv);
|
||||||
~YRTPWrapper();
|
~YRTPWrapper();
|
||||||
void setupRTP(const char* localip);
|
void setupRTP(const char* localip);
|
||||||
bool startRTP(const char* raddr, unsigned int rport, int payload, int evpayload, const char* format);
|
bool startRTP(const char* raddr, unsigned int rport, const Message& msg);
|
||||||
bool sendDTMF(char dtmf, int duration = 0);
|
bool sendDTMF(char dtmf, int duration = 0);
|
||||||
void gotDTMF(char tone);
|
void gotDTMF(char tone);
|
||||||
inline YRTPSession* rtp() const
|
inline YRTPSession* rtp() const
|
||||||
|
@ -260,8 +274,8 @@ void YRTPWrapper::setupRTP(const char* localip)
|
||||||
Debug(&splugin,DebugAll,"YRTPWrapper::setupRTP(\"%s\") [%p]",localip,this);
|
Debug(&splugin,DebugAll,"YRTPWrapper::setupRTP(\"%s\") [%p]",localip,this);
|
||||||
m_rtp = new YRTPSession(this);
|
m_rtp = new YRTPSession(this);
|
||||||
m_rtp->initTransport();
|
m_rtp->initTransport();
|
||||||
int minport = s_cfg.getIntValue("rtp","minport",16384);
|
int minport = s_minport;
|
||||||
int maxport = s_cfg.getIntValue("rtp","maxport",32768);
|
int maxport = s_maxport;
|
||||||
int attempt = 10;
|
int attempt = 10;
|
||||||
if (minport > maxport) {
|
if (minport > maxport) {
|
||||||
int tmp = maxport;
|
int tmp = maxport;
|
||||||
|
@ -289,9 +303,9 @@ void YRTPWrapper::setupRTP(const char* localip)
|
||||||
Debug(&splugin,DebugWarn,"YRTPWrapper [%p] RTP bind failed in range %d-%d",this,minport,maxport);
|
Debug(&splugin,DebugWarn,"YRTPWrapper [%p] RTP bind failed in range %d-%d",this,minport,maxport);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool YRTPWrapper::startRTP(const char* raddr, unsigned int rport, int payload, int evpayload, const char* format)
|
bool YRTPWrapper::startRTP(const char* raddr, unsigned int rport, const Message& msg)
|
||||||
{
|
{
|
||||||
Debug(&splugin,DebugAll,"YRTPWrapper::startRTP(\"%s\",%u,%d) [%p]",raddr,rport,payload,this);
|
Debug(&splugin,DebugAll,"YRTPWrapper::startRTP(\"%s\",%u) [%p]",raddr,rport,this);
|
||||||
if (!m_rtp) {
|
if (!m_rtp) {
|
||||||
Debug(&splugin,DebugWarn,"YRTPWrapper [%p] attempted to start RTP before setup!",this);
|
Debug(&splugin,DebugWarn,"YRTPWrapper [%p] attempted to start RTP before setup!",this);
|
||||||
return false;
|
return false;
|
||||||
|
@ -303,6 +317,15 @@ bool YRTPWrapper::startRTP(const char* raddr, unsigned int rport, int payload, i
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String p(msg.getValue("payload"));
|
||||||
|
if (p.null())
|
||||||
|
p = msg.getValue("format");
|
||||||
|
int payload = p.toInteger(dict_payloads,-1);
|
||||||
|
int evpayload = msg.getIntValue("evpayload",101);
|
||||||
|
const char* format = msg.getValue("format");
|
||||||
|
p = msg.getValue("tos",s_tos);
|
||||||
|
int tos = p.toInteger(dict_tos,0);
|
||||||
|
|
||||||
if (!format)
|
if (!format)
|
||||||
format = lookup(payload, dict_payloads);
|
format = lookup(payload, dict_payloads);
|
||||||
if (!format) {
|
if (!format) {
|
||||||
|
@ -357,7 +380,8 @@ bool YRTPWrapper::startRTP(const char* raddr, unsigned int rport, int payload, i
|
||||||
return false;
|
return false;
|
||||||
m_rtp->dataPayload(payload);
|
m_rtp->dataPayload(payload);
|
||||||
m_rtp->eventPayload(evpayload);
|
m_rtp->eventPayload(evpayload);
|
||||||
m_bufsize = s_cfg.getIntValue("rtp","buffer",240);
|
m_rtp->setTOS(tos);
|
||||||
|
m_bufsize = s_bufsize;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -584,12 +608,8 @@ bool AttachHandler::received(Message &msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rip && rport) {
|
if (rip && rport)
|
||||||
String p(msg.getValue("payload"));
|
w->startRTP(rip,rport.toInteger(),msg);
|
||||||
if (p.null())
|
|
||||||
p = msg.getValue("format");
|
|
||||||
w->startRTP(rip,rport.toInteger(),p.toInteger(dict_payloads,-1),msg.getIntValue("evpayload",101),msg.getValue("format"));
|
|
||||||
}
|
|
||||||
msg.setParam("localip",lip);
|
msg.setParam("localip",lip);
|
||||||
msg.setParam("localport",String(w->port()));
|
msg.setParam("localport",String(w->port()));
|
||||||
msg.setParam("rtpid",w->id());
|
msg.setParam("rtpid",w->id());
|
||||||
|
@ -675,12 +695,8 @@ bool RtpHandler::received(Message &msg)
|
||||||
if (w->deref())
|
if (w->deref())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (rip && rport) {
|
if (rip && rport)
|
||||||
String p(msg.getValue("payload"));
|
w->startRTP(rip,rport.toInteger(),msg);
|
||||||
if (p.null())
|
|
||||||
p = msg.getValue("format");
|
|
||||||
w->startRTP(rip,rport.toInteger(),p.toInteger(dict_payloads,-1),msg.getIntValue("evpayload",101),msg.getValue("format"));
|
|
||||||
}
|
|
||||||
msg.setParam("localport",String(w->port()));
|
msg.setParam("localport",String(w->port()));
|
||||||
msg.setParam("rtpid",w->id());
|
msg.setParam("rtpid",w->id());
|
||||||
|
|
||||||
|
@ -726,8 +742,12 @@ void YRTPPlugin::statusParams(String& str)
|
||||||
void YRTPPlugin::initialize()
|
void YRTPPlugin::initialize()
|
||||||
{
|
{
|
||||||
Output("Initializing module YRTP");
|
Output("Initializing module YRTP");
|
||||||
s_cfg = Engine::configFile("yrtpchan");
|
Configuration cfg(Engine::configFile("yrtpchan"));
|
||||||
s_cfg.load();
|
cfg.load();
|
||||||
|
s_minport = cfg.getIntValue("general","minport",MIN_PORT);
|
||||||
|
s_maxport = cfg.getIntValue("general","maxport",MAX_PORT);
|
||||||
|
s_bufsize = cfg.getIntValue("general","buffer",BUF_SIZE);
|
||||||
|
s_tos = cfg.getValue("general","tos");
|
||||||
setup();
|
setup();
|
||||||
if (m_first) {
|
if (m_first) {
|
||||||
m_first = false;
|
m_first = false;
|
||||||
|
|
Loading…
Reference in New Issue