/* * Created on Mar 20, 2004 * Created by Alon Rohter * Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * AELITIS, SAS au capital de 46,603.30 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package org.gudy.azureus2.core3.peer.util; import java.util.HashSet; import java.util.Set; import org.gudy.azureus2.core3.config.*; import org.gudy.azureus2.core3.util.Constants; /** * Varies peer connection utility methods. */ public class PeerUtils { private static final String CONFIG_MAX_CONN_PER_TORRENT = "Max.Peer.Connections.Per.Torrent"; private static final String CONFIG_MAX_CONN_TOTAL = "Max.Peer.Connections.Total"; public static int MAX_CONNECTIONS_PER_TORRENT; public static int MAX_CONNECTIONS_TOTAL; static{ COConfigurationManager.addParameterListener( CONFIG_MAX_CONN_PER_TORRENT, new ParameterListener() { public void parameterChanged( String parameterName ) { MAX_CONNECTIONS_PER_TORRENT = COConfigurationManager.getIntParameter(CONFIG_MAX_CONN_PER_TORRENT); } }); MAX_CONNECTIONS_PER_TORRENT = COConfigurationManager.getIntParameter(CONFIG_MAX_CONN_PER_TORRENT); COConfigurationManager.addParameterListener( CONFIG_MAX_CONN_TOTAL, new ParameterListener() { public void parameterChanged( String parameterName ) { MAX_CONNECTIONS_TOTAL = COConfigurationManager.getIntParameter(CONFIG_MAX_CONN_TOTAL); } }); MAX_CONNECTIONS_TOTAL = COConfigurationManager.getIntParameter(CONFIG_MAX_CONN_TOTAL); } /** * Get the number of new peer connections allowed for the given data item, * within the configured per-torrent and global connection limits. * @return max number of new connections allowed, or -1 if there is no limit */ public static int numNewConnectionsAllowed( PeerIdentityDataID data_id, int specific_max ) { int curConnPerTorrent = PeerIdentityManager.getIdentityCount( data_id ); int curConnTotal = PeerIdentityManager.getTotalIdentityCount(); // specific max here will default to the global per-torrent default if not explicitly set // so we don't need to consider CONFIG_MAX_CONN_PER_TORRENT seperately int PER_TORRENT_LIMIT = specific_max; int perTorrentAllowed = -1; //default unlimited if ( PER_TORRENT_LIMIT != 0 ) { //if limited int allowed = PER_TORRENT_LIMIT - curConnPerTorrent; if ( allowed < 0 ) allowed = 0; perTorrentAllowed = allowed; } int totalAllowed = -1; //default unlimited if ( MAX_CONNECTIONS_TOTAL != 0 ) { //if limited int allowed = MAX_CONNECTIONS_TOTAL - curConnTotal; if ( allowed < 0 ) allowed = 0; totalAllowed = allowed; } int allowed = -1; //default unlimited if ( perTorrentAllowed > -1 && totalAllowed > -1 ) { //if both limited allowed = Math.min( perTorrentAllowed, totalAllowed ); } else if ( perTorrentAllowed == -1 || totalAllowed == -1 ) { //if either unlimited allowed = Math.max( perTorrentAllowed, totalAllowed ); } return allowed; } private static Set ignore_peer_ports = new HashSet(); static{ COConfigurationManager.addParameterListener( "Ignore.peer.ports", new ParameterListener() { public void parameterChanged( String parameterName ) { readIgnorePeerPorts(); } }); readIgnorePeerPorts(); } private static void readIgnorePeerPorts() { // XXX Optimize me for ranges!! String str = COConfigurationManager.getStringParameter( "Ignore.peer.ports" ).trim(); ignore_peer_ports.clear(); if ( str.length() > 0 ){ String[] ports = str.split("\\;"); if (ports != null && ports.length > 0) { for (int i = 0; i < ports.length; i++) { String port = ports[i]; int spreadPos = port.indexOf('-'); if (spreadPos > 0 && spreadPos < port.length() - 1) { try { int iMin = Integer.parseInt(port.substring(0, spreadPos).trim()); int iMax = Integer.parseInt(port.substring(spreadPos + 1).trim()); for (int j = iMin; j <= iMax; j++) { ignore_peer_ports.add("" + j); } } catch (Exception e) { } } else { ignore_peer_ports.add(port.trim()); } } } } } public static boolean ignorePeerPort( int port ) { return( ignore_peer_ports.contains( "" + port )); } static final String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; public static byte[] createPeerID() { byte[] peerId = new byte[20]; byte[] version = Constants.VERSION_ID; for (int i = 0; i < 8; i++) { peerId[i] = version[i]; } for (int i = 8; i < 20; i++) { int pos = (int) ( Math.random() * chars.length()); peerId[i] = (byte)chars.charAt(pos); } // System.out.println( "generated new peer id:" + ByteFormatter.nicePrint(peerId)); return( peerId ); } public static byte[] createWebSeedPeerID() { byte[] peerId = new byte[20]; peerId[0] = '-'; peerId[1] = 'W'; peerId[2] = 'S'; for (int i = 3; i < 20; i++) { int pos = (int) ( Math.random() * chars.length()); peerId[i] = (byte)chars.charAt(pos); } // System.out.println( "generated new peer id:" + ByteFormatter.nicePrint(peerId)); return( peerId ); } }