our @access_list = (
# half-life - untested (packet dump only)
{
+ name => 'Half-Life',
ports => [ 27015 ],
sizes => [ 16 ]
},
# cs 1.6 - verified
# (funker muligens for _alle_ source-spill inkl. hl2/cs:s)
{
+ name => 'CS 1.6, other Source games',
ports => [ 4242, "26900..26905", "27015..27020" ],
sizes => [ 25 ]
},
# doom 3 - verified
{
+ name => 'Doom 3',
ports => [ "27666..27673" ],
sizes => [ 14 ]
},
# quake 1 - verified
{
+ name => 'Quake 1',
ports => [ 26000 ],
sizes => [ 12 ]
},
# q3a - tested with demo only
# rtcw: enemy territory - untested (packet dump only)
{
+ name => 'Quake 3 Arena, RTCW: ET',
ports => [ "27960..27969" ],
sizes => [ 15 ]
},
# bf2 - tested with demo only
# bf2142 reportedly uses same engine
{
+ name => 'BF2/BF2142',
ports => [ "29900..29950" ],
sizes => [ 8 ]
},
# bf1942 - unverified (packet dump only)
{
+ name => 'BF1942',
ports => [ "22000..22010" ],
sizes => [ 8 ]
},
# quake 4 - tested with demo only, MUST select "internet"
{
+ name => 'Quake 4',
ports => [ 27950, 28004 ],
sizes => [ 14 ]
},
# quake 2 - untested (packet dump only)
{
+ name => 'Quake 2',
ports => [ 27910 ],
sizes => [ 11 ]
},
# warcraft 3 - untested (packet dump only)
{
+ name => 'Warcraft 3',
ports => [ "6112..6119" ],
sizes => [ 16, 48 ],
filter => sub { return (ord(substr(shift, 1, 1)) == 0x2f); }
# ut2003/ut2004 - untested (packet dump only)
{
+ name => 'UT2003/UT2004',
ports => [ 10777 ],
sizes => [ 5 ]
},
# soldat - untested (packet dump only)
{
+ name => 'Soldat',
ports => [ 23073 ],
sizes => [ 8 ]
},
# starcraft - untested (packet dump only)
{
+ name => 'Starcraft',
ports => [ 6111, 6112 ],
sizes => [ 8, 20 ]
},
# trackmania nations - untested (packet dump only)
{
+ name => 'Trackmania Nations',
ports => [ "2350..2370" ],
sizes => [ 42 ]
},
# company of heroes - untested (packet dump only)
{
+ name => 'Company of Heroes',
ports => [ 9100 ],
sizes => [ 39 ]
},
# command & conquer 3 - untested (packet dump only, reported to have some kind
# of chat functionality)
- {
- ports => [ "8086..8093" ],
- sizes => [ 476 ]
- },
+# {
+# ports => [ "8086..8093" ],
+# sizes => [ 476 ]
+# },
# unreal tournament, port 9777?
)
for my $sport (keys %active_surveys) {
my $age = Time::HiRes::tv_interval($active_surveys{$sport}{start}, $now);
if ($age > $Config::survey_time && $active_surveys{$sport}{active}) {
- print "Survey for port " . $active_surveys{$sport}{dport} . ": " .
- $active_surveys{$sport}{num} . " active servers.\n";
+ print "Survey for '" . $Config::access_list[$active_surveys{$sport}{entry}]->{name} . "'/" .
+ $active_surveys{$sport}{dport} . ": " . $active_surveys{$sport}{num} . " active servers.\n";
$active_surveys{$sport}{active} = 0;
}
if ($age > $Config::survey_time * 3.0) {
# We don't get the packet's destination address, but I guess this should do...
# Check against the ACL.
my $pass = 0;
+ my $entry = -1;
for my $rule (@Config::access_list) {
+ ++$entry;
+
next unless (mbd::match_ranges($dport, $rule->{'ports'}));
next unless (mbd::match_ranges($size, $rule->{'sizes'}));
# The packet is OK! Do we already have a recent enough survey
# for this port, or should we use this packet?
my $survey = 1;
- if (exists($last_survey{$dport})) {
- my $age = Time::HiRes::tv_interval($last_survey{$dport}, $now);
+ if (exists($last_survey{$entry . "/" . $dport})) {
+ my $age = Time::HiRes::tv_interval($last_survey{$entry . "/" . $dport}, $now);
if ($age < $Config::survey_freq) {
$survey = 0;
}
# New survey; find an unused port
my $survey_sport;
- for my $port ($Config::survey_port_low..$Config::survey_port_high) {
- if (!exists($active_surveys{$port})) {
- $survey_sport = $port;
-
- $active_surveys{$port} = {
- start => $now,
- active => 1,
- dport => $dport,
- num => 0
- };
- $last_survey{$dport} = $now;
-
- last;
+ if ($survey) {
+ for my $port ($Config::survey_port_low..$Config::survey_port_high) {
+ if (!exists($active_surveys{$port})) {
+ $survey_sport = $port;
+
+ $active_surveys{$port} = {
+ start => $now,
+ active => 1,
+ dport => $dport,
+ entry => $entry,
+ num => 0
+ };
+ $last_survey{$entry . "/" . $dport} = $now;
+
+ last;
+ }
}
- }
- if (!defined($survey_sport)) {
- print "WARNING: no free survey source ports, not surveying.\n";
- $survey = 0;
+ if (!defined($survey_sport)) {
+ print "WARNING: no free survey source ports, not surveying.\n";
+ $survey = 0;
+ }
}
my $num_nets = 0;
package Config;
our $survey_ip = "87.76.254.2";
-our $survey_port_low = 60000;
-our $survey_port_high = 60500;
+our $survey_port_low = 60100;
+our $survey_port_high = 60600;
our $survey_freq = 60.0;
-our $survey_time = 3.0;
+our $survey_time = 10.0;
1;