ESP32 STA nebo AP

ESP32 STA nebo AP
« kdy: 19. 03. 2021, 15:35:06 »
Ahoj, narazil jsem na problem se kterym si nevim rady. Snazim se u ESP32 detekovat zda prichozi TCP pakety jsou z rozhrani STA nebo AP. Moje prvotni myslenka byla takova, ze to rozhodnu podle IP adresy. Jenze pak jsem zjistil, ze na STA i AP muzu mit stejnou IP adresu, takze toho nebude fungovat. Dale me napada ze by to mohlo jit podle MAC adresy, jenze zde jsem narazil na to, za nedokazu z prichoziho spojeni MAC adresu zjistit nebo nevim jak. Nenapada nekoho jak toto vyresit? Dik.


Re:ESP32 STA nebo AP
« Odpověď #1 kdy: 19. 03. 2021, 16:10:25 »
Pouzil funci esp_err_tesp_wifi_ap_get_sta_list() ktera  vraci seznam klientu a strukturu obsahujici MAC:

https://www.google.com/amp/s/techtutorialsx.com/2018/06/09/esp32-arduino-obtaining-mac-address-of-stations-connected-to-soft-ap/amp/

Re:ESP32 STA nebo AP
« Odpověď #2 kdy: 19. 03. 2021, 16:26:33 »
No mozna jsem se spatne vyjadril nebo nerozumim jak tuto funkci pouzit.
Tato funkce jak ji chapu je pouzitelna pouze pro zjisteni MAC adresy pripojenych zarizeni k rozhrani. Toto mi k pozadovanemu vysledku nestaci, protoze jeste potrebuju tuto informaci ziskat z konkterniho pateku TCP. Napisu k cemu to chci pouzit...v tom espcku bezi tcp server. Ja ale chci aby se k tomu TCP serveru mohlo jen z rozhrani AP. Pokud se na nej bude chtit pripojit neco ze STA rozhrani, bude to blokovane.

Re:ESP32 STA nebo AP
« Odpověď #3 kdy: 19. 03. 2021, 18:32:10 »
TCP paket ponese linkovou hlavicku s jinou MAC? Nepletes si MAC a cislo portu?

Re:ESP32 STA nebo AP
« Odpověď #4 kdy: 19. 03. 2021, 18:56:50 »
No vidis, vyjadruju se spatne neustale. Myslel jsem to tak, ze pokud budu vedet jaka MAC jsou pripojena na rozhrani AP (to vim), tak pokud budu vedet jakemu MAC patri prichozi paket TCP, jsem schopen provest filtraci a zahodit nezadouci. Kdyby to slo bylo by to super, protoze bych se nemusel hrabat v esp-idf, ale zvladnul bych to na urovni user_app. Tohle se mi ale zatim nedari.

S cislem portu jsem asi schopen pracovat pomoci funkce wifi_sta_receive() a wifi_ap_receive(), ktere maji jako argumet prijaty datagram. Tim padem jsem schopen zjistit na jaky port je to smerovane a mozna to zablokovat. Je to ale na urovni esp-idf coz se mi moc nelibi.


Re:ESP32 STA nebo AP
« Odpověď #5 kdy: 19. 03. 2021, 19:38:22 »
Tak jsem to vyresil k obrazu svemu...kdyby to nekoho nekdy zajimalo, tak zde je postup...
V souboru "wifi_netif.c" nahradit fnukci:
Kód: [Vybrat]
static esp_err_t wifi_sta_receive(void *buffer, uint16_t len, void *eb)
{   
    return s_wifi_rxcbs[WIFI_IF_STA](s_wifi_netifs[WIFI_IF_STA], buffer, len, eb);
}

touto:
Kód: [Vybrat]
static esp_err_t wifi_sta_receive(void *buffer, uint16_t len, void *eb)
{   
    esp_err_t ret;
    uint16_t port;
    uint8_t *p_port = (uint8_t*)&port;
   
    p_port[0] = *(uint8_t*)(buffer + 0x25);
    p_port[1] = *(uint8_t*)(buffer + 0x24);
   
    if(port == 80){
      len = 0;
      }   
   
    ret = s_wifi_rxcbs[WIFI_IF_STA](s_wifi_netifs[WIFI_IF_STA], buffer, len, eb);
   
    return ret;
}

O tom, zda je to prasarna nepochybuju :D
Kazdopadne to dela to co chci a pokud je ma domnenka, ze pozice cisla portu je v datagramu pevne dana, melo by to fungovat spolehlive.

Sory ze jsem Vas v patek k veceru nutil toto cist...
« Poslední změna: 19. 03. 2021, 19:45:32 od hazardrok »

RDa

  • *****
  • 2 465
    • Zobrazit profil
    • E-mail
Re:ESP32 STA nebo AP
« Odpověď #6 kdy: 19. 03. 2021, 21:13:31 »
Pozice nemusi byt pevne dana, ale mohl jsi to alespon udelat slusne a ne na prasaka, i kdyby to byl vykon navic, tj:

Kód: [Vybrat]
// hodne ilustrativne!
if (data[ETH_PROTO] == IP)
if (data[ETH_HDR_LEN + IP_PROTO_VER] == IPv4 )
if (data[ETH_HDR_LEN + IP_PROTO_TYPE] == TCP )
if (data[ETH_HDR_LEN + IP_HDR_LEN + IP_TCP_PORT] == 80 )
...

proste overit kazdou vrstvu - frame -> ip paket -> tcp paket a posouvat se o kyzeny header size (ktery casto byva soucasti headru, neni to implicitni konstanta jak v mem prikladu)