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:
Aus drivers/net/wireless/intel/iwlwifi/mvm/rx.c:
Im Kernel Log habe ich Einträge wie diesen:
Das ist – soweit ich sagen kann – die einzige Stelle, die einen solchen Logeintrag verursachen kann. Daraus (und dass
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),
/* […] */
};
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?