merge RTP relay with Stun server

git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@86 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
This commit is contained in:
jehan 2008-10-14 16:19:49 +00:00
parent 92ace8fd22
commit a744f3de1b
4 changed files with 42 additions and 22 deletions

View file

@ -26,6 +26,8 @@ import java.net.InetSocketAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
@ -40,14 +42,17 @@ public class GenericUdpSession implements Runnable {
private final DatagramSocket mLocalSocket;
private final Thread mLocalSocketThread;
private final MessageHandler mMessageHandler;
private final List<MessageHandler> mMessageHandlerList = new ArrayList<MessageHandler>();
private boolean mExit = false;
public GenericUdpSession(InetSocketAddress aSocketAddress,MessageHandler aMessageHandler) throws SocketException, UnknownHostException {
mMessageHandler = aMessageHandler;
public GenericUdpSession(InetSocketAddress aSocketAddress) throws SocketException, UnknownHostException {
mLocalSocket = new DatagramSocket(aSocketAddress);
mLocalSocketThread = new Thread(this,"udp session rtp ["+aSocketAddress+"]");
mLocalSocketThread.start();
}
public GenericUdpSession(InetSocketAddress aSocketAddress,MessageHandler aMessageHandler) throws SocketException, UnknownHostException {
this(aSocketAddress);
mMessageHandlerList.add(aMessageHandler);
}
public void run() {
while (mExit != true) {
@ -56,7 +61,9 @@ public class GenericUdpSession implements Runnable {
DatagramPacket lDatagramPacket = new DatagramPacket(lBuff,lBuff.length);
mLocalSocket.receive(lDatagramPacket);
if (mLog.isInfoEnabled()) mLog.info(mLocalSocket.getLocalAddress().getHostAddress() + ":" + mLocalSocket.getLocalPort() + " datagram received from " + lDatagramPacket.getAddress().getHostAddress() + ":" + lDatagramPacket.getPort());
mMessageHandler.onMessage(lDatagramPacket);
for (MessageHandler lmMessageHandlerList : mMessageHandlerList) {
lmMessageHandlerList.onMessage(lDatagramPacket);
}
}catch(Exception e) {
//nop
@ -74,6 +81,9 @@ public class GenericUdpSession implements Runnable {
public DatagramSocket getSocket() {
return mLocalSocket;
}
public void addMessageHandler(MessageHandler aMessageHandler) {
mMessageHandlerList.add(aMessageHandler);
}
}

View file

@ -21,6 +21,7 @@ package org.linphone.p2pproxy.core.media.rtprelay;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
@ -37,8 +38,9 @@ import org.linphone.p2pproxy.core.GenericUdpSession;
public class RtpRelayServer implements GenericUdpSession.MessageHandler {
private final static Logger mLog = Logger.getLogger(RtpRelayServer.class);
private final GenericUdpSession mGenericUdpSession;
private final static Logger mLog = Logger.getLogger(RtpRelayServer.class);
private final DatagramSocket mSocket;
class RoutingTable {
class GarbageCollectorTask extends TimerTask {
@ -187,12 +189,13 @@ public class RtpRelayServer implements GenericUdpSession.MessageHandler {
private static final String SESSIONID_NAME="RSID"; //Relay session Id
private final RoutingTable mRoutingTable;
public RtpRelayServer(InetSocketAddress aSocketAddress) throws SocketException, UnknownHostException {
this(aSocketAddress,3600000,60000);
public RtpRelayServer(DatagramSocket aListeningSocket) throws SocketException, UnknownHostException {
this(aListeningSocket,3600000,60000);
}
public RtpRelayServer(InetSocketAddress aSocketAddress,long aMaxSilenceDuration, long aGCPeriod) throws SocketException, UnknownHostException {
public RtpRelayServer(DatagramSocket aListeningSocket,long aMaxSilenceDuration, long aGCPeriod) throws SocketException, UnknownHostException {
mRoutingTable = new RoutingTable(aMaxSilenceDuration,aGCPeriod);
mGenericUdpSession = new GenericUdpSession(aSocketAddress,this);
mSocket = aListeningSocket;
}
public void onMessage(DatagramPacket aMessage) {
try {
@ -218,7 +221,7 @@ public class RtpRelayServer implements GenericUdpSession.MessageHandler {
// ok forwarding
if (mLog.isInfoEnabled()) mLog.info("forwarding ["+aMessage.getLength()+"] bytes from ["+aMessage.getSocketAddress()+"] to ["+lDestAddress+"]");
aMessage.setSocketAddress(lDestAddress);
mGenericUdpSession.getSocket().send(aMessage);
mSocket.send(aMessage);
}
} catch (IOException e) {
mLog.error("cannot forward ["+aMessage+"]", e);
@ -228,11 +231,9 @@ public class RtpRelayServer implements GenericUdpSession.MessageHandler {
}
}
public InetSocketAddress getInetSocketAddress() {
return (InetSocketAddress) mGenericUdpSession.getSocket().getLocalSocketAddress();
}
public void close() {
mGenericUdpSession.close();
return (InetSocketAddress) mSocket.getLocalSocketAddress();
}
private long getSsrc(DatagramPacket aMessage) {
// The RTP header has the following format:
//

View file

@ -13,17 +13,26 @@ import junit.framework.TestCase;
import org.apache.log4j.BasicConfigurator;
import org.junit.After;
import org.junit.Before;
import org.linphone.p2pproxy.core.GenericUdpSession;
import org.linphone.p2pproxy.core.media.rtprelay.RtpRelayServer;
import org.linphone.p2pproxy.core.stun.StunServer;
public class RtpRelayServerTester extends TestCase{
static private RtpRelayServer mRtpRelayServer;
static private int RTP_SERVER_PORT = 16000;
private static GenericUdpSession mGenericUdpSession;
static StunServer mSturServer = null;
@Before
public void setUp() throws Exception {
if (mRtpRelayServer == null) {
BasicConfigurator.configure();
mRtpRelayServer = new RtpRelayServer(new InetSocketAddress(RTP_SERVER_PORT),1000,1000);
mGenericUdpSession = new GenericUdpSession(new InetSocketAddress(RTP_SERVER_PORT));
mRtpRelayServer = new RtpRelayServer(mGenericUdpSession.getSocket(),1000,1000);
mGenericUdpSession.addMessageHandler(mRtpRelayServer);
mSturServer = new StunServer(mGenericUdpSession.getSocket());
mGenericUdpSession.addMessageHandler(mSturServer);
}
}

View file

@ -61,9 +61,9 @@ public class StunServerTester extends TestCase {
if (mSturServer == null) {
BasicConfigurator.configure();
mGenericUdpSession = new GenericUdpSession(aSocketAddress,this);
if (mSturServer == null) mSturServer = new StunServer(port,InetAddress.getByName("localhost"),port+1);
mSturServer.start();
mGenericUdpSession = new GenericUdpSession(new InetSocketAddress(port));
mSturServer = new StunServer(mGenericUdpSession.getSocket());
mGenericUdpSession.addMessageHandler(mSturServer);
iaddress = InetAddress.getLocalHost();
}
di = new DiscoveryInfo(iaddress);
@ -106,7 +106,7 @@ public class StunServerTester extends TestCase {
// Test 1 including response
socketTest1 = new DatagramSocket(new InetSocketAddress(iaddress, 0));
socketTest1.setReuseAddress(true);
socketTest1.connect(InetAddress.getByName(stunServer), port);
socketTest1.connect(mGenericUdpSession.getSocket().getLocalSocketAddress());
socketTest1.setSoTimeout(timeout);
MessageHeader sendMH = new MessageHeader(MessageHeader.MessageHeaderType.BindingRequest);
@ -136,7 +136,7 @@ public class StunServerTester extends TestCase {
logger.info("Message header contains an Errorcode message attribute.");
return false;
}
if ((ma == null) || (ca == null)) {
if ((ma == null)) {
di.setError(700, "The server is sending an incomplete response (Mapped Address and Changed Address message attributes are missing). The client should not retry.");
logger.info("Response does not contain a Mapped Address or Changed Address message attribute.");
return false;
@ -172,7 +172,7 @@ public class StunServerTester extends TestCase {
* ALLOCATEREQUEST
*
*/
public void testAllocateRequest() {
public void xxxAllocateRequest() {
int timeSinceFirstTransmission = 0;
int timeout = timeoutInitValue;