В порядке, причина того, что вы не можете просто анализировать IE по проверочным запросам, как по маякам или по проверочным ответам, заключается в том, что сам gopacket фактически никогда не присваивается полю Payload
структуры Dot11MgmtProbeReq
. См. DecodeFromBytes
в Dot11MgmtBeacon и Dot11MgmtProbeResp ; Dot11MgmtProbeReq не имеет такого метода. Замена Dot11MgmtProbeReq
из gopacket с помощью следующего кода решает эту проблему (хотя это может быть излишним для вас):
type Dot11MgmtProbeReq struct {
Dot11Mgmt
}
func decodeDot11MgmtProbeReq(data []byte, p gopacket.PacketBuilder) error {
d := &Dot11MgmtProbeReq{}
return decodingLayerDecoder(d, data, p)
}
func (m *Dot11MgmtProbeReq) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtProbeReq }
func (m *Dot11MgmtProbeReq) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtProbeReq }
func (m *Dot11MgmtProbeReq) NextLayerType() gopacket.LayerType {
return LayerTypeDot11InformationElement
}
func (m *Dot11MgmtProbeReq) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
m.Payload = data
return m.Dot11Mgmt.DecodeFromBytes(data, df)
}
Один простой способ извлечения IE в целом состоит в том, чтобы настроить одну базовую функцию для передачи список IE из текущего кадра в функцию, которая декодирует все соответствующие элементы в map[string][]byte
, где строка - это удобочитаемое имя для строки. Таким образом, любые специфичные для фрейма поля c могут быть запрошены в их конкретных c случаях. (Для этого нужно написать карту [layer.Dot11InformationElementID] string`).