LCOV - code coverage report
Current view: top level - include/net - udp.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 9 17 52.9 %
Date: 2014-04-07 Functions: 1 2 50.0 %
Branches: 3 20 15.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * INET         An implementation of the TCP/IP protocol suite for the LINUX
       3                 :            :  *              operating system.  INET is implemented using the  BSD Socket
       4                 :            :  *              interface as the means of communication with the user level.
       5                 :            :  *
       6                 :            :  *              Definitions for the UDP module.
       7                 :            :  *
       8                 :            :  * Version:     @(#)udp.h       1.0.2   05/07/93
       9                 :            :  *
      10                 :            :  * Authors:     Ross Biro
      11                 :            :  *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
      12                 :            :  *
      13                 :            :  * Fixes:
      14                 :            :  *              Alan Cox        : Turned on udp checksums. I don't want to
      15                 :            :  *                                chase 'memory corruption' bugs that aren't!
      16                 :            :  *
      17                 :            :  *              This program is free software; you can redistribute it and/or
      18                 :            :  *              modify it under the terms of the GNU General Public License
      19                 :            :  *              as published by the Free Software Foundation; either version
      20                 :            :  *              2 of the License, or (at your option) any later version.
      21                 :            :  */
      22                 :            : #ifndef _UDP_H
      23                 :            : #define _UDP_H
      24                 :            : 
      25                 :            : #include <linux/list.h>
      26                 :            : #include <linux/bug.h>
      27                 :            : #include <net/inet_sock.h>
      28                 :            : #include <net/sock.h>
      29                 :            : #include <net/snmp.h>
      30                 :            : #include <net/ip.h>
      31                 :            : #include <linux/ipv6.h>
      32                 :            : #include <linux/seq_file.h>
      33                 :            : #include <linux/poll.h>
      34                 :            : 
      35                 :            : /**
      36                 :            :  *      struct udp_skb_cb  -  UDP(-Lite) private variables
      37                 :            :  *
      38                 :            :  *      @header:      private variables used by IPv4/IPv6
      39                 :            :  *      @cscov:       checksum coverage length (UDP-Lite only)
      40                 :            :  *      @partial_cov: if set indicates partial csum coverage
      41                 :            :  */
      42                 :            : struct udp_skb_cb {
      43                 :            :         union {
      44                 :            :                 struct inet_skb_parm    h4;
      45                 :            : #if IS_ENABLED(CONFIG_IPV6)
      46                 :            :                 struct inet6_skb_parm   h6;
      47                 :            : #endif
      48                 :            :         } header;
      49                 :            :         __u16           cscov;
      50                 :            :         __u8            partial_cov;
      51                 :            : };
      52                 :            : #define UDP_SKB_CB(__skb)       ((struct udp_skb_cb *)((__skb)->cb))
      53                 :            : 
      54                 :            : /**
      55                 :            :  *      struct udp_hslot - UDP hash slot
      56                 :            :  *
      57                 :            :  *      @head:  head of list of sockets
      58                 :            :  *      @count: number of sockets in 'head' list
      59                 :            :  *      @lock:  spinlock protecting changes to head/count
      60                 :            :  */
      61                 :            : struct udp_hslot {
      62                 :            :         struct hlist_nulls_head head;
      63                 :            :         int                     count;
      64                 :            :         spinlock_t              lock;
      65                 :            : } __attribute__((aligned(2 * sizeof(long))));
      66                 :            : 
      67                 :            : /**
      68                 :            :  *      struct udp_table - UDP table
      69                 :            :  *
      70                 :            :  *      @hash:  hash table, sockets are hashed on (local port)
      71                 :            :  *      @hash2: hash table, sockets are hashed on (local port, local address)
      72                 :            :  *      @mask:  number of slots in hash tables, minus 1
      73                 :            :  *      @log:   log2(number of slots in hash table)
      74                 :            :  */
      75                 :            : struct udp_table {
      76                 :            :         struct udp_hslot        *hash;
      77                 :            :         struct udp_hslot        *hash2;
      78                 :            :         unsigned int            mask;
      79                 :            :         unsigned int            log;
      80                 :            : };
      81                 :            : extern struct udp_table udp_table;
      82                 :            : void udp_table_init(struct udp_table *, const char *);
      83                 :            : static inline struct udp_hslot *udp_hashslot(struct udp_table *table,
      84                 :            :                                              struct net *net, unsigned int num)
      85                 :            : {
      86                 :      10221 :         return &table->hash[udp_hashfn(net, num, table->mask)];
      87                 :            : }
      88                 :            : /*
      89                 :            :  * For secondary hash, net_hash_mix() is performed before calling
      90                 :            :  * udp_hashslot2(), this explains difference with udp_hashslot()
      91                 :            :  */
      92                 :            : static inline struct udp_hslot *udp_hashslot2(struct udp_table *table,
      93                 :            :                                               unsigned int hash)
      94                 :            : {
      95                 :        230 :         return &table->hash2[hash & table->mask];
      96                 :            : }
      97                 :            : 
      98                 :            : /* Note: this must match 'valbool' in sock_setsockopt */
      99                 :            : #define UDP_CSUM_NOXMIT         1
     100                 :            : 
     101                 :            : /* Used by SunRPC/xprt layer. */
     102                 :            : #define UDP_CSUM_NORCV          2
     103                 :            : 
     104                 :            : /* Default, as per the RFC, is to always do csums. */
     105                 :            : #define UDP_CSUM_DEFAULT        0
     106                 :            : 
     107                 :            : extern struct proto udp_prot;
     108                 :            : 
     109                 :            : extern atomic_long_t udp_memory_allocated;
     110                 :            : 
     111                 :            : /* sysctl variables for udp */
     112                 :            : extern long sysctl_udp_mem[3];
     113                 :            : extern int sysctl_udp_rmem_min;
     114                 :            : extern int sysctl_udp_wmem_min;
     115                 :            : 
     116                 :            : struct sk_buff;
     117                 :            : 
     118                 :            : /*
     119                 :            :  *      Generic checksumming routines for UDP(-Lite) v4 and v6
     120                 :            :  */
     121                 :            : static inline __sum16 __udp_lib_checksum_complete(struct sk_buff *skb)
     122                 :            : {
     123                 :        180 :         return __skb_checksum_complete_head(skb, UDP_SKB_CB(skb)->cscov);
     124                 :            : }
     125                 :            : 
     126                 :            : static inline int udp_lib_checksum_complete(struct sk_buff *skb)
     127                 :            : {
     128   [ #  #  #  # ]:        360 :         return !skb_csum_unnecessary(skb) &&
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ +  -  +  - ]
     129                 :            :                 __udp_lib_checksum_complete(skb);
     130                 :            : }
     131                 :            : 
     132                 :            : /**
     133                 :            :  *      udp_csum_outgoing  -  compute UDPv4/v6 checksum over fragments
     134                 :            :  *      @sk:    socket we are writing to
     135                 :            :  *      @skb:   sk_buff containing the filled-in UDP header
     136                 :            :  *              (checksum field must be zeroed out)
     137                 :            :  */
     138                 :          0 : static inline __wsum udp_csum_outgoing(struct sock *sk, struct sk_buff *skb)
     139                 :            : {
     140                 :          0 :         __wsum csum = csum_partial(skb_transport_header(skb),
     141                 :            :                                    sizeof(struct udphdr), 0);
     142         [ #  # ]:          0 :         skb_queue_walk(&sk->sk_write_queue, skb) {
     143                 :          0 :                 csum = csum_add(csum, skb->csum);
     144                 :            :         }
     145                 :            :         return csum;
     146                 :            : }
     147                 :            : 
     148                 :         22 : static inline __wsum udp_csum(struct sk_buff *skb)
     149                 :            : {
     150                 :         11 :         __wsum csum = csum_partial(skb_transport_header(skb),
     151                 :            :                                    sizeof(struct udphdr), skb->csum);
     152                 :            : 
     153         [ -  + ]:         11 :         for (skb = skb_shinfo(skb)->frag_list; skb; skb = skb->next) {
     154                 :          0 :                 csum = csum_add(csum, skb->csum);
     155                 :            :         }
     156                 :            :         return csum;
     157                 :            : }
     158                 :            : 
     159                 :            : /* hash routines shared between UDPv4/6 and UDP-Litev4/6 */
     160                 :          0 : static inline void udp_lib_hash(struct sock *sk)
     161                 :            : {
     162                 :          0 :         BUG();
     163                 :            : }
     164                 :            : 
     165                 :            : void udp_lib_unhash(struct sock *sk);
     166                 :            : void udp_lib_rehash(struct sock *sk, u16 new_hash);
     167                 :            : 
     168                 :          0 : static inline void udp_lib_close(struct sock *sk, long timeout)
     169                 :            : {
     170                 :         77 :         sk_common_release(sk);
     171                 :         77 : }
     172                 :            : 
     173                 :            : int udp_lib_get_port(struct sock *sk, unsigned short snum,
     174                 :            :                      int (*)(const struct sock *, const struct sock *),
     175                 :            :                      unsigned int hash2_nulladdr);
     176                 :            : 
     177                 :            : /* net/ipv4/udp.c */
     178                 :            : void udp_v4_early_demux(struct sk_buff *skb);
     179                 :            : int udp_get_port(struct sock *sk, unsigned short snum,
     180                 :            :                  int (*saddr_cmp)(const struct sock *,
     181                 :            :                                   const struct sock *));
     182                 :            : void udp_err(struct sk_buff *, u32);
     183                 :            : int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
     184                 :            :                 size_t len);
     185                 :            : int udp_push_pending_frames(struct sock *sk);
     186                 :            : void udp_flush_pending_frames(struct sock *sk);
     187                 :            : void udp4_hwcsum(struct sk_buff *skb, __be32 src, __be32 dst);
     188                 :            : int udp_rcv(struct sk_buff *skb);
     189                 :            : int udp_ioctl(struct sock *sk, int cmd, unsigned long arg);
     190                 :            : int udp_disconnect(struct sock *sk, int flags);
     191                 :            : unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait);
     192                 :            : struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb,
     193                 :            :                                        netdev_features_t features);
     194                 :            : int udp_lib_getsockopt(struct sock *sk, int level, int optname,
     195                 :            :                        char __user *optval, int __user *optlen);
     196                 :            : int udp_lib_setsockopt(struct sock *sk, int level, int optname,
     197                 :            :                        char __user *optval, unsigned int optlen,
     198                 :            :                        int (*push_pending_frames)(struct sock *));
     199                 :            : struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
     200                 :            :                              __be32 daddr, __be16 dport, int dif);
     201                 :            : struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
     202                 :            :                                __be32 daddr, __be16 dport, int dif,
     203                 :            :                                struct udp_table *tbl);
     204                 :            : struct sock *udp6_lib_lookup(struct net *net,
     205                 :            :                              const struct in6_addr *saddr, __be16 sport,
     206                 :            :                              const struct in6_addr *daddr, __be16 dport,
     207                 :            :                              int dif);
     208                 :            : struct sock *__udp6_lib_lookup(struct net *net,
     209                 :            :                                const struct in6_addr *saddr, __be16 sport,
     210                 :            :                                const struct in6_addr *daddr, __be16 dport,
     211                 :            :                                int dif, struct udp_table *tbl);
     212                 :            : 
     213                 :            : /*
     214                 :            :  *      SNMP statistics for UDP and UDP-Lite
     215                 :            :  */
     216                 :            : #define UDP_INC_STATS_USER(net, field, is_udplite)            do { \
     217                 :            :         if (is_udplite) SNMP_INC_STATS_USER((net)->mib.udplite_statistics, field);       \
     218                 :            :         else            SNMP_INC_STATS_USER((net)->mib.udp_statistics, field);  }  while(0)
     219                 :            : #define UDP_INC_STATS_BH(net, field, is_udplite)              do { \
     220                 :            :         if (is_udplite) SNMP_INC_STATS_BH((net)->mib.udplite_statistics, field);         \
     221                 :            :         else            SNMP_INC_STATS_BH((net)->mib.udp_statistics, field);    }  while(0)
     222                 :            : 
     223                 :            : #define UDP6_INC_STATS_BH(net, field, is_udplite)           do { \
     224                 :            :         if (is_udplite) SNMP_INC_STATS_BH((net)->mib.udplite_stats_in6, field);\
     225                 :            :         else            SNMP_INC_STATS_BH((net)->mib.udp_stats_in6, field);  \
     226                 :            : } while(0)
     227                 :            : #define UDP6_INC_STATS_USER(net, field, __lite)             do { \
     228                 :            :         if (__lite) SNMP_INC_STATS_USER((net)->mib.udplite_stats_in6, field);  \
     229                 :            :         else        SNMP_INC_STATS_USER((net)->mib.udp_stats_in6, field);      \
     230                 :            : } while(0)
     231                 :            : 
     232                 :            : #if IS_ENABLED(CONFIG_IPV6)
     233                 :            : #define UDPX_INC_STATS_BH(sk, field)                                    \
     234                 :            : do {                                                                    \
     235                 :            :         if ((sk)->sk_family == AF_INET)                                      \
     236                 :            :                 UDP_INC_STATS_BH(sock_net(sk), field, 0);               \
     237                 :            :         else                                                            \
     238                 :            :                 UDP6_INC_STATS_BH(sock_net(sk), field, 0);              \
     239                 :            : } while (0)
     240                 :            : #else
     241                 :            : #define UDPX_INC_STATS_BH(sk, field) UDP_INC_STATS_BH(sock_net(sk), field, 0)
     242                 :            : #endif
     243                 :            : 
     244                 :            : /* /proc */
     245                 :            : int udp_seq_open(struct inode *inode, struct file *file);
     246                 :            : 
     247                 :            : struct udp_seq_afinfo {
     248                 :            :         char                            *name;
     249                 :            :         sa_family_t                     family;
     250                 :            :         struct udp_table                *udp_table;
     251                 :            :         const struct file_operations    *seq_fops;
     252                 :            :         struct seq_operations           seq_ops;
     253                 :            : };
     254                 :            : 
     255                 :            : struct udp_iter_state {
     256                 :            :         struct seq_net_private  p;
     257                 :            :         sa_family_t             family;
     258                 :            :         int                     bucket;
     259                 :            :         struct udp_table        *udp_table;
     260                 :            : };
     261                 :            : 
     262                 :            : #ifdef CONFIG_PROC_FS
     263                 :            : int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo);
     264                 :            : void udp_proc_unregister(struct net *net, struct udp_seq_afinfo *afinfo);
     265                 :            : 
     266                 :            : int udp4_proc_init(void);
     267                 :            : void udp4_proc_exit(void);
     268                 :            : #endif
     269                 :            : 
     270                 :            : int udpv4_offload_init(void);
     271                 :            : 
     272                 :            : void udp_init(void);
     273                 :            : 
     274                 :            : void udp_encap_enable(void);
     275                 :            : #if IS_ENABLED(CONFIG_IPV6)
     276                 :            : void udpv6_encap_enable(void);
     277                 :            : #endif
     278                 :            : #endif  /* _UDP_H */

Generated by: LCOV version 1.9