Forráskód Böngészése

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
Author Amrit Sahai 3 éve
szülő
commit
dc5cc15bba
3 módosított fájl, 44 hozzáadás és 0 törlés
  1. 13 0
      qdf/inc/qdf_nbuf.h
  2. 2 0
      qdf/linux/src/i_qdf_nbuf.h
  3. 29 0
      qdf/linux/src/qdf_nbuf.c

+ 13 - 0
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

+ 2 - 0
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);

+ 29 - 0
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