Check that vnet properly receives SYN/ACK packets
[tests.git] / qaapi / qa / tests / node / synacks.pl
1 #!/usr/bin/perl
2 # Generate a ton of connections and check if we can see syn/ack packets via tcpdump
3
4 use strict;
5 use IO::Socket;
6 use threads;
7 use threads::shared;
8
9 my $guineapig='www.cs.princeton.edu';
10 my $targetfile='/~sapanb/small';
11 my $magic='3j4kl;1234kj341234jl1k234ljk123h4';
12 my $numiter=1000;
13 my $numsynacks:shared=0;
14 my $numthreads=4;
15 my $numpackets=$numthreads*$numiter;
16
17 sub fetch {
18         my $sock = new IO::Socket::INET (
19                 PeerAddr => $guineapig,
20                 PeerPort => 80,
21                 Proto => 'tcp'
22         );
23         return 0 unless $sock;
24         print $sock "GET $targetfile HTTP/1.0\r\n";
25         print $sock "Host: www.cs.princeton.edu\r\n";
26         print $sock "\r\n";
27
28         my $success=0;
29         while (<$sock>) {
30                 if (/$magic/g) {
31                         $success=1;
32                         last;
33                 }
34         }
35         close ($sock);
36         if ($success==1) {
37                 $numsynacks=$numsynacks+1;
38         }
39         return $success;
40 }
41
42 sub mfetch {
43         foreach (1..$numiter) {
44                 fetch;
45         }
46 }
47
48 sub launch {
49         my @tarray;
50         foreach (1..$numthreads) {
51                 my $thr = threads->create(\&mfetch);
52                 push @tarray,$thr;
53         }
54
55         for (@tarray) {
56                 $_->join;
57         }
58 }
59
60 sub open_tcpdump {
61         my $filter="'tcp[tcpflags]&tcp-syn !=0 and tcp[tcpflags]&tcp-ack !=0 and src $guineapig'";
62         my $cmdline="/usr/sbin/tcpdump -c $numpackets $filter";
63         my $p;
64         
65         system($cmdline);
66 }
67
68 sub alhandler {
69         print "[FAILED] tcpdump apparently did not intercept all SYN/ACK packets\n";
70         exit(-1);
71 }
72
73 print "Starting tcpdump...\n";
74 my $tcpdthr=threads->create(\&open_tcpdump);
75 sleep 10;
76 print "Generating connections...\n";
77 launch;
78 $SIG{ALRM}=\&alhandler;
79 alarm(60);
80 $tcpdthr.join;
81 print "[SUCCESS] Test completed OK. $numsynacks SYN/ACK packets intercepted.\n";