static void lro_flush(struct net_lro_mgr *lro_mgr, struct net_lro_desc *lro_desc) { if (lro_desc->pkt_aggr_cnt > 1) lro_update_tcp_ip_header(lro_desc); skb_shinfo(lro_desc->parent)->gso_size = lro_desc->mss; if (lro_desc->vgrp) { if (lro_mgr->features & LRO_F_NAPI) vlan_hwaccel_receive_skb(lro_desc->parent, lro_desc->vgrp, lro_desc->vlan_tag); else vlan_hwaccel_rx(lro_desc->parent, lro_desc->vgrp, lro_desc->vlan_tag); } else { if (lro_mgr->features & LRO_F_NAPI) netif_receive_skb(lro_desc->parent); else netif_rx(lro_desc->parent); } LRO_INC_STATS(lro_mgr, flushed); lro_clear_desc(lro_desc); }
static void flush_session(struct mlx4_en_priv *priv, struct mlx4_en_ipfrag *session, u16 more) { struct sk_buff *skb = session->fragments; struct iphdr *iph = ip_hdr(skb); struct net_device *dev = skb->dev; /* Update IP length and checksum */ iph->tot_len = htons(session->total_len); iph->frag_off = htons(more | (session->offset >> 3)); iph->check = 0; iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); if (session->vlan) { if (priv->mdev->profile.use_napi) vlan_hwaccel_receive_skb(skb, priv->vlgrp, be16_to_cpu(session->sl_vid)); else vlan_hwaccel_rx(skb, priv->vlgrp, be16_to_cpu(session->sl_vid)); } else { if (priv->mdev->profile.use_napi) netif_receive_skb(skb); else netif_rx(skb); } dev->last_rx = jiffies; session->fragments = NULL; session->last = NULL; }
void lro_vlan_hwaccel_receive_skb(struct net_lro_mgr *lro_mgr, struct sk_buff *skb, struct vlan_group *vgrp, u16 vlan_tag, void *priv) { if (__lro_proc_skb(lro_mgr, skb, vgrp, vlan_tag, priv)) { if (lro_mgr->features & LRO_F_NAPI) vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag); else vlan_hwaccel_rx(skb, vgrp, vlan_tag); } }
static int mvswitch_mangle_rx(struct sk_buff *skb, int napi) { struct mvswitch_priv *priv; struct net_device *dev; int vlan = -1; unsigned char *buf; int i; dev = skb->dev; if (!dev) goto error; priv = dev->phy_ptr; if (!priv) goto error; if (!priv->grp) goto error; #ifdef HEADER_MODE buf = skb->data; skb_pull(skb, MV_HEADER_SIZE); #else buf = skb->data + skb->len - MV_TRAILER_SIZE; if (buf[0] != 0x80) goto error; #endif /* look for the vlan matching the incoming port */ for (i = 0; i < ARRAY_SIZE(priv->vlans); i++) { if ((1 << buf[1]) & priv->vlans[i]) vlan = i; } if (vlan == -1) goto error; skb->protocol = eth_type_trans(skb, skb->dev); if (napi) return vlan_hwaccel_receive_skb(skb, priv->grp, vlan); else return vlan_hwaccel_rx(skb, priv->grp, vlan); error: /* no vlan? eat the packet! */ dev_kfree_skb_any(skb); return 0; }
void lro_vlan_hwaccel_receive_frags(struct net_lro_mgr *lro_mgr, struct skb_frag_struct *frags, int len, int true_size, struct vlan_group *vgrp, u16 vlan_tag, void *priv, __wsum sum) { struct sk_buff *skb; skb = __lro_proc_segment(lro_mgr, frags, len, true_size, vgrp, vlan_tag, priv, sum); if (!skb) return; if (lro_mgr->features & LRO_F_NAPI) vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag); else vlan_hwaccel_rx(skb, vgrp, vlan_tag); }