|
@@ -225,9 +225,10 @@ int aq_ring_rx_clean(struct aq_ring_s *self,
|
|
|
}
|
|
|
|
|
|
/* for single fragment packets use build_skb() */
|
|
|
- if (buff->is_eop) {
|
|
|
+ if (buff->is_eop &&
|
|
|
+ buff->len <= AQ_CFG_RX_FRAME_MAX - AQ_SKB_ALIGN) {
|
|
|
skb = build_skb(page_address(buff->page),
|
|
|
- buff->len + AQ_SKB_ALIGN);
|
|
|
+ AQ_CFG_RX_FRAME_MAX);
|
|
|
if (unlikely(!skb)) {
|
|
|
err = -ENOMEM;
|
|
|
goto err_exit;
|
|
@@ -247,18 +248,21 @@ int aq_ring_rx_clean(struct aq_ring_s *self,
|
|
|
buff->len - ETH_HLEN,
|
|
|
SKB_TRUESIZE(buff->len - ETH_HLEN));
|
|
|
|
|
|
- for (i = 1U, next_ = buff->next,
|
|
|
- buff_ = &self->buff_ring[next_]; true;
|
|
|
- next_ = buff_->next,
|
|
|
- buff_ = &self->buff_ring[next_], ++i) {
|
|
|
- skb_add_rx_frag(skb, i, buff_->page, 0,
|
|
|
- buff_->len,
|
|
|
- SKB_TRUESIZE(buff->len -
|
|
|
- ETH_HLEN));
|
|
|
- buff_->is_cleaned = 1;
|
|
|
-
|
|
|
- if (buff_->is_eop)
|
|
|
- break;
|
|
|
+ if (!buff->is_eop) {
|
|
|
+ for (i = 1U, next_ = buff->next,
|
|
|
+ buff_ = &self->buff_ring[next_];
|
|
|
+ true; next_ = buff_->next,
|
|
|
+ buff_ = &self->buff_ring[next_], ++i) {
|
|
|
+ skb_add_rx_frag(skb, i,
|
|
|
+ buff_->page, 0,
|
|
|
+ buff_->len,
|
|
|
+ SKB_TRUESIZE(buff->len -
|
|
|
+ ETH_HLEN));
|
|
|
+ buff_->is_cleaned = 1;
|
|
|
+
|
|
|
+ if (buff_->is_eop)
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|