diff options
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/src/lib.rs b/src/lib.rs index 133ce3161..3d08370c7 100644 --- a/src/lib.rs +++ b/src/lib.rs | |||
| @@ -815,20 +815,55 @@ where | |||
| 815 | trace!(" {:?}", bcd_header); | 815 | trace!(" {:?}", bcd_header); |
| 816 | 816 | ||
| 817 | let packet_start = BcdHeader::SIZE + 4 * bcd_header.data_offset as usize; | 817 | let packet_start = BcdHeader::SIZE + 4 * bcd_header.data_offset as usize; |
| 818 | if packet_start > payload.len() { | 818 | |
| 819 | warn!("packet start out of range."); | 819 | if packet_start + EventPacket::SIZE > payload.len() { |
| 820 | warn!("BCD event, incomplete header"); | ||
| 821 | return; | ||
| 822 | } | ||
| 823 | let bcd_packet = &payload[packet_start..]; | ||
| 824 | trace!(" {:02x}", &bcd_packet[..(bcd_packet.len() as usize).min(36)]); | ||
| 825 | |||
| 826 | let mut event_packet = EventPacket::from_bytes(&bcd_packet[..EventPacket::SIZE].try_into().unwrap()); | ||
| 827 | event_packet.byteswap(); | ||
| 828 | |||
| 829 | const ETH_P_LINK_CTL: u16 = 0x886c; // HPNA, wlan link local tunnel, according to linux if_ether.h | ||
| 830 | if event_packet.eth.ether_type != ETH_P_LINK_CTL { | ||
| 831 | warn!( | ||
| 832 | "unexpected ethernet type 0x{:04x}, expected Broadcom ether type 0x{:04x}", | ||
| 833 | event_packet.eth.ether_type, ETH_P_LINK_CTL | ||
| 834 | ); | ||
| 835 | return; | ||
| 836 | } | ||
| 837 | const BROADCOM_OUI: &[u8] = &[0x00, 0x10, 0x18]; | ||
| 838 | if event_packet.hdr.oui != BROADCOM_OUI { | ||
| 839 | warn!( | ||
| 840 | "unexpected ethernet OUI {:02x}, expected Broadcom OUI {:02x}", | ||
| 841 | event_packet.hdr.oui, BROADCOM_OUI | ||
| 842 | ); | ||
| 843 | return; | ||
| 844 | } | ||
| 845 | const BCMILCP_SUBTYPE_VENDOR_LONG: u16 = 32769; | ||
| 846 | if event_packet.hdr.subtype != BCMILCP_SUBTYPE_VENDOR_LONG { | ||
| 847 | warn!("unexpected subtype {}", event_packet.hdr.subtype); | ||
| 848 | return; | ||
| 849 | } | ||
| 850 | |||
| 851 | const BCMILCP_BCM_SUBTYPE_EVENT: u16 = 1; | ||
| 852 | if event_packet.hdr.user_subtype != BCMILCP_BCM_SUBTYPE_EVENT { | ||
| 853 | warn!("unexpected user_subtype {}", event_packet.hdr.subtype); | ||
| 854 | return; | ||
| 855 | } | ||
| 856 | |||
| 857 | if event_packet.msg.datalen as usize >= (bcd_packet.len() - EventMessage::SIZE) { | ||
| 858 | warn!("BCD event, incomplete data"); | ||
| 820 | return; | 859 | return; |
| 821 | } | 860 | } |
| 822 | let packet = &payload[packet_start..]; | ||
| 823 | trace!(" {:02x}", &packet[..(packet.len() as usize).min(36)]); | ||
| 824 | 861 | ||
| 825 | let mut evt = EventHeader::from_bytes(&packet[24..][..EventHeader::SIZE].try_into().unwrap()); | 862 | let evt_data = &bcd_packet[EventMessage::SIZE..][..event_packet.msg.datalen as usize]; |
| 826 | evt.byteswap(); | ||
| 827 | let evt_data = &packet[24 + EventHeader::SIZE..][..evt.datalen as usize]; | ||
| 828 | debug!( | 863 | debug!( |
| 829 | "=== EVENT {}: {} {:02x}", | 864 | "=== EVENT {}: {} {:02x}", |
| 830 | events::Event::from(evt.event_type as u8), | 865 | events::Event::from(event_packet.msg.event_type as u8), |
| 831 | evt, | 866 | event_packet.msg, |
| 832 | evt_data | 867 | evt_data |
| 833 | ); | 868 | ); |
| 834 | } | 869 | } |
