luci-app-mtk: fix stainfo

This commit is contained in:
hanwckf 2022-11-13 00:52:16 +08:00
parent 709884eaee
commit 7b216caf26
7 changed files with 796 additions and 219 deletions

View File

@ -940,6 +940,9 @@ function sta_info(ifname)
local output = {} local output = {}
local stalist = c_StaInfo(ifname) local stalist = c_StaInfo(ifname)
local ifname_t = {["ifname"] = ifname}
table.insert(output, ifname_t)
local count = 0 local count = 0
for _ in pairs(stalist) do count = count + 1 end for _ in pairs(stalist) do count = count + 1 end

View File

@ -204,20 +204,18 @@ local chipname
<% end %> <% end %>
<% end %> <% end %>
<!--
<h2><a id="content" name="content"><%:Station List%></a></h2>
<fieldset class="cbi-section"> <fieldset class="cbi-section">
<table class="cbi-section-table" style="margin:10px" id="iw-assoclist"> <h2><a id="content" name="content">Station List</a></h2>
<table class="cbi-section-table" style="margin: auto" id="iw-assoclist">
<tr class="cbi-section-table-titles"> <tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"></th> <th class="cbi-section-table-cell">Interface</th>
<th class="cbi-section-table-cell"><%:SSID%></th> <th class="cbi-section-table-cell">SSID</th>
<th class="cbi-section-table-cell"><%:MAC-Address%></th> <th class="cbi-section-table-cell">MAC-Address</th>
<th class="cbi-section-table-cell"><%:IPv4-Address%></th> <!--th class="cbi-section-table-cell">IPv4-Address</th-->
<th class="cbi-section-table-cell"><%:Signal%></th> <th class="cbi-section-table-cell">Signal (dBm)</th>
<th class="cbi-section-table-cell"><%:Noise%></th> <th class="cbi-section-table-cell">TX Rate</th>
<th class="cbi-section-table-cell"><%:RX Rate%></th> <th class="cbi-section-table-cell">RX Rate</th>
<th class="cbi-section-table-cell"><%:TX Rate%></th> <th class="cbi-section-table-cell">Connected Time</th>
</tr> </tr>
<tr class="cbi-section-table-row cbi-rowstyle-2"> <tr class="cbi-section-table-row cbi-rowstyle-2">
<td class="cbi-value-field" colspan="8"> <td class="cbi-value-field" colspan="8">
@ -226,9 +224,58 @@ local chipname
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
-->
<script> <script>
function clean_stalist_table()
{
var table = document.getElementById('iw-assoclist');
//console.log("clean_aplist_table.aplist len=" + table.rows.length);
while(table.rows.length > 1)
table.deleteRow(-1);
}
function insert_stalist_table(ifname, ssid, sta_list)
{
var i, tr_row, td_cell;
var tableid = document.getElementById('iw-assoclist');
for (i = 0; sta_list[i] ; i++){
//console.log(sta_list[i]);
tr_row = tableid.insertRow(-1);
tr_row.align = "center";
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = ifname;
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = ssid;
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].MacAddr;
// FIXME: TODO
/*
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = "IPv4 addr";
*/
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].AvgRssi0 + ", " + sta_list[i].AvgRssi1 + ", " + sta_list[i].AvgRssi2;
//TxRate
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].TxRate + "Mbps," + sta_list[i].Bw+ "MHz" + "<br>" + sta_list[i].PhyMode + ", " + sta_list[i].Mcs + ", " + sta_list[i].Gi + "GI";
//RxRate
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].RxRate + "Mbps," + sta_list[i].LastBw + "MHz" + "<br>" + sta_list[i].LastPhyMode + ", " + sta_list[i].LastMcs + ", " + sta_list[i].LastGi + "GI";
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].Hr + ":" + sta_list[i].Min + ":" + sta_list[i].Sec;
}
}
function disable_all_buttons() function disable_all_buttons()
{ {
var inp = document.getElementsByTagName("INPUT"); var inp = document.getElementsByTagName("INPUT");
@ -296,6 +343,42 @@ local chipname
} }
); );
} }
var stainfo = [];
function staInfoHandler()
{
for (var i=0; stainfo[i]; i++) {
//console.log(stainfo[i].ifname);
XHR.poll(3, "<%=luci.dispatcher.build_url("admin", "network", "wifi", "sta_info")%>/" + stainfo[i].ifname, null,
function(x)
{
this.idx = i;
try{
//console.log(x.responseText);
response = JSON.parse(x.responseText);
for (var j=0; stainfo[j]; j++) {
if (response[0].ifname == stainfo[j].ifname) {
response.shift(); //delete first item
stainfo[j].sta = response;
}
}
}
catch(e){}
}
);
}
}
function printstainfo()
{
//console.log(stainfo);
clean_stalist_table();
var stabuf = stainfo;
for (var i=0; stabuf[i]; i++) {
insert_stalist_table(stabuf[i].ifname, stabuf[i].ssid, stabuf[i].sta);
}
setTimeout(printstainfo, 500);
}
function apcliInfoTimerHandler(vifNameList,idx,remSec) function apcliInfoTimerHandler(vifNameList,idx,remSec)
{ {
@ -396,6 +479,17 @@ local chipname
window.onload = function(){ window.onload = function(){
get_apply_status(); get_apply_status();
updateApCliInfo(); updateApCliInfo();
<% for _,dev in ipairs(devs) do %>
<% if dev.vifs then%>
<% for _,vif in ipairs(dev.vifs) do %>
<% if vif.state == "up" then %>
stainfo.push({"ifname": "<%=vif.vifname%>", "ssid": "<%=vif.__ssid%>", "sta": ""});
<% end %>
<% end %>
<% end %>
<% end %>
staInfoHandler(stainfo);
printstainfo();
} }
</script> </script>
<%+footer%> <%+footer%>

View File

@ -59,18 +59,11 @@ function hi(to, devname, vifname)
<% end %> <% end %>
tables.push("vif-cfg-basic-AC"); tables.push("vif-cfg-basic-AC");
<% if request[4] == "vif_cfg_view" then%>
tables.push("vif-cfg-station");
<% end %>
var tabs = new Array(); var tabs = new Array();
tabs.push("vif-cfg-tab-basic"); tabs.push("vif-cfg-tab-basic");
<% if string.split(cfgs.WirelessMode,";")[1] == "16" or string.split(cfgs.WirelessMode,";")[1] == "17" or string.split(cfgs.WirelessMode,";")[1] == "18" then %> <% if string.split(cfgs.WirelessMode,";")[1] == "16" or string.split(cfgs.WirelessMode,";")[1] == "17" or string.split(cfgs.WirelessMode,";")[1] == "18" then %>
tabs.push("vif-cfg-tab-he_mu"); tabs.push("vif-cfg-tab-he_mu");
<% end %> <% end %>
<% if request[4] == "vif_cfg_view" then%>
tabs.push("vif-cfg-tab-station");
<% end %>
document.getElementById("__activeTab").value = to; document.getElementById("__activeTab").value = to;
@ -98,14 +91,6 @@ function hi(to, devname, vifname)
a.className = "cbi-tab"; a.className = "cbi-tab";
} }
} }
<% if request[4] == "vif_cfg_view" then%>
//Clear station list timer
XHR.halt();
if(to == "station"){
InitStaList(devname, vifname);
}
<% end %>
} }
</script> </script>
@ -143,11 +128,6 @@ function hi(to, devname, vifname)
<a href="javascript:hi('he_mu', <%="'"..devname.."', '"..vifname.."'"%>);this.blur(); ">HE_MU</a> <a href="javascript:hi('he_mu', <%="'"..devname.."', '"..vifname.."'"%>);this.blur(); ">HE_MU</a>
</li> </li>
<% end %> <% end %>
<% if request[4] == "vif_cfg_view" then%>
<li class="cbi-tab-disabled" id="vif-cfg-tab-station">
<a href="javascript:hi('station', <%="'"..devname.."', '"..vifname.."'"%>);this.blur(); ">Stations</a>
</li>
<% end %>
</ul> </ul>
<input type="hidden" name="__activeTab" id="__activeTab" value="basic"> <input type="hidden" name="__activeTab" id="__activeTab" value="basic">
<table class="cbi-section-table" id="vif-cfg-basic"> <table class="cbi-section-table" id="vif-cfg-basic">
@ -673,25 +653,6 @@ function hi(to, devname, vifname)
</table> </table>
<% end %> <% end %>
<% if request[4] == "vif_cfg_view" then%>
<table class="cbi-section-table" id="vif-cfg-station" name="vif-cfg-station" style="display:none" width="600" border="1" cellpadding="2" cellspacing="1">
<tr>
<td class="head" id="stalistMacAddr">MAC Addr</td>
<td class="head">Aid</td>
<td class="head">PSM</td>
<td class="head">MIMO<br>PS</td>
<td class="head">TX Rate</td>
<td class="head">TxBF</td>
<td class="head">RSSI</td>
<td class="head">Stream<br>SNR</td>
<td class="head">Snd Rsp<br>SNR</td>
<td class="head">Last<br>RX Rate</td>
<td class="head">Connect<br>Time</td>
</tr>
</table>
<% end %>
<fieldset class="cbi-section" id="vif-cfg-basic-AC"> <fieldset class="cbi-section" id="vif-cfg-basic-AC">
<legend>Access Control - <%=vifname and devname.."@"..vifname or devname%> </legend> <legend>Access Control - <%=vifname and devname.."@"..vifname or devname%> </legend>
<table class="cbi-section-table"> <table class="cbi-section-table">
@ -732,7 +693,6 @@ AA:BB:CC:DD:EE:FF
<script type="text/javascript"> <script type="text/javascript">
var sta_list;
function disable_all_link_btns() function disable_all_link_btns()
{ {
document.getElementById("vif_form_action_btns").style.display = "none"; document.getElementById("vif_form_action_btns").style.display = "none";
@ -764,82 +724,6 @@ AA:BB:CC:DD:EE:FF
return ((imode >= 0) && (imode <= 4)); return ((imode >= 0) && (imode <= 4));
} }
/* Functions used for updating Stations tab must be written inside this check. */
<% if request[4] == "vif_cfg_view" then%>
function clean_stalist_table()
{
var table = document.getElementById('vif-cfg-station');
//console.log("clean_aplist_table.aplist len=" + table.rows.length);
while(table.rows.length > 1)
table.deleteRow(-1);
}
function insert_stalist_table()
{
var i, tr_row, td_cell;
var tableid = document.getElementById('vif-cfg-station');
for (i = 0; sta_list[i] ; i++){
console.log(sta_list[i]);
tr_row = tableid.insertRow(-1);
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].MacAddr;
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].Aid;
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].Psm;
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].MimoPs;
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = "MCS "+ sta_list[i].Mcs + "<br>" + sta_list[i].Bw+ "M, " + sta_list[i].Gi + "GI<br>" + sta_list[i].PhyMode + ", " +sta_list[i].Stbc;
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].iTxBF + " " + sta_list[i].eTxBF;
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].AvgRssi0 + "<br>" + sta_list[i].AvgRssi1 + "<br>" + sta_list[i].AvgRssi2 + "<br>" + sta_list[i].AvgRssi3;
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].StreamSnr0 + "<br>" + sta_list[i].StreamSnr1 + "<br>" + sta_list[i].StreamSnr2;
if (sta_list[i].eTxBF != "-")
{
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].SoundingRespSnr0 + "<br>" + sta_list[i].SoundingRespSnr1 + "<br>" + sta_list[i].SoundingRespSnr2;
}
else{
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = "-<br>-<br>-";
}
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = "MCS "+ sta_list[i].LastMcs + "<br>" + sta_list[i].LastBw+ "M, " + sta_list[i].LastGi + "GI<br>" + sta_list[i].LastPhyMode + ", " +sta_list[i].LastStbc;
td_cell = tr_row.insertCell(-1);
td_cell.innerHTML = sta_list[i].Hr + ":" + sta_list[i].Min + ":" + sta_list[i].Sec;
}
}
function InitStaList_cb(response)
{
sta_list = response;
clean_stalist_table();
insert_stalist_table();
}
function InitStaList(devname, vifname)
{
XHR.poll(10, "<%=luci.dispatcher.build_url("admin", "network", "wifi", "sta_info")%>/" + vifname + '/' + devname, null,
function(x)
{
try{
var response = JSON.parse(x.responseText);
console.log("Station List " + response);
InitStaList_cb(response);
}
catch(e){}
}
);
}
<% end %>
function checkInjection(str) function checkInjection(str)
{ {
var len = str.length; var len = str.length;

View File

@ -1,4 +1,4 @@
OBJ_IOCTL = ioctl_helper.o OBJ_IOCTL = ioctl_helper.o rate_calc.o
CFLAGS += -I. CFLAGS += -I.
CFLAGS += -I$(ROOTDIR)/user/luci/lua-5.1.5/src CFLAGS += -I$(ROOTDIR)/user/luci/lua-5.1.5/src
CFLAGS += -Wall -shared -fPIC CFLAGS += -Wall -shared -fPIC

View File

@ -9,66 +9,8 @@
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <linux/wireless.h> #include <linux/wireless.h>
#include <lua.h> /* Always include this */
#include <lauxlib.h> /* Always include this */
#include <lualib.h> /* Always include this */
#define USHORT unsigned short #include "mtwifi.h"
#define UCHAR unsigned char
typedef union _HTTRANSMIT_SETTING {
struct {
USHORT MCS:6;
USHORT ldpc:1;
USHORT BW:2;
USHORT ShortGI:1;
USHORT STBC:1;
USHORT eTxBF:1;
USHORT iTxBF:1;
USHORT MODE:3;
} field;
USHORT word;
} HTTRANSMIT_SETTING, *PHTTRANSMIT_SETTING;
typedef struct _RT_802_11_MAC_ENTRY {
unsigned char ApIdx;
unsigned char Addr[6];
unsigned short Aid;
unsigned char Psm; // 0:PWR_ACTIVE, 1:PWR_SAVE
unsigned char MimoPs; // 0:MMPS_STATIC, 1:MMPS_DYNAMIC, 3:MMPS_Enabled
signed char AvgRssi0;
signed char AvgRssi1;
signed char AvgRssi2;
unsigned int ConnectedTime;
HTTRANSMIT_SETTING TxRate;
unsigned int LastRxRate;
short StreamSnr[3];
short SoundingRespSnr[3];
//short TxPER;
//short reserved;
} RT_802_11_MAC_ENTRY;
#define MAX_NUMBER_OF_MAC 544
typedef struct _RT_802_11_MAC_TABLE {
unsigned long Num;
RT_802_11_MAC_ENTRY Entry[MAX_NUMBER_OF_MAC];
} RT_802_11_MAC_TABLE;
#define IF_NAMESIZE 16
#define SIOCIWFIRSTPRIV 0x8BE0
#define RT_PRIV_IOCTL (SIOCIWFIRSTPRIV + 0x0E)
#define RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT (SIOCIWFIRSTPRIV + 0x1F)
#define RTPRIV_IOCTL_GSITESURVEY (SIOCIWFIRSTPRIV + 0x0D)
#define OID_GET_WMODE 0x099E
#define OID_GET_CPU_TEMPERATURE 0x09A1
int get_macaddr(lua_State *L);
int convert_string_display(lua_State *L);
int StaInfo(lua_State *L);
int getWMOde(lua_State *L);
int getTempature(lua_State *L);
int scanResult(lua_State *L);
int luaopen_ioctl_helper(lua_State *L) int luaopen_ioctl_helper(lua_State *L)
{ {
@ -302,7 +244,7 @@ int StaInfo(lua_State *L)
int i, s; int i, s;
struct iwreq iwr; struct iwreq iwr;
RT_802_11_MAC_TABLE *table; RT_802_11_MAC_TABLE *table;
char tmpBuff[128]; char tmpBuff[128] = {0};
char *phyMode[12] = {"CCK", "OFDM", "MM", "GF", "VHT", "HE", char *phyMode[12] = {"CCK", "OFDM", "MM", "GF", "VHT", "HE",
"HE5G", "HE2G", "HE_SU", "HE_EXT_SU", "HE_TRIG", "HE_MU"}; "HE5G", "HE2G", "HE_SU", "HE_EXT_SU", "HE_TRIG", "HE_MU"};
const char *interface = luaL_checkstring(L, 1); const char *interface = luaL_checkstring(L, 1);
@ -340,20 +282,28 @@ int StaInfo(lua_State *L)
lua_pushnumber(L, i); lua_pushnumber(L, i);
RT_802_11_MAC_ENTRY *pe = &(table->Entry[i]); RT_802_11_MAC_ENTRY *pe = &(table->Entry[i]);
unsigned int lastRxRate = pe->LastRxRate;
unsigned int mcs = pe->LastRxRate & 0x7F; HTTRANSMIT_SETTING RxRate;
unsigned int vht_nss; RxRate.word = pe->LastRxRate;
unsigned int vht_mcs = pe->TxRate.field.MCS;
unsigned int vht_nss_r; /* vht tx mcs nss*/
unsigned int vht_mcs_r = pe->LastRxRate & 0x3F; unsigned int mcs = pe->TxRate.field.MCS;
unsigned int nss = 0;
/* vht rx mcs nss*/
unsigned int mcs_r = RxRate.field.MCS;
unsigned int nss_r = 0;
int hr, min, sec; int hr, min, sec;
unsigned long DataRate = 0;
unsigned long DataRate_r = 0;
hr = pe->ConnectedTime/3600; hr = pe->ConnectedTime/3600;
min = (pe->ConnectedTime % 3600)/60; min = (pe->ConnectedTime % 3600)/60;
sec = pe->ConnectedTime - hr*3600 - min*60; sec = pe->ConnectedTime - hr*3600 - min*60;
/*Creates first child table of size 28 non-array elements: */ /*Creates first child table of size 28 non-array elements: */
lua_createtable(L, 0, 28); lua_createtable(L, 0, 32);
// MAC Address // MAC Address
snprintf(tmpBuff, sizeof(tmpBuff), "%02X:%02X:%02X:%02X:%02X:%02X", pe->Addr[0], pe->Addr[1], pe->Addr[2], pe->Addr[3], snprintf(tmpBuff, sizeof(tmpBuff), "%02X:%02X:%02X:%02X:%02X:%02X", pe->Addr[0], pe->Addr[1], pe->Addr[2], pe->Addr[3],
@ -375,14 +325,15 @@ int StaInfo(lua_State *L)
lua_setfield(L, -2, "MimoPs"); lua_setfield(L, -2, "MimoPs");
// TX Rate // TX Rate
if (pe->TxRate.field.MODE == 4){ if (pe->TxRate.field.MODE >= 4){
vht_nss = ((vht_mcs & (0x3 << 4)) >> 4) + 1; nss = ((mcs & (0x3 << 4)) >> 4) + 1;
vht_mcs = vht_mcs & 0xF; mcs = mcs & 0xF;
snprintf(tmpBuff, sizeof(tmpBuff), "%dS-M%d/", vht_nss, vht_mcs); snprintf(tmpBuff, sizeof(tmpBuff), "%dSS-MCS%d", nss, mcs);
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "Mcs"); lua_setfield(L, -2, "Mcs");
} else{ } else{
snprintf(tmpBuff, sizeof(tmpBuff), "%d", pe->TxRate.field.MCS); mcs = mcs & 0x3f;
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", pe->TxRate.field.MCS);
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "Mcs"); lua_setfield(L, -2, "Mcs");
} }
@ -399,9 +350,13 @@ int StaInfo(lua_State *L)
snprintf(tmpBuff, sizeof(tmpBuff), "%d", 80); snprintf(tmpBuff, sizeof(tmpBuff), "%d", 80);
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "Bw"); lua_setfield(L, -2, "Bw");
} else if (pe->TxRate.field.BW == 3){
snprintf(tmpBuff, sizeof(tmpBuff), "%d", 160);
lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "Bw");
} }
snprintf(tmpBuff, sizeof(tmpBuff), "%c", pe->TxRate.field.ShortGI? 'S': 'L'); snprintf(tmpBuff, sizeof(tmpBuff), "%c", pe->TxRate.field.ShortGI ? 'S': 'L');
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "Gi"); lua_setfield(L, -2, "Gi");
@ -460,41 +415,76 @@ int StaInfo(lua_State *L)
} }
// Last RX Rate // Last RX Rate
if (((lastRxRate>>13) & 0x7) == 4){ if (RxRate.field.MODE >= MODE_VHT) {
vht_nss_r = ((vht_mcs_r & (0x3 << 4)) >> 4) + 1; nss_r = ((mcs_r & (0x3 << 4)) >> 4) + 1;
vht_mcs_r = vht_mcs_r & 0xF; mcs_r = mcs_r & 0xF;
snprintf(tmpBuff, sizeof(tmpBuff), "%dS-M%d", vht_nss_r, vht_mcs_r); snprintf(tmpBuff, sizeof(tmpBuff), "%dSS-MCS%d", nss_r, mcs_r);
lua_pushstring(L, tmpBuff); } else if (RxRate.field.MODE == MODE_HTMIX) {
lua_setfield(L, -2, "LastMcs"); mcs_r = mcs_r & 0x3f;
} else{ snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", mcs_r);
snprintf(tmpBuff, sizeof(tmpBuff), "%d", mcs); } else if (RxRate.field.MODE == MODE_OFDM) {
lua_pushstring(L, tmpBuff); mcs_r = mcs_r & 0xF;
lua_setfield(L, -2, "LastMcs"); if (mcs_r == TMI_TX_RATE_OFDM_6M)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 0);
else if (mcs_r == TMI_TX_RATE_OFDM_9M)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 1);
else if (mcs_r == TMI_TX_RATE_OFDM_12M)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 2);
else if (mcs_r == TMI_TX_RATE_OFDM_18M)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 3);
else if (mcs_r == TMI_TX_RATE_OFDM_24M)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 4);
else if (mcs_r == TMI_TX_RATE_OFDM_36M)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 5);
else if (mcs_r == TMI_TX_RATE_OFDM_48M)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 6);
else if (mcs_r == TMI_TX_RATE_OFDM_54M)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 7);
else
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 0);
} else if (RxRate.field.MODE == MODE_CCK) {
mcs_r = mcs_r & 0x7;
if (mcs_r == TMI_TX_RATE_CCK_1M_LP)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 0);
else if (mcs_r == TMI_TX_RATE_CCK_2M_LP || mcs_r == TMI_TX_RATE_CCK_2M_SP)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 1);
else if (mcs_r == TMI_TX_RATE_CCK_5M_LP || mcs_r == TMI_TX_RATE_CCK_5M_SP)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 2);
else if (mcs_r == TMI_TX_RATE_CCK_11M_LP || mcs_r == TMI_TX_RATE_CCK_11M_SP)
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 3);
else
snprintf(tmpBuff, sizeof(tmpBuff), "MCS%d", 0);
} }
lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "LastMcs");
if (((lastRxRate>>7) & 0x3) == 0){ if (RxRate.field.BW == 0){
snprintf(tmpBuff, sizeof(tmpBuff), "%d", 20); snprintf(tmpBuff, sizeof(tmpBuff), "%d", 20);
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "LastBw"); lua_setfield(L, -2, "LastBw");
} else if (((lastRxRate>>7) & 0x3) == 1){ } else if (RxRate.field.BW == 1){
snprintf(tmpBuff, sizeof(tmpBuff), "%d", 40); snprintf(tmpBuff, sizeof(tmpBuff), "%d", 40);
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "LastBw"); lua_setfield(L, -2, "LastBw");
} else if (((lastRxRate>>7) & 0x3) == 2){ } else if (RxRate.field.BW == 2){
snprintf(tmpBuff, sizeof(tmpBuff), "%d", 80); snprintf(tmpBuff, sizeof(tmpBuff), "%d", 80);
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "LastBw"); lua_setfield(L, -2, "LastBw");
} else if (RxRate.field.BW == 3){
snprintf(tmpBuff, sizeof(tmpBuff), "%d", 160);
lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "LastBw");
} }
snprintf(tmpBuff, sizeof(tmpBuff), "%c", ((lastRxRate>>8) & 0x1)? 'S': 'L'); snprintf(tmpBuff, sizeof(tmpBuff), "%c", RxRate.field.ShortGI ? 'S': 'L');
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "LastGi"); lua_setfield(L, -2, "LastGi");
snprintf(tmpBuff, sizeof(tmpBuff), "%s", phyMode[(lastRxRate>>13) & 0x7]); snprintf(tmpBuff, sizeof(tmpBuff), "%s", phyMode[RxRate.field.MODE]);
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "LastPhyMode"); lua_setfield(L, -2, "LastPhyMode");
snprintf(tmpBuff, sizeof(tmpBuff), "%s", ((lastRxRate>>9) & 0x3)? "STBC": " "); snprintf(tmpBuff, sizeof(tmpBuff), "%s", RxRate.field.STBC ? "STBC": " ");
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "LastStbc"); lua_setfield(L, -2, "LastStbc");
@ -511,6 +501,26 @@ int StaInfo(lua_State *L)
lua_pushstring(L, tmpBuff); lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "Sec"); lua_setfield(L, -2, "Sec");
if (pe->TxRate.field.MODE >= MODE_HE) {
get_rate_he((mcs & 0xf), pe->TxRate.field.BW, nss, 0, &DataRate);
} else {
getRate(pe->TxRate, &DataRate);
}
snprintf(tmpBuff, sizeof(tmpBuff), "%ld", DataRate);
lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "TxRate");
if (RxRate.field.MODE >= MODE_HE) {
get_rate_he((mcs_r & 0xf), RxRate.field.BW, nss_r, 0, &DataRate_r);
} else {
getRate(RxRate, &DataRate_r);
}
snprintf(tmpBuff, sizeof(tmpBuff), "%ld", DataRate_r);
lua_pushstring(L, tmpBuff);
lua_setfield(L, -2, "RxRate");
lua_settable(L, -3); lua_settable(L, -3);
} }
free(table); free(table);

