staging:r8188eu: update pkt->(data|tail|len) synchronously with rx_(data|tail|len...
authorIvan Safonov <insafonov@gmail.com>
Mon, 6 Feb 2017 17:23:27 +0000 (20:23 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Feb 2017 12:22:09 +0000 (13:22 +0100)
Original driver code uses rx_* members to store skb (pkt) fields
(instead of pkt->* members), pkt->* updated only after data
completely formed, not in process.

Update pkt->* after data buffer changed (with rx_*).

Signed-off-by: Ivan Safonov <insafonov@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8188eu/include/rtw_recv.h

index 2e5caa4ac59d4e6e2f60ff98594ade17baf063bf..d4d8a740990f882b736a93288a7697d3ef4f1c44 100644 (file)
@@ -261,6 +261,8 @@ static inline u8 *recvframe_pull(struct recv_frame *precvframe, int sz)
 
        if (precvframe == NULL)
                return NULL;
+
+       skb_pull(precvframe->pkt, sz);
        precvframe->rx_data += sz;
        if (precvframe->rx_data > precvframe->rx_tail) {
                precvframe->rx_data -= sz;
@@ -278,7 +280,7 @@ static inline u8 *recvframe_put(struct recv_frame *precvframe, int sz)
 
        if (precvframe == NULL)
                return NULL;
-
+       skb_put(precvframe->pkt, sz);
        precvframe->rx_tail += sz;
 
        if (precvframe->rx_tail > precvframe->pkt->end) {
@@ -299,6 +301,7 @@ static inline u8 *recvframe_pull_tail(struct recv_frame *precvframe, int sz)
 
        if (precvframe == NULL)
                return NULL;
+       skb_trim(precvframe->pkt, precvframe->pkt->len - sz);
        precvframe->rx_tail -= sz;
        if (precvframe->rx_tail < precvframe->rx_data) {
                precvframe->rx_tail += sz;