[Gelöst] Bin ich zu blöd C zu lesen?

YCbCr

Profi
Thread Starter
Mitglied seit
30.11.2020
Beiträge
282
Der folgende Code stammt aus einem Intel WLAN Kerneltreiber. Relevant ist hier aber nicht, was der genau tut, sondern dass anscheinend ein Codepfad ausgeführt wird, der mMn. so nicht erreichbar sein sollte.
Steh ich hier gerade total auf dem Schlauch? Stell ich mich grundlegend zu blöd an? Oder liegt vielleicht sogar ein subtiler Fehler im Code vor?

Aus drivers/net/wireless/intel/iwlwifi/fw/api/rx.h:
C:
enum iwl_mvm_rx_status {
    /* […] */
    RX_MPDU_RES_STATUS_SEC_ENC_ERR            = (7 << 8),
    RX_MPDU_RES_STATUS_SEC_ENC_MSK            = (7 << 8),
    /* […] */
};
Aus drivers/net/wireless/intel/iwlwifi/mvm/rx.c:
C:
static u32 iwl_mvm_set_mac80211_rx_flag(struct iwl_mvm *mvm,
                    struct ieee80211_hdr *hdr,
                    struct ieee80211_rx_status *stats,
                    u32 rx_pkt_status,
                    u8 *crypt_len)
{
    if (!ieee80211_has_protected(hdr->frame_control) ||
        (rx_pkt_status & RX_MPDU_RES_STATUS_SEC_ENC_MSK) ==
                 RX_MPDU_RES_STATUS_SEC_NO_ENC)
        return 0;

    /* packet was encrypted with unknown alg */
    if ((rx_pkt_status & RX_MPDU_RES_STATUS_SEC_ENC_MSK) ==
                    RX_MPDU_RES_STATUS_SEC_ENC_ERR)
        return 0;

    switch (rx_pkt_status & RX_MPDU_RES_STATUS_SEC_ENC_MSK) {
    /* […] */
    default:
        /* Expected in monitor (not having the keys) */
        if (!mvm->monitor_on)
            IWL_ERR(mvm, "Unhandled alg: 0x%x\n", rx_pkt_status);
    }

    return 0;
}

Im Kernel Log habe ich Einträge wie diesen:
Code:
iwlwifi 0000:29:00.0: Unhandled alg: 0x703

Das ist – soweit ich sagen kann – die einzige Stelle, die einen solchen Logeintrag verursachen kann. Daraus (und dass rx_pkt_status in der gesamten Funktion nicht überschrieben wird) schließe ich, dass iwl_mvm_set_mac80211_rx_flag mit einem rx_pkt_status von 0x703 aufgerufen wurde.

RX_MPDU_RES_STATUS_SEC_ENC_MSK und RX_MPDU_RES_STATUS_SEC_ENC_ERR sind aber als (7 << 8), also 0x700 definiert. (0x703 & 0x700) == 0x700 ist wahr, also sollte return 0; ausgeführt und (für alle Werte von rx_pkt_status, die diese 3 Bits gesetzt haben) das switch Statement nie erreicht werden?
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh