loopback: Remove rest of LOOPBACK_TSO code.
It hasn't been enabled for a long time and the generic GSO engine is better documentation of what is expected of a device implementing TSO. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
f22f8567cb
Коммит
7447ef63cf
|
@ -64,68 +64,6 @@ struct pcpu_lstats {
|
|||
unsigned long bytes;
|
||||
};
|
||||
|
||||
/* KISS: just allocate small chunks and copy bits.
|
||||
*
|
||||
* So, in fact, this is documentation, explaining what we expect
|
||||
* of largesending device modulo TCP checksum, which is ignored for loopback.
|
||||
*/
|
||||
|
||||
#ifdef LOOPBACK_TSO
|
||||
static void emulate_large_send_offload(struct sk_buff *skb)
|
||||
{
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
struct tcphdr *th = (struct tcphdr *)(skb_network_header(skb) +
|
||||
(iph->ihl * 4));
|
||||
unsigned int doffset = (iph->ihl + th->doff) * 4;
|
||||
unsigned int mtu = skb_shinfo(skb)->gso_size + doffset;
|
||||
unsigned int offset = 0;
|
||||
u32 seq = ntohl(th->seq);
|
||||
u16 id = ntohs(iph->id);
|
||||
|
||||
while (offset + doffset < skb->len) {
|
||||
unsigned int frag_size = min(mtu, skb->len - offset) - doffset;
|
||||
struct sk_buff *nskb = alloc_skb(mtu + 32, GFP_ATOMIC);
|
||||
|
||||
if (!nskb)
|
||||
break;
|
||||
skb_reserve(nskb, 32);
|
||||
skb_set_mac_header(nskb, -ETH_HLEN);
|
||||
skb_reset_network_header(nskb);
|
||||
iph = ip_hdr(nskb);
|
||||
skb_copy_to_linear_data(nskb, skb_network_header(skb),
|
||||
doffset);
|
||||
if (skb_copy_bits(skb,
|
||||
doffset + offset,
|
||||
nskb->data + doffset,
|
||||
frag_size))
|
||||
BUG();
|
||||
skb_put(nskb, doffset + frag_size);
|
||||
nskb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
nskb->dev = skb->dev;
|
||||
nskb->priority = skb->priority;
|
||||
nskb->protocol = skb->protocol;
|
||||
nskb->dst = dst_clone(skb->dst);
|
||||
memcpy(nskb->cb, skb->cb, sizeof(skb->cb));
|
||||
nskb->pkt_type = skb->pkt_type;
|
||||
|
||||
th = (struct tcphdr *)(skb_network_header(nskb) + iph->ihl * 4);
|
||||
iph->tot_len = htons(frag_size + doffset);
|
||||
iph->id = htons(id);
|
||||
iph->check = 0;
|
||||
iph->check = ip_fast_csum((unsigned char *) iph, iph->ihl);
|
||||
th->seq = htonl(seq);
|
||||
if (offset + doffset + frag_size < skb->len)
|
||||
th->fin = th->psh = 0;
|
||||
netif_rx(nskb);
|
||||
offset += frag_size;
|
||||
seq += frag_size;
|
||||
id++;
|
||||
}
|
||||
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
#endif /* LOOPBACK_TSO */
|
||||
|
||||
/*
|
||||
* The higher levels take care of making this non-reentrant (it's
|
||||
* called with bh's disabled).
|
||||
|
|
Загрузка…
Ссылка в новой задаче