Modmobmap/utils/eu_arfcn_calc.py

495 lines
15 KiB
Python
Executable File

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# ----------------------------------------------------------------------------
# "THE BEER-WARE LICENSE" (Revision 42):
# <sebastien.dudek(<@T>)penthertz.com> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a beer in return FlUxIuS ;)
# ----------------------------------------------------------------------------
from __future__ import print_function
#####################################
# UARFCN and EARFCN Calculator
#####################################
##
# Tables
#
table_earfcn = {
1 : { 'FDL_Low' : 2110,
'NDL_Offset' : 0,
'DL_range' : (0,599),
'FUL_Low' : 1920,
'NUL_Offset' : 18000,
'UP_range' : (1800,18599),
},
2 : { 'FDL_Low' : 1930,
'NDL_Offset' : 600,
'DL_range' : (600,1199),
'FUL_Low' : 1850,
'NUL_Offset' : 18600,
'UP_range' : (18600,19199),
},
3 : { 'FDL_Low' : 1805,
'NDL_Offset' : 1200,
'DL_range' : (1200,1949),
'FUL_Low' : 1710,
'NUL_Offset' : 19200,
'UP_range' : (19200,19949),
},
4 : { 'FDL_Low' : 2110,
'NDL_Offset' : 1950,
'DL_range' : (1950,2399),
'FUL_Low' : 1710,
'NUL_Offset' : 19950,
'UP_range' : (19950,20399),
},
5 : { 'FDL_Low' : 869,
'NDL_Offset' : 2400,
'DL_range' : (2400,2649),
'FUL_Low' : 824,
'NUL_Offset' : 20400,
'UP_range' : (20400,20649),
},
6 : { 'FDL_Low' : 875,
'NDL_Offset' : 2650,
'DL_range' : (2650,2749),
'FUL_Low' : 830,
'NUL_Offset' : 20650,
'UP_range' : (20650,20749),
},
7 : { 'FDL_Low' : 2620,
'NDL_Offset' : 2750,
'DL_range' : (2750,3449),
'FUL_Low' : 2500,
'NUL_Offset' : 20750,
'UP_range' : (20750,21449),
},
8 : { 'FDL_Low' : 925,
'NDL_Offset' : 3450,
'DL_range' : (3450,3799),
'FUL_Low' : 880,
'NUL_Offset' : 21450,
'UP_range' : (21450,21799),
},
9 : { 'FDL_Low' : 1844.9,
'NDL_Offset' : 3800,
'DL_range' : (3800,4149),
'FUL_Low' : 1749.9,
'NUL_Offset' : 21800,
'UP_range' : (21800,22149),
},
10 : { 'FDL_Low' : 2110,
'NDL_Offset' : 4150,
'DL_range' : (4150,4749),
'FUL_Low' : 1710,
'NUL_Offset' : 22150,
'UP_range' : (22150,22749),
},
11 : { 'FDL_Low' : 1475.9,
'NDL_Offset' : 4750,
'DL_range' : (4750,4949),
'FUL_Low' : 1427.9,
'NUL_Offset' : 22750,
'UP_range' : (22750,22949),
},
12 : { 'FDL_Low' : 729,
'NDL_Offset' : 5010,
'DL_range' : (5010,5179),
'FUL_Low' : 699,
'NUL_Offset' : 23010,
'UP_range' : (23010,23179),
},
13 : { 'FDL_Low' : 746,
'NDL_Offset' : 5180,
'DL_range' : (5180,5279),
'FUL_Low' : 777,
'NUL_Offset' : 23180,
'UP_range' : (23180,23279),
},
14 : { 'FDL_Low' : 758,
'NDL_Offset' : 5280,
'DL_range' : (5280,5379),
'FUL_Low' : 788,
'NUL_Offset' : 23280,
'UP_range' : (23280,23379),
},
17 : { 'FDL_Low' : 734,
'NDL_Offset' : 5730,
'DL_range' : (5730,5849),
'FUL_Low' : 704,
'NUL_Offset' : 23730,
'UP_range' : (23730,23849),
},
18 : { 'FDL_Low' : 860,
'NDL_Offset' : 5850,
'DL_range' : (5850,5999),
'FUL_Low' : 815,
'NUL_Offset' : 23850,
'UP_range' : (23850,23999),
},
19 : { 'FDL_Low' : 875,
'NDL_Offset' : 6000,
'DL_range' : (6000,6149),
'FUL_Low' : 830,
'NUL_Offset' : 24000,
'UP_range' : (24000,24149),
},
20 : { 'FDL_Low' : 791,
'NDL_Offset' : 6150,
'DL_range' : (6150,6449),
'FUL_Low' : 832,
'NUL_Offset' : 24150,
'UP_range' : (24150,24449),
},
21 : { 'FDL_Low' : 1495.9,
'NDL_Offset' : 6450,
'DL_range' : (6450,6599),
'FUL_Low' : 1447.9,
'NUL_Offset' : 24450,
'UP_range' : (24450,24599),
},
22 : { 'FDL_Low' : 3510,
'NDL_Offset' : 6600,
'DL_range' : (6600,7399),
'FUL_Low' : 3410,
'NUL_Offset' : 24600,
'UP_range' : (24600,25399),
},
23 : { 'FDL_Low' : 2180,
'NDL_Offset' : 7500,
'DL_range' : (7500,7699),
'FUL_Low' : 2000,
'NUL_Offset' : 25500,
'UP_range' : (25500,25699),
},
24 : { 'FDL_Low' : 1525,
'NDL_Offset' : 7700,
'DL_range' : (7700,8039),
'FUL_Low' : 1626.5,
'NUL_Offset' : 25700,
'UP_range' : (25700,26039),
},
25 : { 'FDL_Low' : 1930,
'NDL_Offset' : 8040,
'DL_range' : (8040,8689),
'FUL_Low' : 1850,
'NUL_Offset' : 26040,
'UP_range' : (26040,26689),
},
26 : { 'FDL_Low' : 859,
'NDL_Offset' : 8690,
'DL_range' : (8690,9039),
'FUL_Low' : 814,
'NUL_Offset' : 26690,
'UP_range' : (26690,27039),
},
27 : { 'FDL_Low' : 852,
'NDL_Offset' : 9040,
'DL_range' : (9040,9209),
'FUL_Low' : 807,
'NUL_Offset' : 27040,
'UP_range' : (27040,27209),
},
28 : { 'FDL_Low' : 758,
'NDL_Offset' : 9210,
'DL_range' : (9210,9659),
'FUL_Low' : 703,
'NUL_Offset' : 27210,
'UP_range' : (27210,27659),
},
30 : { 'FDL_Low' : 2350,
'NDL_Offset' : 9770,
'DL_range' : (9770,9869),
'FUL_Low' : 2305,
'NUL_Offset' : 27660,
'UP_range' : (27660,27759),
},
31 : { 'FDL_Low' : 462.5,
'NDL_Offset' : 9870,
'DL_range' : (9870,9919),
'FUL_Low' : 452.5,
'NUL_Offset' : 27760,
'UP_range' : (27760,27809),
},
38 : { 'FDL_Low' : 2570,
'NDL_Offset' : 37750,
'DL_range' : (37750,38249),
},
40 : { 'FDL_Low' : 2300,
'NDL_Offset' : 38650,
'DL_range' : (38650,39649),
},
65 : { 'FDL_Low' : 2110,
'NDL_Offset' : 65536,
'DL_range' : (65536,66435),
'FUL_Low' : 1920,
'NUL_Offset' : 131072,
'UP_range' : (131072,131971),
},
66 : { 'FDL_Low' : 2110,
'NDL_Offset' : 66436,
'DL_range' : (66436,67335),
'FUL_Low' : 1710,
'NUL_Offset' : 131972,
'UP_range' : (131972,132671),
},
68 : { 'FDL_Low' : 753,
'NDL_Offset' : 67536,
'DL_range' : (67536,67835),
'FUL_Low' : 698,
'NUL_Offset' : 132672,
'UP_range' : (132672,132971),
},
70 : { 'FDL_Low' : 1995,
'NDL_Offset' : 68336,
'DL_range' : (68336,68585),
'FUL_Low' : 1695,
'NUL_Offset' : 132972,
'UP_range' : (132972,133121),
},
71 : { 'FDL_Low' : 617,
'NDL_Offset' : 68586,
'DL_range' : (68586,68935),
'FUL_Low' : 663,
'NUL_Offset' : 133122,
'UP_range' : (133122,133471),
},
72 : { 'FDL_Low' : 461,
'NDL_Offset' : 68936,
'DL_range' : (68936,68985),
'FUL_Low' : 451,
'NUL_Offset' : 133472,
'UP_range' : (133472,133521),
},
73 : { 'FDL_Low' : 460,
'NDL_Offset' : 68986,
'DL_range' : (68986,69465),
'FUL_Low' : 450,
'NUL_Offset' : 133522,
'UP_range' : (133522,133571),
},
74 : { 'FDL_Low' : 1475,
'NDL_Offset' : 69036,
'DL_range' : (69036,69035),
'FUL_Low' : 1427,
'NUL_Offset' : 133572,
'UP_range' : (133572,134001),
},
85 : { 'FDL_Low' : 728,
'NDL_Offset' : 70366,
'DL_range' : (70366,70545),
'FUL_Low' : 698,
'NUL_Offset' : 134002,
'UP_range' : (134002,134181),
},
}
table_uarfcn = {
1 : { 'FDL_Offset' : 0,
'FDL_Low' : 2112.4,
'DL_range' : (10562,10838),
'FUL_Low' : 1922.4,
'NUL_Offset' : 0,
'UP_range' : (9612,9888),
},
2 : { 'FDL_Offset' : 0,
'FDL_Low' : 1932.4,
'DL_range' : (9662,9938),
'FUL_Low' : 1852.4,
'NUL_Offset' : 0,
'UP_range' : (9262,9538),
},
3 : { 'FDL_Offset' : 1525,
'FDL_Low' : 1712.4,
'DL_range' : (937,1288),
'FUL_Low' : 1807.4,
'NUL_Offset' : 1575,
'UP_range' : (1162,1513),
},
4 : { 'FDL_Offset' : 1805,
'FDL_Low' : 2112.4,
'DL_range' : (1537,1738),
'FUL_Low' : 1712.4,
'NUL_Offset' : 1450,
'UP_range' : (1312,1513),
},
5 : { 'FDL_Offset' : 0,
'FDL_Low' : 871.4,
'DL_range' : (4357,4458),
'FUL_Low' : 826.4,
'NUL_Offset' : 0,
'UP_range' : (4132,4233),
},
6 : { 'FDL_Offset' : 0,
'FDL_Low' : 877.4,
'DL_range' : (4387,4413),
'FUL_Low' : 832.4,
'NUL_Offset' : 0,
'UP_range' : (4162,4188),
},
7 : { 'FDL_Offset' : 2175,
'FDL_Low' : 2622.4,
'DL_range' : (2237,2563),
'FUL_Low' : 2502.4,
'NUL_Offset' : 2100,
'UP_range' : (2012,2338),
},
8 : { 'FDL_Offset' : 340,
'FDL_Low' : 927.4,
'DL_range' : (2937,3088),
'FUL_Low' : 882.4,
'NUL_Offset' : 340,
'UP_range' : (2712,2863),
},
9 : { 'FDL_Offset' : 0,
'FDL_Low' : 1847.4,
'DL_range' : (9237,93878),
'FUL_Low' : 1752.4,
'NUL_Offset' : 0,
'UP_range' : (8762,8912),
},
10 : { 'FDL_Offset' : 1490,
'FDL_Low' : 2112.4,
'DL_range' : (3112,3388),
'FUL_Low' : 1712.4,
'NUL_Offset' : 1135,
'UP_range' : (2887,3163),
},
11 : { 'FDL_Offset' : 736,
'FDL_Low' : 1478.4,
'DL_range' : (3712,3812),
'FUL_Low' : 1430.4,
'NUL_Offset' : 733,
'UP_range' : (3487,3587),
},
12 : { 'FDL_Offset' : -37,
'FDL_Low' : 730.4,
'DL_range' : (3837,3903),
'FUL_Low' : 700.4,
'NUL_Offset' : -22,
'UP_range' : (3612,3678),
},
13 : { 'FDL_Offset' : -55,
'FDL_Low' : 748.4,
'DL_range' : (4017,4043),
'FUL_Low' : 779.4,
'NUL_Offset' : 21,
'UP_range' : (3792,3818),
},
14 : { 'FDL_Offset' : -63,
'FDL_Low' : 760.4,
'DL_range' : (4117,4143),
'FUL_Low' : 790.4,
'NUL_Offset' : 12,
'UP_range' : (3892,3918),
},
19 : { 'FDL_Offset' : 735,
'FDL_Low' : 877.4,
'DL_range' : (712,763),
'FUL_Low' : 832.4,
'NUL_Offset' : 770,
'UP_range' : (312,363),
},
20 : { 'FDL_Offset' : -109,
'FDL_Low' : 793.4,
'DL_range' : (4512,4638),
'FUL_Low' : 834.4,
'NUL_Offset' : -23,
'UP_range' : (4287,4413),
},
21 : { 'FDL_Offset' : 1326,
'FDL_Low' : 1498.4,
'DL_range' : (862,912),
'FUL_Low' : 1450.4,
'NUL_Offset' : 1358,
'UP_range' : (462,512),
},
22 : { 'FDL_Offset' : 2580,
'FDL_Low' : 3512.4,
'DL_range' : (4662,5038),
'FUL_Low' : 3412.4,
'NUL_Offset' : 2525,
'UP_range' : (4437,4813),
},
25 : { 'FDL_Offset' : 910,
'FDL_Low' : 1932.4,
'DL_range' : (5112,5413),
'FUL_Low' : 1852.4,
'NUL_Offset' : 875,
'UP_range' : (4887,5188),
},
26 : { 'FDL_Offset' : -291,
'FDL_Low' : 1932.4,
'DL_range' : (5762,5913),
'FUL_Low' : 1852.4,
'NUL_Offset' : -291,
'UP_range' : (5537,5688),
},
}
##
# Functions
#
def uarfcn2freq(band, dl_uarfcn=None, ul_uarfcn=None):
'''
in(1): int band index,
in(2): int Downling UARFCN index,
in(3): int Uplink UARFCN index,
out: tuple (float downlink_freq, float uplink_freq)
'''
duplex_spacing = abs(table_uarfcn[band]['FDL_Low']-table_uarfcn[band]['FUL_Low'])
FDL_Offset = table_uarfcn[band]['FDL_Offset']
FUL_Offset = table_uarfcn[band]['NUL_Offset']
downlink_freq = uplink_freq = None
if dl_uarfcn is not None:
downlink_freq = FDL_Offset + 0.2 * dl_uarfcn
if ul_uarfcn is not None:
uplink_freq = FUL_Offset + 0.2 * ul_uarfcn
if downlink_freq is not None and uplink_freq is None:
uplink_freq = downlink_freq - duplex_spacing
elif downlink_freq is None and uplink_freq is not None:
downlink_freq = downlink_freq + duplex_spacing
return (downlink_freq, uplink_freq)
def earfcn2freq(band, dl_earfcn=None, ul_earfcn=None):
'''
in(1): int band index,
in(2): int Downling EARFCN index,
in(3): int Uplink EARFCN index,
out: tuple (float downlink_freq, float uplink_freq)
'''
NDL_Offset = table_earfcn[band]['NDL_Offset']
NUL_Offset = table_earfcn[band]['NUL_Offset']
duplex_spacing = abs(table_earfcn[band]['FDL_Low']-table_earfcn[band]['FUL_Low'])
FDL_Low = table_earfcn[band]['FDL_Low']
FUL_Low = table_earfcn[band]['FUL_Low']
downlink_freq = uplink_freq = None
if dl_earfcn is not None:
downlink_freq = FDL_Low + 0.1 * (dl_earfcn-NDL_Offset)
if ul_earfcn is not None:
uplink_freq = FUL_Low + 0.1 * (ul_earfcn-NUL_Offset)
if downlink_freq is not None and uplink_freq is None:
uplink_freq = downlink_freq - duplex_spacing
elif downlink_freq is None and uplink_freq is not None:
downlink_freq = downlink_freq + duplex_spacing
return (downlink_freq, uplink_freq)
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("nettype", type=int, help="select network type: 1 for 3G, and 2 for 4G")
parser.add_argument("band", type=int, help="Band index")
parser.add_argument("downlink", type=int, help="Downlink U/E-ARFCN")
parser.add_argument("--uplink", type=int, help="Uplink U/E-ARFCN")
args = parser.parse_args()
if args.nettype == 1:
ret = uarfcn2freq(args.band, args.downlink, args.uplink)
elif args.nettype == 2:
ret = earfcn2freq(args.band, args.downlink, args.uplink)
print ("[+] Selected Downlink ARFCN %i (band %i)" % (args.downlink, args.band))
print ("Downlink: %f MHz and Uplink: %f MHz" % (ret[0],ret[1]))