View File

@ -0,0 +1,127 @@
#ifndef __MTWIFI_H
#define __MTWIFI_H
#define USHORT unsigned short
#define UCHAR unsigned char
#define ULONG unsigned long
#define UINT8 unsigned char
#define UINT16 unsigned short
#define INT32 int
#define INT int
#include <lua.h> /* Always include this */
#include <lauxlib.h> /* Always include this */
#include <lualib.h> /* Always include this */
typedef union _HTTRANSMIT_SETTING {
struct {
USHORT MCS:6;
USHORT ldpc:1;
USHORT BW:2;
USHORT ShortGI:1;
USHORT STBC:1;
USHORT eTxBF:1;
USHORT iTxBF:1;
USHORT MODE:3;
} field;
USHORT word;
} HTTRANSMIT_SETTING, *PHTTRANSMIT_SETTING;
typedef struct _RT_802_11_MAC_ENTRY {
unsigned char ApIdx;
unsigned char Addr[6];
unsigned short Aid;
unsigned char Psm; // 0:PWR_ACTIVE, 1:PWR_SAVE
unsigned char MimoPs; // 0:MMPS_STATIC, 1:MMPS_DYNAMIC, 3:MMPS_Enabled
signed char AvgRssi0;
signed char AvgRssi1;
signed char AvgRssi2;
unsigned int ConnectedTime;
HTTRANSMIT_SETTING TxRate;
unsigned int LastRxRate;
short StreamSnr[3];
short SoundingRespSnr[3];
//short TxPER;
//short reserved;
} RT_802_11_MAC_ENTRY;
#define MAX_NUMBER_OF_MAC 544
typedef struct _RT_802_11_MAC_TABLE {
unsigned long Num;
RT_802_11_MAC_ENTRY Entry[MAX_NUMBER_OF_MAC];
} RT_802_11_MAC_TABLE;
#define IF_NAMESIZE 16
#define SIOCIWFIRSTPRIV 0x8BE0
#define RT_PRIV_IOCTL (SIOCIWFIRSTPRIV + 0x0E)
#define RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT (SIOCIWFIRSTPRIV + 0x1F)
#define RTPRIV_IOCTL_GSITESURVEY (SIOCIWFIRSTPRIV + 0x0D)
#define OID_GET_WMODE 0x099E
#define OID_GET_CPU_TEMPERATURE 0x09A1
#define MODE_CCK 0
#define MODE_OFDM 1
#define MODE_HTMIX 2
#define MODE_HTGREENFIELD 3
#define MODE_VHT 4
#define MODE_HE 5
#define MODE_HE_5G 6
#define MODE_HE_24G 7
#define MODE_HE_SU 8
#define MODE_HE_EXT_SU 9
#define MODE_HE_TRIG 10
#define MODE_HE_MU 11
#define TMI_TX_RATE_OFDM_6M 11
#define TMI_TX_RATE_OFDM_9M 15
#define TMI_TX_RATE_OFDM_12M 10
#define TMI_TX_RATE_OFDM_18M 14
#define TMI_TX_RATE_OFDM_24M 9
#define TMI_TX_RATE_OFDM_36M 13
#define TMI_TX_RATE_OFDM_48M 8
#define TMI_TX_RATE_OFDM_54M 12
#define TMI_TX_RATE_CCK_1M_LP 0
#define TMI_TX_RATE_CCK_2M_LP 1
#define TMI_TX_RATE_CCK_5M_LP 2
#define TMI_TX_RATE_CCK_11M_LP 3
#define TMI_TX_RATE_CCK_2M_SP 5
#define TMI_TX_RATE_CCK_5M_SP 6
#define TMI_TX_RATE_CCK_11M_SP 7
enum oid_bw {
BAND_WIDTH_20,
BAND_WIDTH_40,
BAND_WIDTH_80,
BAND_WIDTH_160,
BAND_WIDTH_10,
BAND_WIDTH_5,
BAND_WIDTH_8080,
BAND_WIDTH_BOTH,
BAND_WIDTH_25,
BAND_WIDTH_20_242TONE,
BAND_WIDTH_NUM
};
#define BW_20 BAND_WIDTH_20
#define BW_40 BAND_WIDTH_40
#define BW_80 BAND_WIDTH_80
#define BW_160 BAND_WIDTH_160
#define BW_10 BAND_WIDTH_10
#define BW_5 BAND_WIDTH_5
#define BW_8080 BAND_WIDTH_8080
#define BW_25 BAND_WIDTH_25
#define BW_20_242TONE BAND_WIDTH_20_242TONE
#define BW_NUM BAND_WIDTH_NUM
int get_macaddr(lua_State *L);
int convert_string_display(lua_State *L);
int StaInfo(lua_State *L);
int getWMOde(lua_State *L);
int getTempature(lua_State *L);
int scanResult(lua_State *L);
void getRate(HTTRANSMIT_SETTING HTSetting, ULONG *fLastTxRxRate);
void get_rate_he(UINT8 mcs, UINT8 bw, UINT8 nss, UINT8 dcm, ULONG *last_tx_rate);
#endif

