Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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);
	}
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
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);
}