Files
wlan-lanforge-scripts/py-json/wlan_theoretical_sta.py
2021-02-05 17:25:31 -08:00

2229 lines
96 KiB
Python
Executable File

'''
Candela Technologies Inc.
Info : Standard Script for WLAN Capaity Calculator
Date :
Author : Anjali Rahamatkar
This Script has three classes :
1. abg11_calculator : It will take all the user input of 802.11a/b/g station,calculate Intermediate values and Theoretical values.
2. n11_calculator : It will take all the user input of 802.11n station,calculate Intermediate values and Theoretical values.
3. ac11_calculator : It will take all the user input of 802.11ac station,calculate Intermediate values and Theoretical values.
All classes have different functions: input_parameter() that calculates intermediate values and generate theroretical data
'''
import argparse
import json
# Class to take all user input (802.11a/b/g Standard)
class abg11_calculator():
def __init__(self, Traffic_Type, PHY_Bit_Rate, Encryption, QoS, MAC_Frame_802_11, Basic_Rate_Set, Preamble,
slot_name, Codec_Type, RTS_CTS_Handshake, CTS_to_self):
self.Traffic_Type = Traffic_Type
self.PHY_Bit_Rate = PHY_Bit_Rate
self.Encryption = Encryption
self.QoS = QoS
self.MAC_Frame_802_11 = MAC_Frame_802_11
self.Basic_Rate_Set = Basic_Rate_Set
self.Preamble = Preamble
self.slot_name = slot_name
self.Codec_Type = Codec_Type
self.RTS_CTS_Handshake = RTS_CTS_Handshake
self.CTS_to_self = CTS_to_self
# This function is for calculate intermediate values and Theoretical values
@staticmethod
def create_argparse(prog=None, formatter_class=None, epilog=None, description=None):
if (prog is not None) or (formatter_class is not None) or (epilog is not None) or (description is not None):
ap = argparse.ArgumentParser(prog=prog,
formatter_class=formatter_class,
allow_abbrev=True,
epilog=epilog,
description=description)
else:
ap = argparse.ArgumentParser()
# Station : 11abg
ap.add_argument("-sta", "--station", help="Enter Station Name : [11abg,11n,11ac](by Default 11abg)")
ap.add_argument("-t", "--traffic", help="Enter the Traffic Type : [Data,Voice](by Default Data)")
ap.add_argument("-p", "--phy",
help="Enter the PHY Bit Rate of Data Flow : [1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54](by Default 54)")
ap.add_argument("-e", "--encryption",
help="Enter the Encryption : [None, WEP , TKIP, CCMP](by Default None)")
ap.add_argument("-q", "--qos", help="Enter the QoS = : [No, Yes](by Default [No for 11abg] and [Yes for 11n])")
ap.add_argument("-m", "--mac",
help="Enter the 802.11 MAC Frame : [Any Value](by Default [106 for 11abg] and [1538 for 11n])")
ap.add_argument("-b", "--basic", nargs='+',
help="Enter the Basic Rate Set : [1,2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54]"
" (by Default [1 2 5.5 11 6 12] for 11abg, [6 12 24] for 11n/11ac])")
ap.add_argument("-pre", "--preamble", help="Enter Preamble value : [ Short, Long, N/A](by Default Short)")
ap.add_argument("-s", "--slot", help="Enter the Slot Time : [Short, Long, N/A](by Default Short)")
ap.add_argument("-co", "--codec", help="Enter the Codec Type (Voice Traffic): {[ G.711 , G.723 , G.729]"
"by Default G.723 for 11abg, G.711 for 11n} and"
"{['Mixed','Greenfield'] by Default Mixed for 11ac}")
ap.add_argument("-r", "--rts", help="Enter the RTS/CTS Handshake : [No, Yes](by Default No)")
ap.add_argument("-c", "--cts", help="Enter the CTS-to-self (protection) : [No, Yes](by Default No)")
# Station : 11n and 11ac
ap.add_argument("-d", "--data",
help="Enter the Data/Voice MCS Index : ['0','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']by Default 7")
ap.add_argument("-ch", "--channel",
help="Enter the Channel Bandwidth = : ['20','40'] by Default 40 for 11n and "
"['20','40','80'] by Default 80 for 11ac")
ap.add_argument("-gu", "--guard", help="Enter the Guard Interval = : ['400','800'] (by Default 400)")
ap.add_argument("-high", "--highest",
help="Enter the Highest Basic MCS = : ['0','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'](by Default 1)")
ap.add_argument("-pl", "--plcp",
help="Enter the PLCP Configuration = : ['Mixed','Greenfield'] (by Default Mixed) for 11n")
ap.add_argument("-ip", "--ip",
help="Enter the IP Packets per A-MSDU = : ['0','1','2','3','4','5','6','7','8','9',"
"'10','11','12','13','14','15','16','17','18','19','20'] (by Default 0)")
ap.add_argument("-mc", "--mc",
help="Enter the MAC Frames per A-MPDU = : ['0','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'](by Default [42 for 11n] and [64 for 11ac])")
ap.add_argument("-cw", "--cwin",
help="Enter the CWmin (leave alone for default) = : [Any Value] (by Default 15)")
ap.add_argument("-spa", "--spatial", help="Enter the Spatial Streams = [1,2,3,4] (by Default 4)")
ap.add_argument("-rc", "--rtscts", help="Enter the RTS/CTS Handshake and CTS-to-self "
" = ['No','Yes'] (by Default No for 11ac)")
return ap
def calculate(self):
PHY_Bit_Rate_float = float(self.PHY_Bit_Rate)
PHY_Bit_Rate_int = int(PHY_Bit_Rate_float)
if PHY_Bit_Rate_int < 12:
if PHY_Bit_Rate_int < 5:
yellow_cell = PHY_Bit_Rate_int
else:
if PHY_Bit_Rate_int == 5:
yellow_cell = 5.5
else:
if PHY_Bit_Rate_int == 11:
yellow_cell = 11
else:
if PHY_Bit_Rate_int == 6:
yellow_cell = 6
else:
if PHY_Bit_Rate_int == 9:
yellow_cell = 9
else:
if PHY_Bit_Rate_int == 12:
yellow_cell = 12
else:
if PHY_Bit_Rate_int == 18:
yellow_cell = 18
else:
if PHY_Bit_Rate_int == 24:
yellow_cell = 24
else:
if PHY_Bit_Rate_int == 36:
yellow_cell = 36
else:
if PHY_Bit_Rate_int == 48:
yellow_cell = 48
else:
yellow_cell = 54
# (IP Packet)
if "None" in self.Encryption:
Enc_value = 0
else:
if "WEP" in self.Encryption:
Enc_value = 8
else:
if "TKIP" in self.Encryption:
Enc_value = 20
else:
Enc_value = 16
if "Yes" in self.QoS:
Qos_value = 2
else:
Qos_value = 0
ip_packet_1 = int(self.MAC_Frame_802_11) - 36 - float(Enc_value) - float(Qos_value)
ip_packet = int(ip_packet_1)
if ip_packet < 20:
get_ip_packet = "N/A"
ip = 0
else:
get_ip_packet = ip_packet
ip = 1
# (Ethernet MAC Frame)
encrpt = float(self.MAC_Frame_802_11) - 24 - 8 + 14 - float(Enc_value) - float(Qos_value)
Ethernet_MAC_Frame_int = max(encrpt, 64)
Ethernet_value = int(Ethernet_MAC_Frame_int)
get_ethernet = Ethernet_value
# Usable Basic Rates
if "1" in self.Basic_Rate_Set:
if "1" in self.Basic_Rate_Set and yellow_cell >= 1:
Usable_Basic_Rates_1 = 1
else:
Usable_Basic_Rates_1 = 0
else:
Usable_Basic_Rates_1 = 0
if "2" in self.Basic_Rate_Set:
if "2" in self.Basic_Rate_Set and yellow_cell >= 2:
Usable_Basic_Rates_2 = 2
else:
Usable_Basic_Rates_2 = 0
else:
Usable_Basic_Rates_2 = 0
if "5.5" in self.Basic_Rate_Set:
if "5.5" in self.Basic_Rate_Set and yellow_cell >= 5:
Usable_Basic_Rates_5 = 5.5
else:
Usable_Basic_Rates_5 = 0
else:
Usable_Basic_Rates_5 = 0
if "11" in self.Basic_Rate_Set:
if "11" in self.Basic_Rate_Set and yellow_cell >= 11:
Usable_Basic_Rates_11 = 11
else:
Usable_Basic_Rates_11 = 0
else:
Usable_Basic_Rates_11 = 0
if "6" in self.Basic_Rate_Set:
if "6" in self.Basic_Rate_Set and yellow_cell >= 6:
Usable_Basic_Rates_6 = 6
else:
Usable_Basic_Rates_6 = 0
else:
Usable_Basic_Rates_6 = 0
if "9" in self.Basic_Rate_Set:
if "9" in self.Basic_Rate_Set and yellow_cell >= 9:
Usable_Basic_Rates_9 = 9
else:
Usable_Basic_Rates_9 = 0
else:
Usable_Basic_Rates_9 = 0
if "12" in self.Basic_Rate_Set:
if "12" in self.Basic_Rate_Set and yellow_cell >= 12:
Usable_Basic_Rates_12 = 12
else:
Usable_Basic_Rates_12 = 0
else:
Usable_Basic_Rates_12 = 0
if "18" in self.Basic_Rate_Set:
if "18" in self.Basic_Rate_Set and yellow_cell >= 18:
Usable_Basic_Rates_18 = 18
else:
Usable_Basic_Rates_18 = 0
else:
Usable_Basic_Rates_18 = 0
if "24" in self.Basic_Rate_Set:
if "24" in self.Basic_Rate_Set and yellow_cell >= 24:
Usable_Basic_Rates_24 = 24
else:
Usable_Basic_Rates_24 = 0
else:
Usable_Basic_Rates_24 = 0
if "36" in self.Basic_Rate_Set:
if "36" in self.Basic_Rate_Set and yellow_cell >= 36:
Usable_Basic_Rates_36 = 36
else:
Usable_Basic_Rates_36 = 0
else:
Usable_Basic_Rates_36 = 0
if "48" in self.Basic_Rate_Set:
if "48" in self.Basic_Rate_Set and yellow_cell >= 48:
Usable_Basic_Rates_48 = 48
else:
Usable_Basic_Rates_48 = 0
else:
Usable_Basic_Rates_48 = 0
if "54" in self.Basic_Rate_Set:
if "54" in self.Basic_Rate_Set and yellow_cell >= 54:
Usable_Basic_Rates_54 = 54
else:
Usable_Basic_Rates_54 = 0
else:
Usable_Basic_Rates_54 = 0
# Usable Mandatory Rates
if (PHY_Bit_Rate_int <= 11) and yellow_cell >= 1:
Mandatory_1 = 1
else:
Mandatory_1 = 0
if (PHY_Bit_Rate_int <= 11) and yellow_cell >= 2:
Mandatory_2 = 2
else:
Mandatory_2 = 0
if (PHY_Bit_Rate_int <= 11) and yellow_cell >= 5:
Mandatory_5 = 5.5
else:
Mandatory_5 = 0
if (PHY_Bit_Rate_int <= 11) and yellow_cell >= 11:
Mandatory_11 = 11
else:
Mandatory_11 = 0
if (PHY_Bit_Rate_int >= 6) and yellow_cell >= 6:
Mandatory_6 = 6
else:
Mandatory_6 = 0
if (PHY_Bit_Rate_int >= 6) and yellow_cell >= 9:
Mandatory_9 = 6
else:
Mandatory_9 = 0
if (PHY_Bit_Rate_int >= 6) and yellow_cell >= 12:
Mandatory_12 = 12
else:
Mandatory_12 = 0
if (PHY_Bit_Rate_int >= 6) and yellow_cell >= 18:
Mandatory_18 = 12
else:
Mandatory_18 = 0
if (PHY_Bit_Rate_int >= 6) and yellow_cell >= 24:
Mandatory_24 = 24
else:
Mandatory_24 = 0
if (PHY_Bit_Rate_int >= 6) and yellow_cell >= 36:
Mandatory_36 = 24
else:
Mandatory_36 = 0
if (PHY_Bit_Rate_int >= 6) and yellow_cell >= 48:
Mandatory_48 = 24
else:
Mandatory_48 = 0
if (PHY_Bit_Rate_int >= 6) and yellow_cell >= 54:
Mandatory_54 = 24
else:
Mandatory_54 = 0
# CWmin_str (leave alone for default)
if (PHY_Bit_Rate_int == 1 or PHY_Bit_Rate_int == 2 or PHY_Bit_Rate_int == 5 or PHY_Bit_Rate_int == 11):
CWmin_str = 31
else:
if (
"1" in self.Basic_Rate_Set or "2" in self.Basic_Rate_Set or "5.5" in self.Basic_Rate_Set or "11" in self.Basic_Rate_Set) \
and (not ("6" in self.Basic_Rate_Set or "9" in self.Basic_Rate_Set or "12" in self.Basic_Rate_Set or
"18" in self.Basic_Rate_Set or "24" in self.Basic_Rate_Set or "36" in self.Basic_Rate_Set or "48" in self.Basic_Rate_Set or "54" in self.Basic_Rate_Set)):
CWmin_str = 31
else:
CWmin_str = 15
# MAC MPDU Size
if "G.711" in self.Codec_Type:
Codec_IP_Packet_Size = 200
Codec_Frame_rate = 100
else:
if "G.723" in self.Codec_Type:
Codec_IP_Packet_Size = 60
Codec_Frame_rate = 67
elif "G.729" in self.Codec_Type:
Codec_IP_Packet_Size = 60
Codec_Frame_rate = 100
else:
Codec_IP_Packet_Size = 0
Codec_Frame_rate = 0
if "Data" in self.Traffic_Type:
MAC_MPDU_Size = int(self.MAC_Frame_802_11)
else:
if "None" in self.Encryption:
result = Codec_IP_Packet_Size + 28 + 0
elif "WEP" in self.Encryption:
result = Codec_IP_Packet_Size + 28 + 8
elif "TKIP" in self.Encryption:
result = Codec_IP_Packet_Size + 28 + 20
else:
result = Codec_IP_Packet_Size + 28 + 16
if "Yes" in self.QoS:
final_result = result + 2
else:
final_result = result + 0
MAC_MPDU_Size = final_result + 8
# PHY Bit Rate of Control Frames
if (PHY_Bit_Rate_int == 1 or PHY_Bit_Rate_int == 2 or PHY_Bit_Rate_int == 5 or PHY_Bit_Rate_int == 11):
data = 1
else:
data = 6
if len(self.Basic_Rate_Set) == 0:
present_BasicRate = 0
else:
present_BasicRate = 1
if present_BasicRate == 1:
PHY_Bit = max(Usable_Basic_Rates_1, Usable_Basic_Rates_2, Usable_Basic_Rates_5,
Usable_Basic_Rates_11, Usable_Basic_Rates_6,
Usable_Basic_Rates_9, Usable_Basic_Rates_12, Usable_Basic_Rates_18,
Usable_Basic_Rates_24, Usable_Basic_Rates_36, Usable_Basic_Rates_48,
Usable_Basic_Rates_54, data)
else:
PHY_Bit = max(Mandatory_1, Mandatory_2, Mandatory_5, Mandatory_11, Mandatory_6, Mandatory_9,
Mandatory_12, Mandatory_18, Mandatory_24, Mandatory_36, Mandatory_48, Mandatory_54)
# Ttxframe (ACK)
if "Short" in self.Preamble:
Preamble_1 = float(96)
else:
Preamble_1 = float(192)
if (PHY_Bit == 1) or (PHY_Bit == 2) or (PHY_Bit == 5.5) or (PHY_Bit == 11):
Ttxframe = (14 * 8) / PHY_Bit + (Preamble_1)
Ttxframe_new = format(Ttxframe, '.2f')
else:
Ttxframe = int((14 * 8 + 22 + PHY_Bit * 4 - 1) / (PHY_Bit * 4)) * 4 + 20
Ttxframe_new = format(Ttxframe, '.2f')
# RTS/CTS Handshake Overhead
if (PHY_Bit_Rate_int == 1 or PHY_Bit_Rate_int == 2 or PHY_Bit_Rate_int == 5 or PHY_Bit_Rate_int == 11):
SIFS_value = float(10)
else:
SIFS_value = float(16)
if "No" in self.RTS_CTS_Handshake:
RTS_CTS_Handshake_Overhead = 0
elif "Yes" in self.RTS_CTS_Handshake:
if (PHY_Bit == 1) or (PHY_Bit == 2) or (PHY_Bit == 5.5) or (PHY_Bit == 11):
RTS_CTS_Handshake = ((20 + 14) * 8) / PHY_Bit + (Preamble_1)
else:
RTS_CTS_Handshake = int(((20 + 14) * 8 + 22 + PHY_Bit * 4 - 1) / (PHY_Bit * 4)) * 4 + 2 * 20
RTS_CTS_Handshake_Overhead = RTS_CTS_Handshake + (2 * SIFS_value)
# c22 CTS-to-self Handshake Overhead
if ("Yes" in self.CTS_to_self) and ("Yes" in self.RTS_CTS_Handshake):
CTS_to_self_Handshake = 0
else:
if ("No" in self.CTS_to_self) or ("Yes" in self.RTS_CTS_Handshake):
CTS_to_self_Handshake = 0
else:
if (PHY_Bit == 1) or (PHY_Bit == 2) or (PHY_Bit == 5.5) or (PHY_Bit == 11):
CTS_to_self_Handshake = (14 * 8) / PHY_Bit + (Preamble_1) + SIFS_value
else:
CTS_to_self_Handshake = int(
(14 * 8 + 22 + PHY_Bit * 4 - 1) / (PHY_Bit * 4)) * 4 + 20 + SIFS_value
# DIFS calulation
if (PHY_Bit_Rate_int == 1 or PHY_Bit_Rate_int == 2 or PHY_Bit_Rate_int == 5 or PHY_Bit_Rate_int == 11):
DIFS_value = 50
elif ("Short" in self.slot_name):
DIFS_value = 34
else:
DIFS_value = 50
# MeanBackoff calculation
if (PHY_Bit_Rate_int == 1 or PHY_Bit_Rate_int == 2 or PHY_Bit_Rate_int == 5 or PHY_Bit_Rate_int == 11):
c4 = (CWmin_str * 20 / 2)
MeanBackoff_value = float(c4)
elif ("Short" in self.slot_name):
d2 = (CWmin_str * 9 / 2)
MeanBackoff_value = float(d2)
else:
d3 = (CWmin_str * 20 / 2)
MeanBackoff_value = float(d3)
# c27 Ndbps, MAC data bits per symbol
Ndbps_value = yellow_cell * 4
# Nbits, bits in MAC frame
Nbits_value = (MAC_MPDU_Size * 8)
# Tmac, time for MAC frame and Tplcp, time for MAC PLCP
if (PHY_Bit_Rate_int == 1 or PHY_Bit_Rate_int == 2 or PHY_Bit_Rate_int == 5 or PHY_Bit_Rate_int == 11):
Tmac_value = Nbits_value / yellow_cell
if "Short" in self.Preamble:
Tplcp = float(96)
else:
Tplcp = float(192)
else:
Tmac_value = int((Nbits_value + 22 + Ndbps_value) / Ndbps_value) * 4
Tplcp = float(20)
# Ttxframe (DATA)
Ttxframe_data = Tmac_value + Tplcp
Client_1 = Ttxframe_data + SIFS_value + Ttxframe + DIFS_value + RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake + MeanBackoff_value
Client_2 = Ttxframe_data + SIFS_value + Ttxframe + DIFS_value + RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake + MeanBackoff_value / 2
Client_3 = Ttxframe_data + SIFS_value + Ttxframe + DIFS_value + RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake + MeanBackoff_value / 5
Client_4 = Ttxframe_data + SIFS_value + Ttxframe + DIFS_value + RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake + MeanBackoff_value / 10
Client_5 = Ttxframe_data + SIFS_value + Ttxframe + DIFS_value + RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake + MeanBackoff_value / 20
Client_6 = Ttxframe_data + SIFS_value + Ttxframe + DIFS_value + RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake + MeanBackoff_value / 50
Client_7 = Ttxframe_data + SIFS_value + Ttxframe + DIFS_value + RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake + MeanBackoff_value / 100
self.Client_1_new = format(Client_1, '.2f')
Client_2_new = format(Client_2, '.4f')
Client_3_new = format(Client_3, '.4f')
Client_4_new = format(Client_4, '.4f')
Client_5_new = format(Client_5, '.4f')
Client_6_new = format(Client_6, '.4f')
Client_7_new = round(Client_7)
# Max Frame Rate
Max_Frame_Rate_C1 = 1000000 / Client_1
self.Max_Frame_Rate_C1_round = round(Max_Frame_Rate_C1)
Max_Frame_Rate_C2 = 1000000 / Client_2
Max_Frame_Rate_C2_round = round(Max_Frame_Rate_C2)
Max_Frame_Rate_C3 = 1000000 / Client_3
Max_Frame_Rate_C3_round = round(Max_Frame_Rate_C3)
Max_Frame_Rate_C4 = 1000000 / Client_4
Max_Frame_Rate_C4_round = round(Max_Frame_Rate_C4)
Max_Frame_Rate_C5 = 1000000 / Client_5
Max_Frame_Rate_C5_round = round(Max_Frame_Rate_C5)
Max_Frame_Rate_C6 = 1000000 / Client_6
Max_Frame_Rate_C6_round = round(Max_Frame_Rate_C6)
Max_Frame_Rate_C7 = 1000000 / Client_7
Max_Frame_Rate_C7_round = round(Max_Frame_Rate_C7)
# Max. Offered Load (802.11)
Max_Offered_Load_C1 = Max_Frame_Rate_C1 * Nbits_value / 1000000
self.Max_Offered_Load_C1_new = format(Max_Offered_Load_C1, '.3f')
Max_Offered_Load_C2 = Max_Frame_Rate_C2 * Nbits_value / 1000000
Max_Offered_Load_C2_new = format(Max_Offered_Load_C2, '.3f')
Max_Offered_Load_C3 = Max_Frame_Rate_C3 * Nbits_value / 1000000
Max_Offered_Load_C3_new = format(Max_Offered_Load_C3, '.3f')
Max_Offered_Load_C4 = Max_Frame_Rate_C4 * Nbits_value / 1000000
Max_Offered_Load_C4_new = format(Max_Offered_Load_C4, '.3f')
Max_Offered_Load_C5 = Max_Frame_Rate_C5 * Nbits_value / 1000000
Max_Offered_Load_C5_new = format(Max_Offered_Load_C5, '.3f')
Max_Offered_Load_C6 = Max_Frame_Rate_C6 * Nbits_value / 1000000
Max_Offered_Load_C6_new = format(Max_Offered_Load_C6, '.3f')
Max_Offered_Load_C7 = Max_Frame_Rate_C7 * Nbits_value / 1000000
Max_Offered_Load_C7_new = format(Max_Offered_Load_C7, '.3f')
# Offered Load Per 802.11 Client
Offered_Load_Per_Client1 = Max_Offered_Load_C1 / 1
self.Offered_Load_Per_Client1_new = format(Offered_Load_Per_Client1, '.3f')
Offered_Load_Per_Client2 = Max_Offered_Load_C2 / 2
Offered_Load_Per_Client2_new = format(Offered_Load_Per_Client2, '.3f')
Offered_Load_Per_Client3 = Max_Offered_Load_C3 / 5
Offered_Load_Per_Client3_new = format(Offered_Load_Per_Client3, '.3f')
Offered_Load_Per_Client4 = Max_Offered_Load_C4 / 10
Offered_Load_Per_Client4_new = format(Offered_Load_Per_Client4, '.3f')
Offered_Load_Per_Client5 = Max_Offered_Load_C5 / 20
Offered_Load_Per_Client5_new = format(Offered_Load_Per_Client5, '.3f')
Offered_Load_Per_Client6 = Max_Offered_Load_C6 / 50
Offered_Load_Per_Client6_new = format(Offered_Load_Per_Client6, '.3f')
Offered_Load_Per_Client7 = Max_Offered_Load_C7 / 100
Offered_Load_Per_Client7_new = format(Offered_Load_Per_Client7, '.3f')
# Offered Load (802.3 Side)
Offered_Load_C1 = Max_Frame_Rate_C1 * Ethernet_MAC_Frame_int * 8 / 1000000
self.Offered_Load_C1_new = format(Offered_Load_C1, '.3f')
Offered_Load_C2 = Max_Frame_Rate_C2 * Ethernet_MAC_Frame_int * 8 / 1000000
Offered_Load_C2_new = format(Offered_Load_C2, '.3f')
Offered_Load_C3 = Max_Frame_Rate_C3 * Ethernet_MAC_Frame_int * 8 / 1000000
Offered_Load_C3_new = format(Offered_Load_C3, '.3f')
Offered_Load_C4 = Max_Frame_Rate_C4 * Ethernet_MAC_Frame_int * 8 / 1000000
Offered_Load_C4_new = format(Offered_Load_C4, '.3f')
Offered_Load_C5 = Max_Frame_Rate_C5 * Ethernet_MAC_Frame_int * 8 / 1000000
Offered_Load_C5_new = format(Offered_Load_C5, '.3f')
Offered_Load_C6 = Max_Frame_Rate_C6 * Ethernet_MAC_Frame_int * 8 / 1000000
Offered_Load_C6_new = format(Offered_Load_C6, '.3f')
Offered_Load_C7 = Max_Frame_Rate_C7 * Ethernet_MAC_Frame_int * 8 / 1000000
Offered_Load_C7_new = format(Offered_Load_C7, '.3f')
# IP Throughput (802.11 -> 802.3)
if ip == 1:
IP_Throughput_C1 = Max_Frame_Rate_C1 * ip_packet * 8 / 1000000
self.IP_Throughput_C1_new = format(IP_Throughput_C1, '.3f')
IP_Throughput_C2 = Max_Frame_Rate_C2 * ip_packet * 8 / 1000000
IP_Throughput_C2_new = format(IP_Throughput_C2, '.3f')
IP_Throughput_C3 = Max_Frame_Rate_C3 * ip_packet * 8 / 1000000
IP_Throughput_C3_new = format(IP_Throughput_C3, '.3f')
IP_Throughput_C4 = Max_Frame_Rate_C4 * ip_packet * 8 / 1000000
IP_Throughput_C4_new = format(IP_Throughput_C4, '.3f')
IP_Throughput_C5 = Max_Frame_Rate_C5 * ip_packet * 8 / 1000000
IP_Throughput_C5_new = format(IP_Throughput_C5, '.3f')
IP_Throughput_C6 = Max_Frame_Rate_C6 * ip_packet * 8 / 1000000
IP_Throughput_C6_new = format(IP_Throughput_C6, '.3f')
IP_Throughput_C7 = Max_Frame_Rate_C7 * ip_packet * 8 / 1000000
IP_Throughput_C7_new = format(IP_Throughput_C7, '.3f')
else:
self.IP_Throughput_C1_new = "N/A"
IP_Throughput_C2_new = "N/A"
IP_Throughput_C3_new = "N/A"
IP_Throughput_C4_new = "N/A"
IP_Throughput_C5_new = "N/A"
IP_Throughput_C6_new = "N/A"
IP_Throughput_C7_new = "N/A"
Voice_Call = Max_Frame_Rate_C1 / Codec_Frame_rate
Voice_Call_value = round(Voice_Call)
if "Data" in self.Traffic_Type:
self.Maximum_Theoretical_R_value = "N/A"
else:
if "G.711" in self.Codec_Type:
self.Maximum_Theoretical_R_value = 85.9
else:
if "G.723" in self.Codec_Type:
self.Maximum_Theoretical_R_value = 72.9
else:
if "G.729" in self.Codec_Type:
self.Maximum_Theoretical_R_value = 81.7
else:
self.Maximum_Theoretical_R_value = 93.2
if "Data" in self.Traffic_Type:
self.Estimated_MOS_Score = "N/A"
self.Maximum_Bidirectional_Voice_Calls = "N/A"
else:
if (Voice_Call_value <= 1):
Maximum_Bidirectional_Voice_Calls1 = self.Max_Frame_Rate_C1_round / Codec_Frame_rate
elif (Voice_Call_value <= 2):
Maximum_Bidirectional_Voice_Calls1 = Max_Frame_Rate_C2_round / Codec_Frame_rate
elif (Voice_Call_value <= 5):
Maximum_Bidirectional_Voice_Calls1 = Max_Frame_Rate_C3_round / Codec_Frame_rate
elif (Voice_Call_value <= 10):
Maximum_Bidirectional_Voice_Calls1 = Max_Frame_Rate_C4_round / Codec_Frame_rate
elif (Voice_Call_value <= 20):
Maximum_Bidirectional_Voice_Calls1 = Max_Frame_Rate_C5_round / Codec_Frame_rate
elif (Voice_Call_value <= 50):
Maximum_Bidirectional_Voice_Calls1 = Max_Frame_Rate_C6_round / Codec_Frame_rate
else:
Maximum_Bidirectional_Voice_Calls1 = Max_Frame_Rate_C7_round / Codec_Frame_rate
self.Maximum_Bidirectional_Voice_Calls = round(Maximum_Bidirectional_Voice_Calls1, 2)
if self.Maximum_Theoretical_R_value < 0:
self.Estimated_MOS_Score = 1
else:
if self.Maximum_Theoretical_R_value > 100:
self.Estimated_MOS_Score = 4.5
else:
Estimated_MOS_Score_1 = 1 + 0.035 * self.Maximum_Theoretical_R_value + self.Maximum_Theoretical_R_value * (
self.Maximum_Theoretical_R_value - 60) * (
100 - self.Maximum_Theoretical_R_value) * 7 * 0.000001
self.Estimated_MOS_Score = round(Estimated_MOS_Score_1, 2)
def get_result(self):
print("\n" + "******************Station : 11abgCalculator*****************************" + "\n")
print("Theoretical Maximum Offered Load" + "\n")
print("1 Client:")
All_theoretical_output = {'Packet Interval(usec)': self.Client_1_new, 'Max Frame Rate(fps)': self.Max_Frame_Rate_C1_round,
'Max. Offered Load (802.11)(Mb/s)': self.Max_Offered_Load_C1_new,
'Offered Load Per 802.11 Client(Mb/s)': self.Offered_Load_Per_Client1_new,
'Offered Load (802.3 Side)(Mb/s)': self.Offered_Load_C1_new,
'IP Throughput (802.11 -> 802.3)(Mb/s)': self.IP_Throughput_C1_new}
print(json.dumps(All_theoretical_output, indent=4))
print("\n" + "Theroretical Voice Call Capacity" + "\n")
All_theoretical_voice = {'Maximum Theoretical R-value': self.Maximum_Theoretical_R_value,
'Estimated MOS Score': self.Estimated_MOS_Score,
'Maximum Bidirectional Voice Calls(calls)': self.Maximum_Bidirectional_Voice_Calls}
print(json.dumps(All_theoretical_voice, indent=4))
##Class to take all user input (802.11n Standard)
class n11_calculator(abg11_calculator):
def __init__(self, Traffic_Type, Data_Voice_MCS, Channel_Bandwidth, Guard_Interval_value, Highest_Basic_str,
Encryption, QoS,
IP_Packets_MSDU_str, MAC_Frames_per_A_MPDU_str, BSS_Basic_Rate, MAC_MPDU_Size_Data_Traffic,
Codec_Type, PLCP, CWmin, RTS_CTS_Handshake, CTS_to_self,PHY_Bit_Rate=None,MAC_Frame_802_11=None,Basic_Rate_Set=None,Preamble=None,slot_name=None):
super().__init__(Traffic_Type, PHY_Bit_Rate, Encryption, QoS, MAC_Frame_802_11, Basic_Rate_Set, Preamble,
slot_name, Codec_Type, RTS_CTS_Handshake, CTS_to_self)
self.Data_Voice_MCS = Data_Voice_MCS
self.Channel_Bandwidth = Channel_Bandwidth
self.Guard_Interval_value = Guard_Interval_value
self.Highest_Basic_str = Highest_Basic_str
self.IP_Packets_MSDU_str = IP_Packets_MSDU_str
self.MAC_Frames_per_A_MPDU_str = MAC_Frames_per_A_MPDU_str
self.BSS_Basic_Rate = BSS_Basic_Rate
self.MAC_MPDU_Size_Data_Traffic = MAC_MPDU_Size_Data_Traffic
self.PLCP = PLCP
self.CWmin = CWmin
# This function is for calculate intermediate values and Theoretical values
def calculate(self):
global HT_data_temp
global temp_value
SIFS = 16.00
DIFS = 34.00
Slot_Time = 9.00
Tsymbol_Control = 4.00
# *********************************************Auxilliary Data***********************************************
Non_HT_Ref = ['6', '12', '18', '24', '36', '48', '54', '54', '6', '12', '18', '24', '36', '48', '54', '54', '6',
'12', '18', '24', '36', '48', '54', '54', '6', '12', '18', '24', '36', '48', '54', '54']
HT_LTFs = ['0', '1', '3', '3']
Ndbps_20MHz = ['26', '52', '78', '104', '156', '208', '234', '260']
Ndbps_40MHz = ['54', '108', '162', '216', '324', '432', '486', '540']
Nes = ['1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
'2', '2', '2', '1', '1', '1', '1', '2', '2', '2', '2', ]
Data_Voice_MCS_int = int(self.Data_Voice_MCS)
IP_Packets_MSDU = int(self.IP_Packets_MSDU_str)
IP_Packets_MSDU_loc = IP_Packets_MSDU + 1
Highest_Basic = int(self.Highest_Basic_str)
i = 0
while True:
if Data_Voice_MCS_int == i:
Non_HT = Non_HT_Ref[i]
break
i = i + 1
Non_HT_value = int(Non_HT)
if Non_HT_value >= 6:
if "6" in self.BSS_Basic_Rate:
Allowed_control6 = 6
else:
if (not (
"6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate or "18" in self.BSS_Basic_Rate or
"24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or "48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
Allowed_control6 = 6
else:
Allowed_control6 = 0
else:
Allowed_control6 = 0
if Non_HT_value >= 9:
if "9" in self.BSS_Basic_Rate:
Allowed_control9 = 9
else:
if (not (
"6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate or "18" in self.BSS_Basic_Rate or
"24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or "48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
Allowed_control9 = 6
else:
Allowed_control9 = 0
else:
Allowed_control9 = 0
if Non_HT_value >= 12:
if "12" in self.BSS_Basic_Rate:
Allowed_control12 = 12
else:
if (not (
"6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate or "18" in self.BSS_Basic_Rate or
"24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or "48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
Allowed_control12 = 12
else:
Allowed_control12 = 0
else:
Allowed_control12 = 0
if Non_HT_value >= 18:
if "18" in self.BSS_Basic_Rate:
Allowed_control18 = 18
else:
if (not (
"6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate or "18" in self.BSS_Basic_Rate or
"24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or "48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
Allowed_control18 = 12
else:
Allowed_control18 = 0
else:
Allowed_control18 = 0
if Non_HT_value >= 24:
if "24" in self.BSS_Basic_Rate:
Allowed_control24 = 24
else:
if (not (
"6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate or "18" in self.BSS_Basic_Rate or
"24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or "48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
Allowed_control24 = 24
else:
Allowed_control24 = 0
else:
Allowed_control24 = 0
if Non_HT_value >= 36:
if "36" in self.BSS_Basic_Rate:
Allowed_control36 = 36
else:
if (not (
"6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate or "18" in self.BSS_Basic_Rate or
"24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or "48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
Allowed_control36 = 24
else:
Allowed_control36 = 0
else:
Allowed_control36 = 0
if Non_HT_value >= 48:
if "48" in self.BSS_Basic_Rate:
Allowed_control48 = 48
else:
if (not (
"6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate or "18" in self.BSS_Basic_Rate or
"24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or "48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
Allowed_control48 = 24
else:
Allowed_control48 = 0
else:
Allowed_control48 = 0
if Non_HT_value >= 54:
if "54" in self.BSS_Basic_Rate:
Allowed_control54 = 54
else:
if (not (
"6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate or "18" in self.BSS_Basic_Rate or
"24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or "48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
Allowed_control54 = 24
else:
Allowed_control54 = 0
else:
Allowed_control54 = 0
# g24 QoS Hdr
if "Yes" in self.QoS:
QoS_1 = 1
elif "No" in self.QoS:
QoS_1 = 0
if (QoS_1 == 1) or (IP_Packets_MSDU > 1):
QoS_Hdr = 2
else:
QoS_Hdr = 0
# g23 Encrypt Hdr
if "None" in self.Encryption:
Encrypt_Hdr = 0
else:
if "WEP" in self.Encryption:
Encrypt_Hdr = 8
elif "TKIP" in self.Encryption:
Encrypt_Hdr = 20
else:
Encrypt_Hdr = 16
# c36 Codec IP Packet Size
if "G.711" in self.Codec_Type:
Codec_IP_Packet_Size = 200
Codec_Frame_Rate = 100
else:
if "G.723" in self.Codec_Type:
Codec_IP_Packet_Size = 60
Codec_Frame_Rate = 67
else:
if "G.729" in self.Codec_Type:
Codec_IP_Packet_Size = 60
Codec_Frame_Rate = 100
else:
Codec_IP_Packet_Size = 0
Codec_Frame_Rate = 0
# c17 MAC MPDU Size
if "Data" in self.Traffic_Type:
MAC_MPDU_Size = int(self.MAC_MPDU_Size_Data_Traffic)
else:
if ((IP_Packets_MSDU == 0)):
MAC_MPDU_Size = (Codec_IP_Packet_Size + 28 + QoS_Hdr + Encrypt_Hdr + 8)
else:
MAC_MPDU_Size_1 = (Codec_IP_Packet_Size + 28 + QoS_Hdr + Encrypt_Hdr + 8 + (IP_Packets_MSDU_loc - 1) * (
14 + 3))
MAC_MPDU_Size = int(MAC_MPDU_Size_1 / (IP_Packets_MSDU_loc - 1))
# MSDU Size
if IP_Packets_MSDU == 0:
MSDU_final = MAC_MPDU_Size - 28 - QoS_Hdr - Encrypt_Hdr
else:
MSDU_1 = (MAC_MPDU_Size - 28 - QoS_Hdr - Encrypt_Hdr - (IP_Packets_MSDU) * (14 + 3))
MSDU_final = MSDU_1 / IP_Packets_MSDU
if MSDU_final < 0:
msdu_str = str(MSDU_final)
x = msdu_str.split(".")
sec = len(x[0])
if sec > 2:
MSDU = int(MSDU_final) - 1
else:
MSDU = int(MSDU_final)
else:
MSDU = int(MSDU_final)
if (MSDU - 8) < 20:
IP_Packet_value = "N/A"
ip_value = 0
else:
IP_Packet_value = MSDU - 8
ip_value = 1
if ip_value == 0:
Ethernet_value = "N/A"
eth_value = 0
else:
ip_1 = int(IP_Packet_value)
Ethernet_value = max(ip_1 + 18, 64)
eth_value = 1
# HT-LTFs
temp_value = int(Data_Voice_MCS_int / 8)
def HT_value_func():
if temp_value == 0:
HT_data_temp = HT_LTFs[0]
elif temp_value == 1:
HT_data_temp = HT_LTFs[1]
elif temp_value == 2:
HT_data_temp = HT_LTFs[2]
elif temp_value == 3:
HT_data_temp = HT_LTFs[3]
return HT_data_temp
HT_data = HT_value_func()
HT_data_1 = int(HT_data)
# c20 Tppdu_fixed (HT Data Frames)
if "Mixed" in self.PLCP:
Tppdu_fixed_Data_Frame = float(36 + 4 * HT_data_1)
PLCP_Configuration_int = 1
elif "Greenfield" in self.PLCP:
Tppdu_fixed_Data_Frame = float(24 + 4 * HT_data_1)
PLCP_Configuration_int = 2
# c21 Tppdu_fixed (HT Control Frames)
Data_min = min(Data_Voice_MCS_int, Highest_Basic)
temp_value = int(Data_min / 8) + 1
HT_data_temp_1 = HT_value_func()
HT_data_2 = int(HT_data_temp_1)
if "Mixed" in self.PLCP:
Tppdu_fixed_Control_Frames = float(36 + 4 * HT_data_2)
elif "Greenfield" in self.PLCP:
Tppdu_fixed_Control_Frames = float(24 + 4 * HT_data_2)
# Non-HT Reference Rate
# Offset calculation
i = 0
while True:
if Data_Voice_MCS_int == i:
Non_HT = Non_HT_Ref[i]
Nes_data = Nes[i]
break
i = i + 1
# PHY Bit Rate of Control Frames
PHY_Bit_Rate_of_Control_Frames = max(Allowed_control6, Allowed_control9,
Allowed_control12, Allowed_control18,
Allowed_control24, Allowed_control36,
Allowed_control48, Allowed_control54, 6)
# Ndbps, data bits per symbol (Data)
def Ndbps_fun():
if Data_Voice_MCS_int == 0 or Data_Voice_MCS_int == 8 or Data_Voice_MCS_int == 16 or Data_Voice_MCS_int == 24:
Ndbps_20 = Ndbps_20MHz[0]
Ndbps_40 = Ndbps_40MHz[0]
elif Data_Voice_MCS_int == 1 or Data_Voice_MCS_int == 9 or Data_Voice_MCS_int == 17 or Data_Voice_MCS_int == 25:
Ndbps_20 = Ndbps_20MHz[1]
Ndbps_40 = Ndbps_40MHz[1]
elif Data_Voice_MCS_int == 2 or Data_Voice_MCS_int == 10 or Data_Voice_MCS_int == 18 or Data_Voice_MCS_int == 26:
Ndbps_20 = Ndbps_20MHz[2]
Ndbps_40 = Ndbps_40MHz[2]
elif Data_Voice_MCS_int == 3 or Data_Voice_MCS_int == 11 or Data_Voice_MCS_int == 19 or Data_Voice_MCS_int == 27:
Ndbps_20 = Ndbps_20MHz[3]
Ndbps_40 = Ndbps_40MHz[3]
elif Data_Voice_MCS_int == 4 or Data_Voice_MCS_int == 12 or Data_Voice_MCS_int == 20 or Data_Voice_MCS_int == 28:
Ndbps_20 = Ndbps_20MHz[4]
Ndbps_40 = Ndbps_40MHz[4]
elif Data_Voice_MCS_int == 5 or Data_Voice_MCS_int == 13 or Data_Voice_MCS_int == 21 or Data_Voice_MCS_int == 29:
Ndbps_20 = Ndbps_20MHz[5]
Ndbps_40 = Ndbps_40MHz[5]
elif Data_Voice_MCS_int == 6 or Data_Voice_MCS_int == 14 or Data_Voice_MCS_int == 22 or Data_Voice_MCS_int == 30:
Ndbps_20 = Ndbps_20MHz[6]
Ndbps_40 = Ndbps_40MHz[6]
elif Data_Voice_MCS_int == 7 or Data_Voice_MCS_int == 15 or Data_Voice_MCS_int == 23 or Data_Voice_MCS_int == 31:
Ndbps_20 = Ndbps_20MHz[7]
Ndbps_40 = Ndbps_40MHz[7]
Ndbps_20_int = int(Ndbps_20)
Ndbps_40_int = int(Ndbps_40)
return Ndbps_20_int, Ndbps_40_int
if "20" in self.Channel_Bandwidth:
if Data_Voice_MCS_int >= 0 and Data_Voice_MCS_int < 8:
Ndbps_20_int, Ndbps_40_int = Ndbps_fun()
data_bits = Ndbps_20_int * 1
if Data_Voice_MCS_int >= 8 and Data_Voice_MCS_int < 16:
Ndbps_20_int, Ndbps_40_int = Ndbps_fun()
data_bits = Ndbps_20_int * 2
if Data_Voice_MCS_int >= 16 and Data_Voice_MCS_int < 24:
Ndbps_20_int, Ndbps_40_int = Ndbps_fun()
data_bits = Ndbps_20_int * 3
if Data_Voice_MCS_int >= 24 and Data_Voice_MCS_int < 32:
Ndbps_20_int, Ndbps_40_int = Ndbps_fun()
data_bits = Ndbps_20_int * 4
elif "40" in self.Channel_Bandwidth:
if Data_Voice_MCS_int >= 0 and Data_Voice_MCS_int < 8:
Ndbps_20_int, Ndbps_40_int = Ndbps_fun()
data_bits = Ndbps_40_int * 1
if Data_Voice_MCS_int >= 8 and Data_Voice_MCS_int < 16:
Ndbps_20_int, Ndbps_40_int = Ndbps_fun()
data_bits = Ndbps_40_int * 2
if Data_Voice_MCS_int >= 16 and Data_Voice_MCS_int < 24:
Ndbps_20_int, Ndbps_40_int = Ndbps_fun()
data_bits = Ndbps_40_int * 3
if Data_Voice_MCS_int >= 24 and Data_Voice_MCS_int < 32:
Ndbps_20_int, Ndbps_40_int = Ndbps_fun()
data_bits = Ndbps_40_int * 4
# Ndbps, data bits per symbol (Control)
if PHY_Bit_Rate_of_Control_Frames < 7:
if PHY_Bit_Rate_of_Control_Frames < 3:
PHY = PHY_Bit_Rate_of_Control_Frames
else:
if PHY_Bit_Rate_of_Control_Frames == 3:
PHY = 5.5
else:
if PHY_Bit_Rate_of_Control_Frames == 4:
PHY = 11
else:
if PHY_Bit_Rate_of_Control_Frames == 5:
PHY = 6
else:
if PHY_Bit_Rate_of_Control_Frames == 6:
PHY = 9
else:
if PHY_Bit_Rate_of_Control_Frames == 8:
PHY = 18
else:
if PHY_Bit_Rate_of_Control_Frames == 9:
PHY = 24
else:
if PHY_Bit_Rate_of_Control_Frames == 10:
PHY = 36
else:
if PHY_Bit_Rate_of_Control_Frames == 11:
PHY = 48
else:
PHY = 54
Ndbps_data_bits_per_symbol_Control = PHY * 4
MAC_Frames_per_A_MPDU = int(self.MAC_Frames_per_A_MPDU_str)
# g22 A-MPDU Pad
if ((MAC_Frames_per_A_MPDU == 0)):
MPDU_Pad = int(0)
else:
x = int((MAC_MPDU_Size % 4))
y = int((4 - x))
MPDU_Pad = int((y % 4))
# c26 Nbits, Bits per MAC PPDU
MAC_Frames_per_A_MPDU_loc = MAC_Frames_per_A_MPDU + 1
if (MAC_Frames_per_A_MPDU == 0):
Nbits_Bits_per_MAC_PPDU = MAC_MPDU_Size * 8
else:
Nbits_Bits_per_MAC_PPDU = ((MAC_MPDU_Size + 4) * (MAC_Frames_per_A_MPDU_loc - 1) + MPDU_Pad * (
MAC_Frames_per_A_MPDU_loc - 2)) * 8
# c27 Tsymbol(Data), Data Symbol Period
if "400" in self.Guard_Interval_value:
Guard_Interval_1 = 1
elif "800" in self.Guard_Interval_value:
Guard_Interval_1 = 0
calculation = (((Data_Voice_MCS_int > 7 and PLCP_Configuration_int == 2) or PLCP_Configuration_int == 1))
if (Guard_Interval_1 == 1) and calculation:
Tsymbol_Data_Symbol_Period = 3.60
else:
Tsymbol_Data_Symbol_Period = 4
Nes_data_int = int(Nes_data)
# Ttxframe (DATA)
if "40" in self.Channel_Bandwidth:
offset = 6 * Nes_data_int
else:
offset = 6
Ttxframe_1 = Tppdu_fixed_Data_Frame + int(
(16 + offset + Nbits_Bits_per_MAC_PPDU + data_bits - 1) / data_bits) * Tsymbol_Data_Symbol_Period
Ttxframe_2 = format(Ttxframe_1, '.2f')
Ttxframe = float(Ttxframe_2)
# c30 Ttxframe (Ack)
Ttxframe_Ack = int(
(22 + 14 * 8 + PHY_Bit_Rate_of_Control_Frames * 4 - 1) / (PHY_Bit_Rate_of_Control_Frames * 4)) * 4 + 20
# c31 Ttxframe (Compressed BlockAck)
Ttxframe_Compressed_BlockAck = int(
(22 + 32 * 8 + PHY_Bit_Rate_of_Control_Frames * 4 - 1) / (PHY_Bit_Rate_of_Control_Frames * 4)) * 4 + 20
# g20 Use BlockAck
if (MAC_Frames_per_A_MPDU == 0):
Use_BlockAck = False
else:
Use_BlockAck = True
# c34 Ack Response Overhead
if Use_BlockAck:
Ack_Response_Overhead = 0
else:
Ack_Response_Overhead = SIFS + Ttxframe_Ack
# c35 BlockAck Response Overhead
if Use_BlockAck:
BlockAck_Response_Overhead = SIFS + Ttxframe_Compressed_BlockAck
else:
BlockAck_Response_Overhead = 0
CWmin_leave_alone_for_default = int(self.CWmin)
MeanBackoff = CWmin_leave_alone_for_default * Slot_Time / 2
# c32 RTS/CTS Handshake Overhead
if "Yes" in self.RTS_CTS_Handshake:
if "20" in self.Channel_Bandwidth:
RTS_CTS_Handshake_Overhead = 2 * 20 + 4 * int((22 + (20 + 14) * 8 + 24 * 4 - 1) / (24 * 4)) + 2 * SIFS
else:
RTS_CTS_Handshake_Overhead = 2 * 20 + int(
(22 + (20 + 14) * 8 + 24 - 1) / 24) * Tsymbol_Control + 2 * SIFS
else:
RTS_CTS_Handshake_Overhead = 0
# c33CTS-to-self Handshake Overhead
if "Yes" in self.RTS_CTS_Handshake:
CTS_to_self_Handshake_Overhead = 0
else:
if "Yes" in self.CTS_to_self:
if "20" in self.Channel_Bandwidth:
CTS_to_self_Handshake_Overhead = 20 + 4 * int((22 + 14 * 8 + 24 * 4 - 1) / (24 * 4)) + SIFS
else:
CTS_to_self_Handshake_Overhead = 20 + int((22 + 14 * 8 + 24 - 1) / 24) * Tsymbol_Control + SIFS
else:
CTS_to_self_Handshake_Overhead = 0
# MAC PPDU Interval
# MeanBackoff
MAC_PPDU_Interval_1 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 1)
self.Client_1_new = format(MAC_PPDU_Interval_1, '.2f')
MAC_PPDU_Interval_2 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 2)
Client_2_new = format(MAC_PPDU_Interval_2, '.2f')
MAC_PPDU_Interval_3 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 5)
Client_3_new = format(MAC_PPDU_Interval_3, '.2f')
MAC_PPDU_Interval_4 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 10)
Client_4_new = format(MAC_PPDU_Interval_4, '.2f')
MAC_PPDU_Interval_5 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 20)
Client_5_new = format(MAC_PPDU_Interval_5, '.2f')
MAC_PPDU_Interval_6 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 50)
Client_6_new = format(MAC_PPDU_Interval_6, '.2f')
MAC_PPDU_Interval_7 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 100)
Client_7_new = format(MAC_PPDU_Interval_7, '.3f')
# Max PPDU Rate
Max_PPDU_Rate_1 = 1000000 / MAC_PPDU_Interval_1
self.Client_8_new = format(Max_PPDU_Rate_1, '.2f')
Max_PPDU_Rate_2 = 1000000 / MAC_PPDU_Interval_2
Client_9_new = format(Max_PPDU_Rate_2, '.2f')
Max_PPDU_Rate_3 = 1000000 / MAC_PPDU_Interval_3
Client_10_new = format(Max_PPDU_Rate_3, '.2f')
Max_PPDU_Rate_4 = 1000000 / MAC_PPDU_Interval_4
Client_11_new = format(Max_PPDU_Rate_4, '.2f')
Max_PPDU_Rate_5 = 1000000 / MAC_PPDU_Interval_5
Client_12_new = format(Max_PPDU_Rate_5, '.2f')
Max_PPDU_Rate_6 = 1000000 / MAC_PPDU_Interval_6
Client_13_new = format(Max_PPDU_Rate_6, '.2f')
Max_PPDU_Rate_7 = 1000000 / MAC_PPDU_Interval_7
Client_14_new = format(Max_PPDU_Rate_7, '.2f')
# c44 Max_MAC_MPDU_Rate_1
if (MAC_Frames_per_A_MPDU > 0):
Max_MAC_MPDU_Rate_1 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_1
Max_MAC_MPDU_Rate_2 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_2
Max_MAC_MPDU_Rate_3 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_3
Max_MAC_MPDU_Rate_4 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_4
Max_MAC_MPDU_Rate_5 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_5
Max_MAC_MPDU_Rate_6 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_6
Max_MAC_MPDU_Rate_7 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_7
else:
Max_MAC_MPDU_Rate_1 = Max_PPDU_Rate_1
Max_MAC_MPDU_Rate_2 = Max_PPDU_Rate_2
Max_MAC_MPDU_Rate_3 = Max_PPDU_Rate_3
Max_MAC_MPDU_Rate_4 = Max_PPDU_Rate_4
Max_MAC_MPDU_Rate_5 = Max_PPDU_Rate_5
Max_MAC_MPDU_Rate_6 = Max_PPDU_Rate_6
Max_MAC_MPDU_Rate_7 = Max_PPDU_Rate_7
self.Client_15_new = round(Max_MAC_MPDU_Rate_1)
Client_16_new = round(Max_MAC_MPDU_Rate_2)
Client_17_new = round(Max_MAC_MPDU_Rate_3)
Client_18_new = round(Max_MAC_MPDU_Rate_4)
Client_19_new = round(Max_MAC_MPDU_Rate_5)
Client_20_new = round(Max_MAC_MPDU_Rate_6)
Client_21_new = round(Max_MAC_MPDU_Rate_7)
# Max MAC MSDU Rate
if (IP_Packets_MSDU > 0):
Max_MAC_MSDU_Rate_1 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_1
Max_MAC_MSDU_Rate_2 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_2
Max_MAC_MSDU_Rate_3 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_3
Max_MAC_MSDU_Rate_4 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_4
Max_MAC_MSDU_Rate_5 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_5
Max_MAC_MSDU_Rate_6 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_6
Max_MAC_MSDU_Rate_7 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_7
else:
Max_MAC_MSDU_Rate_1 = Max_MAC_MPDU_Rate_1
Max_MAC_MSDU_Rate_2 = Max_MAC_MPDU_Rate_2
Max_MAC_MSDU_Rate_3 = Max_MAC_MPDU_Rate_3
Max_MAC_MSDU_Rate_4 = Max_MAC_MPDU_Rate_4
Max_MAC_MSDU_Rate_5 = Max_MAC_MPDU_Rate_5
Max_MAC_MSDU_Rate_6 = Max_MAC_MPDU_Rate_6
Max_MAC_MSDU_Rate_7 = Max_MAC_MPDU_Rate_7
self.Client_22_new = round(Max_MAC_MSDU_Rate_1)
Client_23_new = round(Max_MAC_MSDU_Rate_2)
Client_24_new = round(Max_MAC_MSDU_Rate_3)
Client_25_new = round(Max_MAC_MSDU_Rate_4)
Client_26_new = round(Max_MAC_MSDU_Rate_5)
Client_27_new = round(Max_MAC_MSDU_Rate_6)
Client_28_new = round(Max_MAC_MSDU_Rate_7)
# Max. 802.11 MAC Frame Data Rate
Max_802_11_MAC_Frame_Data_Rate_1 = Max_MAC_MPDU_Rate_1 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_2 = Max_MAC_MPDU_Rate_2 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_3 = Max_MAC_MPDU_Rate_3 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_4 = Max_MAC_MPDU_Rate_4 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_5 = Max_MAC_MPDU_Rate_5 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_6 = Max_MAC_MPDU_Rate_6 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_7 = Max_MAC_MPDU_Rate_7 * MAC_MPDU_Size * 8 / 1000000
self.Client_29_new = format(Max_802_11_MAC_Frame_Data_Rate_1, '.3f')
Client_30_new = format(Max_802_11_MAC_Frame_Data_Rate_2, '.3f')
Client_31_new = format(Max_802_11_MAC_Frame_Data_Rate_3, '.3f')
Client_32_new = format(Max_802_11_MAC_Frame_Data_Rate_4, '.3f')
Client_33_new = format(Max_802_11_MAC_Frame_Data_Rate_5, '.3f')
Client_34_new = format(Max_802_11_MAC_Frame_Data_Rate_6, '.3f')
Client_35_new = format(Max_802_11_MAC_Frame_Data_Rate_7, '.3f')
# Max. 802.11 MAC Payload Goodput
Max_802_11_MAC_Payload_Goodput_1 = MSDU * 8 * Max_MAC_MSDU_Rate_1 / 1000000
Max_802_11_MAC_Payload_Goodput_2 = MSDU * 8 * Max_MAC_MSDU_Rate_2 / 1000000
Max_802_11_MAC_Payload_Goodput_3 = MSDU * 8 * Max_MAC_MSDU_Rate_3 / 1000000
Max_802_11_MAC_Payload_Goodput_4 = MSDU * 8 * Max_MAC_MSDU_Rate_4 / 1000000
Max_802_11_MAC_Payload_Goodput_5 = MSDU * 8 * Max_MAC_MSDU_Rate_5 / 1000000
Max_802_11_MAC_Payload_Goodput_6 = MSDU * 8 * Max_MAC_MSDU_Rate_6 / 1000000
Max_802_11_MAC_Payload_Goodput_7 = MSDU * 8 * Max_MAC_MSDU_Rate_7 / 1000000
self.Client_36_new = format(Max_802_11_MAC_Payload_Goodput_1, '.3f')
Client_37_new = format(Max_802_11_MAC_Payload_Goodput_2, '.3f')
Client_38_new = format(Max_802_11_MAC_Payload_Goodput_3, '.3f')
Client_39_new = format(Max_802_11_MAC_Payload_Goodput_4, '.3f')
Client_40_new = format(Max_802_11_MAC_Payload_Goodput_5, '.3f')
Client_41_new = format(Max_802_11_MAC_Payload_Goodput_6, '.3f')
Client_42_new = format(Max_802_11_MAC_Payload_Goodput_7, '.3f')
# MAC Goodput Per 802.11 Client
MAC_Goodput_Per_802_11_Client_1 = Max_802_11_MAC_Payload_Goodput_1 / 1
MAC_Goodput_Per_802_11_Client_2 = Max_802_11_MAC_Payload_Goodput_2 / 2
MAC_Goodput_Per_802_11_Client_3 = Max_802_11_MAC_Payload_Goodput_3 / 5
MAC_Goodput_Per_802_11_Client_4 = Max_802_11_MAC_Payload_Goodput_4 / 10
MAC_Goodput_Per_802_11_Client_5 = Max_802_11_MAC_Payload_Goodput_5 / 20
MAC_Goodput_Per_802_11_Client_6 = Max_802_11_MAC_Payload_Goodput_6 / 50
MAC_Goodput_Per_802_11_Client_7 = Max_802_11_MAC_Payload_Goodput_7 / 100
self.Client_43_new = format(MAC_Goodput_Per_802_11_Client_1, '.3f')
Client_44_new = format(MAC_Goodput_Per_802_11_Client_2, '.3f')
Client_45_new = format(MAC_Goodput_Per_802_11_Client_3, '.3f')
Client_46_new = format(MAC_Goodput_Per_802_11_Client_4, '.3f')
Client_47_new = format(MAC_Goodput_Per_802_11_Client_5, '.3f')
Client_48_new = format(MAC_Goodput_Per_802_11_Client_6, '.3f')
Client_49_new = format(MAC_Goodput_Per_802_11_Client_7, '.3f')
# Offered Load (802.3 Side)
# c49
if eth_value != 0:
Offered_Load_8023_Side_1 = Max_MAC_MSDU_Rate_1 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_2 = Max_MAC_MSDU_Rate_2 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_3 = Max_MAC_MSDU_Rate_3 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_4 = Max_MAC_MSDU_Rate_4 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_5 = Max_MAC_MSDU_Rate_5 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_6 = Max_MAC_MSDU_Rate_6 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_7 = Max_MAC_MSDU_Rate_7 * Ethernet_value * 8 / 1000000
self.Client_50_new = format(Offered_Load_8023_Side_1, '.3f')
Client_51_new = format(Offered_Load_8023_Side_2, '.3f')
Client_52_new = format(Offered_Load_8023_Side_3, '.3f')
Client_53_new = format(Offered_Load_8023_Side_4, '.3f')
Client_54_new = format(Offered_Load_8023_Side_5, '.3f')
Client_55_new = format(Offered_Load_8023_Side_6, '.3f')
Client_56_new = format(Offered_Load_8023_Side_7, '.3f')
else:
self.Client_50_new = "N/A"
Client_51_new = "N/A"
Client_52_new = "N/A"
Client_53_new = "N/A"
Client_54_new = "N/A"
Client_55_new = "N/A"
Client_56_new = "N/A"
IP_Packet_value_str = str(IP_Packet_value)
if "N/A" not in IP_Packet_value_str:
IP_Goodput_802_11_8023_1 = Max_MAC_MSDU_Rate_1 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_2 = Max_MAC_MSDU_Rate_2 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_3 = Max_MAC_MSDU_Rate_3 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_4 = Max_MAC_MSDU_Rate_4 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_5 = Max_MAC_MSDU_Rate_5 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_6 = Max_MAC_MSDU_Rate_6 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_7 = Max_MAC_MSDU_Rate_7 * ip_1 * 8 / 1000000
self.Client_57_new = format(IP_Goodput_802_11_8023_1, '.3f')
Client_58_new = format(IP_Goodput_802_11_8023_2, '.3f')
Client_59_new = format(IP_Goodput_802_11_8023_3, '.3f')
Client_60_new = format(IP_Goodput_802_11_8023_4, '.3f')
Client_61_new = format(IP_Goodput_802_11_8023_5, '.3f')
Client_62_new = format(IP_Goodput_802_11_8023_6, '.3f')
Client_63_new = format(IP_Goodput_802_11_8023_7, '.3f')
else:
self.Client_57_new = "N/A"
Client_58_new = "N/A"
Client_59_new = "N/A"
Client_60_new = "N/A"
Client_61_new = "N/A"
Client_62_new = "N/A"
Client_63_new = "N/A"
# Theoretical Voice Call Capacity
# c53
if "Data" in self.Traffic_Type:
self.Maximum_Theoretical_R_value = "N/A"
self.Estimated_MOS_Score = "N/A"
else:
if "G.711" in self.Codec_Type:
self.Maximum_Theoretical_R_value = 85.9
else:
if "G.723" in self.Codec_Type:
self.Maximum_Theoretical_R_value = 72.9
else:
if "G.729" in self.Codec_Type:
self.Maximum_Theoretical_R_value = 81.7
else:
self.Maximum_Theoretical_R_value = 93.2
if self.Maximum_Theoretical_R_value < 0:
self.Estimated_MOS_Score = 1
else:
if self.Maximum_Theoretical_R_value > 100:
self.Estimated_MOS_Score = 4.5
else:
self.Estimated_MOS_Score_1 = (
1 + 0.035 * self.Maximum_Theoretical_R_value + self.Maximum_Theoretical_R_value * (
self.Maximum_Theoretical_R_value - 60) * (
100 - self.Maximum_Theoretical_R_value) * 7 * 0.000001)
self.Estimated_MOS_Score = format(self.Estimated_MOS_Score_1, '.2f')
# Voice_Call_Range
try:
Voice_Call_Range = round(Max_PPDU_Rate_1 / Codec_Frame_Rate)
# c55 Maximum Bidirectional Voice Calls
if Voice_Call_Range <= 1:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_1 / Codec_Frame_Rate
else:
if Voice_Call_Range <= 2:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_2 / Codec_Frame_Rate
else:
if Voice_Call_Range <= 5:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_3 / Codec_Frame_Rate
else:
if Voice_Call_Range <= 10:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_4 / Codec_Frame_Rate
else:
if Voice_Call_Range <= 20:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_5 / Codec_Frame_Rate
else:
if Voice_Call_Range <= 50:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_6 / Codec_Frame_Rate
else:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_7 / Codec_Frame_Rate
except ZeroDivisionError:
pass
if "Data" in self.Traffic_Type:
self.Maximum_Bidirectional_Voice_Calls = "N/A"
else:
self.Maximum_Bidirectional_Voice_Calls = round(Maximum_Bidirectional, 2)
def get_result(self):
print("\n" + "******************Station : 11nCalculator*****************************" + "\n")
print("Theoretical Maximum Offered Load" + "\n")
print("1 Client:")
All_theoretical_output = {'MAC PPDU Interval(usec)': self.Client_1_new,
'Max PPDU Rate(fps)': self.Client_8_new,
'Max MAC MPDU Rate': self.Client_15_new,
'Max MAC MSDU Rate': self.Client_22_new,
'Max. 802.11 MAC Frame Data Rate(Mb/s)': self.Client_29_new,
'Max. 802.11 MAC Payload Goodput(Mb/s)': self.Client_36_new,
'MAC Goodput Per 802.11 Client(Mb/s)': self.Client_43_new,
'Offered Load (802.3 Side)(Mb/s)': self.Client_50_new,
'IP Goodput (802.11 -> 802.3)(Mb/s)': self.Client_57_new}
print(json.dumps(All_theoretical_output, indent=4))
print("\n" + "Theroretical Voice Call Capacity" + "\n")
All_theoretical_voice = {'Maximum Theoretical R-value': self.Maximum_Theoretical_R_value,
'Estimated MOS Score': self.Estimated_MOS_Score,
'Maximum Bidirectional Voice Calls(calls)': self.Maximum_Bidirectional_Voice_Calls}
print(json.dumps(All_theoretical_voice, indent=4))
##Class to take all user input (802.11ac Standard)
class ac11_calculator(n11_calculator):
def __init__(self, Traffic_Type, Data_Voice_MCS, spatial, Channel_Bandwidth, Guard_Interval_value,
Highest_Basic_str, Encryption, QoS,IP_Packets_MSDU_str, MAC_Frames_per_A_MPDU_str, BSS_Basic_Rate, MAC_MPDU_Size_Data_Traffic,
Codec_Type, CWmin, RTS_CTS,PLCP = None,RTS_CTS_Handshake=None,CTS_to_self=None):
super().__init__(Traffic_Type, Data_Voice_MCS, Channel_Bandwidth, Guard_Interval_value, Highest_Basic_str,
Encryption, QoS,
IP_Packets_MSDU_str, MAC_Frames_per_A_MPDU_str, BSS_Basic_Rate, MAC_MPDU_Size_Data_Traffic,
Codec_Type, PLCP, CWmin, RTS_CTS_Handshake, CTS_to_self)
self.spatial = spatial
self.RTS_CTS = RTS_CTS
# This function is for calculate intermediate values and Theoretical values
def calculate(self):
SIFS = 16.00
DIFS = 34.00
Slot_Time = 9.00
Tsymbol_control_Symbol_Period = 4.00
Codec_IP_Packet_Size = 200
Codec_Frame_Rate = 100
# ********************Auxilliary data****************************
HT_LTFs = ['1', '2', '4', '4']
Ndbps_20MHz = ['26', '52', '78', '104', '156', '208', '234', '260', '312', '1040']
Ndbps_40MHz = ['54', '108', '162', '216', '324', '432', '486', '540', '648', '720']
Ndbps_80MHz = ['117', '234', '351', '468', '702', '936', '1053', '1170', '1404', '1560']
Non_HT_Ref = ['6', '12', '18', '24', '36', '48', '54', '54', '54', '54']
Nes1 = ['1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
'1', '1', '1', '1', '1', '1', '1', '1', '1']
Nes2 = ['1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
'2', '2', '2', '1', '1', '1', '2', '2', '2']
Nes3 = ['1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
'2', '2', '2', '1', '2', '2', '2', '2', '3']
Nes4 = ['1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', '1',
'1', '1', '1', '2', '2', '2', '3', '3', '3']
Data_Voice_MCS_int = int(self.Data_Voice_MCS)
CWmin_leave_alone_for_default = int(self.CWmin)
spatial_int = int(self.spatial)
MAC_Frames_per_A_MPDU = int(self.MAC_Frames_per_A_MPDU_str)
i = 0
while True:
if Data_Voice_MCS_int == i:
Non_HT = Non_HT_Ref[i]
break
i = i + 1
Non_HT_value = int(Non_HT)
if Non_HT_value >= 6:
if "6" in self.BSS_Basic_Rate:
allowed_control6 = 6
else:
if (not ("6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate
or "18" in self.BSS_Basic_Rate or "24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or
"48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
allowed_control6 = 6
else:
allowed_control6 = 0
else:
allowed_control6 = 0
if Non_HT_value >= 9:
if "9" in self.BSS_Basic_Rate:
allowed_control9 = 9
else:
if (not ("6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate
or "18" in self.BSS_Basic_Rate or "24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or
"48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
allowed_control9 = 6
else:
allowed_control9 = 0
else:
allowed_control9 = 0
if Non_HT_value >= 12:
if "12" in self.BSS_Basic_Rate:
allowed_control12 = 12
else:
if (not ("6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate
or "18" in self.BSS_Basic_Rate or "24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or
"48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
allowed_control12 = 12
else:
allowed_control12 = 0
else:
allowed_control12 = 0
if Non_HT_value >= 18:
if "18" in self.BSS_Basic_Rate:
allowed_control18 = 18
else:
if (not ("6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate
or "18" in self.BSS_Basic_Rate or "24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or
"48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
allowed_control18 = 12
else:
allowed_control18 = 0
else:
allowed_control18 = 0
if Non_HT_value >= 24:
if "24" in self.BSS_Basic_Rate:
allowed_control24 = 24
else:
if (not ("6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate
or "18" in self.BSS_Basic_Rate or "24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or
"48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
allowed_control24 = 24
else:
allowed_control24 = 0
else:
allowed_control24 = 0
if Non_HT_value >= 36:
if "36" in self.BSS_Basic_Rate:
allowed_control36 = 36
else:
if (not ("6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate
or "18" in self.BSS_Basic_Rate or "24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or
"48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
allowed_control36 = 24
else:
allowed_control36 = 0
else:
allowed_control36 = 0
if Non_HT_value >= 48:
if "48" in self.BSS_Basic_Rate:
allowed_control48 = 48
else:
if (not ("6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate
or "18" in self.BSS_Basic_Rate or "24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or
"48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
allowed_control48 = 24
else:
allowed_control48 = 0
else:
allowed_control48 = 0
if Non_HT_value >= 54:
if "54" in self.BSS_Basic_Rate:
allowed_control54 = 54
else:
if (not ("6" in self.BSS_Basic_Rate or "9" in self.BSS_Basic_Rate or "12" in self.BSS_Basic_Rate
or "18" in self.BSS_Basic_Rate or "24" in self.BSS_Basic_Rate or "36" in self.BSS_Basic_Rate or
"48" in self.BSS_Basic_Rate or "54" in self.BSS_Basic_Rate)):
allowed_control54 = 24
else:
allowed_control54 = 0
else:
allowed_control54 = 0
MeanBackoff = CWmin_leave_alone_for_default * Slot_Time / 2
IP_Packets_MSDU = int(self.IP_Packets_MSDU_str)
if "Mixed" in self.Codec_Type:
plcp = 1
elif "Greenfield" in self.Codec_Type:
plcp = 2
RTS_CTS_Handshake = 1
if "No" in self.RTS_CTS:
CTS_to_self = 1
elif "Yes" in self.RTS_CTS:
CTS_to_self = 2
# g24 QoS Hdr
if "Yes" in self.QoS:
QoS_1 = 1
elif "No" in self.QoS:
QoS_1 = 0
if (QoS_1 == 1) or (IP_Packets_MSDU > 1):
QoS_Hdr = 2
else:
QoS_Hdr = 0
# g23 Encrypt Hdr
if "None" in self.Encryption:
Encrypt_Hdr = 0
else:
if "WEP" in self.Encryption:
Encrypt_Hdr = 8
elif "TKIP" in self.Encryption:
Encrypt_Hdr = 20
else:
Encrypt_Hdr = 16
# c18 MAC MPDU Size
IP_Packets_MSDU_loc = IP_Packets_MSDU + 1
if "Data" in self.Traffic_Type:
MAC_MPDU_Size = int(self.MAC_MPDU_Size_Data_Traffic)
else:
if (IP_Packets_MSDU == 0):
MAC_MPDU_Size = (Codec_IP_Packet_Size + 28 + QoS_Hdr + Encrypt_Hdr + 8)
else:
MAC_MPDU_Size_1 = (
Codec_IP_Packet_Size + 28 + QoS_Hdr + Encrypt_Hdr + 8 + (IP_Packets_MSDU_loc - 1) * (
14 + 3))
MAC_MPDU_Size = int(MAC_MPDU_Size_1 / (IP_Packets_MSDU_loc - 1))
# MSDU Size
if IP_Packets_MSDU == 0:
MSDU_final = MAC_MPDU_Size - 28 - QoS_Hdr - Encrypt_Hdr
else:
MSDU_1 = (MAC_MPDU_Size - 28 - QoS_Hdr - Encrypt_Hdr - (IP_Packets_MSDU) * (14 + 3))
MSDU_final = (int(MSDU_1 / (IP_Packets_MSDU)))
if MSDU_final < 0:
MSDU = MSDU_final - 1
else:
MSDU = MSDU_final
if (MSDU - 8) < 20:
IP_Packet_value = "N/A"
ip_value = 0
else:
IP_Packet_value = MSDU - 8
ip_value = 1
if ip_value == 0:
Ethernet_value = "N/A"
eth_value = 0
else:
ip_1 = int(IP_Packet_value)
Ethernet_value = max(ip_1 + 18, 64)
eth_value = 1
i = 1
while True:
if int(spatial_int) == i:
offset_str = HT_LTFs[i - 1]
break
i = i + 1
offset = int(offset_str)
Tppdu_fixed = 36 + offset * 4
# Tppdu_fixed (HT Control Frames)
offset_str_1 = HT_LTFs[0]
offset_1 = int(offset_str_1)
Tppdu_fixed_control = 36 + offset_1 * 4
# c23 VHT Data Rate
# Ndbps, data bits per symbol (Data)
# offset
j = 0
while True:
if Data_Voice_MCS_int == j:
if "20" in self.Channel_Bandwidth:
Ndbps_str = Ndbps_20MHz[j]
break
elif "40" in self.Channel_Bandwidth:
Ndbps_str = Ndbps_40MHz[j]
break
elif "80" in self.Channel_Bandwidth:
Ndbps_str = Ndbps_80MHz[j]
break
j = j + 1
Ndbps = int(Ndbps_str)
Ndbps_bits_per_symbol_Data = Ndbps * spatial_int
# c27 Tsymbol(Data), Data Symbol Period
if "400" in self.Guard_Interval_value:
Guard_Interval_1 = 1
elif "800" in self.Guard_Interval_value:
Guard_Interval_1 = 0
calculation = (((Data_Voice_MCS_int > 7 and plcp == 2) or plcp == 1))
if (Guard_Interval_1 == 1) and calculation:
Tsymbol_Data_Symbol_Period = 3.60
else:
Tsymbol_Data_Symbol_Period = 4
VHT_Data_Rate = Ndbps_bits_per_symbol_Data / Tsymbol_Data_Symbol_Period
# Non-HT Reference Rate
k = 0
while True:
if Data_Voice_MCS_int == k:
Non_HT = Non_HT_Ref[k]
break
k = k + 1
Non_HT_value = int(Non_HT)
# PHY Bit Rate of Control Frames
PHY_Bit_Rate_of_Control_Frames = max(allowed_control6, allowed_control9,
allowed_control12, allowed_control18,
allowed_control24, allowed_control36,
allowed_control48, allowed_control54, 6)
# c27 Ndbps, data bits per symbol (Control)
if PHY_Bit_Rate_of_Control_Frames < 7:
if PHY_Bit_Rate_of_Control_Frames < 3:
PHY = PHY_Bit_Rate_of_Control_Frames
else:
if PHY_Bit_Rate_of_Control_Frames == 3:
PHY = 5.5
else:
if PHY_Bit_Rate_of_Control_Frames == 4:
PHY = 11
else:
if PHY_Bit_Rate_of_Control_Frames == 5:
PHY = 6
else:
if PHY_Bit_Rate_of_Control_Frames == 6:
PHY = 9
else:
if PHY_Bit_Rate_of_Control_Frames == 8:
PHY = 18
else:
if PHY_Bit_Rate_of_Control_Frames == 9:
PHY = 24
else:
if PHY_Bit_Rate_of_Control_Frames == 10:
PHY = 36
else:
if PHY_Bit_Rate_of_Control_Frames == 11:
PHY = 48
else:
PHY = 54
Ndbps_bits_per_symbol_Control = PHY * 4
# Nbits, Bits per MAC PPDU
# A-MPDU Pad
if ((MAC_Frames_per_A_MPDU == 0)):
MPDU_Pad = int(0)
else:
x = int((MAC_MPDU_Size % 4))
y = int((4 - x))
MPDU_Pad = int((y % 4))
MAC_Frames_per_A_MPDU_loc = MAC_Frames_per_A_MPDU + 1
if (MAC_Frames_per_A_MPDU == 0):
Nbits_Bits_per_MAC_PPDU = MAC_MPDU_Size * 8
else:
Nbits_Bits_per_MAC_PPDU = ((MAC_MPDU_Size + 4) * (MAC_Frames_per_A_MPDU_loc - 1) + MPDU_Pad * (
MAC_Frames_per_A_MPDU_loc - 2)) * 8
# Nes, Number of BCC encoders
l = 0
while True:
if Data_Voice_MCS_int == l:
if "20" in self.Channel_Bandwidth:
Nes = 0 * 10 + Data_Voice_MCS_int
elif "40" in self.Channel_Bandwidth:
Nes = 1 * 10 + Data_Voice_MCS_int
elif "80" in self.Channel_Bandwidth:
Nes = 2 * 10 + Data_Voice_MCS_int
if spatial_int == 1:
Nes_str = Nes1[Nes]
break
elif spatial_int == 2:
Nes_str = Nes2[Nes]
break
elif spatial_int == 3:
Nes_str = Nes3[Nes]
break
elif spatial_int == 4:
Nes_str = Nes4[Nes]
break
l = l + 1
Nes_int = int(Nes_str)
# Ttxframe (DATA)
Ttxframe = Tppdu_fixed + int((16 + 6 * Nes_int + Nbits_Bits_per_MAC_PPDU + Ndbps_bits_per_symbol_Data - 1)
/ Ndbps_bits_per_symbol_Data) * Tsymbol_Data_Symbol_Period
Ttxframe_Ack = int(
(22 + 14 * 8 + PHY_Bit_Rate_of_Control_Frames * 4 - 1) / (PHY_Bit_Rate_of_Control_Frames * 4)) * 4 + 20
# c34 Ttxframe (Compressed BlockAck)
Ttxframe_Compressed_BlockAck = int((22 + 32 * 8 + PHY_Bit_Rate_of_Control_Frames * 4 - 1)
/ (PHY_Bit_Rate_of_Control_Frames * 4)) * 4 + 20
# c35 RTS/CTS Handshake Overhead
if RTS_CTS_Handshake == 2:
if "20" in self.Channel_Bandwidth:
RTS_CTS_Handshake_Overhead = 2 * 20 + 4 * int(
(22 + (20 + 14) * 8 + 24 * 4 - 1) / (24 * 4)) + 2 * SIFS
else:
RTS_CTS_Handshake_Overhead = 2 * 20 + int(
(22 + (20 + 14) * 8 + 24 - 1) / 24) * Tsymbol_control_Symbol_Period + 2 * SIFS
else:
RTS_CTS_Handshake_Overhead = 0
# c36 CTS-to-self Handshake Overhead
if RTS_CTS_Handshake == 2:
CTS_to_self_Handshake_Overhead = 0
else:
if CTS_to_self == 2:
if "20" in self.Channel_Bandwidth:
CTS_to_self_Handshake_Overhead = 20 + 4 * int((22 + 14 * 8 + 24 * 4 - 1) / (24 * 4)) + SIFS
else:
CTS_to_self_Handshake_Overhead = 20 + int(
(22 + 14 * 8 + 24 - 1) / 24) * Tsymbol_control_Symbol_Period + SIFS
else:
CTS_to_self_Handshake_Overhead = 0
# c37 Ack Response Overhead
# g20 Use BlockAck
if (MAC_Frames_per_A_MPDU == 0):
Use_BlockAck = False
else:
Use_BlockAck = True
if Use_BlockAck:
Ack_Response_Overhead = 0
else:
Ack_Response_Overhead = SIFS + Ttxframe_Ack
# c38BlockAck Response Overhead
if Use_BlockAck:
BlockAck_Response_Overhead = SIFS + Ttxframe_Compressed_BlockAck
else:
BlockAck_Response_Overhead = 0
# c42 MAC PPDU Interval
MAC_PPDU_Interval_1 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 1)
self.Client_1_new = format(MAC_PPDU_Interval_1, '.2f')
MAC_PPDU_Interval_2 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 2)
Client_2_new = format(MAC_PPDU_Interval_2, '.2f')
MAC_PPDU_Interval_3 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 5)
Client_3_new = format(MAC_PPDU_Interval_3, '.2f')
MAC_PPDU_Interval_4 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 10)
Client_4_new = format(MAC_PPDU_Interval_4, '.2f')
MAC_PPDU_Interval_5 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 20)
Client_5_new = format(MAC_PPDU_Interval_5, '.2f')
MAC_PPDU_Interval_6 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 50)
Client_6_new = format(MAC_PPDU_Interval_6, '.2f')
MAC_PPDU_Interval_7 = RTS_CTS_Handshake_Overhead + CTS_to_self_Handshake_Overhead + Ttxframe + Ack_Response_Overhead + BlockAck_Response_Overhead + DIFS + (
MeanBackoff / 100)
Client_7_new = format(MAC_PPDU_Interval_7, '.3f')
# Max PPDU Rate
Max_PPDU_Rate_1 = 1000000 / MAC_PPDU_Interval_1
self.Client_8_new = format(Max_PPDU_Rate_1, '.2f')
Max_PPDU_Rate_2 = 1000000 / MAC_PPDU_Interval_2
Client_9_new = format(Max_PPDU_Rate_2, '.2f')
Max_PPDU_Rate_3 = 1000000 / MAC_PPDU_Interval_3
Client_10_new = format(Max_PPDU_Rate_3, '.2f')
Max_PPDU_Rate_4 = 1000000 / MAC_PPDU_Interval_4
Client_11_new = format(Max_PPDU_Rate_4, '.2f')
Max_PPDU_Rate_5 = 1000000 / MAC_PPDU_Interval_5
Client_12_new = format(Max_PPDU_Rate_5, '.2f')
Max_PPDU_Rate_6 = 1000000 / MAC_PPDU_Interval_6
Client_13_new = format(Max_PPDU_Rate_6, '.2f')
Max_PPDU_Rate_7 = 1000000 / MAC_PPDU_Interval_7
Client_14_new = format(Max_PPDU_Rate_7, '.2f')
# c44 Max_MAC_MPDU_Rate_1
if (MAC_Frames_per_A_MPDU > 0):
Max_MAC_MPDU_Rate_1 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_1
Max_MAC_MPDU_Rate_2 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_2
Max_MAC_MPDU_Rate_3 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_3
Max_MAC_MPDU_Rate_4 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_4
Max_MAC_MPDU_Rate_5 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_5
Max_MAC_MPDU_Rate_6 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_6
Max_MAC_MPDU_Rate_7 = (MAC_Frames_per_A_MPDU) * Max_PPDU_Rate_7
else:
Max_MAC_MPDU_Rate_1 = Max_PPDU_Rate_1
Max_MAC_MPDU_Rate_2 = Max_PPDU_Rate_2
Max_MAC_MPDU_Rate_3 = Max_PPDU_Rate_3
Max_MAC_MPDU_Rate_4 = Max_PPDU_Rate_4
Max_MAC_MPDU_Rate_5 = Max_PPDU_Rate_5
Max_MAC_MPDU_Rate_6 = Max_PPDU_Rate_6
Max_MAC_MPDU_Rate_7 = Max_PPDU_Rate_7
self.Client_15_new = round(Max_MAC_MPDU_Rate_1)
Client_16_new = round(Max_MAC_MPDU_Rate_2)
Client_17_new = round(Max_MAC_MPDU_Rate_3)
Client_18_new = round(Max_MAC_MPDU_Rate_4)
Client_19_new = round(Max_MAC_MPDU_Rate_5)
Client_20_new = round(Max_MAC_MPDU_Rate_6)
Client_21_new = round(Max_MAC_MPDU_Rate_7)
# Max MAC MSDU Rate
if (IP_Packets_MSDU > 0):
Max_MAC_MSDU_Rate_1 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_1
Max_MAC_MSDU_Rate_2 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_2
Max_MAC_MSDU_Rate_3 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_3
Max_MAC_MSDU_Rate_4 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_4
Max_MAC_MSDU_Rate_5 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_5
Max_MAC_MSDU_Rate_6 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_6
Max_MAC_MSDU_Rate_7 = (IP_Packets_MSDU) * Max_MAC_MPDU_Rate_7
else:
Max_MAC_MSDU_Rate_1 = Max_MAC_MPDU_Rate_1
Max_MAC_MSDU_Rate_2 = Max_MAC_MPDU_Rate_2
Max_MAC_MSDU_Rate_3 = Max_MAC_MPDU_Rate_3
Max_MAC_MSDU_Rate_4 = Max_MAC_MPDU_Rate_4
Max_MAC_MSDU_Rate_5 = Max_MAC_MPDU_Rate_5
Max_MAC_MSDU_Rate_6 = Max_MAC_MPDU_Rate_6
Max_MAC_MSDU_Rate_7 = Max_MAC_MPDU_Rate_7
self.Client_22_new = round(Max_MAC_MSDU_Rate_1)
Client_23_new = round(Max_MAC_MSDU_Rate_2)
Client_24_new = round(Max_MAC_MSDU_Rate_3)
Client_25_new = round(Max_MAC_MSDU_Rate_4)
Client_26_new = round(Max_MAC_MSDU_Rate_5)
Client_27_new = round(Max_MAC_MSDU_Rate_6)
Client_28_new = round(Max_MAC_MSDU_Rate_7)
# Max. 802.11 MAC Frame Data Rate
Max_802_11_MAC_Frame_Data_Rate_1 = Max_MAC_MPDU_Rate_1 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_2 = Max_MAC_MPDU_Rate_2 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_3 = Max_MAC_MPDU_Rate_3 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_4 = Max_MAC_MPDU_Rate_4 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_5 = Max_MAC_MPDU_Rate_5 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_6 = Max_MAC_MPDU_Rate_6 * MAC_MPDU_Size * 8 / 1000000
Max_802_11_MAC_Frame_Data_Rate_7 = Max_MAC_MPDU_Rate_7 * MAC_MPDU_Size * 8 / 1000000
self.Client_29_new = format(Max_802_11_MAC_Frame_Data_Rate_1, '.3f')
Client_30_new = format(Max_802_11_MAC_Frame_Data_Rate_2, '.3f')
Client_31_new = format(Max_802_11_MAC_Frame_Data_Rate_3, '.3f')
Client_32_new = format(Max_802_11_MAC_Frame_Data_Rate_4, '.3f')
Client_33_new = format(Max_802_11_MAC_Frame_Data_Rate_5, '.3f')
Client_34_new = format(Max_802_11_MAC_Frame_Data_Rate_6, '.3f')
Client_35_new = format(Max_802_11_MAC_Frame_Data_Rate_7, '.3f')
# Max. 802.11 MAC Payload Goodput
Max_802_11_MAC_Payload_Goodput_1 = MSDU * 8 * Max_MAC_MSDU_Rate_1 / 1000000
Max_802_11_MAC_Payload_Goodput_2 = MSDU * 8 * Max_MAC_MSDU_Rate_2 / 1000000
Max_802_11_MAC_Payload_Goodput_3 = MSDU * 8 * Max_MAC_MSDU_Rate_3 / 1000000
Max_802_11_MAC_Payload_Goodput_4 = MSDU * 8 * Max_MAC_MSDU_Rate_4 / 1000000
Max_802_11_MAC_Payload_Goodput_5 = MSDU * 8 * Max_MAC_MSDU_Rate_5 / 1000000
Max_802_11_MAC_Payload_Goodput_6 = MSDU * 8 * Max_MAC_MSDU_Rate_6 / 1000000
Max_802_11_MAC_Payload_Goodput_7 = MSDU * 8 * Max_MAC_MSDU_Rate_7 / 1000000
self.Client_36_new = format(Max_802_11_MAC_Payload_Goodput_1, '.3f')
Client_37_new = format(Max_802_11_MAC_Payload_Goodput_2, '.3f')
Client_38_new = format(Max_802_11_MAC_Payload_Goodput_3, '.3f')
Client_39_new = format(Max_802_11_MAC_Payload_Goodput_4, '.3f')
Client_40_new = format(Max_802_11_MAC_Payload_Goodput_5, '.3f')
Client_41_new = format(Max_802_11_MAC_Payload_Goodput_6, '.3f')
Client_42_new = format(Max_802_11_MAC_Payload_Goodput_7, '.3f')
# MAC Goodput Per 802.11 Client
MAC_Goodput_Per_802_11_Client_1 = Max_802_11_MAC_Payload_Goodput_1 / 1
MAC_Goodput_Per_802_11_Client_2 = Max_802_11_MAC_Payload_Goodput_2 / 2
MAC_Goodput_Per_802_11_Client_3 = Max_802_11_MAC_Payload_Goodput_3 / 5
MAC_Goodput_Per_802_11_Client_4 = Max_802_11_MAC_Payload_Goodput_4 / 10
MAC_Goodput_Per_802_11_Client_5 = Max_802_11_MAC_Payload_Goodput_5 / 20
MAC_Goodput_Per_802_11_Client_6 = Max_802_11_MAC_Payload_Goodput_6 / 50
MAC_Goodput_Per_802_11_Client_7 = Max_802_11_MAC_Payload_Goodput_7 / 100
self.Client_43_new = format(MAC_Goodput_Per_802_11_Client_1, '.3f')
Client_44_new = format(MAC_Goodput_Per_802_11_Client_2, '.3f')
Client_45_new = format(MAC_Goodput_Per_802_11_Client_3, '.3f')
Client_46_new = format(MAC_Goodput_Per_802_11_Client_4, '.3f')
Client_47_new = format(MAC_Goodput_Per_802_11_Client_5, '.3f')
Client_48_new = format(MAC_Goodput_Per_802_11_Client_6, '.3f')
Client_49_new = format(MAC_Goodput_Per_802_11_Client_7, '.3f')
# Offered Load (802.3 Side)
if eth_value != 0:
Offered_Load_8023_Side_1 = Max_MAC_MSDU_Rate_1 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_2 = Max_MAC_MSDU_Rate_2 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_3 = Max_MAC_MSDU_Rate_3 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_4 = Max_MAC_MSDU_Rate_4 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_5 = Max_MAC_MSDU_Rate_5 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_6 = Max_MAC_MSDU_Rate_6 * Ethernet_value * 8 / 1000000
Offered_Load_8023_Side_7 = Max_MAC_MSDU_Rate_7 * Ethernet_value * 8 / 1000000
self.Client_50_new = format(Offered_Load_8023_Side_1, '.3f')
Client_51_new = format(Offered_Load_8023_Side_2, '.3f')
Client_52_new = format(Offered_Load_8023_Side_3, '.3f')
Client_53_new = format(Offered_Load_8023_Side_4, '.3f')
Client_54_new = format(Offered_Load_8023_Side_5, '.3f')
Client_55_new = format(Offered_Load_8023_Side_6, '.3f')
Client_56_new = format(Offered_Load_8023_Side_7, '.3f')
else:
self.Client_50_new = "N/A"
Client_51_new = "N/A"
Client_52_new = "N/A"
Client_53_new = "N/A"
Client_54_new = "N/A"
Client_55_new = "N/A"
Client_56_new = "N/A"
IP_Packet_value_str = str(IP_Packet_value)
if "N/A" not in IP_Packet_value_str:
IP_Goodput_802_11_8023_1 = Max_MAC_MSDU_Rate_1 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_2 = Max_MAC_MSDU_Rate_2 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_3 = Max_MAC_MSDU_Rate_3 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_4 = Max_MAC_MSDU_Rate_4 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_5 = Max_MAC_MSDU_Rate_5 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_6 = Max_MAC_MSDU_Rate_6 * ip_1 * 8 / 1000000
IP_Goodput_802_11_8023_7 = Max_MAC_MSDU_Rate_7 * ip_1 * 8 / 1000000
self.Client_57_new = format(IP_Goodput_802_11_8023_1, '.3f')
Client_58_new = format(IP_Goodput_802_11_8023_2, '.3f')
Client_59_new = format(IP_Goodput_802_11_8023_3, '.3f')
Client_60_new = format(IP_Goodput_802_11_8023_4, '.3f')
Client_61_new = format(IP_Goodput_802_11_8023_5, '.3f')
Client_62_new = format(IP_Goodput_802_11_8023_6, '.3f')
Client_63_new = format(IP_Goodput_802_11_8023_7, '.3f')
else:
self.Client_57_new = "N/A"
Client_58_new = "N/A"
Client_59_new = "N/A"
Client_60_new = "N/A"
Client_61_new = "N/A"
Client_62_new = "N/A"
Client_63_new = "N/A"
# Theoretical Voice Call Capacity
if "Data" in self.Traffic_Type:
self.Maximum_Theoretical_R_value = "N/A"
self.Estimated_MOS_Score = "N/A"
else:
self.Maximum_Theoretical_R_value = 85.9
if self.Maximum_Theoretical_R_value < 0:
self.Estimated_MOS_Score = 1
else:
if self.Maximum_Theoretical_R_value > 100:
self.Estimated_MOS_Score = 4.5
else:
Estimated_MOS_Score_1 = (1 + 0.035 * self.Maximum_Theoretical_R_value + self.Maximum_Theoretical_R_value * (
self.Maximum_Theoretical_R_value - 60) * (100 - self.Maximum_Theoretical_R_value) * 7 * 0.000001)
self.Estimated_MOS_Score = format(Estimated_MOS_Score_1, '.2f')
# Voice_Call_Range
try:
Voice_Call_Range = round(Max_PPDU_Rate_1 / Codec_Frame_Rate)
# c55 Maximum Bidirectional Voice Calls
if Voice_Call_Range <= 1:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_1 / Codec_Frame_Rate
else:
if Voice_Call_Range <= 2:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_2 / Codec_Frame_Rate
else:
if Voice_Call_Range <= 5:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_3 / Codec_Frame_Rate
else:
if Voice_Call_Range <= 10:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_4 / Codec_Frame_Rate
else:
if Voice_Call_Range <= 20:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_5 / Codec_Frame_Rate
else:
if Voice_Call_Range <= 50:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_6 / Codec_Frame_Rate
else:
Maximum_Bidirectional = Max_MAC_MSDU_Rate_7 / Codec_Frame_Rate
except ZeroDivisionError:
pass
if "Data" in self.Traffic_Type:
self.Maximum_Bidirectional_Voice_Calls = "N/A"
else:
self.Maximum_Bidirectional_Voice_Calls = round(Maximum_Bidirectional, 2)
def get_result(self):
print("\n" + "******************Station : 11ac Calculator*****************************" + "\n")
print("Theoretical Maximum Offered Load" + "\n")
print("1 Client:")
All_theoretical_output = {'MAC PPDU Interval(usec)': self.Client_1_new, 'Max PPDU Rate(fps)': self.Client_8_new,
'Max MAC MPDU Rate': self.Client_15_new,
'Max MAC MSDU Rate': self.Client_22_new,
'Max. 802.11 MAC Frame Data Rate(Mb/s)': self.Client_29_new,
'Max. 802.11 MAC Payload Goodput(Mb/s)': self.Client_36_new,
'MAC Goodput Per 802.11 Client(Mb/s)': self.Client_43_new,
'Offered Load (802.3 Side)(Mb/s)': self.Client_50_new,
'IP Goodput (802.11 -> 802.3)(Mb/s)': self.Client_57_new}
print(json.dumps(All_theoretical_output, indent=4))
print("\n" + "Theroretical Voice Call Capacity" + "\n")
All_theoretical_voice = {'Maximum Theoretical R-value': self.Maximum_Theoretical_R_value,
'Estimated MOS Score': self.Estimated_MOS_Score,
'Maximum Bidirectional Voice Calls(calls)': self.Maximum_Bidirectional_Voice_Calls}
print(json.dumps(All_theoretical_voice, indent=4))