View File

@ -0,0 +1,459 @@
#include "mtwifi.h"
#define MAX_NUM_HE_BANDWIDTHS 4
#define MAX_NUM_HE_SPATIAL_STREAMS 4
#define MAX_NUM_HE_MCS_ENTRIES 12
static UINT16 he_mcs_phyrate_mapping_table[MAX_NUM_HE_BANDWIDTHS][MAX_NUM_HE_SPATIAL_STREAMS][MAX_NUM_HE_MCS_ENTRIES] = {
{ /*20 Mhz*/
/* 1 SS */
{
/* DCM 0*/
8,
17,
25,
34,
51,
68,
77,
86,
103,
114,
129,
143
},
/* 2 SS */
{
/* DCM 0 */
17,
34,
51,
68,
103,
137,
154,
172,
206,
229,
258,
286
},
/* 3 SS */
{
/* DCM 0 */
25,
51,
77,
103,
154,
206,
232,
258,
309,
344,
387,
430
},
/* 4 SS */
{
/* DCM 0 */
34,
68,
103,
137,
206,
275,
309,
344,
412,
458,
516,
573
}
},
{ /*40 Mhz*/
/* 1 SS */
{
/* DCM 0*/
17,
34,
51,
68,
103,
137,
154,
172,
206,
229,
258,
286
},
/* 2 SS */
{
/* DCM 0 */
34,
68,
103,
137,
206,
275,
309,
344,
412,
458,
516,
573
},
/* 3 SS */
{
/* DCM 0 */
51,
103,
154,
206,
309,
412,
464,
516,
619,
688,
774,
860
},
/* 4 SS */
{
/* DCM 0 */
68,
137,
206,
275,
412,
550,
619,
688,
825,
917,
1032,
1147
}
},
{ /*80 Mhz*/
/* 1 SS */
{
/* DCM 0*/
36,
72,
108,
144,
216,
288,
324,
360,
432,
480,
540,
600
},
/* 2 SS */
{
/* DCM 0 */
72,
144,
216,
288,
432,
576,
648,
720,
864,
960,
1080,
1201
},
/* 3 SS */
{
/* DCM 0 */
108,
216,
324,
432,
648,
864,
972,
1080,
1297,
1441,
1621,
1801
},
/* 4 SS */
{
/* DCM 0 */
144,
288,
432,
576,
864,
1152,
1297,
1141,
1729,
1921,
2161,
2401
}
},
{ /*160 Mhz*/
/* 1 SS */
{
/* DCM 0*/
72,
144,
216,
288,
432,
576,
648,
720,
864,
960,
1080,
1201
},
/* 2 SS */
{
/* DCM 0 */
144,
288,
432,
576,
864,
1152,
1297,
1441,
1729,
1921,
2161,
2401
},
/* 3 SS */
{
/* DCM 0 */
216,
432,
648,
864,
1297,
1729,
1945,
2161,
2594,
2882,
3242,
3602
},
/* 4 SS */
{
/* DCM 0 */
288,
576,
864,
1152,
1729,
2305,
2594,
2882,
3458,
3843,
4323,
4803
},
}
};
void get_rate_he(UINT8 mcs, UINT8 bw, UINT8 nss, UINT8 dcm, ULONG *last_tx_rate)
{
ULONG value = 0;
if (nss == 0)
nss = 1;
if (mcs >= MAX_NUM_HE_MCS_ENTRIES)
mcs = MAX_NUM_HE_MCS_ENTRIES - 1;
if (nss > MAX_NUM_HE_SPATIAL_STREAMS)
nss = MAX_NUM_HE_SPATIAL_STREAMS;
if (bw >= MAX_NUM_HE_BANDWIDTHS)
bw = MAX_NUM_HE_BANDWIDTHS - 1;
nss--;
value = he_mcs_phyrate_mapping_table[bw][nss][mcs];
/*In spec data rate when DCM =1 is half of the data rate when DCM = 0*/
if (dcm && value)
value = value / 2 ;
*last_tx_rate = (ULONG)value;
return;
}
static INT32 getLegacyOFDMMCSIndex(UINT8 MCS)
{
INT32 mcs_index = MCS;
if (MCS == 0xb)
mcs_index = 0;
else if (MCS == 0xf)
mcs_index = 1;
else if (MCS == 0xa)
mcs_index = 2;
else if (MCS == 0xe)
mcs_index = 3;
else if (MCS == 0x9)
mcs_index = 4;
else if (MCS == 0xd)
mcs_index = 5;
else if (MCS == 0x8)
mcs_index = 6;
else if (MCS == 0xc)
mcs_index = 7;
return mcs_index;
}
static INT MCSMappingRateTable[] = {
2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, 109, 110, 111, 112,/* CCK and OFDM */
13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260,
39, 78, 117, 156, 234, 312, 351, 390, /* BW 20, 800ns GI, MCS 0~23 */
27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540,
81, 162, 243, 324, 486, 648, 729, 810, /* BW 40, 800ns GI, MCS 0~23 */
14, 29, 43, 57, 87, 115, 130, 144, 29, 59, 87, 115, 173, 230, 260, 288,
43, 87, 130, 173, 260, 317, 390, 433, /* BW 20, 400ns GI, MCS 0~23 */
30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600,
90, 180, 270, 360, 540, 720, 810, 900, /* BW 40, 400ns GI, MCS 0~23 */
/*for 11ac:20 Mhz 800ns GI*/
6, 13, 19, 26, 39, 52, 58, 65, 78, 90, /*1ss mcs 0~8*/
13, 26, 39, 52, 78, 104, 117, 130, 156, 180, /*2ss mcs 0~8*/
19, 39, 58, 78, 117, 156, 175, 195, 234, 260, /*3ss mcs 0~9*/
26, 52, 78, 104, 156, 208, 234, 260, 312, 360, /*4ss mcs 0~8*/
/*for 11ac:40 Mhz 800ns GI*/
13, 27, 40, 54, 81, 108, 121, 135, 162, 180, /*1ss mcs 0~9*/
27, 54, 81, 108, 162, 216, 243, 270, 324, 360, /*2ss mcs 0~9*/
40, 81, 121, 162, 243, 324, 364, 405, 486, 540, /*3ss mcs 0~9*/
54, 108, 162, 216, 324, 432, 486, 540, 648, 720, /*4ss mcs 0~9*/
/*for 11ac:80 Mhz 800ns GI*/
29, 58, 87, 117, 175, 234, 263, 292, 351, 390, /*1ss mcs 0~9*/
58, 117, 175, 243, 351, 468, 526, 585, 702, 780, /*2ss mcs 0~9*/
87, 175, 263, 351, 526, 702, 0, 877, 1053, 1170, /*3ss mcs 0~9*/
117, 234, 351, 468, 702, 936, 1053, 1170, 1404, 1560, /*4ss mcs 0~9*/
/*for 11ac:160 Mhz 800ns GI*/
58, 117, 175, 234, 351, 468, 526, 585, 702, 780, /*1ss mcs 0~9*/
117, 234, 351, 468, 702, 936, 1053, 1170, 1404, 1560, /*2ss mcs 0~9*/
175, 351, 526, 702, 1053, 1404, 1579, 1755, 2160, 0, /*3ss mcs 0~8*/
234, 468, 702, 936, 1404, 1872, 2106, 2340, 2808, 3120, /*4ss mcs 0~9*/
/*for 11ac:20 Mhz 400ns GI*/
7, 14, 21, 28, 43, 57, 65, 72, 86, 100, /*1ss mcs 0~8*/
14, 28, 43, 57, 86, 115, 130, 144, 173, 200, /*2ss mcs 0~8*/
21, 43, 65, 86, 130, 173, 195, 216, 260, 288, /*3ss mcs 0~9*/
28, 57, 86, 115, 173, 231, 260, 288, 346, 400, /*4ss mcs 0~8*/
/*for 11ac:40 Mhz 400ns GI*/
15, 30, 45, 60, 90, 120, 135, 150, 180, 200, /*1ss mcs 0~9*/
30, 60, 90, 120, 180, 240, 270, 300, 360, 400, /*2ss mcs 0~9*/
45, 90, 135, 180, 270, 360, 405, 450, 540, 600, /*3ss mcs 0~9*/
60, 120, 180, 240, 360, 480, 540, 600, 720, 800, /*4ss mcs 0~9*/
/*for 11ac:80 Mhz 400ns GI*/
32, 65, 97, 130, 195, 260, 292, 325, 390, 433, /*1ss mcs 0~9*/
65, 130, 195, 260, 390, 520, 585, 650, 780, 866, /*2ss mcs 0~9*/
97, 195, 292, 390, 585, 780, 0, 975, 1170, 1300, /*3ss mcs 0~9*/
130, 260, 390, 520, 780, 1040, 1170, 1300, 1560, 1733, /*4ss mcs 0~9*/
/*for 11ac:160 Mhz 400ns GI*/
65, 130, 195, 260, 390, 520, 585, 650, 780, 866, /*1ss mcs 0~9*/
130, 260, 390, 520, 780, 1040, 1170, 1300, 1560, 1733, /*2ss mcs 0~9*/
195, 390, 585, 780, 1170, 1560, 1755, 1950, 2340, 0, /*3ss mcs 0~8*/
260, 520, 780, 1040, 1560, 2080, 2340, 2600, 3120, 3466, /*4ss mcs 0~9*/
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
}; /* 3*3 */
void getRate(HTTRANSMIT_SETTING HTSetting, ULONG *fLastTxRxRate)
{
UINT8 Antenna = 0;
UINT8 MCS = HTSetting.field.MCS;
int rate_count = sizeof(MCSMappingRateTable) / sizeof(int);
int rate_index = 0;
int value = 0;
if (HTSetting.field.MODE >= MODE_VHT) {
MCS = HTSetting.field.MCS & 0xf;
Antenna = (HTSetting.field.MCS >> 4) + 1;
if (HTSetting.field.BW == BW_20) {
rate_index = 112 + ((Antenna - 1) * 10) +
((UCHAR)HTSetting.field.ShortGI * 160) +
((UCHAR)MCS);
} else if (HTSetting.field.BW == BW_40) {
rate_index = 152 + ((Antenna - 1) * 10) +
((UCHAR)HTSetting.field.ShortGI * 160) +
((UCHAR)MCS);
} else if (HTSetting.field.BW == BW_80) {
rate_index = 192 + ((Antenna - 1) * 10) +
((UCHAR)HTSetting.field.ShortGI * 160) +
((UCHAR)MCS);
} else if (HTSetting.field.BW == BW_160) {
rate_index = 232 + ((Antenna - 1) * 10) +
((UCHAR)HTSetting.field.ShortGI * 160) +
((UCHAR)MCS);
}
} else {
if (HTSetting.field.MODE >= MODE_HTMIX) {
MCS = HTSetting.field.MCS;
if ((HTSetting.field.MODE == MODE_HTMIX)
|| (HTSetting.field.MODE == MODE_HTGREENFIELD))
Antenna = (MCS >> 3) + 1;
/* map back to 1SS MCS , multiply by antenna numbers later */
if (MCS > 7)
MCS %= 8;
rate_index = 16 + ((UCHAR)HTSetting.field.BW * 24) + ((UCHAR)HTSetting.field.ShortGI * 48) + ((UCHAR)MCS);
} else {
if (HTSetting.field.MODE == MODE_OFDM)
rate_index = getLegacyOFDMMCSIndex(HTSetting.field.MCS) + 4;
else if (HTSetting.field.MODE == MODE_CCK)
rate_index = (UCHAR)(HTSetting.field.MCS);
}
}
if (rate_index < 0)
rate_index = 0;
if (rate_index >= rate_count)
rate_index = rate_count - 1;
if (HTSetting.field.MODE < MODE_VHT)
value = (MCSMappingRateTable[rate_index] * 5) / 10;
else
value = MCSMappingRateTable[rate_index];
if (HTSetting.field.MODE >= MODE_HTMIX && HTSetting.field.MODE < MODE_VHT)
value *= Antenna;
*fLastTxRxRate = (ULONG)value;
return;
}