LCOV - code coverage report
Current view: top level - include/net - ip_tunnels.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 12 0.0 %
Date: 2014-04-07 Functions: 0 0 -
Branches: 0 8 0.0 %

           Branch data     Line data    Source code
       1                 :            : #ifndef __NET_IP_TUNNELS_H
       2                 :            : #define __NET_IP_TUNNELS_H 1
       3                 :            : 
       4                 :            : #include <linux/if_tunnel.h>
       5                 :            : #include <linux/netdevice.h>
       6                 :            : #include <linux/skbuff.h>
       7                 :            : #include <linux/types.h>
       8                 :            : #include <linux/u64_stats_sync.h>
       9                 :            : #include <net/dsfield.h>
      10                 :            : #include <net/gro_cells.h>
      11                 :            : #include <net/inet_ecn.h>
      12                 :            : #include <net/ip.h>
      13                 :            : #include <net/rtnetlink.h>
      14                 :            : 
      15                 :            : #if IS_ENABLED(CONFIG_IPV6)
      16                 :            : #include <net/ipv6.h>
      17                 :            : #include <net/ip6_fib.h>
      18                 :            : #include <net/ip6_route.h>
      19                 :            : #endif
      20                 :            : 
      21                 :            : /* Keep error state on tunnel for 30 sec */
      22                 :            : #define IPTUNNEL_ERR_TIMEO      (30*HZ)
      23                 :            : 
      24                 :            : /* 6rd prefix/relay information */
      25                 :            : #ifdef CONFIG_IPV6_SIT_6RD
      26                 :            : struct ip_tunnel_6rd_parm {
      27                 :            :         struct in6_addr         prefix;
      28                 :            :         __be32                  relay_prefix;
      29                 :            :         u16                     prefixlen;
      30                 :            :         u16                     relay_prefixlen;
      31                 :            : };
      32                 :            : #endif
      33                 :            : 
      34                 :            : struct ip_tunnel_prl_entry {
      35                 :            :         struct ip_tunnel_prl_entry __rcu *next;
      36                 :            :         __be32                          addr;
      37                 :            :         u16                             flags;
      38                 :            :         struct rcu_head                 rcu_head;
      39                 :            : };
      40                 :            : 
      41                 :            : struct ip_tunnel {
      42                 :            :         struct ip_tunnel __rcu  *next;
      43                 :            :         struct hlist_node hash_node;
      44                 :            :         struct net_device       *dev;
      45                 :            :         struct net              *net;   /* netns for packet i/o */
      46                 :            : 
      47                 :            :         int             err_count;      /* Number of arrived ICMP errors */
      48                 :            :         unsigned long   err_time;       /* Time when the last ICMP error
      49                 :            :                                          * arrived */
      50                 :            : 
      51                 :            :         /* These four fields used only by GRE */
      52                 :            :         __u32           i_seqno;        /* The last seen seqno  */
      53                 :            :         __u32           o_seqno;        /* The last output seqno */
      54                 :            :         int             hlen;           /* Precalculated header length */
      55                 :            :         int             mlink;
      56                 :            : 
      57                 :            :         struct ip_tunnel_parm parms;
      58                 :            : 
      59                 :            :         /* for SIT */
      60                 :            : #ifdef CONFIG_IPV6_SIT_6RD
      61                 :            :         struct ip_tunnel_6rd_parm ip6rd;
      62                 :            : #endif
      63                 :            :         struct ip_tunnel_prl_entry __rcu *prl;  /* potential router list */
      64                 :            :         unsigned int            prl_count;      /* # of entries in PRL */
      65                 :            :         int                     ip_tnl_net_id;
      66                 :            :         struct gro_cells        gro_cells;
      67                 :            : };
      68                 :            : 
      69                 :            : #define TUNNEL_CSUM     __cpu_to_be16(0x01)
      70                 :            : #define TUNNEL_ROUTING  __cpu_to_be16(0x02)
      71                 :            : #define TUNNEL_KEY      __cpu_to_be16(0x04)
      72                 :            : #define TUNNEL_SEQ      __cpu_to_be16(0x08)
      73                 :            : #define TUNNEL_STRICT   __cpu_to_be16(0x10)
      74                 :            : #define TUNNEL_REC      __cpu_to_be16(0x20)
      75                 :            : #define TUNNEL_VERSION  __cpu_to_be16(0x40)
      76                 :            : #define TUNNEL_NO_KEY   __cpu_to_be16(0x80)
      77                 :            : #define TUNNEL_DONT_FRAGMENT    __cpu_to_be16(0x0100)
      78                 :            : 
      79                 :            : struct tnl_ptk_info {
      80                 :            :         __be16 flags;
      81                 :            :         __be16 proto;
      82                 :            :         __be32 key;
      83                 :            :         __be32 seq;
      84                 :            : };
      85                 :            : 
      86                 :            : #define PACKET_RCVD     0
      87                 :            : #define PACKET_REJECT   1
      88                 :            : 
      89                 :            : #define IP_TNL_HASH_BITS   7
      90                 :            : #define IP_TNL_HASH_SIZE   (1 << IP_TNL_HASH_BITS)
      91                 :            : 
      92                 :            : struct ip_tunnel_net {
      93                 :            :         struct net_device *fb_tunnel_dev;
      94                 :            :         struct hlist_head tunnels[IP_TNL_HASH_SIZE];
      95                 :            : };
      96                 :            : 
      97                 :            : #ifdef CONFIG_INET
      98                 :            : 
      99                 :            : int ip_tunnel_init(struct net_device *dev);
     100                 :            : void ip_tunnel_uninit(struct net_device *dev);
     101                 :            : void  ip_tunnel_dellink(struct net_device *dev, struct list_head *head);
     102                 :            : int ip_tunnel_init_net(struct net *net, int ip_tnl_net_id,
     103                 :            :                        struct rtnl_link_ops *ops, char *devname);
     104                 :            : 
     105                 :            : void ip_tunnel_delete_net(struct ip_tunnel_net *itn, struct rtnl_link_ops *ops);
     106                 :            : 
     107                 :            : void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
     108                 :            :                     const struct iphdr *tnl_params, const u8 protocol);
     109                 :            : int ip_tunnel_ioctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd);
     110                 :            : int ip_tunnel_change_mtu(struct net_device *dev, int new_mtu);
     111                 :            : 
     112                 :            : struct rtnl_link_stats64 *ip_tunnel_get_stats64(struct net_device *dev,
     113                 :            :                                                 struct rtnl_link_stats64 *tot);
     114                 :            : struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
     115                 :            :                                    int link, __be16 flags,
     116                 :            :                                    __be32 remote, __be32 local,
     117                 :            :                                    __be32 key);
     118                 :            : 
     119                 :            : int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
     120                 :            :                   const struct tnl_ptk_info *tpi, bool log_ecn_error);
     121                 :            : int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[],
     122                 :            :                          struct ip_tunnel_parm *p);
     123                 :            : int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
     124                 :            :                       struct ip_tunnel_parm *p);
     125                 :            : void ip_tunnel_setup(struct net_device *dev, int net_id);
     126                 :            : 
     127                 :            : /* Extract dsfield from inner protocol */
     128                 :            : static inline u8 ip_tunnel_get_dsfield(const struct iphdr *iph,
     129                 :            :                                        const struct sk_buff *skb)
     130                 :            : {
     131         [ #  # ]:          0 :         if (skb->protocol == htons(ETH_P_IP))
     132                 :          0 :                 return iph->tos;
     133         [ #  # ]:          0 :         else if (skb->protocol == htons(ETH_P_IPV6))
     134                 :            :                 return ipv6_get_dsfield((const struct ipv6hdr *)iph);
     135                 :            :         else
     136                 :            :                 return 0;
     137                 :            : }
     138                 :            : 
     139                 :            : /* Propogate ECN bits out */
     140                 :            : static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph,
     141                 :          0 :                                      const struct sk_buff *skb)
     142                 :            : {
     143                 :            :         u8 inner = ip_tunnel_get_dsfield(iph, skb);
     144                 :            : 
     145                 :            :         return INET_ECN_encapsulate(tos, inner);
     146                 :            : }
     147                 :            : 
     148                 :            : int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto);
     149                 :            : int iptunnel_xmit(struct rtable *rt, struct sk_buff *skb,
     150                 :            :                   __be32 src, __be32 dst, __u8 proto,
     151                 :            :                   __u8 tos, __u8 ttl, __be16 df, bool xnet);
     152                 :            : 
     153                 :            : struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, bool gre_csum,
     154                 :            :                                          int gso_type_mask);
     155                 :            : 
     156                 :            : static inline void iptunnel_xmit_stats(int err,
     157                 :            :                                        struct net_device_stats *err_stats,
     158                 :            :                                        struct pcpu_tstats __percpu *stats)
     159                 :            : {
     160         [ #  # ]:          0 :         if (err > 0) {
     161                 :          0 :                 struct pcpu_tstats *tstats = this_cpu_ptr(stats);
     162                 :            : 
     163                 :            :                 u64_stats_update_begin(&tstats->syncp);
     164                 :          0 :                 tstats->tx_bytes += err;
     165                 :          0 :                 tstats->tx_packets++;
     166                 :            :                 u64_stats_update_end(&tstats->syncp);
     167         [ #  # ]:          0 :         } else if (err < 0) {
     168                 :          0 :                 err_stats->tx_errors++;
     169                 :          0 :                 err_stats->tx_aborted_errors++;
     170                 :            :         } else {
     171                 :          0 :                 err_stats->tx_dropped++;
     172                 :            :         }
     173                 :            : }
     174                 :            : 
     175                 :            : #endif /* CONFIG_INET */
     176                 :            : 
     177                 :            : #endif /* __NET_IP_TUNNELS_H */

Generated by: LCOV version 1.9