[9610] wlbt: SMAPPER: fix access to SKB data
authorDebabrata Purohit <d.purohit@samsung.com>
Fri, 3 Aug 2018 09:59:24 +0000 (10:59 +0100)
committerhskang <hs1218.kang@samsung.com>
Fri, 17 Aug 2018 00:32:52 +0000 (20:32 -0400)
Fix incorrect access to Ethernet header in S-mapper
mode.

Change-Id: I5893340536a1836fa7cbb04ec1e0b284ff8ff210
SCSC-Bug-Id: SSB-42532
Signed-off-by: Debabrata Purohit <d.purohit@samsung.com>
drivers/net/wireless/scsc/hip.c
drivers/net/wireless/scsc/hip.h
drivers/net/wireless/scsc/hip4_smapper.c
drivers/net/wireless/scsc/hip4_smapper.h
drivers/net/wireless/scsc/sap_ma.c

index 11dd81604d49c65452f1122de1aee626df1a092c..5c559c4fe3f323de25b0db3c926eb8191c6c7029 100755 (executable)
@@ -280,6 +280,11 @@ struct sk_buff *slsi_hip_get_skb_from_smapper(struct slsi_dev *sdev, struct sk_b
 {
        return hip4_smapper_get_skb(sdev, &sdev->hip4_inst, skb);
 }
+
+void *slsi_hip_get_skb_data_from_smapper(struct slsi_dev *sdev, struct sk_buff *skb)
+{
+       return hip4_smapper_get_skb_data(sdev, &sdev->hip4_inst, skb);
+}
 #endif
 
 int slsi_hip_stop(struct slsi_dev *sdev)
index 8b02a93c0a10b96095ee6bf76dc7342014e09166..b8dc04a91bbd12d86bc101e40fba9fd4d8ed26b1 100644 (file)
@@ -57,6 +57,7 @@ void slsi_hip_deinit(struct slsi_dev *sdev);
 int slsi_hip_start(struct slsi_dev *sdev);
 int slsi_hip_setup(struct slsi_dev *sdev);
 int slsi_hip_consume_smapper_entry(struct slsi_dev *sdev, struct sk_buff *skb);
+void *slsi_hip_get_skb_data_from_smapper(struct slsi_dev *sdev, struct sk_buff *skb);
 struct sk_buff *slsi_hip_get_skb_from_smapper(struct slsi_dev *sdev, struct sk_buff *skb);
 int slsi_hip_stop(struct slsi_dev *sdev);
 
index 4f0063b1770b708c5f548af95e648c22c7a897e2..7109b7c7e9603e5bdfc195eae1e1d1fe6cfeae38 100644 (file)
@@ -247,6 +247,24 @@ error:
        return -EIO;
 }
 
+void *hip4_smapper_get_skb_data(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi)
+{
+       struct sk_buff *skb;
+       struct slsi_skb_cb *cb = slsi_skb_cb_get(skb_fapi);
+       struct hip4_smapper_control *control;
+       unsigned long flags;
+
+       control = &(hip->hip_priv->smapper_control);
+
+       spin_lock_irqsave(&control->smapper_lock, flags);
+       skb = (struct sk_buff *)cb->skb_addr;
+
+       SLSI_DBG4_NODEV(SLSI_SMAPPER, "Get SKB smapper: 0x%p, SKB fapi 0x%p\n", skb, skb_fapi);
+       spin_unlock_irqrestore(&control->smapper_lock, flags);
+
+       return skb->data;
+}
+
 struct sk_buff *hip4_smapper_get_skb(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi)
 {
        struct sk_buff *skb;
index fa3d9b5f45a45f2a367d67c18e201b71f9b44dd6..badcecf56a45c976d6afc01d4b714669487abc70 100644 (file)
@@ -93,5 +93,6 @@ void hip4_smapper_deinit(struct slsi_dev *sdev, struct slsi_hip4 *hip);
 
 struct mbulk *hip4_smapper_send(struct slsi_hip4 *hip, struct sk_buff *skb, int *val);
 int hip4_smapper_consume_entry(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi);
+void *hip4_smapper_get_skb_data(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi);
 struct sk_buff *hip4_smapper_get_skb(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi);
 #endif
index 38ddd7a75199fbf80af6bf1efd4c63abd2a01583..f5628042c6cbbfd0e1fb1ebab5ee36b0e8e99758 100755 (executable)
@@ -201,12 +201,27 @@ static int slsi_rx_data_process_skb(struct slsi_dev *sdev, struct net_device *de
 {
        struct netdev_vif *ndev_vif = netdev_priv(dev);
        struct slsi_peer *peer = NULL;
-       struct ethhdr *ehdr = (struct ethhdr *)fapi_get_data((*skb));
+       struct ethhdr *ehdr;
        u16 seq_num;
        bool skip_ba = from_ba;
        bool is_amsdu = slsi_rx_is_amsdu((*skb));
        u8 trafic_q = slsi_frame_priority_to_ac_queue(fapi_get_u16((*skb), u.ma_unitdata_ind.priority));
 
+#ifdef CONFIG_SCSC_SMAPPER
+       /* Check if the payload is in the SMAPPER entry */
+       if (fapi_get_u16((*skb), u.ma_unitdata_ind.bulk_data_descriptor) == FAPI_BULKDATADESCRIPTOR_SMAPPER) {
+               ehdr = (struct ethhdr *)slsi_hip_get_skb_data_from_smapper(sdev, (*skb));
+               if (!(ehdr)) {
+                       SLSI_NET_DBG2(dev, SLSI_RX, "SKB from SMAPPER is NULL\n");
+                       return -EINVAL;
+               }
+       } else {
+               ehdr = (struct ethhdr *)fapi_get_data((*skb));
+       }
+#else
+       ehdr = (struct ethhdr *)fapi_get_data((*skb));
+#endif
+
        SLSI_NET_DBG_HEX(dev, SLSI_RX, (*skb)->data, (*skb)->len < 64 ? (*skb)->len : 64, "\n");
 
        if (!((fapi_get_u16((*skb), u.ma_unitdata_ind.data_unit_descriptor) == FAPI_DATAUNITDESCRIPTOR_IEEE802_3_FRAME) ||