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:

committed by
Madan Koyyalamudi

parent
c58feb9240
commit
dc5cc15bba
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user