aboutsummaryrefslogtreecommitdiffstats
path: root/vnet/vnet/map/examples/mt-test.py
blob: 62d269c7a13778e0e64cc86dd401fe87226bb7b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/env python

# Copyright (c) 2009-2014 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import threading
import time
from scapy.all import *
from Queue import *

iface = 'veth1'

class SnifferThread(threading.Thread) :
    def __init__(self,q,iface,flt,timeout) :
        threading.Thread.__init__(self)
        self.q = q
        self.iface = iface
        self.timeout = timeout
        self.flt = flt
        print("Sniffers reporting for service on ",self.iface)
 
    def run(self) :
        conf.iface=self.iface
        conf.iface6=self.iface

        r = sniff(filter=self.flt,iface=self.iface,timeout=self.timeout,prn=lambda x: x.summary())
        self.q.put(r)



# New "SR" function
#   Fire off thread with filter and expected answer packet(s).
# Fire off sniffer thread, main thread sends packet
#   Returns true if found

def sr2(answer, *args, **kwargs):
    q = Queue()
    print("Creating SnifferThreadWorkerThread")
    flt='ip proto 41'
    iface='veth1'
    sniffer = SnifferThread(q,iface,flt,1)
    sniffer.setDaemon(True)
    sniffer.start()

    print "Sending packet:"
    send(*args, **kwargs)
    sniffer.join()
    ps = q.get()
    
#    ps.summary()
    print "Number of packets sniffed:", len(ps)

    for p in ps:
        ip = p.getlayer(1)
        print "Comparing", ip.summary(), "and", answer.summary()
        if ip == answer:
            print "We have a match!!"
            return True
    return False

aip6 = IPv6(dst='2002:0a0a:0a0a::12')/ICMPv6EchoRequest()
answer= IP(src="10.0.0.100",dst="10.10.10.10",ttl=63)/aip6
packet = IPv6(dst='2002:0a0a:0a0a::12')/ICMPv6EchoRequest()

# From IPv6
sr2(answer, packet,iface='veth1')

#From IPv4
packet = IP(src='10.10.10.10',dst='10.0.0.100')/IPv6(src='2002:0a0a:0a0a::12',dst='1::2')/ICMPv6EchoRequest()
sr2(answer, packet,iface='veth1')