OSDN Git Service

s390/qeth: try harder to get packets from RX buffer
authorJulian Wiedmann <jwi@linux.vnet.ibm.com>
Wed, 18 Oct 2017 15:40:23 +0000 (17:40 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Oct 2017 12:11:05 +0000 (13:11 +0100)
Current code bails out when two subsequent buffer elements hold
insufficient data to contain a qeth_hdr packet descriptor.
This seems reasonable, but it would be legal for quirky hardware to
leave a few elements empty and then present packets in a subsequent
element. These packets would currently be dropped.

So make sure to check all buffer elements, until we hit the LAST_ENTRY
indication.

Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_core_main.c

index 23b439f..8855bc8 100644 (file)
@@ -5214,13 +5214,11 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
        int use_rx_sg = 0;
 
        /* qeth_hdr must not cross element boundaries */
-       if (element->length < offset + sizeof(struct qeth_hdr)) {
+       while (element->length < offset + sizeof(struct qeth_hdr)) {
                if (qeth_is_last_sbale(element))
                        return NULL;
                element++;
                offset = 0;
-               if (element->length < sizeof(struct qeth_hdr))
-                       return NULL;
        }
        *hdr = element->addr + offset;