Browse Source

qcacmn: Handle NULL objects properly

handle qdf_nbuf_unshare failure cases and NULL peer
in pn_error handler properly.

Change-Id: I9d271bed512a7e84a16d2b6c5b34f13235fc54e9
CRs-Fixed: 2221457
Tallapragada Kalyan 7 years ago
parent
commit
bc62989ce4
2 changed files with 21 additions and 8 deletions
  1. 13 0
      dp/wifi3.0/dp_rx.c
  2. 8 8
      dp/wifi3.0/dp_rx_err.c

+ 13 - 0
dp/wifi3.0/dp_rx.c

@@ -191,6 +191,7 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
 
 		rxdma_ring_entry = hal_srng_src_get_next(dp_soc->hal_soc,
 								rxdma_srng);
+		qdf_assert_always(rxdma_ring_entry);
 
 		next = (*desc_list)->next;
 
@@ -385,6 +386,18 @@ dp_rx_intrabss_fwd(struct dp_soc *soc,
 					return false;
 
 				nbuf = qdf_nbuf_unshare(nbuf);
+				if (!nbuf) {
+					DP_STATS_INC_PKT(sa_peer,
+							 rx.intra_bss.fail,
+							 1,
+							 len);
+					/* return true even though the pkt is
+					 * not forwarded. Basically skb_unshare
+					 * failed and we want to continue with
+					 * next nbuf.
+					 */
+					return true;
+				}
 			}
 
 			if (!dp_tx_send(sa_peer->vdev, nbuf)) {

+ 8 - 8
dp/wifi3.0/dp_rx_err.c

@@ -348,18 +348,18 @@ dp_rx_pn_error_handle(struct dp_soc *soc, void *ring_desc,
 		/*
 		 * TODO: Check for peer specific policies & set peer_pn_policy
 		 */
+		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
+			"discard rx due to PN error for peer  %pK  "
+			"(%02x:%02x:%02x:%02x:%02x:%02x)\n",
+			peer,
+			peer->mac_addr.raw[0], peer->mac_addr.raw[1],
+			peer->mac_addr.raw[2], peer->mac_addr.raw[3],
+			peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
+
 	}
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 		"Packet received with PN error");
 
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-		"discard rx due to PN error for peer  %pK  "
-		"(%02x:%02x:%02x:%02x:%02x:%02x)\n",
-		peer,
-		peer->mac_addr.raw[0], peer->mac_addr.raw[1],
-		peer->mac_addr.raw[2], peer->mac_addr.raw[3],
-		peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
-
 	/* No peer PN policy -- definitely drop */
 	if (!peer_pn_policy)
 		rx_bufs_used = dp_rx_msdus_drop(soc, ring_desc,