~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/ipv6/tcpv6_offload.c

Version: ~ [ linux-5.12-rc7 ] ~ [ linux-5.11.13 ] ~ [ linux-5.10.29 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.111 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.186 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.230 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.266 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.266 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *      IPV6 GSO/GRO offload support
  3  *      Linux INET6 implementation
  4  *
  5  *      This program is free software; you can redistribute it and/or
  6  *      modify it under the terms of the GNU General Public License
  7  *      as published by the Free Software Foundation; either version
  8  *      2 of the License, or (at your option) any later version.
  9  *
 10  *      TCPv6 GSO/GRO support
 11  */
 12 #include <linux/skbuff.h>
 13 #include <net/protocol.h>
 14 #include <net/tcp.h>
 15 #include <net/ip6_checksum.h>
 16 #include "ip6_offload.h"
 17 
 18 static struct sk_buff **tcp6_gro_receive(struct sk_buff **head,
 19                                          struct sk_buff *skb)
 20 {
 21         /* Don't bother verifying checksum if we're going to flush anyway. */
 22         if (!NAPI_GRO_CB(skb)->flush &&
 23             skb_gro_checksum_validate(skb, IPPROTO_TCP,
 24                                       ip6_gro_compute_pseudo)) {
 25                 NAPI_GRO_CB(skb)->flush = 1;
 26                 return NULL;
 27         }
 28 
 29         return tcp_gro_receive(head, skb);
 30 }
 31 
 32 static int tcp6_gro_complete(struct sk_buff *skb, int thoff)
 33 {
 34         const struct ipv6hdr *iph = ipv6_hdr(skb);
 35         struct tcphdr *th = tcp_hdr(skb);
 36 
 37         th->check = ~tcp_v6_check(skb->len - thoff, &iph->saddr,
 38                                   &iph->daddr, 0);
 39         skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV6;
 40 
 41         return tcp_gro_complete(skb);
 42 }
 43 
 44 static struct sk_buff *tcp6_gso_segment(struct sk_buff *skb,
 45                                         netdev_features_t features)
 46 {
 47         struct tcphdr *th;
 48 
 49         if (!(skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6))
 50                 return ERR_PTR(-EINVAL);
 51 
 52         if (!pskb_may_pull(skb, sizeof(*th)))
 53                 return ERR_PTR(-EINVAL);
 54 
 55         if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) {
 56                 const struct ipv6hdr *ipv6h = ipv6_hdr(skb);
 57                 struct tcphdr *th = tcp_hdr(skb);
 58 
 59                 /* Set up pseudo header, usually expect stack to have done
 60                  * this.
 61                  */
 62 
 63                 th->check = 0;
 64                 skb->ip_summed = CHECKSUM_PARTIAL;
 65                 __tcp_v6_send_check(skb, &ipv6h->saddr, &ipv6h->daddr);
 66         }
 67 
 68         return tcp_gso_segment(skb, features);
 69 }
 70 static const struct net_offload tcpv6_offload = {
 71         .callbacks = {
 72                 .gso_segment    =       tcp6_gso_segment,
 73                 .gro_receive    =       tcp6_gro_receive,
 74                 .gro_complete   =       tcp6_gro_complete,
 75         },
 76 };
 77 
 78 int __init tcpv6_offload_init(void)
 79 {
 80         return inet6_add_offload(&tcpv6_offload, IPPROTO_TCP);
 81 }
 82 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp