qcacmn: Check ICMPV4 and ICMV6 are redirect or not

Add API to check ICMPV4 and ICMPV6 are redirect or not
This is to avoid a security breach.

Change-Id: I61e7c54c6d9279c1e7d2f316381fbc1c83ce5b4a
CRs-Fixed: 3233925
This commit is contained in:
Author Amrit Sahai
2022-06-30 10:54:34 +05:30
committed by Madan Koyyalamudi
parent c58feb9240
commit dc5cc15bba
3 changed files with 44 additions and 0 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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