ESP32 chips do have a new function esp_wifi_80211_tx() which is used to send router raw frames.
They made a function to filter frames that may be illegal( deauthentification or dissociation frames ).
Sadly, this filter sanity function sits inside their precompiled library and can't be modified in c code.
I saw many guys reporting all this over forums that 'c0' deauth frame not working.
E (1084305) wifi:unsupport frame type: 0c0
Spent several hours analyzing decompiled library which is 'libnet80211.a'
Library has several object files merged together
Function esp_wifi_80211_tx() sits inside : 'libnet80211.a' -> 'ieee80211_output.o'
I disassembled and edited some registers inside 'ieee80211_output.o' object file so that sanity check function result will be ignored and you can now send any packet.
Still left check for length (length >= 24)
cd $your_esp_location/esp/esp-idf/components/esp_wifi/lib/esp32/
ar rcs libnet80211.a ieee80211_output.o
Frame sending deauth worked :)
I would be grateful if you share your thoughs about this solution and tell me if it helped to solve your problem ;)