diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index f6d0c28dd4..6239ee7c2f 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -3011,6 +3011,32 @@ bool qdf_nbuf_data_is_dns_response(qdf_nbuf_t buf) return __qdf_nbuf_data_is_dns_response(qdf_nbuf_data(buf)); } +/** + * qdf_nbuf_data_is_tcp_fin() - check if skb data is a tcp fin + * @buf: buffer + * + * Return: true if packet is tcp fin packet. + * false otherwise. + */ +static inline +bool qdf_nbuf_data_is_tcp_fin(qdf_nbuf_t buf) +{ + return __qdf_nbuf_data_is_tcp_fin(qdf_nbuf_data(buf)); +} + +/** + * qdf_nbuf_data_is_tcp_fin_ack() - check if skb data is a tcp fin ack + * @buf: buffer + * + * Return: true if packet is tcp fin ack packet. + * false otherwise. + */ +static inline +bool qdf_nbuf_data_is_tcp_fin_ack(qdf_nbuf_t buf) +{ + return __qdf_nbuf_data_is_tcp_fin_ack(qdf_nbuf_data(buf)); +} + /** * qdf_nbuf_data_is_tcp_syn() - check if skb data is a tcp syn * @buf: buffer @@ -3037,6 +3063,19 @@ bool qdf_nbuf_data_is_tcp_syn_ack(qdf_nbuf_t buf) return __qdf_nbuf_data_is_tcp_syn_ack(qdf_nbuf_data(buf)); } +/** + * qdf_nbuf_data_is_tcp_rst() - check if skb data is a tcp rst + * @buf: buffer + * + * Return: true if packet is tcp rst packet. + * false otherwise. + */ +static inline +bool qdf_nbuf_data_is_tcp_rst(qdf_nbuf_t buf) +{ + return __qdf_nbuf_data_is_tcp_rst(qdf_nbuf_data(buf)); +} + /** * qdf_nbuf_data_is_tcp_ack() - check if skb data is a tcp ack * @buf: buffer diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h index 5d27a60b02..0fd7dfd125 100644 --- a/qdf/linux/src/i_qdf_nbuf.h +++ b/qdf/linux/src/i_qdf_nbuf.h @@ -82,6 +82,11 @@ typedef struct sk_buff_head __qdf_nbuf_queue_head_t; /* mark the first packet after wow wakeup */ #define QDF_MARK_FIRST_WAKEUP_PACKET 0x80000000 +/* TCP Related MASK */ +#define QDF_NBUF_PKT_TCPOP_FIN 0x01 +#define QDF_NBUF_PKT_TCPOP_FIN_ACK 0x11 +#define QDF_NBUF_PKT_TCPOP_RST 0x04 + /* * Make sure that qdf_dma_addr_t in the cb block is always 64 bit aligned */ @@ -862,8 +867,11 @@ uint32_t __qdf_nbuf_get_arp_tgt_ip(uint8_t *data); uint8_t *__qdf_nbuf_get_dns_domain_name(uint8_t *data, uint32_t len); bool __qdf_nbuf_data_is_dns_query(uint8_t *data); bool __qdf_nbuf_data_is_dns_response(uint8_t *data); +bool __qdf_nbuf_data_is_tcp_fin(uint8_t *data); +bool __qdf_nbuf_data_is_tcp_fin_ack(uint8_t *data); bool __qdf_nbuf_data_is_tcp_syn(uint8_t *data); bool __qdf_nbuf_data_is_tcp_syn_ack(uint8_t *data); +bool __qdf_nbuf_data_is_tcp_rst(uint8_t *data); 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); diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c index 66e1dc5712..0b171058d6 100644 --- a/qdf/linux/src/qdf_nbuf.c +++ b/qdf/linux/src/qdf_nbuf.c @@ -1810,6 +1810,50 @@ bool __qdf_nbuf_data_is_dns_response(uint8_t *data) return false; } +/** + * __qdf_nbuf_data_is_tcp_fin() - check if skb data is a tcp fin + * @data: Pointer to network data buffer + * + * This api is to check if the packet is tcp fin. + * + * Return: true if packet is tcp fin packet. + * false otherwise. + */ +bool __qdf_nbuf_data_is_tcp_fin(uint8_t *data) +{ + uint8_t op_code; + + op_code = (uint8_t)(*(uint8_t *)(data + + QDF_NBUF_PKT_TCP_OPCODE_OFFSET)); + + if (op_code == QDF_NBUF_PKT_TCPOP_FIN) + return true; + + return false; +} + +/** + * __qdf_nbuf_data_is_tcp_fin_ack() - check if skb data is a tcp fin ack + * @data: Pointer to network data buffer + * + * This api is to check if the tcp packet is fin ack. + * + * Return: true if packet is tcp fin ack packet. + * false otherwise. + */ +bool __qdf_nbuf_data_is_tcp_fin_ack(uint8_t *data) +{ + uint8_t op_code; + + op_code = (uint8_t)(*(uint8_t *)(data + + QDF_NBUF_PKT_TCP_OPCODE_OFFSET)); + + if (op_code == QDF_NBUF_PKT_TCPOP_FIN_ACK) + return true; + + return false; +} + /** * __qdf_nbuf_data_is_tcp_syn() - check if skb data is a tcp syn * @data: Pointer to network data buffer @@ -1852,6 +1896,28 @@ bool __qdf_nbuf_data_is_tcp_syn_ack(uint8_t *data) return false; } +/** + * __qdf_nbuf_data_is_tcp_rst() - check if skb data is a tcp rst + * @data: Pointer to network data buffer + * + * This api is to check if the tcp packet is rst. + * + * Return: true if packet is tcp rst packet. + * false otherwise. + */ +bool __qdf_nbuf_data_is_tcp_rst(uint8_t *data) +{ + uint8_t op_code; + + op_code = (uint8_t)(*(uint8_t *)(data + + QDF_NBUF_PKT_TCP_OPCODE_OFFSET)); + + if (op_code == QDF_NBUF_PKT_TCPOP_RST) + return true; + + return false; +} + /** * __qdf_nbuf_data_is_tcp_ack() - check if skb data is a tcp ack * @data: Pointer to network data buffer