diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 86ede1daf5..2d8195df5a 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -135,6 +135,7 @@ #define QDF_NBUF_PKT_ICMPv4OP_REPLY 0x00 #define QDF_NBUF_PKT_ICMPv4_SRC_IP_OFFSET 26 #define QDF_NBUF_PKT_ICMPv4_TGT_IP_OFFSET 30 +#define QDF_NBUF_PKT_ICMPV4_REDIRECT 0x05 /* TCP Related MASK */ #define QDF_NBUF_PKT_TCP_OPCODE_OFFSET 47 @@ -713,6 +714,7 @@ struct qdf_radiotap_ext2 { #define IPV6_DST_PORT_OFFSET 56 /* IPV6 ICMPV6 Related Mask */ +#define ICMPV6_REDIRECT 137 #define ICMPV6_SEQ_NUM_OFFSET 60 #define ICMPV6_SUBTYPE_OFFSET 54 #define ICMPV6_REQUEST 0x80 @@ -3604,6 +3606,12 @@ bool qdf_nbuf_data_is_icmpv4_rsp(qdf_nbuf_t buf) return __qdf_nbuf_data_is_icmpv4_rsp(qdf_nbuf_data(buf)); } +static inline +bool qdf_nbuf_is_icmpv4_redirect(qdf_nbuf_t buf) +{ + return __qdf_nbuf_data_is_icmpv4_redirect(qdf_nbuf_data(buf)); +} + /** * qdf_nbuf_get_icmpv4_src_ip() - get icmpv4 src IP * @buf: buffer @@ -3643,6 +3651,11 @@ bool qdf_nbuf_is_ipv6_pkt(qdf_nbuf_t buf) return __qdf_nbuf_data_is_ipv6_pkt(qdf_nbuf_data(buf)); } +static inline +bool qdf_nbuf_is_icmpv6_redirect(qdf_nbuf_t buf) +{ + return __qdf_nbuf_data_is_icmpv6_redirect(qdf_nbuf_data(buf)); +} /** * qdf_nbuf_data_is_ipv6_pkt() - check if it is IPV6 packet. * @data: Pointer to IPV6 packet data buffer diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h index 6b42523d23..23a2bd1d00 100644 --- a/qdf/linux/src/i_qdf_nbuf.h +++ b/qdf/linux/src/i_qdf_nbuf.h @@ -894,6 +894,8 @@ bool __qdf_nbuf_data_is_tcp_ack(uint8_t *data); uint16_t __qdf_nbuf_data_get_tcp_src_port(uint8_t *data); uint16_t __qdf_nbuf_data_get_tcp_dst_port(uint8_t *data); bool __qdf_nbuf_data_is_icmpv4_req(uint8_t *data); +bool __qdf_nbuf_data_is_icmpv4_redirect(uint8_t *data); +bool __qdf_nbuf_data_is_icmpv6_redirect(uint8_t *data); bool __qdf_nbuf_data_is_icmpv4_rsp(uint8_t *data); uint32_t __qdf_nbuf_get_icmpv4_src_ip(uint8_t *data); uint32_t __qdf_nbuf_get_icmpv4_tgt_ip(uint8_t *data); diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c index 6ae6d6d88d..79cb3b8e80 100644 --- a/qdf/linux/src/qdf_nbuf.c +++ b/qdf/linux/src/qdf_nbuf.c @@ -2077,6 +2077,33 @@ bool __qdf_nbuf_data_is_icmpv4_rsp(uint8_t *data) return false; } +bool __qdf_nbuf_data_is_icmpv4_redirect(uint8_t *data) +{ + uint8_t op_code; + + op_code = (uint8_t)(*(uint8_t *)(data + + QDF_NBUF_PKT_ICMPv4_OPCODE_OFFSET)); + + if (op_code == QDF_NBUF_PKT_ICMPV4_REDIRECT) + return true; + return false; +} + +qdf_export_symbol(__qdf_nbuf_data_is_icmpv4_redirect); + +bool __qdf_nbuf_data_is_icmpv6_redirect(uint8_t *data) +{ + uint8_t subtype; + + subtype = (uint8_t)(*(uint8_t *)(data + ICMPV6_SUBTYPE_OFFSET)); + + if (subtype == ICMPV6_REDIRECT) + return true; + return false; +} + +qdf_export_symbol(__qdf_nbuf_data_is_icmpv6_redirect); + /** * __qdf_nbuf_data_get_icmpv4_src_ip() - get icmpv4 src IP * @data: Pointer to network data buffer @@ -2311,6 +2338,8 @@ bool __qdf_nbuf_data_is_icmpv6_pkt(uint8_t *data) return false; } +qdf_export_symbol(__qdf_nbuf_data_is_icmpv6_pkt); + /** * __qdf_nbuf_data_is_ipv4_udp_pkt() - check if it is IPV4 UDP packet. * @data: Pointer to IPV4 UDP packet data buffer