s390/qeth: try harder to get packets from RX buffer
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>
This commit is contained in:
parent
8d68af6af6
commit
864c17c3d8
@ -5214,13 +5214,11 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
|
|||||||
int use_rx_sg = 0;
|
int use_rx_sg = 0;
|
||||||
|
|
||||||
/* qeth_hdr must not cross element boundaries */
|
/* 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))
|
if (qeth_is_last_sbale(element))
|
||||||
return NULL;
|
return NULL;
|
||||||
element++;
|
element++;
|
||||||
offset = 0;
|
offset = 0;
|
||||||
if (element->length < sizeof(struct qeth_hdr))
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
*hdr = element->addr + offset;
|
*hdr = element->addr + offset;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user