aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/contrib/gb-proxy-unblock-bug.py
blob: 0cd4b871f7b0777ca06a892610757d8489c29636 (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
#!/usr/bin/env python

"""
demonstrate a unblock bug on the GB Proxy..
"""

bts_ns_reset = "\x02\x00\x81\x01\x01\x82\x1f\xe7\x04\x82\x1f\xe7"
ns_reset_ack = "\x03\x01\x82\x1f\xe7\x04\x82\x1f\xe7"

bts_ns_unblock = "\x06"
ns_unblock_ack = "\x07"

bts_bvc_reset_0 = "\x00\x00\x00\x00\x22\x04\x82\x00\x00\x07\x81\x03\x3b\x81\x02"
ns_bvc_reset_0_ack = "\x00\x00\x00\x00\x23\x04\x82\x00\x00"

bts_bvc_reset_8167 = "\x00\x00\x00\x00\x22\x04\x82\x1f\xe7\x07\x81\x08\x08\x88\x72\xf4\x80\x10\x1c\x00\x9c\x40"


import socket
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket.bind(("0.0.0.0", 0))
socket.setblocking(1)


import sys
port = int(sys.argv[1])
print "Sending data to port: %d" % port

def send_and_receive(packet):
    socket.sendto(packet, ("127.0.0.1", port))

    try:
        data, addr = socket.recvfrom(4096)
    except socket.error, e:
        print "ERROR", e
        import sys
        sys.exit(0)
    return data

#send stuff once

to_send = [
    (bts_ns_reset, ns_reset_ack, "reset ack"),
    (bts_ns_unblock, ns_unblock_ack, "unblock ack"),
    (bts_bvc_reset_0, ns_bvc_reset_0_ack, "BVCI=0 reset ack"),
]


for (out, inp, type) in to_send:
    res = send_and_receive(out)
    if res != inp:
        print "Failed to get the %s" % type
        sys.exit(-1)

import time
time.sleep(3)
res = send_and_receive(bts_bvc_reset_8167)
print "Sent all messages... check wireshark for the last response"