root/include/net/ip_tunnels.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. ip_tunnel_key_init
  2. ip_tunnel_dst_cache_usable
  3. ip_tunnel_info_af
  4. key32_to_tunnel_id
  5. tunnel_id_to_key32
  6. ip_tunnel_init_flow
  7. pskb_inet_may_pull
  8. ip_encap_hlen
  9. ip_tunnel_encap
  10. ip_tunnel_get_dsfield
  11. ip_tunnel_get_ttl
  12. ip_tunnel_ecn_encap
  13. iptunnel_pull_header
  14. iptunnel_pull_offloads
  15. iptunnel_xmit_stats
  16. ip_tunnel_info_opts
  17. ip_tunnel_info_opts_get
  18. ip_tunnel_info_opts_set
  19. lwt_tun_info
  20. ip_tunnel_collect_metadata
  21. lwt_tun_info
  22. ip_tunnel_need_metadata
  23. ip_tunnel_unneed_metadata
  24. ip_tunnel_info_opts_get
  25. ip_tunnel_info_opts_set

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef __NET_IP_TUNNELS_H
   3 #define __NET_IP_TUNNELS_H 1
   4 
   5 #include <linux/if_tunnel.h>
   6 #include <linux/netdevice.h>
   7 #include <linux/skbuff.h>
   8 #include <linux/socket.h>
   9 #include <linux/types.h>
  10 #include <linux/u64_stats_sync.h>
  11 #include <linux/bitops.h>
  12 
  13 #include <net/dsfield.h>
  14 #include <net/gro_cells.h>
  15 #include <net/inet_ecn.h>
  16 #include <net/netns/generic.h>
  17 #include <net/rtnetlink.h>
  18 #include <net/lwtunnel.h>
  19 #include <net/dst_cache.h>
  20 
  21 #if IS_ENABLED(CONFIG_IPV6)
  22 #include <net/ipv6.h>
  23 #include <net/ip6_fib.h>
  24 #include <net/ip6_route.h>
  25 #endif
  26 
  27 /* Keep error state on tunnel for 30 sec */
  28 #define IPTUNNEL_ERR_TIMEO      (30*HZ)
  29 
  30 /* Used to memset ip_tunnel padding. */
  31 #define IP_TUNNEL_KEY_SIZE      offsetofend(struct ip_tunnel_key, tp_dst)
  32 
  33 /* Used to memset ipv4 address padding. */
  34 #define IP_TUNNEL_KEY_IPV4_PAD  offsetofend(struct ip_tunnel_key, u.ipv4.dst)
  35 #define IP_TUNNEL_KEY_IPV4_PAD_LEN                              \
  36         (FIELD_SIZEOF(struct ip_tunnel_key, u) -                \
  37          FIELD_SIZEOF(struct ip_tunnel_key, u.ipv4))
  38 
  39 struct ip_tunnel_key {
  40         __be64                  tun_id;
  41         union {
  42                 struct {
  43                         __be32  src;
  44                         __be32  dst;
  45                 } ipv4;
  46                 struct {
  47                         struct in6_addr src;
  48                         struct in6_addr dst;
  49                 } ipv6;
  50         } u;
  51         __be16                  tun_flags;
  52         u8                      tos;            /* TOS for IPv4, TC for IPv6 */
  53         u8                      ttl;            /* TTL for IPv4, HL for IPv6 */
  54         __be32                  label;          /* Flow Label for IPv6 */
  55         __be16                  tp_src;
  56         __be16                  tp_dst;
  57 };
  58 
  59 /* Flags for ip_tunnel_info mode. */
  60 #define IP_TUNNEL_INFO_TX       0x01    /* represents tx tunnel parameters */
  61 #define IP_TUNNEL_INFO_IPV6     0x02    /* key contains IPv6 addresses */
  62 #define IP_TUNNEL_INFO_BRIDGE   0x04    /* represents a bridged tunnel id */
  63 
  64 /* Maximum tunnel options length. */
  65 #define IP_TUNNEL_OPTS_MAX                                      \
  66         GENMASK((FIELD_SIZEOF(struct ip_tunnel_info,            \
  67                               options_len) * BITS_PER_BYTE) - 1, 0)
  68 
  69 struct ip_tunnel_info {
  70         struct ip_tunnel_key    key;
  71 #ifdef CONFIG_DST_CACHE
  72         struct dst_cache        dst_cache;
  73 #endif
  74         u8                      options_len;
  75         u8                      mode;
  76 };
  77 
  78 /* 6rd prefix/relay information */
  79 #ifdef CONFIG_IPV6_SIT_6RD
  80 struct ip_tunnel_6rd_parm {
  81         struct in6_addr         prefix;
  82         __be32                  relay_prefix;
  83         u16                     prefixlen;
  84         u16                     relay_prefixlen;
  85 };
  86 #endif
  87 
  88 struct ip_tunnel_encap {
  89         u16                     type;
  90         u16                     flags;
  91         __be16                  sport;
  92         __be16                  dport;
  93 };
  94 
  95 struct ip_tunnel_prl_entry {
  96         struct ip_tunnel_prl_entry __rcu *next;
  97         __be32                          addr;
  98         u16                             flags;
  99         struct rcu_head                 rcu_head;
 100 };
 101 
 102 struct metadata_dst;
 103 
 104 struct ip_tunnel {
 105         struct ip_tunnel __rcu  *next;
 106         struct hlist_node hash_node;
 107         struct net_device       *dev;
 108         struct net              *net;   /* netns for packet i/o */
 109 
 110         unsigned long   err_time;       /* Time when the last ICMP error
 111                                          * arrived */
 112         int             err_count;      /* Number of arrived ICMP errors */
 113 
 114         /* These four fields used only by GRE */
 115         u32             i_seqno;        /* The last seen seqno  */
 116         u32             o_seqno;        /* The last output seqno */
 117         int             tun_hlen;       /* Precalculated header length */
 118 
 119         /* These four fields used only by ERSPAN */
 120         u32             index;          /* ERSPAN type II index */
 121         u8              erspan_ver;     /* ERSPAN version */
 122         u8              dir;            /* ERSPAN direction */
 123         u16             hwid;           /* ERSPAN hardware ID */
 124 
 125         struct dst_cache dst_cache;
 126 
 127         struct ip_tunnel_parm parms;
 128 
 129         int             mlink;
 130         int             encap_hlen;     /* Encap header length (FOU,GUE) */
 131         int             hlen;           /* tun_hlen + encap_hlen */
 132         struct ip_tunnel_encap encap;
 133 
 134         /* for SIT */
 135 #ifdef CONFIG_IPV6_SIT_6RD
 136         struct ip_tunnel_6rd_parm ip6rd;
 137 #endif
 138         struct ip_tunnel_prl_entry __rcu *prl;  /* potential router list */
 139         unsigned int            prl_count;      /* # of entries in PRL */
 140         unsigned int            ip_tnl_net_id;
 141         struct gro_cells        gro_cells;
 142         __u32                   fwmark;
 143         bool                    collect_md;
 144         bool                    ignore_df;
 145 };
 146 
 147 struct tnl_ptk_info {
 148         __be16 flags;
 149         __be16 proto;
 150         __be32 key;
 151         __be32 seq;
 152         int hdr_len;
 153 };
 154 
 155 #define PACKET_RCVD     0
 156 #define PACKET_REJECT   1
 157 #define PACKET_NEXT     2
 158 
 159 #define IP_TNL_HASH_BITS   7
 160 #define IP_TNL_HASH_SIZE   (1 << IP_TNL_HASH_BITS)
 161 
 162 struct ip_tunnel_net {
 163         struct net_device *fb_tunnel_dev;
 164         struct rtnl_link_ops *rtnl_link_ops;
 165         struct hlist_head tunnels[IP_TNL_HASH_SIZE];
 166         struct ip_tunnel __rcu *collect_md_tun;
 167         int type;
 168 };
 169 
 170 static inline void ip_tunnel_key_init(struct ip_tunnel_key *key,
 171                                       __be32 saddr, __be32 daddr,
 172                                       u8 tos, u8 ttl, __be32 label,
 173                                       __be16 tp_src, __be16 tp_dst,
 174                                       __be64 tun_id, __be16 tun_flags)
 175 {
 176         key->tun_id = tun_id;
 177         key->u.ipv4.src = saddr;
 178         key->u.ipv4.dst = daddr;
 179         memset((unsigned char *)key + IP_TUNNEL_KEY_IPV4_PAD,
 180                0, IP_TUNNEL_KEY_IPV4_PAD_LEN);
 181         key->tos = tos;
 182         key->ttl = ttl;
 183         key->label = label;
 184         key->tun_flags = tun_flags;
 185 
 186         /* For the tunnel types on the top of IPsec, the tp_src and tp_dst of
 187          * the upper tunnel are used.
 188          * E.g: GRE over IPSEC, the tp_src and tp_port are zero.
 189          */
 190         key->tp_src = tp_src;
 191         key->tp_dst = tp_dst;
 192 
 193         /* Clear struct padding. */
 194         if (sizeof(*key) != IP_TUNNEL_KEY_SIZE)
 195                 memset((unsigned char *)key + IP_TUNNEL_KEY_SIZE,
 196                        0, sizeof(*key) - IP_TUNNEL_KEY_SIZE);
 197 }
 198 
 199 static inline bool
 200 ip_tunnel_dst_cache_usable(const struct sk_buff *skb,
 201                            const struct ip_tunnel_info *info)
 202 {
 203         if (skb->mark)
 204                 return false;
 205         if (!info)
 206                 return true;
 207         if (info->key.tun_flags & TUNNEL_NOCACHE)
 208                 return false;
 209 
 210         return true;
 211 }
 212 
 213 static inline unsigned short ip_tunnel_info_af(const struct ip_tunnel_info
 214                                                *tun_info)
 215 {
 216         return tun_info->mode & IP_TUNNEL_INFO_IPV6 ? AF_INET6 : AF_INET;
 217 }
 218 
 219 static inline __be64 key32_to_tunnel_id(__be32 key)
 220 {
 221 #ifdef __BIG_ENDIAN
 222         return (__force __be64)key;
 223 #else
 224         return (__force __be64)((__force u64)key << 32);
 225 #endif
 226 }
 227 
 228 /* Returns the least-significant 32 bits of a __be64. */
 229 static inline __be32 tunnel_id_to_key32(__be64 tun_id)
 230 {
 231 #ifdef __BIG_ENDIAN
 232         return (__force __be32)tun_id;
 233 #else
 234         return (__force __be32)((__force u64)tun_id >> 32);
 235 #endif
 236 }
 237 
 238 #ifdef CONFIG_INET
 239 
 240 static inline void ip_tunnel_init_flow(struct flowi4 *fl4,
 241                                        int proto,
 242                                        __be32 daddr, __be32 saddr,
 243                                        __be32 key, __u8 tos, int oif,
 244                                        __u32 mark, __u32 tun_inner_hash)
 245 {
 246         memset(fl4, 0, sizeof(*fl4));
 247         fl4->flowi4_oif = oif;
 248         fl4->daddr = daddr;
 249         fl4->saddr = saddr;
 250         fl4->flowi4_tos = tos;
 251         fl4->flowi4_proto = proto;
 252         fl4->fl4_gre_key = key;
 253         fl4->flowi4_mark = mark;
 254         fl4->flowi4_multipath_hash = tun_inner_hash;
 255 }
 256 
 257 int ip_tunnel_init(struct net_device *dev);
 258 void ip_tunnel_uninit(struct net_device *dev);
 259 void  ip_tunnel_dellink(struct net_device *dev, struct list_head *head);
 260 struct net *ip_tunnel_get_link_net(const struct net_device *dev);
 261 int ip_tunnel_get_iflink(const struct net_device *dev);
 262 int ip_tunnel_init_net(struct net *net, unsigned int ip_tnl_net_id,
 263                        struct rtnl_link_ops *ops, char *devname);
 264 
 265 void ip_tunnel_delete_nets(struct list_head *list_net, unsigned int id,
 266                            struct rtnl_link_ops *ops);
 267 
 268 void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
 269                     const struct iphdr *tnl_params, const u8 protocol);
 270 void ip_md_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
 271                        const u8 proto, int tunnel_hlen);
 272 int ip_tunnel_ioctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd);
 273 int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict);
 274 int ip_tunnel_change_mtu(struct net_device *dev, int new_mtu);
 275 
 276 void ip_tunnel_get_stats64(struct net_device *dev,
 277                            struct rtnl_link_stats64 *tot);
 278 struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
 279                                    int link, __be16 flags,
 280                                    __be32 remote, __be32 local,
 281                                    __be32 key);
 282 
 283 int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
 284                   const struct tnl_ptk_info *tpi, struct metadata_dst *tun_dst,
 285                   bool log_ecn_error);
 286 int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[],
 287                          struct ip_tunnel_parm *p, __u32 fwmark);
 288 int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
 289                       struct ip_tunnel_parm *p, __u32 fwmark);
 290 void ip_tunnel_setup(struct net_device *dev, unsigned int net_id);
 291 
 292 struct ip_tunnel_encap_ops {
 293         size_t (*encap_hlen)(struct ip_tunnel_encap *e);
 294         int (*build_header)(struct sk_buff *skb, struct ip_tunnel_encap *e,
 295                             u8 *protocol, struct flowi4 *fl4);
 296         int (*err_handler)(struct sk_buff *skb, u32 info);
 297 };
 298 
 299 #define MAX_IPTUN_ENCAP_OPS 8
 300 
 301 extern const struct ip_tunnel_encap_ops __rcu *
 302                 iptun_encaps[MAX_IPTUN_ENCAP_OPS];
 303 
 304 int ip_tunnel_encap_add_ops(const struct ip_tunnel_encap_ops *op,
 305                             unsigned int num);
 306 int ip_tunnel_encap_del_ops(const struct ip_tunnel_encap_ops *op,
 307                             unsigned int num);
 308 
 309 int ip_tunnel_encap_setup(struct ip_tunnel *t,
 310                           struct ip_tunnel_encap *ipencap);
 311 
 312 static inline bool pskb_inet_may_pull(struct sk_buff *skb)
 313 {
 314         int nhlen;
 315 
 316         switch (skb->protocol) {
 317 #if IS_ENABLED(CONFIG_IPV6)
 318         case htons(ETH_P_IPV6):
 319                 nhlen = sizeof(struct ipv6hdr);
 320                 break;
 321 #endif
 322         case htons(ETH_P_IP):
 323                 nhlen = sizeof(struct iphdr);
 324                 break;
 325         default:
 326                 nhlen = 0;
 327         }
 328 
 329         return pskb_network_may_pull(skb, nhlen);
 330 }
 331 
 332 static inline int ip_encap_hlen(struct ip_tunnel_encap *e)
 333 {
 334         const struct ip_tunnel_encap_ops *ops;
 335         int hlen = -EINVAL;
 336 
 337         if (e->type == TUNNEL_ENCAP_NONE)
 338                 return 0;
 339 
 340         if (e->type >= MAX_IPTUN_ENCAP_OPS)
 341                 return -EINVAL;
 342 
 343         rcu_read_lock();
 344         ops = rcu_dereference(iptun_encaps[e->type]);
 345         if (likely(ops && ops->encap_hlen))
 346                 hlen = ops->encap_hlen(e);
 347         rcu_read_unlock();
 348 
 349         return hlen;
 350 }
 351 
 352 static inline int ip_tunnel_encap(struct sk_buff *skb, struct ip_tunnel *t,
 353                                   u8 *protocol, struct flowi4 *fl4)
 354 {
 355         const struct ip_tunnel_encap_ops *ops;
 356         int ret = -EINVAL;
 357 
 358         if (t->encap.type == TUNNEL_ENCAP_NONE)
 359                 return 0;
 360 
 361         if (t->encap.type >= MAX_IPTUN_ENCAP_OPS)
 362                 return -EINVAL;
 363 
 364         rcu_read_lock();
 365         ops = rcu_dereference(iptun_encaps[t->encap.type]);
 366         if (likely(ops && ops->build_header))
 367                 ret = ops->build_header(skb, &t->encap, protocol, fl4);
 368         rcu_read_unlock();
 369 
 370         return ret;
 371 }
 372 
 373 /* Extract dsfield from inner protocol */
 374 static inline u8 ip_tunnel_get_dsfield(const struct iphdr *iph,
 375                                        const struct sk_buff *skb)
 376 {
 377         if (skb->protocol == htons(ETH_P_IP))
 378                 return iph->tos;
 379         else if (skb->protocol == htons(ETH_P_IPV6))
 380                 return ipv6_get_dsfield((const struct ipv6hdr *)iph);
 381         else
 382                 return 0;
 383 }
 384 
 385 static inline u8 ip_tunnel_get_ttl(const struct iphdr *iph,
 386                                        const struct sk_buff *skb)
 387 {
 388         if (skb->protocol == htons(ETH_P_IP))
 389                 return iph->ttl;
 390         else if (skb->protocol == htons(ETH_P_IPV6))
 391                 return ((const struct ipv6hdr *)iph)->hop_limit;
 392         else
 393                 return 0;
 394 }
 395 
 396 /* Propogate ECN bits out */
 397 static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph,
 398                                      const struct sk_buff *skb)
 399 {
 400         u8 inner = ip_tunnel_get_dsfield(iph, skb);
 401 
 402         return INET_ECN_encapsulate(tos, inner);
 403 }
 404 
 405 int __iptunnel_pull_header(struct sk_buff *skb, int hdr_len,
 406                            __be16 inner_proto, bool raw_proto, bool xnet);
 407 
 408 static inline int iptunnel_pull_header(struct sk_buff *skb, int hdr_len,
 409                                        __be16 inner_proto, bool xnet)
 410 {
 411         return __iptunnel_pull_header(skb, hdr_len, inner_proto, false, xnet);
 412 }
 413 
 414 void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
 415                    __be32 src, __be32 dst, u8 proto,
 416                    u8 tos, u8 ttl, __be16 df, bool xnet);
 417 struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md,
 418                                              gfp_t flags);
 419 
 420 int iptunnel_handle_offloads(struct sk_buff *skb, int gso_type_mask);
 421 
 422 static inline int iptunnel_pull_offloads(struct sk_buff *skb)
 423 {
 424         if (skb_is_gso(skb)) {
 425                 int err;
 426 
 427                 err = skb_unclone(skb, GFP_ATOMIC);
 428                 if (unlikely(err))
 429                         return err;
 430                 skb_shinfo(skb)->gso_type &= ~(NETIF_F_GSO_ENCAP_ALL >>
 431                                                NETIF_F_GSO_SHIFT);
 432         }
 433 
 434         skb->encapsulation = 0;
 435         return 0;
 436 }
 437 
 438 static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len)
 439 {
 440         if (pkt_len > 0) {
 441                 struct pcpu_sw_netstats *tstats = get_cpu_ptr(dev->tstats);
 442 
 443                 u64_stats_update_begin(&tstats->syncp);
 444                 tstats->tx_bytes += pkt_len;
 445                 tstats->tx_packets++;
 446                 u64_stats_update_end(&tstats->syncp);
 447                 put_cpu_ptr(tstats);
 448         } else {
 449                 struct net_device_stats *err_stats = &dev->stats;
 450 
 451                 if (pkt_len < 0) {
 452                         err_stats->tx_errors++;
 453                         err_stats->tx_aborted_errors++;
 454                 } else {
 455                         err_stats->tx_dropped++;
 456                 }
 457         }
 458 }
 459 
 460 static inline void *ip_tunnel_info_opts(struct ip_tunnel_info *info)
 461 {
 462         return info + 1;
 463 }
 464 
 465 static inline void ip_tunnel_info_opts_get(void *to,
 466                                            const struct ip_tunnel_info *info)
 467 {
 468         memcpy(to, info + 1, info->options_len);
 469 }
 470 
 471 static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info,
 472                                            const void *from, int len,
 473                                            __be16 flags)
 474 {
 475         memcpy(ip_tunnel_info_opts(info), from, len);
 476         info->options_len = len;
 477         info->key.tun_flags |= flags;
 478 }
 479 
 480 static inline struct ip_tunnel_info *lwt_tun_info(struct lwtunnel_state *lwtstate)
 481 {
 482         return (struct ip_tunnel_info *)lwtstate->data;
 483 }
 484 
 485 DECLARE_STATIC_KEY_FALSE(ip_tunnel_metadata_cnt);
 486 
 487 /* Returns > 0 if metadata should be collected */
 488 static inline int ip_tunnel_collect_metadata(void)
 489 {
 490         return static_branch_unlikely(&ip_tunnel_metadata_cnt);
 491 }
 492 
 493 void __init ip_tunnel_core_init(void);
 494 
 495 void ip_tunnel_need_metadata(void);
 496 void ip_tunnel_unneed_metadata(void);
 497 
 498 #else /* CONFIG_INET */
 499 
 500 static inline struct ip_tunnel_info *lwt_tun_info(struct lwtunnel_state *lwtstate)
 501 {
 502         return NULL;
 503 }
 504 
 505 static inline void ip_tunnel_need_metadata(void)
 506 {
 507 }
 508 
 509 static inline void ip_tunnel_unneed_metadata(void)
 510 {
 511 }
 512 
 513 static inline void ip_tunnel_info_opts_get(void *to,
 514                                            const struct ip_tunnel_info *info)
 515 {
 516 }
 517 
 518 static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info,
 519                                            const void *from, int len,
 520                                            __be16 flags)
 521 {
 522         info->options_len = 0;
 523         info->key.tun_flags |= flags;
 524 }
 525 
 526 #endif /* CONFIG_INET */
 527 
 528 #endif /* __NET_IP_TUNNELS_H */

/* [<][>][^][v][top][bottom][index][help] */