From 6c888f0bfb2af77c72be6fb17c88f427c6419773 Mon Sep 17 00:00:00 2001 From: Emil Ivov Date: Fri, 13 Jul 2012 22:22:44 +0000 Subject: [PATCH] Increases hole punch packet count to 3 from 1 --- .../protocol/media/TransportManager.java | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/net/java/sip/communicator/service/protocol/media/TransportManager.java b/src/net/java/sip/communicator/service/protocol/media/TransportManager.java index 6a3cd6a22..a9326eaf2 100644 --- a/src/net/java/sip/communicator/service/protocol/media/TransportManager.java +++ b/src/net/java/sip/communicator/service/protocol/media/TransportManager.java @@ -74,6 +74,17 @@ public abstract class TransportManager> private static final String RTP_VIDEO_DSCP_PROPERTY = "net.java.sip.communicator.impl.protocol.RTP_VIDEO_DSCP"; + /** + * Number of empty UDP packets to send for NAT hole punching. + */ + private static final String HOLE_PUNCH_PKT_COUNT_PROPERTY = + "net.java.sip.communicator.impl.protocol.HOLE_PUNCH_PKT_COUNT"; + + /** + * Number of empty UDP packets to send for NAT hole punching. + */ + private static final int DEFAULT_HOLE_PUNCH_PKT_COUNT = 3; + /** * The {@link MediaAwareCallPeer} whose traffic we will be taking care of. */ @@ -360,8 +371,9 @@ public InetAddress getLastUsedLocalHost() } /** - * Send empty UDP packet to target destination data/control ports - * in order to open port on NAT or RTP proxy if any. + * Send empty UDP packets to target destination data/control ports + * in order to open ports on NATs or and help RTP proxies latch onto our + * RTP ports. * * @param target MediaStreamTarget * @param type the {@link MediaType} of the connector we'd like to send @@ -369,18 +381,30 @@ public InetAddress getLastUsedLocalHost() */ public void sendHolePunchPacket(MediaStreamTarget target, MediaType type) { - if (logger.isInfoEnabled()) - logger.info("Try to open port on NAT if any"); + logger.info("Send NAT hole punch packets"); + + //check how many hole punch packets we would be supposed to send: + int packetCount = ProtocolMediaActivator.getConfigurationService() + .getInt( HOLE_PUNCH_PKT_COUNT_PROPERTY, + DEFAULT_HOLE_PUNCH_PKT_COUNT); + + if (packetCount < 0) + packetCount = DEFAULT_HOLE_PUNCH_PKT_COUNT; + try { StreamConnector connector = getStreamConnector(type); synchronized(connector) { - if(connector.getProtocol() != StreamConnector.Protocol.TCP) - { - DatagramSocket socket; + if(connector.getProtocol() == StreamConnector.Protocol.TCP) + return; + + DatagramSocket socket; + //we may want to send more than one packet in case they get lost + for(int i=0; i < packetCount; i++) + { /* data port (RTP) */ if((socket = connector.getDataSocket()) != null) {