@@ -940,33 +940,35 @@ impl<'a> MetaPacket<'a> {
940940 }
941941 }
942942 IpProtocol :: ICMPV6 => {
943+ size_checker -= HeaderType :: Ipv6Icmp . min_header_size ( ) as isize ;
944+ if size_checker < 0 {
945+ return Ok ( ( ) ) ;
946+ }
943947 let mut icmp_data = IcmpData :: default ( ) ;
944- if size_checker > 0 {
945- let icmpv6_type_index = ICMPV6_TYPE_OFFSET + self . l2_l3_opt_size as usize ;
946- icmp_data. icmp_type = packet[ icmpv6_type_index] ;
947-
948- match Icmpv6Type :: new ( packet[ icmpv6_type_index] ) {
949- Icmpv6Types :: NeighborAdvert => {
950- self . nd_reply_or_arp_request = true ;
951- }
952- Icmpv6Types :: EchoRequest => {
953- icmp_data. echo_id_seq = read_u32_be ( & packet[ icmpv6_type_index + 4 ..] ) ;
954- }
955- Icmpv6Types :: EchoReply => {
956- icmp_data. echo_id_seq = read_u32_be ( & packet[ icmpv6_type_index + 4 ..] ) ;
957- self . lookup_key . direction = PacketDirection :: ServerToClient ;
958- }
959- _ => { }
948+ let icmpv6_type_index = ICMPV6_TYPE_OFFSET + self . l2_l3_opt_size as usize ;
949+ icmp_data. icmp_type = packet[ icmpv6_type_index] ;
950+ match Icmpv6Type :: new ( packet[ icmpv6_type_index] ) {
951+ Icmpv6Types :: NeighborAdvert => {
952+ self . nd_reply_or_arp_request = true ;
960953 }
961- // 忽略link-local address并只考虑ND reply, i.e. neighbour advertisement
962- if let IpAddr :: V6 ( ip) = self . lookup_key . src_ip {
963- self . nd_reply_or_arp_request =
964- self . nd_reply_or_arp_request && !is_unicast_link_local ( & ip) ;
954+ Icmpv6Types :: EchoRequest => {
955+ icmp_data. echo_id_seq = read_u32_be ( & packet[ icmpv6_type_index + 4 ..] ) ;
965956 }
957+ Icmpv6Types :: EchoReply => {
958+ icmp_data. echo_id_seq = read_u32_be ( & packet[ icmpv6_type_index + 4 ..] ) ;
959+ self . lookup_key . direction = PacketDirection :: ServerToClient ;
960+ }
961+ _ => { }
962+ }
963+ // 忽略link-local address并只考虑ND reply, i.e. neighbour advertisement
964+ if let IpAddr :: V6 ( ip) = self . lookup_key . src_ip {
965+ self . nd_reply_or_arp_request =
966+ self . nd_reply_or_arp_request && !is_unicast_link_local ( & ip) ;
966967 }
967- self . protocol_data = ProtocolData :: IcmpData ( icmp_data) ;
968968 self . payload_len =
969969 ( self . packet_len - ( packet. len ( ) - size_checker as usize ) as u32 ) as u16 ;
970+ self . protocol_data = ProtocolData :: IcmpData ( icmp_data) ;
971+ self . header_type = HeaderType :: Ipv6Icmp ;
970972 return Ok ( ( ) ) ;
971973 }
972974 _ => {
0 commit comments