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

TOMOYO Linux Cross Reference
Linux/include/net/gre.h

Version: ~ [ linux-5.14-rc3 ] ~ [ linux-5.13.5 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.53 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.135 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.198 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.240 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.276 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.276 ] ~ [ 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 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef __LINUX_GRE_H
  3 #define __LINUX_GRE_H
  4 
  5 #include <linux/skbuff.h>
  6 #include <net/ip_tunnels.h>
  7 
  8 struct gre_base_hdr {
  9         __be16 flags;
 10         __be16 protocol;
 11 } __packed;
 12 
 13 struct gre_full_hdr {
 14         struct gre_base_hdr fixed_header;
 15         __be16 csum;
 16         __be16 reserved1;
 17         __be32 key;
 18         __be32 seq;
 19 } __packed;
 20 #define GRE_HEADER_SECTION 4
 21 
 22 #define GREPROTO_CISCO          0
 23 #define GREPROTO_PPTP           1
 24 #define GREPROTO_MAX            2
 25 #define GRE_IP_PROTO_MAX        2
 26 
 27 struct gre_protocol {
 28         int  (*handler)(struct sk_buff *skb);
 29         void (*err_handler)(struct sk_buff *skb, u32 info);
 30 };
 31 
 32 int gre_add_protocol(const struct gre_protocol *proto, u8 version);
 33 int gre_del_protocol(const struct gre_protocol *proto, u8 version);
 34 
 35 struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
 36                                        u8 name_assign_type);
 37 int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
 38                      bool *csum_err, __be16 proto, int nhs);
 39 
 40 static inline bool netif_is_gretap(const struct net_device *dev)
 41 {
 42         return dev->rtnl_link_ops &&
 43                !strcmp(dev->rtnl_link_ops->kind, "gretap");
 44 }
 45 
 46 static inline bool netif_is_ip6gretap(const struct net_device *dev)
 47 {
 48         return dev->rtnl_link_ops &&
 49                !strcmp(dev->rtnl_link_ops->kind, "ip6gretap");
 50 }
 51 
 52 static inline int gre_calc_hlen(__be16 o_flags)
 53 {
 54         int addend = 4;
 55 
 56         if (o_flags & TUNNEL_CSUM)
 57                 addend += 4;
 58         if (o_flags & TUNNEL_KEY)
 59                 addend += 4;
 60         if (o_flags & TUNNEL_SEQ)
 61                 addend += 4;
 62         return addend;
 63 }
 64 
 65 static inline __be16 gre_flags_to_tnl_flags(__be16 flags)
 66 {
 67         __be16 tflags = 0;
 68 
 69         if (flags & GRE_CSUM)
 70                 tflags |= TUNNEL_CSUM;
 71         if (flags & GRE_ROUTING)
 72                 tflags |= TUNNEL_ROUTING;
 73         if (flags & GRE_KEY)
 74                 tflags |= TUNNEL_KEY;
 75         if (flags & GRE_SEQ)
 76                 tflags |= TUNNEL_SEQ;
 77         if (flags & GRE_STRICT)
 78                 tflags |= TUNNEL_STRICT;
 79         if (flags & GRE_REC)
 80                 tflags |= TUNNEL_REC;
 81         if (flags & GRE_VERSION)
 82                 tflags |= TUNNEL_VERSION;
 83 
 84         return tflags;
 85 }
 86 
 87 static inline __be16 gre_tnl_flags_to_gre_flags(__be16 tflags)
 88 {
 89         __be16 flags = 0;
 90 
 91         if (tflags & TUNNEL_CSUM)
 92                 flags |= GRE_CSUM;
 93         if (tflags & TUNNEL_ROUTING)
 94                 flags |= GRE_ROUTING;
 95         if (tflags & TUNNEL_KEY)
 96                 flags |= GRE_KEY;
 97         if (tflags & TUNNEL_SEQ)
 98                 flags |= GRE_SEQ;
 99         if (tflags & TUNNEL_STRICT)
100                 flags |= GRE_STRICT;
101         if (tflags & TUNNEL_REC)
102                 flags |= GRE_REC;
103         if (tflags & TUNNEL_VERSION)
104                 flags |= GRE_VERSION;
105 
106         return flags;
107 }
108 
109 static inline __sum16 gre_checksum(struct sk_buff *skb)
110 {
111         __wsum csum;
112 
113         if (skb->ip_summed == CHECKSUM_PARTIAL)
114                 csum = lco_csum(skb);
115         else
116                 csum = skb_checksum(skb, 0, skb->len, 0);
117         return csum_fold(csum);
118 }
119 
120 static inline void gre_build_header(struct sk_buff *skb, int hdr_len,
121                                     __be16 flags, __be16 proto,
122                                     __be32 key, __be32 seq)
123 {
124         struct gre_base_hdr *greh;
125 
126         skb_push(skb, hdr_len);
127 
128         skb_set_inner_protocol(skb, proto);
129         skb_reset_transport_header(skb);
130         greh = (struct gre_base_hdr *)skb->data;
131         greh->flags = gre_tnl_flags_to_gre_flags(flags);
132         greh->protocol = proto;
133 
134         if (flags & (TUNNEL_KEY | TUNNEL_CSUM | TUNNEL_SEQ)) {
135                 __be32 *ptr = (__be32 *)(((u8 *)greh) + hdr_len - 4);
136 
137                 if (flags & TUNNEL_SEQ) {
138                         *ptr = seq;
139                         ptr--;
140                 }
141                 if (flags & TUNNEL_KEY) {
142                         *ptr = key;
143                         ptr--;
144                 }
145                 if (flags & TUNNEL_CSUM &&
146                     !(skb_shinfo(skb)->gso_type &
147                       (SKB_GSO_GRE | SKB_GSO_GRE_CSUM))) {
148                         *ptr = 0;
149                         *(__sum16 *)ptr = gre_checksum(skb);
150                 }
151         }
152 }
153 
154 #endif
155 

~ [ 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