LCOV - code coverage report
Current view: top level - net/ipv4 - udp.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 404 848 47.6 %
Date: 2014-04-07 Functions: 37 61 60.7 %
Branches: 256 945 27.1 %

           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                 :            :  *              The User Datagram Protocol (UDP).
       7                 :            :  *
       8                 :            :  * Authors:     Ross Biro
       9                 :            :  *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
      10                 :            :  *              Arnt Gulbrandsen, <agulbra@nvg.unit.no>
      11                 :            :  *              Alan Cox, <alan@lxorguk.ukuu.org.uk>
      12                 :            :  *              Hirokazu Takahashi, <taka@valinux.co.jp>
      13                 :            :  *
      14                 :            :  * Fixes:
      15                 :            :  *              Alan Cox        :       verify_area() calls
      16                 :            :  *              Alan Cox        :       stopped close while in use off icmp
      17                 :            :  *                                      messages. Not a fix but a botch that
      18                 :            :  *                                      for udp at least is 'valid'.
      19                 :            :  *              Alan Cox        :       Fixed icmp handling properly
      20                 :            :  *              Alan Cox        :       Correct error for oversized datagrams
      21                 :            :  *              Alan Cox        :       Tidied select() semantics.
      22                 :            :  *              Alan Cox        :       udp_err() fixed properly, also now
      23                 :            :  *                                      select and read wake correctly on errors
      24                 :            :  *              Alan Cox        :       udp_send verify_area moved to avoid mem leak
      25                 :            :  *              Alan Cox        :       UDP can count its memory
      26                 :            :  *              Alan Cox        :       send to an unknown connection causes
      27                 :            :  *                                      an ECONNREFUSED off the icmp, but
      28                 :            :  *                                      does NOT close.
      29                 :            :  *              Alan Cox        :       Switched to new sk_buff handlers. No more backlog!
      30                 :            :  *              Alan Cox        :       Using generic datagram code. Even smaller and the PEEK
      31                 :            :  *                                      bug no longer crashes it.
      32                 :            :  *              Fred Van Kempen :       Net2e support for sk->broadcast.
      33                 :            :  *              Alan Cox        :       Uses skb_free_datagram
      34                 :            :  *              Alan Cox        :       Added get/set sockopt support.
      35                 :            :  *              Alan Cox        :       Broadcasting without option set returns EACCES.
      36                 :            :  *              Alan Cox        :       No wakeup calls. Instead we now use the callbacks.
      37                 :            :  *              Alan Cox        :       Use ip_tos and ip_ttl
      38                 :            :  *              Alan Cox        :       SNMP Mibs
      39                 :            :  *              Alan Cox        :       MSG_DONTROUTE, and 0.0.0.0 support.
      40                 :            :  *              Matt Dillon     :       UDP length checks.
      41                 :            :  *              Alan Cox        :       Smarter af_inet used properly.
      42                 :            :  *              Alan Cox        :       Use new kernel side addressing.
      43                 :            :  *              Alan Cox        :       Incorrect return on truncated datagram receive.
      44                 :            :  *      Arnt Gulbrandsen        :       New udp_send and stuff
      45                 :            :  *              Alan Cox        :       Cache last socket
      46                 :            :  *              Alan Cox        :       Route cache
      47                 :            :  *              Jon Peatfield   :       Minor efficiency fix to sendto().
      48                 :            :  *              Mike Shaver     :       RFC1122 checks.
      49                 :            :  *              Alan Cox        :       Nonblocking error fix.
      50                 :            :  *      Willy Konynenberg       :       Transparent proxying support.
      51                 :            :  *              Mike McLagan    :       Routing by source
      52                 :            :  *              David S. Miller :       New socket lookup architecture.
      53                 :            :  *                                      Last socket cache retained as it
      54                 :            :  *                                      does have a high hit rate.
      55                 :            :  *              Olaf Kirch      :       Don't linearise iovec on sendmsg.
      56                 :            :  *              Andi Kleen      :       Some cleanups, cache destination entry
      57                 :            :  *                                      for connect.
      58                 :            :  *      Vitaly E. Lavrov        :       Transparent proxy revived after year coma.
      59                 :            :  *              Melvin Smith    :       Check msg_name not msg_namelen in sendto(),
      60                 :            :  *                                      return ENOTCONN for unconnected sockets (POSIX)
      61                 :            :  *              Janos Farkas    :       don't deliver multi/broadcasts to a different
      62                 :            :  *                                      bound-to-device socket
      63                 :            :  *      Hirokazu Takahashi      :       HW checksumming for outgoing UDP
      64                 :            :  *                                      datagrams.
      65                 :            :  *      Hirokazu Takahashi      :       sendfile() on UDP works now.
      66                 :            :  *              Arnaldo C. Melo :       convert /proc/net/udp to seq_file
      67                 :            :  *      YOSHIFUJI Hideaki @USAGI and:   Support IPV6_V6ONLY socket option, which
      68                 :            :  *      Alexey Kuznetsov:               allow both IPv4 and IPv6 sockets to bind
      69                 :            :  *                                      a single port at the same time.
      70                 :            :  *      Derek Atkins <derek@ihtfp.com>: Add Encapulation Support
      71                 :            :  *      James Chapman           :       Add L2TP encapsulation type.
      72                 :            :  *
      73                 :            :  *
      74                 :            :  *              This program is free software; you can redistribute it and/or
      75                 :            :  *              modify it under the terms of the GNU General Public License
      76                 :            :  *              as published by the Free Software Foundation; either version
      77                 :            :  *              2 of the License, or (at your option) any later version.
      78                 :            :  */
      79                 :            : 
      80                 :            : #define pr_fmt(fmt) "UDP: " fmt
      81                 :            : 
      82                 :            : #include <asm/uaccess.h>
      83                 :            : #include <asm/ioctls.h>
      84                 :            : #include <linux/bootmem.h>
      85                 :            : #include <linux/highmem.h>
      86                 :            : #include <linux/swap.h>
      87                 :            : #include <linux/types.h>
      88                 :            : #include <linux/fcntl.h>
      89                 :            : #include <linux/module.h>
      90                 :            : #include <linux/socket.h>
      91                 :            : #include <linux/sockios.h>
      92                 :            : #include <linux/igmp.h>
      93                 :            : #include <linux/in.h>
      94                 :            : #include <linux/errno.h>
      95                 :            : #include <linux/timer.h>
      96                 :            : #include <linux/mm.h>
      97                 :            : #include <linux/inet.h>
      98                 :            : #include <linux/netdevice.h>
      99                 :            : #include <linux/slab.h>
     100                 :            : #include <net/tcp_states.h>
     101                 :            : #include <linux/skbuff.h>
     102                 :            : #include <linux/proc_fs.h>
     103                 :            : #include <linux/seq_file.h>
     104                 :            : #include <net/net_namespace.h>
     105                 :            : #include <net/icmp.h>
     106                 :            : #include <net/inet_hashtables.h>
     107                 :            : #include <net/route.h>
     108                 :            : #include <net/checksum.h>
     109                 :            : #include <net/xfrm.h>
     110                 :            : #include <trace/events/udp.h>
     111                 :            : #include <linux/static_key.h>
     112                 :            : #include <trace/events/skb.h>
     113                 :            : #include <net/busy_poll.h>
     114                 :            : #include "udp_impl.h"
     115                 :            : 
     116                 :            : struct udp_table udp_table __read_mostly;
     117                 :            : EXPORT_SYMBOL(udp_table);
     118                 :            : 
     119                 :            : long sysctl_udp_mem[3] __read_mostly;
     120                 :            : EXPORT_SYMBOL(sysctl_udp_mem);
     121                 :            : 
     122                 :            : int sysctl_udp_rmem_min __read_mostly;
     123                 :            : EXPORT_SYMBOL(sysctl_udp_rmem_min);
     124                 :            : 
     125                 :            : int sysctl_udp_wmem_min __read_mostly;
     126                 :            : EXPORT_SYMBOL(sysctl_udp_wmem_min);
     127                 :            : 
     128                 :            : atomic_long_t udp_memory_allocated;
     129                 :            : EXPORT_SYMBOL(udp_memory_allocated);
     130                 :            : 
     131                 :            : #define MAX_UDP_PORTS 65536
     132                 :            : #define PORTS_PER_CHAIN (MAX_UDP_PORTS / UDP_HTABLE_SIZE_MIN)
     133                 :            : 
     134                 :         70 : static int udp_lib_lport_inuse(struct net *net, __u16 num,
     135                 :            :                                const struct udp_hslot *hslot,
     136                 :            :                                unsigned long *bitmap,
     137                 :            :                                struct sock *sk,
     138                 :            :                                int (*saddr_comp)(const struct sock *sk1,
     139                 :            :                                                  const struct sock *sk2),
     140                 :            :                                unsigned int log)
     141                 :            : {
     142                 :            :         struct sock *sk2;
     143                 :            :         struct hlist_nulls_node *node;
     144                 :         70 :         kuid_t uid = sock_i_uid(sk);
     145                 :            : 
     146         [ -  + ]:         70 :         sk_nulls_for_each(sk2, node, &hslot->head)
     147         [ #  # ]:          0 :                 if (net_eq(sock_net(sk2), net) &&
     148         [ #  # ]:          0 :                     sk2 != sk &&
     149 [ #  # ][ #  # ]:          0 :                     (bitmap || udp_sk(sk2)->udp_port_hash == num) &&
     150 [ #  # ][ #  # ]:          0 :                     (!sk2->sk_reuse || !sk->sk_reuse) &&
     151 [ #  # ][ #  # ]:          0 :                     (!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if ||
     152            [ - ]:          0 :                      sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
     153   [ #  #  #  # ]:          0 :                     (!sk2->sk_reuseport || !sk->sk_reuseport ||
     154         [ #  # ]:          0 :                       !uid_eq(uid, sock_i_uid(sk2))) &&
     155                 :          0 :                     (*saddr_comp)(sk, sk2)) {
     156         [ #  # ]:          0 :                         if (bitmap)
     157                 :          0 :                                 __set_bit(udp_sk(sk2)->udp_port_hash >> log,
     158                 :            :                                           bitmap);
     159                 :            :                         else
     160                 :            :                                 return 1;
     161                 :            :                 }
     162                 :            :         return 0;
     163                 :            : }
     164                 :            : 
     165                 :            : /*
     166                 :            :  * Note: we still hold spinlock of primary hash chain, so no other writer
     167                 :            :  * can insert/delete a socket with local_port == num
     168                 :            :  */
     169                 :          0 : static int udp_lib_lport_inuse2(struct net *net, __u16 num,
     170                 :            :                                struct udp_hslot *hslot2,
     171                 :            :                                struct sock *sk,
     172                 :            :                                int (*saddr_comp)(const struct sock *sk1,
     173                 :            :                                                  const struct sock *sk2))
     174                 :            : {
     175                 :            :         struct sock *sk2;
     176                 :            :         struct hlist_nulls_node *node;
     177                 :          0 :         kuid_t uid = sock_i_uid(sk);
     178                 :            :         int res = 0;
     179                 :            : 
     180                 :            :         spin_lock(&hslot2->lock);
     181         [ #  # ]:          0 :         udp_portaddr_for_each_entry(sk2, node, &hslot2->head)
     182         [ #  # ]:          0 :                 if (net_eq(sock_net(sk2), net) &&
     183         [ #  # ]:          0 :                     sk2 != sk &&
     184         [ #  # ]:          0 :                     (udp_sk(sk2)->udp_port_hash == num) &&
     185 [ #  # ][ #  # ]:          0 :                     (!sk2->sk_reuse || !sk->sk_reuse) &&
     186 [ #  # ][ #  # ]:          0 :                     (!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if ||
     187         [ #  # ]:          0 :                      sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
     188   [ #  #  #  # ]:          0 :                     (!sk2->sk_reuseport || !sk->sk_reuseport ||
     189         [ #  # ]:          0 :                       !uid_eq(uid, sock_i_uid(sk2))) &&
     190                 :          0 :                     (*saddr_comp)(sk, sk2)) {
     191                 :            :                         res = 1;
     192                 :            :                         break;
     193                 :            :                 }
     194                 :            :         spin_unlock(&hslot2->lock);
     195                 :          0 :         return res;
     196                 :            : }
     197                 :            : 
     198                 :            : /**
     199                 :            :  *  udp_lib_get_port  -  UDP/-Lite port lookup for IPv4 and IPv6
     200                 :            :  *
     201                 :            :  *  @sk:          socket struct in question
     202                 :            :  *  @snum:        port number to look up
     203                 :            :  *  @saddr_comp:  AF-dependent comparison of bound local IP addresses
     204                 :            :  *  @hash2_nulladdr: AF-dependent hash value in secondary hash chains,
     205                 :            :  *                   with NULL address
     206                 :            :  */
     207                 :          0 : int udp_lib_get_port(struct sock *sk, unsigned short snum,
     208                 :            :                        int (*saddr_comp)(const struct sock *sk1,
     209                 :            :                                          const struct sock *sk2),
     210                 :            :                      unsigned int hash2_nulladdr)
     211                 :            : {
     212                 :            :         struct udp_hslot *hslot, *hslot2;
     213                 :        210 :         struct udp_table *udptable = sk->sk_prot->h.udp_table;
     214                 :            :         int    error = 1;
     215                 :            :         struct net *net = sock_net(sk);
     216                 :            : 
     217         [ +  + ]:         70 :         if (!snum) {
     218                 :            :                 int low, high, remaining;
     219                 :            :                 unsigned int rand;
     220                 :            :                 unsigned short first, last;
     221                 :            :                 DECLARE_BITMAP(bitmap, PORTS_PER_CHAIN);
     222                 :            : 
     223                 :         48 :                 inet_get_local_port_range(net, &low, &high);
     224                 :         48 :                 remaining = (high - low) + 1;
     225                 :            : 
     226                 :         48 :                 rand = net_random();
     227                 :         48 :                 first = (((u64)rand * remaining) >> 32) + low;
     228                 :            :                 /*
     229                 :            :                  * force rand to be an odd multiple of UDP_HTABLE_SIZE
     230                 :            :                  */
     231                 :         48 :                 rand = (rand | 1) * (udptable->mask + 1);
     232                 :         48 :                 last = first + udptable->mask + 1;
     233                 :            :                 do {
     234                 :         48 :                         hslot = udp_hashslot(udptable, net, first);
     235                 :            :                         bitmap_zero(bitmap, PORTS_PER_CHAIN);
     236                 :            :                         spin_lock_bh(&hslot->lock);
     237                 :         48 :                         udp_lib_lport_inuse(net, snum, hslot, bitmap, sk,
     238                 :            :                                             saddr_comp, udptable->log);
     239                 :            : 
     240                 :            :                         snum = first;
     241                 :            :                         /*
     242                 :            :                          * Iterate on all possible values of snum for this hash.
     243                 :            :                          * Using steps of an odd multiple of UDP_HTABLE_SIZE
     244                 :            :                          * give us randomization and full range coverage.
     245                 :            :                          */
     246                 :            :                         do {
     247 [ +  - ][ +  - ]:        118 :                                 if (low <= snum && snum <= high &&
                 [ +  - ]
     248         [ -  + ]:         48 :                                     !test_bit(snum >> udptable->log, bitmap) &&
     249                 :            :                                     !inet_is_reserved_local_port(snum))
     250                 :            :                                         goto found;
     251                 :          0 :                                 snum += rand;
     252         [ #  # ]:          0 :                         } while (snum != first);
     253                 :            :                         spin_unlock_bh(&hslot->lock);
     254         [ #  # ]:         48 :                 } while (++first != last);
     255                 :          0 :                 goto fail;
     256                 :            :         } else {
     257                 :         22 :                 hslot = udp_hashslot(udptable, net, snum);
     258                 :            :                 spin_lock_bh(&hslot->lock);
     259         [ -  + ]:         22 :                 if (hslot->count > 10) {
     260                 :            :                         int exist;
     261                 :          0 :                         unsigned int slot2 = udp_sk(sk)->udp_portaddr_hash ^ snum;
     262                 :            : 
     263                 :          0 :                         slot2          &= udptable->mask;
     264                 :          0 :                         hash2_nulladdr &= udptable->mask;
     265                 :            : 
     266                 :            :                         hslot2 = udp_hashslot2(udptable, slot2);
     267         [ #  # ]:          0 :                         if (hslot->count < hslot2->count)
     268                 :            :                                 goto scan_primary_hash;
     269                 :            : 
     270                 :          0 :                         exist = udp_lib_lport_inuse2(net, snum, hslot2,
     271                 :            :                                                      sk, saddr_comp);
     272         [ #  # ]:          0 :                         if (!exist && (hash2_nulladdr != slot2)) {
     273                 :            :                                 hslot2 = udp_hashslot2(udptable, hash2_nulladdr);
     274                 :          0 :                                 exist = udp_lib_lport_inuse2(net, snum, hslot2,
     275                 :            :                                                              sk, saddr_comp);
     276                 :            :                         }
     277         [ #  # ]:          0 :                         if (exist)
     278                 :            :                                 goto fail_unlock;
     279                 :            :                         else
     280                 :            :                                 goto found;
     281                 :            :                 }
     282                 :            : scan_primary_hash:
     283         [ +  - ]:         22 :                 if (udp_lib_lport_inuse(net, snum, hslot, NULL, sk,
     284                 :            :                                         saddr_comp, 0))
     285                 :            :                         goto fail_unlock;
     286                 :            :         }
     287                 :            : found:
     288                 :         70 :         inet_sk(sk)->inet_num = snum;
     289                 :         70 :         udp_sk(sk)->udp_port_hash = snum;
     290                 :         70 :         udp_sk(sk)->udp_portaddr_hash ^= snum;
     291         [ +  - ]:         70 :         if (sk_unhashed(sk)) {
     292                 :            :                 sk_nulls_add_node_rcu(sk, &hslot->head);
     293                 :         70 :                 hslot->count++;
     294                 :         70 :                 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
     295                 :            : 
     296                 :         70 :                 hslot2 = udp_hashslot2(udptable, udp_sk(sk)->udp_portaddr_hash);
     297                 :            :                 spin_lock(&hslot2->lock);
     298                 :         70 :                 hlist_nulls_add_head_rcu(&udp_sk(sk)->udp_portaddr_node,
     299                 :            :                                          &hslot2->head);
     300                 :         70 :                 hslot2->count++;
     301                 :            :                 spin_unlock(&hslot2->lock);
     302                 :            :         }
     303                 :            :         error = 0;
     304                 :            : fail_unlock:
     305                 :            :         spin_unlock_bh(&hslot->lock);
     306                 :            : fail:
     307                 :         70 :         return error;
     308                 :            : }
     309                 :            : EXPORT_SYMBOL(udp_lib_get_port);
     310                 :            : 
     311                 :          0 : static int ipv4_rcv_saddr_equal(const struct sock *sk1, const struct sock *sk2)
     312                 :            : {
     313                 :            :         struct inet_sock *inet1 = inet_sk(sk1), *inet2 = inet_sk(sk2);
     314                 :            : 
     315 [ #  # ][ #  # ]:          0 :         return  (!ipv6_only_sock(sk2)  &&
                 [ #  # ]
     316 [ #  # ][ #  # ]:          0 :                  (!inet1->inet_rcv_saddr || !inet2->inet_rcv_saddr ||
     317                 :            :                    inet1->inet_rcv_saddr == inet2->inet_rcv_saddr));
     318                 :            : }
     319                 :            : 
     320                 :        169 : static unsigned int udp4_portaddr_hash(struct net *net, __be32 saddr,
     321                 :            :                                        unsigned int port)
     322                 :            : {
     323                 :        169 :         return jhash_1word((__force u32)saddr, net_hash_mix(net)) ^ port;
     324                 :            : }
     325                 :            : 
     326                 :          0 : int udp_v4_get_port(struct sock *sk, unsigned short snum)
     327                 :            : {
     328                 :         62 :         unsigned int hash2_nulladdr =
     329                 :         62 :                 udp4_portaddr_hash(sock_net(sk), htonl(INADDR_ANY), snum);
     330                 :         62 :         unsigned int hash2_partial =
     331                 :         62 :                 udp4_portaddr_hash(sock_net(sk), inet_sk(sk)->inet_rcv_saddr, 0);
     332                 :            : 
     333                 :            :         /* precompute partial secondary hash */
     334                 :         62 :         udp_sk(sk)->udp_portaddr_hash = hash2_partial;
     335                 :         62 :         return udp_lib_get_port(sk, snum, ipv4_rcv_saddr_equal, hash2_nulladdr);
     336                 :            : }
     337                 :            : 
     338                 :            : static inline int compute_score(struct sock *sk, struct net *net, __be32 saddr,
     339                 :            :                          unsigned short hnum,
     340                 :            :                          __be16 sport, __be32 daddr, __be16 dport, int dif)
     341                 :            : {
     342                 :            :         int score = -1;
     343                 :            : 
     344 [ -  + ][ +  - ]:         38 :         if (net_eq(sock_net(sk), net) && udp_sk(sk)->udp_port_hash == hnum &&
         [ +  - ][ -  + ]
     345 [ #  # ][ #  # ]:          0 :                         !ipv6_only_sock(sk)) {
     346                 :            :                 struct inet_sock *inet = inet_sk(sk);
     347                 :            : 
     348 [ -  + ][ -  + ]:         38 :                 score = (sk->sk_family == PF_INET ? 2 : 1);
     349 [ -  + ][ -  + ]:         38 :                 if (inet->inet_rcv_saddr) {
     350 [ #  # ][ #  # ]:          0 :                         if (inet->inet_rcv_saddr != daddr)
     351                 :            :                                 return -1;
     352                 :          0 :                         score += 4;
     353                 :            :                 }
     354 [ -  + ][ -  + ]:         38 :                 if (inet->inet_daddr) {
     355 [ #  # ][ #  # ]:          0 :                         if (inet->inet_daddr != saddr)
     356                 :            :                                 return -1;
     357                 :          0 :                         score += 4;
     358                 :            :                 }
     359 [ -  + ][ -  + ]:         38 :                 if (inet->inet_dport) {
     360 [ #  # ][ #  # ]:          0 :                         if (inet->inet_dport != sport)
     361                 :            :                                 return -1;
     362                 :          0 :                         score += 4;
     363                 :            :                 }
     364 [ -  + ][ -  + ]:         38 :                 if (sk->sk_bound_dev_if) {
     365 [ #  # ][ #  # ]:          0 :                         if (sk->sk_bound_dev_if != dif)
     366                 :            :                                 return -1;
     367                 :          0 :                         score += 4;
     368                 :            :                 }
     369                 :            :         }
     370                 :            :         return score;
     371                 :            : }
     372                 :            : 
     373                 :            : /*
     374                 :            :  * In this second variant, we check (daddr, dport) matches (inet_rcv_sadd, inet_num)
     375                 :            :  */
     376                 :            : static inline int compute_score2(struct sock *sk, struct net *net,
     377                 :            :                                  __be32 saddr, __be16 sport,
     378                 :            :                                  __be32 daddr, unsigned int hnum, int dif)
     379                 :            : {
     380                 :            :         int score = -1;
     381                 :            : 
     382 [ #  # ][ #  # ]:          0 :         if (net_eq(sock_net(sk), net) && !ipv6_only_sock(sk)) {
         [ #  # ][ #  # ]
     383                 :            :                 struct inet_sock *inet = inet_sk(sk);
     384                 :            : 
     385 [ #  # ][ #  # ]:          0 :                 if (inet->inet_rcv_saddr != daddr)
     386                 :            :                         return -1;
     387 [ #  # ][ #  # ]:          0 :                 if (inet->inet_num != hnum)
     388                 :            :                         return -1;
     389                 :            : 
     390 [ #  # ][ #  # ]:          0 :                 score = (sk->sk_family == PF_INET ? 2 : 1);
     391 [ #  # ][ #  # ]:          0 :                 if (inet->inet_daddr) {
     392 [ #  # ][ #  # ]:          0 :                         if (inet->inet_daddr != saddr)
     393                 :            :                                 return -1;
     394                 :          0 :                         score += 4;
     395                 :            :                 }
     396 [ #  # ][ #  # ]:          0 :                 if (inet->inet_dport) {
     397 [ #  # ][ #  # ]:          0 :                         if (inet->inet_dport != sport)
     398                 :            :                                 return -1;
     399                 :          0 :                         score += 4;
     400                 :            :                 }
     401 [ #  # ][ #  # ]:          0 :                 if (sk->sk_bound_dev_if) {
     402 [ #  # ][ #  # ]:          0 :                         if (sk->sk_bound_dev_if != dif)
     403                 :            :                                 return -1;
     404                 :          0 :                         score += 4;
     405                 :            :                 }
     406                 :            :         }
     407                 :            :         return score;
     408                 :            : }
     409                 :            : 
     410                 :          0 : static unsigned int udp_ehashfn(struct net *net, const __be32 laddr,
     411                 :            :                                  const __u16 lport, const __be32 faddr,
     412                 :            :                                  const __be16 fport)
     413                 :            : {
     414                 :            :         static u32 udp_ehash_secret __read_mostly;
     415                 :            : 
     416         [ #  # ]:          0 :         net_get_random_once(&udp_ehash_secret, sizeof(udp_ehash_secret));
     417                 :            : 
     418                 :          0 :         return __inet_ehashfn(laddr, lport, faddr, fport,
     419                 :            :                               udp_ehash_secret + net_hash_mix(net));
     420                 :            : }
     421                 :            : 
     422                 :            : 
     423                 :            : /* called with read_rcu_lock() */
     424                 :          0 : static struct sock *udp4_lib_lookup2(struct net *net,
     425                 :            :                 __be32 saddr, __be16 sport,
     426                 :            :                 __be32 daddr, unsigned int hnum, int dif,
     427                 :            :                 struct udp_hslot *hslot2, unsigned int slot2)
     428                 :            : {
     429                 :            :         struct sock *sk, *result;
     430                 :            :         struct hlist_nulls_node *node;
     431                 :            :         int score, badness, matches = 0, reuseport = 0;
     432                 :            :         u32 hash = 0;
     433                 :            : 
     434                 :            : begin:
     435                 :            :         result = NULL;
     436                 :            :         badness = 0;
     437         [ #  # ]:          0 :         udp_portaddr_for_each_entry_rcu(sk, node, &hslot2->head) {
     438                 :            :                 score = compute_score2(sk, net, saddr, sport,
     439                 :            :                                       daddr, hnum, dif);
     440         [ #  # ]:          0 :                 if (score > badness) {
     441                 :            :                         result = sk;
     442                 :            :                         badness = score;
     443                 :          0 :                         reuseport = sk->sk_reuseport;
     444         [ #  # ]:          0 :                         if (reuseport) {
     445                 :          0 :                                 hash = udp_ehashfn(net, daddr, hnum,
     446                 :            :                                                    saddr, sport);
     447                 :            :                                 matches = 1;
     448                 :            :                         }
     449         [ #  # ]:          0 :                 } else if (score == badness && reuseport) {
     450                 :          0 :                         matches++;
     451         [ #  # ]:          0 :                         if (((u64)hash * matches) >> 32 == 0)
     452                 :            :                                 result = sk;
     453                 :            :                         hash = next_pseudo_random32(hash);
     454                 :            :                 }
     455                 :            :         }
     456                 :            :         /*
     457                 :            :          * if the nulls value we got at the end of this lookup is
     458                 :            :          * not the expected one, we must restart lookup.
     459                 :            :          * We probably met an item that was moved to another chain.
     460                 :            :          */
     461         [ #  # ]:          0 :         if (get_nulls_value(node) != slot2)
     462                 :            :                 goto begin;
     463         [ #  # ]:          0 :         if (result) {
     464         [ #  # ]:          0 :                 if (unlikely(!atomic_inc_not_zero_hint(&result->sk_refcnt, 2)))
     465                 :            :                         result = NULL;
     466         [ #  # ]:          0 :                 else if (unlikely(compute_score2(result, net, saddr, sport,
     467                 :            :                                   daddr, hnum, dif) < badness)) {
     468                 :            :                         sock_put(result);
     469                 :            :                         goto begin;
     470                 :            :                 }
     471                 :            :         }
     472                 :          0 :         return result;
     473                 :            : }
     474                 :            : 
     475                 :            : /* UDP is nearly always wildcards out the wazoo, it makes no sense to try
     476                 :            :  * harder than this. -DaveM
     477                 :            :  */
     478                 :          0 : struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
     479                 :            :                 __be16 sport, __be32 daddr, __be16 dport,
     480                 :            :                 int dif, struct udp_table *udptable)
     481                 :            : {
     482                 :            :         struct sock *sk, *result;
     483                 :            :         struct hlist_nulls_node *node;
     484         [ -  + ]:         19 :         unsigned short hnum = ntohs(dport);
     485                 :         19 :         unsigned int hash2, slot2, slot = udp_hashfn(net, hnum, udptable->mask);
     486                 :         19 :         struct udp_hslot *hslot2, *hslot = &udptable->hash[slot];
     487                 :            :         int score, badness, matches = 0, reuseport = 0;
     488                 :            :         u32 hash = 0;
     489                 :            : 
     490                 :            :         rcu_read_lock();
     491         [ -  + ]:         19 :         if (hslot->count > 10) {
     492                 :          0 :                 hash2 = udp4_portaddr_hash(net, daddr, hnum);
     493                 :          0 :                 slot2 = hash2 & udptable->mask;
     494                 :          0 :                 hslot2 = &udptable->hash2[slot2];
     495         [ #  # ]:          0 :                 if (hslot->count < hslot2->count)
     496                 :            :                         goto begin;
     497                 :            : 
     498                 :          0 :                 result = udp4_lib_lookup2(net, saddr, sport,
     499                 :            :                                           daddr, hnum, dif,
     500                 :            :                                           hslot2, slot2);
     501         [ #  # ]:          0 :                 if (!result) {
     502                 :          0 :                         hash2 = udp4_portaddr_hash(net, htonl(INADDR_ANY), hnum);
     503                 :          0 :                         slot2 = hash2 & udptable->mask;
     504                 :          0 :                         hslot2 = &udptable->hash2[slot2];
     505         [ #  # ]:         19 :                         if (hslot->count < hslot2->count)
     506                 :            :                                 goto begin;
     507                 :            : 
     508                 :          0 :                         result = udp4_lib_lookup2(net, saddr, sport,
     509                 :            :                                                   htonl(INADDR_ANY), hnum, dif,
     510                 :            :                                                   hslot2, slot2);
     511                 :            :                 }
     512                 :            :                 rcu_read_unlock();
     513                 :          0 :                 return result;
     514                 :            :         }
     515                 :            : begin:
     516                 :            :         result = NULL;
     517                 :            :         badness = 0;
     518         [ +  + ]:         38 :         sk_nulls_for_each_rcu(sk, node, &hslot->head) {
     519                 :            :                 score = compute_score(sk, net, saddr, hnum, sport,
     520                 :            :                                       daddr, dport, dif);
     521         [ +  - ]:         19 :                 if (score > badness) {
     522                 :            :                         result = sk;
     523                 :            :                         badness = score;
     524                 :         19 :                         reuseport = sk->sk_reuseport;
     525         [ -  + ]:         19 :                         if (reuseport) {
     526                 :          0 :                                 hash = udp_ehashfn(net, daddr, hnum,
     527                 :            :                                                    saddr, sport);
     528                 :            :                                 matches = 1;
     529                 :            :                         }
     530         [ #  # ]:          0 :                 } else if (score == badness && reuseport) {
     531                 :          0 :                         matches++;
     532         [ #  # ]:          0 :                         if (((u64)hash * matches) >> 32 == 0)
     533                 :            :                                 result = sk;
     534                 :            :                         hash = next_pseudo_random32(hash);
     535                 :            :                 }
     536                 :            :         }
     537                 :            :         /*
     538                 :            :          * if the nulls value we got at the end of this lookup is
     539                 :            :          * not the expected one, we must restart lookup.
     540                 :            :          * We probably met an item that was moved to another chain.
     541                 :            :          */
     542         [ -  + ]:         19 :         if (get_nulls_value(node) != slot)
     543                 :            :                 goto begin;
     544                 :            : 
     545         [ +  - ]:         19 :         if (result) {
     546         [ +  - ]:         38 :                 if (unlikely(!atomic_inc_not_zero_hint(&result->sk_refcnt, 2)))
     547                 :            :                         result = NULL;
     548         [ -  + ]:         19 :                 else if (unlikely(compute_score(result, net, saddr, hnum, sport,
     549                 :            :                                   daddr, dport, dif) < badness)) {
     550                 :            :                         sock_put(result);
     551                 :            :                         goto begin;
     552                 :            :                 }
     553                 :            :         }
     554                 :            :         rcu_read_unlock();
     555                 :         19 :         return result;
     556                 :            : }
     557                 :            : EXPORT_SYMBOL_GPL(__udp4_lib_lookup);
     558                 :            : 
     559                 :            : static inline struct sock *__udp4_lib_lookup_skb(struct sk_buff *skb,
     560                 :            :                                                  __be16 sport, __be16 dport,
     561                 :            :                                                  struct udp_table *udptable)
     562                 :            : {
     563                 :            :         const struct iphdr *iph = ip_hdr(skb);
     564                 :            : 
     565                 :         19 :         return __udp4_lib_lookup(dev_net(skb_dst(skb)->dev), iph->saddr, sport,
     566                 :            :                                  iph->daddr, dport, inet_iif(skb),
     567                 :            :                                  udptable);
     568                 :            : }
     569                 :            : 
     570                 :          0 : struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
     571                 :            :                              __be32 daddr, __be16 dport, int dif)
     572                 :            : {
     573                 :          0 :         return __udp4_lib_lookup(net, saddr, sport, daddr, dport, dif, &udp_table);
     574                 :            : }
     575                 :            : EXPORT_SYMBOL_GPL(udp4_lib_lookup);
     576                 :            : 
     577                 :            : static inline bool __udp_is_mcast_sock(struct net *net, struct sock *sk,
     578                 :            :                                        __be16 loc_port, __be32 loc_addr,
     579                 :            :                                        __be16 rmt_port, __be32 rmt_addr,
     580                 :            :                                        int dif, unsigned short hnum)
     581                 :            : {
     582                 :            :         struct inet_sock *inet = inet_sk(sk);
     583                 :            : 
     584 [ #  # ][ #  # ]:      10378 :         if (!net_eq(sock_net(sk), net) ||
         [ +  - ][ +  - ]
     585 [ #  # ][ #  # ]:        338 :             udp_sk(sk)->udp_port_hash != hnum ||
         [ -  + ][ -  + ]
     586 [ #  # ][ #  # ]:        338 :             (inet->inet_daddr && inet->inet_daddr != rmt_addr) ||
         [ #  # ][ #  # ]
         [ #  # ][ +  - ]
         [ #  # ][ +  - ]
     587 [ #  # ][ #  # ]:        338 :             (inet->inet_dport != rmt_port && inet->inet_dport) ||
         [ #  # ][ #  # ]
         [ +  - ][ -  + ]
         [ +  - ][ -  + ]
     588 [ #  # ][ #  # ]:        338 :             (inet->inet_rcv_saddr && inet->inet_rcv_saddr != loc_addr) ||
         [ #  # ][ #  # ]
         [ #  # ][ -  + ]
         [ #  # ][ -  + ]
     589 [ #  # ][ #  # ]:        338 :             ipv6_only_sock(sk) ||
         [ #  # ][ #  # ]
         [ #  # ][ -  + ]
         [ #  # ][ -  + ]
     590 [ #  # ][ #  # ]:          0 :             (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif))
         [ #  # ][ #  # ]
     591                 :            :                 return false;
     592 [ #  # ][ #  # ]:        338 :         if (!ip_mc_sf_allow(sk, loc_addr, rmt_addr, dif))
         [ +  - ][ +  - ]
     593                 :            :                 return false;
     594                 :            :         return true;
     595                 :            : }
     596                 :            : 
     597                 :            : static inline struct sock *udp_v4_mcast_next(struct net *net, struct sock *sk,
     598                 :            :                                              __be16 loc_port, __be32 loc_addr,
     599                 :            :                                              __be16 rmt_port, __be32 rmt_addr,
     600                 :            :                                              int dif)
     601                 :            : {
     602                 :            :         struct hlist_nulls_node *node;
     603                 :            :         struct sock *s = sk;
     604 [ -  + ][ #  # ]:      10040 :         unsigned short hnum = ntohs(loc_port);
     605                 :            : 
     606 [ -  + ][ #  # ]:      10040 :         sk_nulls_for_each_from(s, node) {
         [ #  # ][ #  # ]
     607 [ #  # ][ #  # ]:          0 :                 if (__udp_is_mcast_sock(net, s,
     608                 :            :                                         loc_port, loc_addr,
     609                 :            :                                         rmt_port, rmt_addr,
     610                 :            :                                         dif, hnum))
     611                 :            :                         goto found;
     612                 :            :         }
     613                 :            :         s = NULL;
     614                 :            : found:
     615                 :            :         return s;
     616                 :            : }
     617                 :            : 
     618                 :            : /*
     619                 :            :  * This routine is called by the ICMP module when it gets some
     620                 :            :  * sort of error condition.  If err < 0 then the socket should
     621                 :            :  * be closed and the error returned to the user.  If err > 0
     622                 :            :  * it's just the icmp type << 8 | icmp code.
     623                 :            :  * Header points to the ip header of the error packet. We move
     624                 :            :  * on past this. Then (as it used to claim before adjustment)
     625                 :            :  * header points to the first 8 bytes of the udp header.  We need
     626                 :            :  * to find the appropriate port.
     627                 :            :  */
     628                 :            : 
     629                 :          0 : void __udp4_lib_err(struct sk_buff *skb, u32 info, struct udp_table *udptable)
     630                 :            : {
     631                 :            :         struct inet_sock *inet;
     632                 :          0 :         const struct iphdr *iph = (const struct iphdr *)skb->data;
     633                 :          0 :         struct udphdr *uh = (struct udphdr *)(skb->data+(iph->ihl<<2));
     634                 :          0 :         const int type = icmp_hdr(skb)->type;
     635                 :          0 :         const int code = icmp_hdr(skb)->code;
     636                 :            :         struct sock *sk;
     637                 :            :         int harderr;
     638                 :            :         int err;
     639                 :            :         struct net *net = dev_net(skb->dev);
     640                 :            : 
     641                 :          0 :         sk = __udp4_lib_lookup(net, iph->daddr, uh->dest,
     642                 :          0 :                         iph->saddr, uh->source, skb->dev->ifindex, udptable);
     643         [ #  # ]:          0 :         if (sk == NULL) {
     644                 :          0 :                 ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
     645                 :          0 :                 return; /* No socket for error */
     646                 :            :         }
     647                 :            : 
     648                 :            :         err = 0;
     649                 :            :         harderr = 0;
     650                 :            :         inet = inet_sk(sk);
     651                 :            : 
     652   [ #  #  #  #  :          0 :         switch (type) {
                      # ]
     653                 :            :         default:
     654                 :            :         case ICMP_TIME_EXCEEDED:
     655                 :            :                 err = EHOSTUNREACH;
     656                 :            :                 break;
     657                 :            :         case ICMP_SOURCE_QUENCH:
     658                 :            :                 goto out;
     659                 :            :         case ICMP_PARAMETERPROB:
     660                 :            :                 err = EPROTO;
     661                 :            :                 harderr = 1;
     662                 :          0 :                 break;
     663                 :            :         case ICMP_DEST_UNREACH:
     664         [ #  # ]:          0 :                 if (code == ICMP_FRAG_NEEDED) { /* Path MTU discovery */
     665                 :          0 :                         ipv4_sk_update_pmtu(skb, sk, info);
     666         [ #  # ]:          0 :                         if (inet->pmtudisc != IP_PMTUDISC_DONT) {
     667                 :            :                                 err = EMSGSIZE;
     668                 :            :                                 harderr = 1;
     669                 :            :                                 break;
     670                 :            :                         }
     671                 :            :                         goto out;
     672                 :            :                 }
     673                 :            :                 err = EHOSTUNREACH;
     674         [ #  # ]:          0 :                 if (code <= NR_ICMP_UNREACH) {
     675                 :          0 :                         harderr = icmp_err_convert[code].fatal;
     676                 :          0 :                         err = icmp_err_convert[code].errno;
     677                 :            :                 }
     678                 :            :                 break;
     679                 :            :         case ICMP_REDIRECT:
     680                 :          0 :                 ipv4_sk_redirect(skb, sk);
     681                 :          0 :                 goto out;
     682                 :            :         }
     683                 :            : 
     684                 :            :         /*
     685                 :            :          *      RFC1122: OK.  Passes ICMP errors back to application, as per
     686                 :            :          *      4.1.3.3.
     687                 :            :          */
     688         [ #  # ]:          0 :         if (!inet->recverr) {
     689 [ #  # ][ #  # ]:          0 :                 if (!harderr || sk->sk_state != TCP_ESTABLISHED)
     690                 :            :                         goto out;
     691                 :            :         } else
     692                 :          0 :                 ip_icmp_error(sk, skb, err, uh->dest, info, (u8 *)(uh+1));
     693                 :            : 
     694                 :          0 :         sk->sk_err = err;
     695                 :          0 :         sk->sk_error_report(sk);
     696                 :            : out:
     697                 :            :         sock_put(sk);
     698                 :            : }
     699                 :            : 
     700                 :          0 : void udp_err(struct sk_buff *skb, u32 info)
     701                 :            : {
     702                 :          0 :         __udp4_lib_err(skb, info, &udp_table);
     703                 :          0 : }
     704                 :            : 
     705                 :            : /*
     706                 :            :  * Throw away all pending data and cancel the corking. Socket is locked.
     707                 :            :  */
     708                 :          0 : void udp_flush_pending_frames(struct sock *sk)
     709                 :            : {
     710                 :            :         struct udp_sock *up = udp_sk(sk);
     711                 :            : 
     712 [ -  + ][ #  # ]:         72 :         if (up->pending) {
         [ #  # ][ #  # ]
     713                 :          0 :                 up->len = 0;
     714                 :          0 :                 up->pending = 0;
     715                 :          0 :                 ip_flush_pending_frames(sk);
     716                 :            :         }
     717                 :          0 : }
     718                 :            : EXPORT_SYMBOL(udp_flush_pending_frames);
     719                 :            : 
     720                 :            : /**
     721                 :            :  *      udp4_hwcsum  -  handle outgoing HW checksumming
     722                 :            :  *      @skb:   sk_buff containing the filled-in UDP header
     723                 :            :  *              (checksum field must be zeroed out)
     724                 :            :  *      @src:   source IP address
     725                 :            :  *      @dst:   destination IP address
     726                 :            :  */
     727                 :          0 : void udp4_hwcsum(struct sk_buff *skb, __be32 src, __be32 dst)
     728                 :            : {
     729                 :            :         struct udphdr *uh = udp_hdr(skb);
     730                 :         16 :         struct sk_buff *frags = skb_shinfo(skb)->frag_list;
     731                 :            :         int offset = skb_transport_offset(skb);
     732                 :         16 :         int len = skb->len - offset;
     733                 :            :         int hlen = len;
     734                 :            :         __wsum csum = 0;
     735                 :            : 
     736         [ +  - ]:         16 :         if (!frags) {
     737                 :            :                 /*
     738                 :            :                  * Only one fragment on the socket.
     739                 :            :                  */
     740                 :         16 :                 skb->csum_start = skb_transport_header(skb) - skb->head;
     741                 :         16 :                 skb->csum_offset = offsetof(struct udphdr, check);
     742                 :         16 :                 uh->check = ~csum_tcpudp_magic(src, dst, len,
     743                 :            :                                                IPPROTO_UDP, 0);
     744                 :            :         } else {
     745                 :            :                 /*
     746                 :            :                  * HW-checksum won't work as there are two or more
     747                 :            :                  * fragments on the socket so that all csums of sk_buffs
     748                 :            :                  * should be together
     749                 :            :                  */
     750                 :            :                 do {
     751                 :          0 :                         csum = csum_add(csum, frags->csum);
     752                 :          0 :                         hlen -= frags->len;
     753         [ #  # ]:          0 :                 } while ((frags = frags->next));
     754                 :            : 
     755                 :          0 :                 csum = skb_checksum(skb, offset, hlen, csum);
     756                 :          0 :                 skb->ip_summed = CHECKSUM_NONE;
     757                 :            : 
     758                 :          0 :                 uh->check = csum_tcpudp_magic(src, dst, len, IPPROTO_UDP, csum);
     759         [ #  # ]:          0 :                 if (uh->check == 0)
     760                 :          0 :                         uh->check = CSUM_MANGLED_0;
     761                 :            :         }
     762                 :          0 : }
     763                 :            : EXPORT_SYMBOL_GPL(udp4_hwcsum);
     764                 :            : 
     765                 :          0 : static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4)
     766                 :            : {
     767                 :         27 :         struct sock *sk = skb->sk;
     768                 :            :         struct inet_sock *inet = inet_sk(sk);
     769                 :            :         struct udphdr *uh;
     770                 :            :         int err = 0;
     771                 :         27 :         int is_udplite = IS_UDPLITE(sk);
     772                 :            :         int offset = skb_transport_offset(skb);
     773                 :         27 :         int len = skb->len - offset;
     774                 :            :         __wsum csum = 0;
     775                 :            : 
     776                 :            :         /*
     777                 :            :          * Create a UDP header
     778                 :            :          */
     779                 :            :         uh = udp_hdr(skb);
     780                 :         27 :         uh->source = inet->inet_sport;
     781                 :         27 :         uh->dest = fl4->fl4_dport;
     782         [ -  + ]:         27 :         uh->len = htons(len);
     783                 :         27 :         uh->check = 0;
     784                 :            : 
     785         [ -  + ]:         27 :         if (is_udplite)                                  /*     UDP-Lite      */
     786                 :            :                 csum = udplite_csum(skb);
     787                 :            : 
     788         [ -  + ]:         27 :         else if (sk->sk_no_check == UDP_CSUM_NOXMIT) {   /* UDP csum disabled */
     789                 :            : 
     790                 :          0 :                 skb->ip_summed = CHECKSUM_NONE;
     791                 :          0 :                 goto send;
     792                 :            : 
     793         [ +  + ]:         27 :         } else if (skb->ip_summed == CHECKSUM_PARTIAL) { /* UDP hardware csum */
     794                 :            : 
     795                 :         16 :                 udp4_hwcsum(skb, fl4->saddr, fl4->daddr);
     796                 :         16 :                 goto send;
     797                 :            : 
     798                 :            :         } else
     799                 :            :                 csum = udp_csum(skb);
     800                 :            : 
     801                 :            :         /* add protocol-dependent pseudo-header */
     802                 :         33 :         uh->check = csum_tcpudp_magic(fl4->saddr, fl4->daddr, len,
     803                 :         11 :                                       sk->sk_protocol, csum);
     804         [ -  + ]:         11 :         if (uh->check == 0)
     805                 :          0 :                 uh->check = CSUM_MANGLED_0;
     806                 :            : 
     807                 :            : send:
     808                 :         27 :         err = ip_send_skb(sock_net(sk), skb);
     809         [ -  + ]:         27 :         if (err) {
     810 [ #  # ][ #  # ]:          0 :                 if (err == -ENOBUFS && !inet->recverr) {
     811         [ #  # ]:          0 :                         UDP_INC_STATS_USER(sock_net(sk),
     812                 :            :                                            UDP_MIB_SNDBUFERRORS, is_udplite);
     813                 :            :                         err = 0;
     814                 :            :                 }
     815                 :            :         } else
     816         [ -  + ]:         27 :                 UDP_INC_STATS_USER(sock_net(sk),
     817                 :            :                                    UDP_MIB_OUTDATAGRAMS, is_udplite);
     818                 :         27 :         return err;
     819                 :            : }
     820                 :            : 
     821                 :            : /*
     822                 :            :  * Push out all pending data as one UDP datagram. Socket is locked.
     823                 :            :  */
     824                 :          0 : int udp_push_pending_frames(struct sock *sk)
     825                 :            : {
     826                 :            :         struct udp_sock  *up = udp_sk(sk);
     827                 :            :         struct inet_sock *inet = inet_sk(sk);
     828                 :         16 :         struct flowi4 *fl4 = &inet->cork.fl.u.ip4;
     829                 :            :         struct sk_buff *skb;
     830                 :            :         int err = 0;
     831                 :            : 
     832                 :            :         skb = ip_finish_skb(sk, fl4);
     833         [ +  - ]:         16 :         if (!skb)
     834                 :            :                 goto out;
     835                 :            : 
     836                 :         16 :         err = udp_send_skb(skb, fl4);
     837                 :            : 
     838                 :            : out:
     839                 :          0 :         up->len = 0;
     840                 :          0 :         up->pending = 0;
     841                 :          0 :         return err;
     842                 :            : }
     843                 :            : EXPORT_SYMBOL(udp_push_pending_frames);
     844                 :            : 
     845                 :          0 : int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
     846                 :            :                 size_t len)
     847                 :            : {
     848                 :            :         struct inet_sock *inet = inet_sk(sk);
     849                 :            :         struct udp_sock *up = udp_sk(sk);
     850                 :            :         struct flowi4 fl4_stack;
     851                 :            :         struct flowi4 *fl4;
     852                 :         36 :         int ulen = len;
     853                 :            :         struct ipcm_cookie ipc;
     854                 :         36 :         struct rtable *rt = NULL;
     855                 :            :         int free = 0;
     856                 :            :         int connected = 0;
     857                 :            :         __be32 daddr, faddr, saddr;
     858                 :            :         __be16 dport;
     859                 :            :         u8  tos;
     860                 :         36 :         int err, is_udplite = IS_UDPLITE(sk);
     861 [ +  - ][ +  + ]:         36 :         int corkreq = up->corkflag || msg->msg_flags&MSG_MORE;
     862                 :            :         int (*getfrag)(void *, char *, int, int, int, struct sk_buff *);
     863                 :            :         struct sk_buff *skb;
     864                 :            :         struct ip_options_data opt_copy;
     865                 :            : 
     866         [ +  + ]:         36 :         if (len > 0xFFFF)
     867                 :            :                 return -EMSGSIZE;
     868                 :            : 
     869                 :            :         /*
     870                 :            :          *      Check the flags.
     871                 :            :          */
     872                 :            : 
     873         [ +  + ]:         33 :         if (msg->msg_flags & MSG_OOB) /* Mirror BSD error message compatibility */
     874                 :            :                 return -EOPNOTSUPP;
     875                 :            : 
     876                 :         30 :         ipc.opt = NULL;
     877                 :         30 :         ipc.tx_flags = 0;
     878                 :         30 :         ipc.ttl = 0;
     879                 :         30 :         ipc.tos = -1;
     880                 :            : 
     881         [ +  - ]:         30 :         getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag;
     882                 :            : 
     883                 :         30 :         fl4 = &inet->cork.fl.u.ip4;
     884         [ -  + ]:         30 :         if (up->pending) {
     885                 :            :                 /*
     886                 :            :                  * There are pending frames.
     887                 :            :                  * The socket lock must be held while it's corked.
     888                 :            :                  */
     889                 :            :                 lock_sock(sk);
     890         [ #  # ]:          0 :                 if (likely(up->pending)) {
     891         [ #  # ]:          0 :                         if (unlikely(up->pending != AF_INET)) {
     892                 :          0 :                                 release_sock(sk);
     893                 :          0 :                                 return -EINVAL;
     894                 :            :                         }
     895                 :            :                         goto do_append_data;
     896                 :            :                 }
     897                 :          0 :                 release_sock(sk);
     898                 :            :         }
     899                 :         30 :         ulen += sizeof(struct udphdr);
     900                 :            : 
     901                 :            :         /*
     902                 :            :          *      Get and verify the address.
     903                 :            :          */
     904         [ +  + ]:         30 :         if (msg->msg_name) {
     905                 :            :                 struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name;
     906         [ +  + ]:          6 :                 if (msg->msg_namelen < sizeof(*usin))
     907                 :            :                         return -EINVAL;
     908         [ -  + ]:          5 :                 if (usin->sin_family != AF_INET) {
     909         [ #  # ]:          0 :                         if (usin->sin_family != AF_UNSPEC)
     910                 :            :                                 return -EAFNOSUPPORT;
     911                 :            :                 }
     912                 :            : 
     913                 :          5 :                 daddr = usin->sin_addr.s_addr;
     914                 :          5 :                 dport = usin->sin_port;
     915         [ +  - ]:          5 :                 if (dport == 0)
     916                 :            :                         return -EINVAL;
     917                 :            :         } else {
     918         [ +  - ]:         24 :                 if (sk->sk_state != TCP_ESTABLISHED)
     919                 :            :                         return -EDESTADDRREQ;
     920                 :         24 :                 daddr = inet->inet_daddr;
     921                 :         24 :                 dport = inet->inet_dport;
     922                 :            :                 /* Open fast path for connected socket.
     923                 :            :                    Route will not be used, if at least one option is set.
     924                 :            :                  */
     925                 :            :                 connected = 1;
     926                 :            :         }
     927                 :         29 :         ipc.addr = inet->inet_saddr;
     928                 :            : 
     929                 :         29 :         ipc.oif = sk->sk_bound_dev_if;
     930                 :            : 
     931                 :         29 :         sock_tx_timestamp(sk, &ipc.tx_flags);
     932                 :            : 
     933         [ -  + ]:         29 :         if (msg->msg_controllen) {
     934                 :          0 :                 err = ip_cmsg_send(sock_net(sk), msg, &ipc);
     935         [ #  # ]:          0 :                 if (err)
     936                 :            :                         return err;
     937         [ #  # ]:          0 :                 if (ipc.opt)
     938                 :            :                         free = 1;
     939                 :            :                 connected = 0;
     940                 :            :         }
     941         [ +  - ]:         29 :         if (!ipc.opt) {
     942                 :            :                 struct ip_options_rcu *inet_opt;
     943                 :            : 
     944                 :            :                 rcu_read_lock();
     945                 :         29 :                 inet_opt = rcu_dereference(inet->inet_opt);
     946         [ -  + ]:         29 :                 if (inet_opt) {
     947                 :          0 :                         memcpy(&opt_copy, inet_opt,
     948                 :          0 :                                sizeof(*inet_opt) + inet_opt->opt.optlen);
     949                 :          0 :                         ipc.opt = &opt_copy.opt;
     950                 :            :                 }
     951                 :            :                 rcu_read_unlock();
     952                 :            :         }
     953                 :            : 
     954                 :         29 :         saddr = ipc.addr;
     955                 :         29 :         ipc.addr = faddr = daddr;
     956                 :            : 
     957 [ -  + ][ #  # ]:         29 :         if (ipc.opt && ipc.opt->opt.srr) {
     958         [ #  # ]:          0 :                 if (!daddr)
     959                 :            :                         return -EINVAL;
     960                 :          0 :                 faddr = ipc.opt->opt.faddr;
     961                 :            :                 connected = 0;
     962                 :            :         }
     963                 :         29 :         tos = get_rttos(&ipc, inet);
     964 [ +  - ][ +  - ]:         29 :         if (sock_flag(sk, SOCK_LOCALROUTE) ||
     965         [ -  + ]:         29 :             (msg->msg_flags & MSG_DONTROUTE) ||
     966         [ #  # ]:          0 :             (ipc.opt && ipc.opt->opt.is_strictroute)) {
     967                 :          0 :                 tos |= RTO_ONLINK;
     968                 :            :                 connected = 0;
     969                 :            :         }
     970                 :            : 
     971         [ -  + ]:         29 :         if (ipv4_is_multicast(daddr)) {
     972         [ #  # ]:          0 :                 if (!ipc.oif)
     973                 :          0 :                         ipc.oif = inet->mc_index;
     974         [ #  # ]:          0 :                 if (!saddr)
     975                 :          0 :                         saddr = inet->mc_addr;
     976                 :            :                 connected = 0;
     977         [ +  - ]:         29 :         } else if (!ipc.oif)
     978                 :         29 :                 ipc.oif = inet->uc_index;
     979                 :            : 
     980         [ +  + ]:         29 :         if (connected)
     981                 :         24 :                 rt = (struct rtable *)sk_dst_check(sk, 0);
     982                 :            : 
     983         [ +  + ]:         29 :         if (rt == NULL) {
     984                 :            :                 struct net *net = sock_net(sk);
     985                 :            : 
     986                 :            :                 fl4 = &fl4_stack;
     987                 :         10 :                 flowi4_init_output(fl4, ipc.oif, sk->sk_mark, tos,
     988                 :            :                                    RT_SCOPE_UNIVERSE, sk->sk_protocol,
     989                 :            :                                    inet_sk_flowi_flags(sk)|FLOWI_FLAG_CAN_SLEEP,
     990                 :            :                                    faddr, saddr, dport, inet->inet_sport);
     991                 :            : 
     992                 :          5 :                 security_sk_classify_flow(sk, flowi4_to_flowi(fl4));
     993                 :          5 :                 rt = ip_route_output_flow(net, fl4, sk);
     994         [ -  + ]:          5 :                 if (IS_ERR(rt)) {
     995                 :            :                         err = PTR_ERR(rt);
     996                 :          0 :                         rt = NULL;
     997         [ #  # ]:          0 :                         if (err == -ENETUNREACH)
     998                 :          0 :                                 IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);
     999                 :            :                         goto out;
    1000                 :            :                 }
    1001                 :            : 
    1002                 :            :                 err = -EACCES;
    1003 [ -  + ][ #  # ]:          5 :                 if ((rt->rt_flags & RTCF_BROADCAST) &&
    1004                 :            :                     !sock_flag(sk, SOCK_BROADCAST))
    1005                 :            :                         goto out;
    1006         [ -  + ]:          5 :                 if (connected)
    1007                 :          0 :                         sk_dst_set(sk, dst_clone(&rt->dst));
    1008                 :            :         }
    1009                 :            : 
    1010         [ +  - ]:         29 :         if (msg->msg_flags&MSG_CONFIRM)
    1011                 :            :                 goto do_confirm;
    1012                 :            : back_from_confirm:
    1013                 :            : 
    1014                 :         29 :         saddr = fl4->saddr;
    1015         [ +  + ]:         29 :         if (!ipc.addr)
    1016                 :          2 :                 daddr = ipc.addr = fl4->daddr;
    1017                 :            : 
    1018                 :            :         /* Lockless fast path for the non-corking case. */
    1019         [ +  + ]:         29 :         if (!corkreq) {
    1020                 :         13 :                 skb = ip_make_skb(sk, fl4, getfrag, msg->msg_iov, ulen,
    1021                 :            :                                   sizeof(struct udphdr), &ipc, &rt,
    1022                 :            :                                   msg->msg_flags);
    1023                 :            :                 err = PTR_ERR(skb);
    1024         [ +  + ]:         13 :                 if (!IS_ERR_OR_NULL(skb))
    1025                 :         11 :                         err = udp_send_skb(skb, fl4);
    1026                 :            :                 goto out;
    1027                 :            :         }
    1028                 :            : 
    1029                 :            :         lock_sock(sk);
    1030         [ -  + ]:         16 :         if (unlikely(up->pending)) {
    1031                 :            :                 /* The socket is already corked while preparing it. */
    1032                 :            :                 /* ... which is an evident application bug. --ANK */
    1033                 :          0 :                 release_sock(sk);
    1034                 :            : 
    1035 [ #  # ][ #  # ]:          0 :                 LIMIT_NETDEBUG(KERN_DEBUG pr_fmt("cork app bug 2\n"));
    1036                 :            :                 err = -EINVAL;
    1037                 :            :                 goto out;
    1038                 :            :         }
    1039                 :            :         /*
    1040                 :            :          *      Now cork the socket to pend data.
    1041                 :            :          */
    1042                 :            :         fl4 = &inet->cork.fl.u.ip4;
    1043                 :         16 :         fl4->daddr = daddr;
    1044                 :         16 :         fl4->saddr = saddr;
    1045                 :         16 :         fl4->fl4_dport = dport;
    1046                 :         16 :         fl4->fl4_sport = inet->inet_sport;
    1047                 :         16 :         up->pending = AF_INET;
    1048                 :            : 
    1049                 :            : do_append_data:
    1050                 :         16 :         up->len += ulen;
    1051         [ +  - ]:         16 :         err = ip_append_data(sk, fl4, getfrag, msg->msg_iov, ulen,
    1052                 :            :                              sizeof(struct udphdr), &ipc, &rt,
    1053                 :         16 :                              corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags);
    1054         [ -  + ]:         16 :         if (err)
    1055                 :            :                 udp_flush_pending_frames(sk);
    1056         [ -  + ]:         16 :         else if (!corkreq)
    1057                 :          0 :                 err = udp_push_pending_frames(sk);
    1058         [ -  + ]:         16 :         else if (unlikely(skb_queue_empty(&sk->sk_write_queue)))
    1059                 :          0 :                 up->pending = 0;
    1060                 :         16 :         release_sock(sk);
    1061                 :            : 
    1062                 :            : out:
    1063                 :          0 :         ip_rt_put(rt);
    1064         [ -  + ]:         29 :         if (free)
    1065                 :          0 :                 kfree(ipc.opt);
    1066         [ +  + ]:         29 :         if (!err)
    1067                 :            :                 return len;
    1068                 :            :         /*
    1069                 :            :          * ENOBUFS = no kernel mem, SOCK_NOSPACE = no sndbuf space.  Reporting
    1070                 :            :          * ENOBUFS might not be good (it's not tunable per se), but otherwise
    1071                 :            :          * we don't have a good statistic (IpOutDiscards but it can be too many
    1072                 :            :          * things).  We could add another new stat but at least for now that
    1073                 :            :          * seems like overkill.
    1074                 :            :          */
    1075 [ +  - ][ -  + ]:          2 :         if (err == -ENOBUFS || test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) {
    1076         [ #  # ]:          0 :                 UDP_INC_STATS_USER(sock_net(sk),
    1077                 :            :                                 UDP_MIB_SNDBUFERRORS, is_udplite);
    1078                 :            :         }
    1079                 :          2 :         return err;
    1080                 :            : 
    1081                 :            : do_confirm:
    1082                 :          0 :         dst_confirm(&rt->dst);
    1083 [ #  # ][ #  # ]:          0 :         if (!(msg->msg_flags&MSG_PROBE) || len)
    1084                 :            :                 goto back_from_confirm;
    1085                 :            :         err = 0;
    1086                 :            :         goto out;
    1087                 :            : }
    1088                 :            : EXPORT_SYMBOL(udp_sendmsg);
    1089                 :            : 
    1090                 :          0 : int udp_sendpage(struct sock *sk, struct page *page, int offset,
    1091                 :            :                  size_t size, int flags)
    1092                 :            : {
    1093                 :            :         struct inet_sock *inet = inet_sk(sk);
    1094                 :            :         struct udp_sock *up = udp_sk(sk);
    1095                 :            :         int ret;
    1096                 :            : 
    1097         [ -  + ]:         16 :         if (flags & MSG_SENDPAGE_NOTLAST)
    1098                 :          0 :                 flags |= MSG_MORE;
    1099                 :            : 
    1100         [ +  - ]:         16 :         if (!up->pending) {
    1101                 :         16 :                 struct msghdr msg = {   .msg_flags = flags|MSG_MORE };
    1102                 :            : 
    1103                 :            :                 /* Call udp_sendmsg to specify destination address which
    1104                 :            :                  * sendpage interface can't pass.
    1105                 :            :                  * This will succeed only when the socket is connected.
    1106                 :            :                  */
    1107                 :         16 :                 ret = udp_sendmsg(NULL, sk, &msg, 0);
    1108         [ -  + ]:         16 :                 if (ret < 0)
    1109                 :         16 :                         return ret;
    1110                 :            :         }
    1111                 :            : 
    1112                 :            :         lock_sock(sk);
    1113                 :            : 
    1114         [ -  + ]:         16 :         if (unlikely(!up->pending)) {
    1115                 :          0 :                 release_sock(sk);
    1116                 :            : 
    1117 [ #  # ][ #  # ]:          0 :                 LIMIT_NETDEBUG(KERN_DEBUG pr_fmt("udp cork app bug 3\n"));
    1118                 :            :                 return -EINVAL;
    1119                 :            :         }
    1120                 :            : 
    1121                 :         16 :         ret = ip_append_page(sk, &inet->cork.fl.u.ip4,
    1122                 :            :                              page, offset, size, flags);
    1123         [ -  + ]:         16 :         if (ret == -EOPNOTSUPP) {
    1124                 :          0 :                 release_sock(sk);
    1125                 :          0 :                 return sock_no_sendpage(sk->sk_socket, page, offset,
    1126                 :            :                                         size, flags);
    1127                 :            :         }
    1128         [ -  + ]:         16 :         if (ret < 0) {
    1129                 :            :                 udp_flush_pending_frames(sk);
    1130                 :            :                 goto out;
    1131                 :            :         }
    1132                 :            : 
    1133                 :         16 :         up->len += size;
    1134 [ +  - ][ +  - ]:         16 :         if (!(up->corkflag || (flags&MSG_MORE)))
    1135                 :         16 :                 ret = udp_push_pending_frames(sk);
    1136         [ +  - ]:         16 :         if (!ret)
    1137                 :         16 :                 ret = size;
    1138                 :            : out:
    1139                 :         16 :         release_sock(sk);
    1140                 :         16 :         return ret;
    1141                 :            : }
    1142                 :            : 
    1143                 :            : 
    1144                 :            : /**
    1145                 :            :  *      first_packet_length     - return length of first packet in receive queue
    1146                 :            :  *      @sk: socket
    1147                 :            :  *
    1148                 :            :  *      Drops all bad checksum frames, until a valid one is found.
    1149                 :            :  *      Returns the length of found skb, or 0 if none is found.
    1150                 :            :  */
    1151                 :          0 : static unsigned int first_packet_length(struct sock *sk)
    1152                 :            : {
    1153                 :        180 :         struct sk_buff_head list_kill, *rcvq = &sk->sk_receive_queue;
    1154                 :            :         struct sk_buff *skb;
    1155                 :            :         unsigned int res;
    1156                 :            : 
    1157                 :            :         __skb_queue_head_init(&list_kill);
    1158                 :            : 
    1159                 :            :         spin_lock_bh(&rcvq->lock);
    1160 [ +  - ][ -  + ]:        360 :         while ((skb = skb_peek(rcvq)) != NULL &&
    1161                 :            :                 udp_lib_checksum_complete(skb)) {
    1162         [ #  # ]:          0 :                 UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_CSUMERRORS,
    1163                 :            :                                  IS_UDPLITE(sk));
    1164         [ #  # ]:          0 :                 UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS,
    1165                 :            :                                  IS_UDPLITE(sk));
    1166                 :          0 :                 atomic_inc(&sk->sk_drops);
    1167                 :            :                 __skb_unlink(skb, rcvq);
    1168                 :            :                 __skb_queue_tail(&list_kill, skb);
    1169                 :            :         }
    1170         [ +  - ]:        180 :         res = skb ? skb->len : 0;
    1171                 :            :         spin_unlock_bh(&rcvq->lock);
    1172                 :            : 
    1173         [ -  + ]:        180 :         if (!skb_queue_empty(&list_kill)) {
    1174                 :          0 :                 bool slow = lock_sock_fast(sk);
    1175                 :            : 
    1176                 :            :                 __skb_queue_purge(&list_kill);
    1177                 :            :                 sk_mem_reclaim_partial(sk);
    1178                 :            :                 unlock_sock_fast(sk, slow);
    1179                 :            :         }
    1180                 :        180 :         return res;
    1181                 :            : }
    1182                 :            : 
    1183                 :            : /*
    1184                 :            :  *      IOCTL requests applicable to the UDP protocol
    1185                 :            :  */
    1186                 :            : 
    1187                 :          0 : int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
    1188                 :            : {
    1189      [ -  +  + ]:         37 :         switch (cmd) {
    1190                 :            :         case SIOCOUTQ:
    1191                 :            :         {
    1192                 :            :                 int amount = sk_wmem_alloc_get(sk);
    1193                 :            : 
    1194                 :          0 :                 return put_user(amount, (int __user *)arg);
    1195                 :            :         }
    1196                 :            : 
    1197                 :            :         case SIOCINQ:
    1198                 :            :         {
    1199                 :          8 :                 unsigned int amount = first_packet_length(sk);
    1200                 :            : 
    1201         [ +  - ]:          8 :                 if (amount)
    1202                 :            :                         /*
    1203                 :            :                          * We will only return the amount
    1204                 :            :                          * of this packet since that is all
    1205                 :            :                          * that will be read.
    1206                 :            :                          */
    1207                 :          8 :                         amount -= sizeof(struct udphdr);
    1208                 :            : 
    1209                 :          8 :                 return put_user(amount, (int __user *)arg);
    1210                 :            :         }
    1211                 :            : 
    1212                 :            :         default:
    1213                 :            :                 return -ENOIOCTLCMD;
    1214                 :            :         }
    1215                 :            : 
    1216                 :            :         return 0;
    1217                 :            : }
    1218                 :            : EXPORT_SYMBOL(udp_ioctl);
    1219                 :            : 
    1220                 :            : /*
    1221                 :            :  *      This should be easy, if there is something there we
    1222                 :            :  *      return it, otherwise we block.
    1223                 :            :  */
    1224                 :            : 
    1225                 :          0 : int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
    1226                 :            :                 size_t len, int noblock, int flags, int *addr_len)
    1227                 :            : {
    1228                 :            :         struct inet_sock *inet = inet_sk(sk);
    1229                 :        194 :         struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
    1230                 :            :         struct sk_buff *skb;
    1231                 :            :         unsigned int ulen, copied;
    1232                 :        194 :         int peeked, off = 0;
    1233                 :            :         int err;
    1234                 :        194 :         int is_udplite = IS_UDPLITE(sk);
    1235                 :            :         bool slow;
    1236                 :            : 
    1237         [ +  - ]:        194 :         if (flags & MSG_ERRQUEUE)
    1238                 :          0 :                 return ip_recv_error(sk, msg, len, addr_len);
    1239                 :            : 
    1240                 :            : try_again:
    1241         [ +  + ]:        194 :         skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0),
    1242                 :            :                                   &peeked, &off, &err);
    1243         [ +  + ]:        194 :         if (!skb)
    1244                 :            :                 goto out;
    1245                 :            : 
    1246                 :        190 :         ulen = skb->len - sizeof(struct udphdr);
    1247                 :            :         copied = len;
    1248         [ -  + ]:        190 :         if (copied > ulen)
    1249                 :            :                 copied = ulen;
    1250         [ #  # ]:          0 :         else if (copied < ulen)
    1251                 :          0 :                 msg->msg_flags |= MSG_TRUNC;
    1252                 :            : 
    1253                 :            :         /*
    1254                 :            :          * If checksum is needed at all, try to do it while copying the
    1255                 :            :          * data.  If the data is truncated, or if we only want a partial
    1256                 :            :          * coverage checksum (UDP-Lite), do it before the copy.
    1257                 :            :          */
    1258                 :            : 
    1259 [ +  - ][ -  + ]:        190 :         if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) {
    1260         [ #  # ]:          0 :                 if (udp_lib_checksum_complete(skb))
    1261                 :            :                         goto csum_copy_err;
    1262                 :            :         }
    1263                 :            : 
    1264         [ +  - ]:        190 :         if (skb_csum_unnecessary(skb))
    1265                 :        190 :                 err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr),
    1266                 :            :                                               msg->msg_iov, copied);
    1267                 :            :         else {
    1268                 :          0 :                 err = skb_copy_and_csum_datagram_iovec(skb,
    1269                 :            :                                                        sizeof(struct udphdr),
    1270                 :            :                                                        msg->msg_iov);
    1271                 :            : 
    1272         [ #  # ]:          0 :                 if (err == -EINVAL)
    1273                 :            :                         goto csum_copy_err;
    1274                 :            :         }
    1275                 :            : 
    1276         [ -  + ]:        190 :         if (unlikely(err)) {
    1277                 :            :                 trace_kfree_skb(skb, udp_recvmsg);
    1278         [ #  # ]:          0 :                 if (!peeked) {
    1279                 :          0 :                         atomic_inc(&sk->sk_drops);
    1280         [ #  # ]:          0 :                         UDP_INC_STATS_USER(sock_net(sk),
    1281                 :            :                                            UDP_MIB_INERRORS, is_udplite);
    1282                 :            :                 }
    1283                 :            :                 goto out_free;
    1284                 :            :         }
    1285                 :            : 
    1286         [ +  - ]:        190 :         if (!peeked)
    1287         [ -  + ]:        190 :                 UDP_INC_STATS_USER(sock_net(sk),
    1288                 :            :                                 UDP_MIB_INDATAGRAMS, is_udplite);
    1289                 :            : 
    1290                 :            :         sock_recv_ts_and_drops(msg, sk, skb);
    1291                 :            : 
    1292                 :            :         /* Copy the address. */
    1293         [ +  - ]:        190 :         if (sin) {
    1294                 :        190 :                 sin->sin_family = AF_INET;
    1295                 :        190 :                 sin->sin_port = udp_hdr(skb)->source;
    1296                 :        190 :                 sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
    1297                 :        190 :                 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
    1298                 :        190 :                 *addr_len = sizeof(*sin);
    1299                 :            :         }
    1300         [ -  + ]:        190 :         if (inet->cmsg_flags)
    1301                 :          0 :                 ip_cmsg_recv(msg, skb);
    1302                 :            : 
    1303                 :        190 :         err = copied;
    1304         [ -  + ]:        190 :         if (flags & MSG_TRUNC)
    1305                 :          0 :                 err = ulen;
    1306                 :            : 
    1307                 :            : out_free:
    1308                 :        190 :         skb_free_datagram_locked(sk, skb);
    1309                 :            : out:
    1310                 :        194 :         return err;
    1311                 :            : 
    1312                 :            : csum_copy_err:
    1313                 :          0 :         slow = lock_sock_fast(sk);
    1314         [ #  # ]:          0 :         if (!skb_kill_datagram(sk, skb, flags)) {
    1315         [ #  # ]:          0 :                 UDP_INC_STATS_USER(sock_net(sk), UDP_MIB_CSUMERRORS, is_udplite);
    1316         [ #  # ]:          0 :                 UDP_INC_STATS_USER(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
    1317                 :            :         }
    1318                 :            :         unlock_sock_fast(sk, slow);
    1319                 :            : 
    1320         [ #  # ]:          0 :         if (noblock)
    1321                 :            :                 return -EAGAIN;
    1322                 :            : 
    1323                 :            :         /* starting over for a new packet */
    1324                 :          0 :         msg->msg_flags &= ~MSG_TRUNC;
    1325                 :          0 :         goto try_again;
    1326                 :            : }
    1327                 :            : 
    1328                 :            : 
    1329                 :          0 : int udp_disconnect(struct sock *sk, int flags)
    1330                 :            : {
    1331                 :            :         struct inet_sock *inet = inet_sk(sk);
    1332                 :            :         /*
    1333                 :            :          *      1003.1g - break association.
    1334                 :            :          */
    1335                 :            : 
    1336                 :          4 :         sk->sk_state = TCP_CLOSE;
    1337                 :          4 :         inet->inet_daddr = 0;
    1338                 :          4 :         inet->inet_dport = 0;
    1339                 :            :         sock_rps_reset_rxhash(sk);
    1340                 :          4 :         sk->sk_bound_dev_if = 0;
    1341         [ +  - ]:          4 :         if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK))
    1342                 :            :                 inet_reset_saddr(sk);
    1343                 :            : 
    1344         [ +  - ]:          4 :         if (!(sk->sk_userlocks & SOCK_BINDPORT_LOCK)) {
    1345                 :          4 :                 sk->sk_prot->unhash(sk);
    1346                 :          4 :                 inet->inet_sport = 0;
    1347                 :            :         }
    1348                 :            :         sk_dst_reset(sk);
    1349                 :          4 :         return 0;
    1350                 :            : }
    1351                 :            : EXPORT_SYMBOL(udp_disconnect);
    1352                 :            : 
    1353                 :          0 : void udp_lib_unhash(struct sock *sk)
    1354                 :            : {
    1355         [ +  + ]:         81 :         if (sk_hashed(sk)) {
    1356                 :        210 :                 struct udp_table *udptable = sk->sk_prot->h.udp_table;
    1357                 :            :                 struct udp_hslot *hslot, *hslot2;
    1358                 :            : 
    1359                 :         70 :                 hslot  = udp_hashslot(udptable, sock_net(sk),
    1360                 :         70 :                                       udp_sk(sk)->udp_port_hash);
    1361                 :         70 :                 hslot2 = udp_hashslot2(udptable, udp_sk(sk)->udp_portaddr_hash);
    1362                 :            : 
    1363                 :            :                 spin_lock_bh(&hslot->lock);
    1364         [ +  - ]:         70 :                 if (sk_nulls_del_node_init_rcu(sk)) {
    1365                 :         70 :                         hslot->count--;
    1366                 :         70 :                         inet_sk(sk)->inet_num = 0;
    1367                 :         70 :                         sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
    1368                 :            : 
    1369                 :            :                         spin_lock(&hslot2->lock);
    1370                 :            :                         hlist_nulls_del_init_rcu(&udp_sk(sk)->udp_portaddr_node);
    1371                 :         70 :                         hslot2->count--;
    1372                 :            :                         spin_unlock(&hslot2->lock);
    1373                 :            :                 }
    1374                 :            :                 spin_unlock_bh(&hslot->lock);
    1375                 :            :         }
    1376                 :         81 : }
    1377                 :            : EXPORT_SYMBOL(udp_lib_unhash);
    1378                 :            : 
    1379                 :            : /*
    1380                 :            :  * inet_rcv_saddr was changed, we must rehash secondary hash
    1381                 :            :  */
    1382                 :          0 : void udp_lib_rehash(struct sock *sk, u16 newhash)
    1383                 :            : {
    1384         [ +  - ]:         45 :         if (sk_hashed(sk)) {
    1385                 :        131 :                 struct udp_table *udptable = sk->sk_prot->h.udp_table;
    1386                 :            :                 struct udp_hslot *hslot, *hslot2, *nhslot2;
    1387                 :            : 
    1388                 :         45 :                 hslot2 = udp_hashslot2(udptable, udp_sk(sk)->udp_portaddr_hash);
    1389                 :         45 :                 nhslot2 = udp_hashslot2(udptable, newhash);
    1390                 :         45 :                 udp_sk(sk)->udp_portaddr_hash = newhash;
    1391         [ +  + ]:         45 :                 if (hslot2 != nhslot2) {
    1392                 :         41 :                         hslot = udp_hashslot(udptable, sock_net(sk),
    1393                 :         41 :                                              udp_sk(sk)->udp_port_hash);
    1394                 :            :                         /* we must lock primary chain too */
    1395                 :            :                         spin_lock_bh(&hslot->lock);
    1396                 :            : 
    1397                 :            :                         spin_lock(&hslot2->lock);
    1398                 :            :                         hlist_nulls_del_init_rcu(&udp_sk(sk)->udp_portaddr_node);
    1399                 :          0 :                         hslot2->count--;
    1400                 :            :                         spin_unlock(&hslot2->lock);
    1401                 :            : 
    1402                 :            :                         spin_lock(&nhslot2->lock);
    1403                 :         41 :                         hlist_nulls_add_head_rcu(&udp_sk(sk)->udp_portaddr_node,
    1404                 :            :                                                  &nhslot2->head);
    1405                 :         41 :                         nhslot2->count++;
    1406                 :            :                         spin_unlock(&nhslot2->lock);
    1407                 :            : 
    1408                 :            :                         spin_unlock_bh(&hslot->lock);
    1409                 :            :                 }
    1410                 :            :         }
    1411                 :         45 : }
    1412                 :            : EXPORT_SYMBOL(udp_lib_rehash);
    1413                 :            : 
    1414                 :          0 : static void udp_v4_rehash(struct sock *sk)
    1415                 :            : {
    1416                 :         34 :         u16 new_hash = udp4_portaddr_hash(sock_net(sk),
    1417                 :            :                                           inet_sk(sk)->inet_rcv_saddr,
    1418                 :         34 :                                           inet_sk(sk)->inet_num);
    1419                 :         34 :         udp_lib_rehash(sk, new_hash);
    1420                 :         34 : }
    1421                 :            : 
    1422                 :          0 : static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
    1423                 :            : {
    1424                 :            :         int rc;
    1425                 :            : 
    1426         [ +  + ]:        196 :         if (inet_sk(sk)->inet_daddr) {
    1427                 :            :                 sock_rps_save_rxhash(sk, skb);
    1428                 :            :                 sk_mark_napi_id(sk, skb);
    1429                 :            :         }
    1430                 :            : 
    1431                 :        196 :         rc = sock_queue_rcv_skb(sk, skb);
    1432         [ -  + ]:        196 :         if (rc < 0) {
    1433                 :          0 :                 int is_udplite = IS_UDPLITE(sk);
    1434                 :            : 
    1435                 :            :                 /* Note that an ENOMEM error is charged twice */
    1436         [ #  # ]:          0 :                 if (rc == -ENOMEM)
    1437         [ #  # ]:          0 :                         UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS,
    1438                 :            :                                          is_udplite);
    1439         [ #  # ]:          0 :                 UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
    1440                 :          0 :                 kfree_skb(skb);
    1441                 :            :                 trace_udp_fail_queue_rcv_skb(rc, sk);
    1442                 :            :                 return -1;
    1443                 :            :         }
    1444                 :            : 
    1445                 :            :         return 0;
    1446                 :            : 
    1447                 :            : }
    1448                 :            : 
    1449                 :            : static struct static_key udp_encap_needed __read_mostly;
    1450                 :          0 : void udp_encap_enable(void)
    1451                 :            : {
    1452         [ #  # ]:          0 :         if (!static_key_enabled(&udp_encap_needed))
    1453                 :            :                 static_key_slow_inc(&udp_encap_needed);
    1454                 :          0 : }
    1455                 :            : EXPORT_SYMBOL(udp_encap_enable);
    1456                 :            : 
    1457                 :            : /* returns:
    1458                 :            :  *  -1: error
    1459                 :            :  *   0: success
    1460                 :            :  *  >0: "udp encap" protocol resubmission
    1461                 :            :  *
    1462                 :            :  * Note that in the success and error cases, the skb is assumed to
    1463                 :            :  * have either been requeued or freed.
    1464                 :            :  */
    1465                 :          0 : int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
    1466                 :            : {
    1467                 :            :         struct udp_sock *up = udp_sk(sk);
    1468                 :            :         int rc;
    1469                 :        196 :         int is_udplite = IS_UDPLITE(sk);
    1470                 :            : 
    1471                 :            :         /*
    1472                 :            :          *      Charge it to the socket, dropping if the queue is full.
    1473                 :            :          */
    1474         [ +  - ]:        196 :         if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb))
    1475                 :            :                 goto drop;
    1476                 :            :         nf_reset(skb);
    1477                 :            : 
    1478 [ -  + ][ #  # ]:        196 :         if (static_key_false(&udp_encap_needed) && up->encap_type) {
    1479                 :            :                 int (*encap_rcv)(struct sock *sk, struct sk_buff *skb);
    1480                 :            : 
    1481                 :            :                 /*
    1482                 :            :                  * This is an encapsulation socket so pass the skb to
    1483                 :            :                  * the socket's udp_encap_rcv() hook. Otherwise, just
    1484                 :            :                  * fall through and pass this up the UDP socket.
    1485                 :            :                  * up->encap_rcv() returns the following value:
    1486                 :            :                  * =0 if skb was successfully passed to the encap
    1487                 :            :                  *    handler or was discarded by it.
    1488                 :            :                  * >0 if skb should be passed on to UDP.
    1489                 :            :                  * <0 if skb should be resubmitted as proto -N
    1490                 :            :                  */
    1491                 :            : 
    1492                 :            :                 /* if we're overly short, let UDP handle it */
    1493                 :          0 :                 encap_rcv = ACCESS_ONCE(up->encap_rcv);
    1494 [ #  # ][ #  # ]:          0 :                 if (skb->len > sizeof(struct udphdr) && encap_rcv != NULL) {
    1495                 :            :                         int ret;
    1496                 :            : 
    1497                 :          0 :                         ret = encap_rcv(sk, skb);
    1498         [ #  # ]:          0 :                         if (ret <= 0) {
    1499         [ #  # ]:          0 :                                 UDP_INC_STATS_BH(sock_net(sk),
    1500                 :            :                                                  UDP_MIB_INDATAGRAMS,
    1501                 :            :                                                  is_udplite);
    1502                 :          0 :                                 return -ret;
    1503                 :            :                         }
    1504                 :            :                 }
    1505                 :            : 
    1506                 :            :                 /* FALLTHROUGH -- it's a UDP Packet */
    1507                 :            :         }
    1508                 :            : 
    1509                 :            :         /*
    1510                 :            :          *      UDP-Lite specific tests, ignored on UDP sockets
    1511                 :            :          */
    1512 [ -  + ][ #  # ]:        196 :         if ((is_udplite & UDPLITE_RECV_CC)  &&  UDP_SKB_CB(skb)->partial_cov) {
    1513                 :            : 
    1514                 :            :                 /*
    1515                 :            :                  * MIB statistics other than incrementing the error count are
    1516                 :            :                  * disabled for the following two types of errors: these depend
    1517                 :            :                  * on the application settings, not on the functioning of the
    1518                 :            :                  * protocol stack as such.
    1519                 :            :                  *
    1520                 :            :                  * RFC 3828 here recommends (sec 3.3): "There should also be a
    1521                 :            :                  * way ... to ... at least let the receiving application block
    1522                 :            :                  * delivery of packets with coverage values less than a value
    1523                 :            :                  * provided by the application."
    1524                 :            :                  */
    1525         [ #  # ]:          0 :                 if (up->pcrlen == 0) {          /* full coverage was set  */
    1526 [ #  # ][ #  # ]:          0 :                         LIMIT_NETDEBUG(KERN_WARNING "UDPLite: partial coverage %d while full coverage %d requested\n",
    1527                 :            :                                        UDP_SKB_CB(skb)->cscov, skb->len);
    1528                 :            :                         goto drop;
    1529                 :            :                 }
    1530                 :            :                 /* The next case involves violating the min. coverage requested
    1531                 :            :                  * by the receiver. This is subtle: if receiver wants x and x is
    1532                 :            :                  * greater than the buffersize/MTU then receiver will complain
    1533                 :            :                  * that it wants x while sender emits packets of smaller size y.
    1534                 :            :                  * Therefore the above ...()->partial_cov statement is essential.
    1535                 :            :                  */
    1536         [ #  # ]:          0 :                 if (UDP_SKB_CB(skb)->cscov  <  up->pcrlen) {
    1537 [ #  # ][ #  # ]:          0 :                         LIMIT_NETDEBUG(KERN_WARNING "UDPLite: coverage %d too small, need min %d\n",
    1538                 :            :                                        UDP_SKB_CB(skb)->cscov, up->pcrlen);
    1539                 :            :                         goto drop;
    1540                 :            :                 }
    1541                 :            :         }
    1542                 :            : 
    1543 [ -  + ][ #  # ]:        196 :         if (rcu_access_pointer(sk->sk_filter) &&
    1544                 :            :             udp_lib_checksum_complete(skb))
    1545                 :            :                 goto csum_error;
    1546                 :            : 
    1547                 :            : 
    1548         [ +  - ]:        196 :         if (sk_rcvqueues_full(sk, skb, sk->sk_rcvbuf))
    1549                 :            :                 goto drop;
    1550                 :            : 
    1551                 :            :         rc = 0;
    1552                 :            : 
    1553                 :        196 :         ipv4_pktinfo_prepare(sk, skb);
    1554                 :            :         bh_lock_sock(sk);
    1555         [ +  - ]:        196 :         if (!sock_owned_by_user(sk))
    1556                 :        196 :                 rc = __udp_queue_rcv_skb(sk, skb);
    1557         [ #  # ]:          0 :         else if (sk_add_backlog(sk, skb, sk->sk_rcvbuf)) {
    1558                 :            :                 bh_unlock_sock(sk);
    1559                 :            :                 goto drop;
    1560                 :            :         }
    1561                 :            :         bh_unlock_sock(sk);
    1562                 :            : 
    1563                 :        196 :         return rc;
    1564                 :            : 
    1565                 :            : csum_error:
    1566         [ #  # ]:          0 :         UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_CSUMERRORS, is_udplite);
    1567                 :            : drop:
    1568         [ #  # ]:          0 :         UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
    1569                 :          0 :         atomic_inc(&sk->sk_drops);
    1570                 :          0 :         kfree_skb(skb);
    1571                 :          0 :         return -1;
    1572                 :            : }
    1573                 :            : 
    1574                 :            : 
    1575                 :          0 : static void flush_stack(struct sock **stack, unsigned int count,
    1576                 :            :                         struct sk_buff *skb, unsigned int final)
    1577                 :            : {
    1578                 :            :         unsigned int i;
    1579                 :            :         struct sk_buff *skb1 = NULL;
    1580                 :            :         struct sock *sk;
    1581                 :            : 
    1582         [ #  # ]:          0 :         for (i = 0; i < count; i++) {
    1583                 :          0 :                 sk = stack[i];
    1584         [ #  # ]:          0 :                 if (likely(skb1 == NULL))
    1585         [ #  # ]:          0 :                         skb1 = (i == final) ? skb : skb_clone(skb, GFP_ATOMIC);
    1586                 :            : 
    1587         [ #  # ]:          0 :                 if (!skb1) {
    1588                 :          0 :                         atomic_inc(&sk->sk_drops);
    1589         [ #  # ]:          0 :                         UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS,
    1590                 :            :                                          IS_UDPLITE(sk));
    1591         [ #  # ]:          0 :                         UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS,
    1592                 :            :                                          IS_UDPLITE(sk));
    1593                 :            :                 }
    1594                 :            : 
    1595 [ #  # ][ #  # ]:          0 :                 if (skb1 && udp_queue_rcv_skb(sk, skb1) <= 0)
    1596                 :            :                         skb1 = NULL;
    1597                 :            :         }
    1598         [ #  # ]:          0 :         if (unlikely(skb1))
    1599                 :          0 :                 kfree_skb(skb1);
    1600                 :          0 : }
    1601                 :            : 
    1602                 :            : /* For TCP sockets, sk_rx_dst is protected by socket lock
    1603                 :            :  * For UDP, we use xchg() to guard against concurrent changes.
    1604                 :            :  */
    1605                 :          0 : static void udp_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst)
    1606                 :            : {
    1607                 :            :         struct dst_entry *old;
    1608                 :            : 
    1609                 :            :         dst_hold(dst);
    1610                 :         12 :         old = xchg(&sk->sk_rx_dst, dst);
    1611                 :          6 :         dst_release(old);
    1612                 :          6 : }
    1613                 :            : 
    1614                 :            : /*
    1615                 :            :  *      Multicasts and broadcasts go to each listener.
    1616                 :            :  *
    1617                 :            :  *      Note: called only from the BH handler context.
    1618                 :            :  */
    1619                 :          0 : static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
    1620                 :            :                                     struct udphdr  *uh,
    1621                 :            :                                     __be32 saddr, __be32 daddr,
    1622                 :      10040 :                                     struct udp_table *udptable)
    1623                 :            : {
    1624                 :            :         struct sock *sk, *stack[256 / sizeof(struct sock *)];
    1625         [ -  + ]:      10040 :         struct udp_hslot *hslot = udp_hashslot(udptable, net, ntohs(uh->dest));
    1626                 :            :         int dif;
    1627                 :            :         unsigned int i, count = 0;
    1628                 :            : 
    1629                 :            :         spin_lock(&hslot->lock);
    1630                 :            :         sk = sk_nulls_head(&hslot->head);
    1631                 :      10040 :         dif = skb->dev->ifindex;
    1632                 :      10040 :         sk = udp_v4_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
    1633         [ -  + ]:      10040 :         while (sk) {
    1634                 :          0 :                 stack[count++] = sk;
    1635                 :          0 :                 sk = udp_v4_mcast_next(net, sk_nulls_next(sk), uh->dest,
    1636                 :            :                                        daddr, uh->source, saddr, dif);
    1637         [ #  # ]:          0 :                 if (unlikely(count == ARRAY_SIZE(stack))) {
    1638         [ #  # ]:          0 :                         if (!sk)
    1639                 :            :                                 break;
    1640                 :          0 :                         flush_stack(stack, count, skb, ~0);
    1641                 :            :                         count = 0;
    1642                 :            :                 }
    1643                 :            :         }
    1644                 :            :         /*
    1645                 :            :          * before releasing chain lock, we must take a reference on sockets
    1646                 :            :          */
    1647         [ -  + ]:      10040 :         for (i = 0; i < count; i++)
    1648                 :          0 :                 sock_hold(stack[i]);
    1649                 :            : 
    1650                 :            :         spin_unlock(&hslot->lock);
    1651                 :            : 
    1652                 :            :         /*
    1653                 :            :          * do the slow work with no lock held
    1654                 :            :          */
    1655         [ -  + ]:      10040 :         if (count) {
    1656                 :          0 :                 flush_stack(stack, count, skb, count - 1);
    1657                 :            : 
    1658         [ #  # ]:          0 :                 for (i = 0; i < count; i++)
    1659                 :          0 :                         sock_put(stack[i]);
    1660                 :            :         } else {
    1661                 :      10040 :                 kfree_skb(skb);
    1662                 :            :         }
    1663                 :      10040 :         return 0;
    1664                 :            : }
    1665                 :            : 
    1666                 :            : /* Initialize UDP checksum. If exited with zero value (success),
    1667                 :            :  * CHECKSUM_UNNECESSARY means, that no more checks are required.
    1668                 :            :  * Otherwise, csum completion requires chacksumming packet body,
    1669                 :            :  * including udp header and folding it to skb->csum.
    1670                 :            :  */
    1671                 :          0 : static inline int udp4_csum_init(struct sk_buff *skb, struct udphdr *uh,
    1672                 :            :                                  int proto)
    1673                 :            : {
    1674                 :            :         const struct iphdr *iph;
    1675                 :            :         int err;
    1676                 :            : 
    1677                 :      10236 :         UDP_SKB_CB(skb)->partial_cov = 0;
    1678                 :      10236 :         UDP_SKB_CB(skb)->cscov = skb->len;
    1679                 :            : 
    1680         [ -  + ]:      10236 :         if (proto == IPPROTO_UDPLITE) {
    1681                 :            :                 err = udplite_checksum_init(skb, uh);
    1682         [ #  # ]:      10236 :                 if (err)
    1683                 :            :                         return err;
    1684                 :            :         }
    1685                 :            : 
    1686                 :            :         iph = ip_hdr(skb);
    1687         [ -  + ]:      10236 :         if (uh->check == 0) {
    1688                 :          0 :                 skb->ip_summed = CHECKSUM_UNNECESSARY;
    1689         [ -  + ]:      10236 :         } else if (skb->ip_summed == CHECKSUM_COMPLETE) {
    1690         [ #  # ]:          0 :                 if (!csum_tcpudp_magic(iph->saddr, iph->daddr, skb->len,
    1691                 :            :                                       proto, skb->csum))
    1692                 :          0 :                         skb->ip_summed = CHECKSUM_UNNECESSARY;
    1693                 :            :         }
    1694         [ +  + ]:      10236 :         if (!skb_csum_unnecessary(skb))
    1695                 :      10220 :                 skb->csum = csum_tcpudp_nofold(iph->saddr, iph->daddr,
    1696                 :      10220 :                                                skb->len, proto, 0);
    1697                 :            :         /* Probably, we should checksum udp header (it should be in cache
    1698                 :            :          * in any case) and data in tiny packets (< rx copybreak).
    1699                 :            :          */
    1700                 :            : 
    1701                 :            :         return 0;
    1702                 :            : }
    1703                 :            : 
    1704                 :            : /*
    1705                 :            :  *      All we need to do is get the socket, and then do a checksum.
    1706                 :            :  */
    1707                 :            : 
    1708                 :          0 : int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
    1709                 :            :                    int proto)
    1710                 :            : {
    1711                 :            :         struct sock *sk;
    1712                 :            :         struct udphdr *uh;
    1713                 :            :         unsigned short ulen;
    1714                 :            :         struct rtable *rt = skb_rtable(skb);
    1715                 :            :         __be32 saddr, daddr;
    1716                 :            :         struct net *net = dev_net(skb->dev);
    1717                 :            : 
    1718                 :            :         /*
    1719                 :            :          *  Validate the packet.
    1720                 :            :          */
    1721         [ +  - ]:      10236 :         if (!pskb_may_pull(skb, sizeof(struct udphdr)))
    1722                 :            :                 goto drop;              /* No space for header. */
    1723                 :            : 
    1724                 :            :         uh   = udp_hdr(skb);
    1725         [ -  + ]:      10236 :         ulen = ntohs(uh->len);
    1726                 :      10236 :         saddr = ip_hdr(skb)->saddr;
    1727                 :      10236 :         daddr = ip_hdr(skb)->daddr;
    1728                 :            : 
    1729         [ +  - ]:      10236 :         if (ulen > skb->len)
    1730                 :            :                 goto short_packet;
    1731                 :            : 
    1732         [ +  - ]:      10236 :         if (proto == IPPROTO_UDP) {
    1733                 :            :                 /* UDP validates ulen. */
    1734 [ +  - ][ +  - ]:      20472 :                 if (ulen < sizeof(*uh) || pskb_trim_rcsum(skb, ulen))
    1735                 :            :                         goto short_packet;
    1736                 :            :                 uh = udp_hdr(skb);
    1737                 :            :         }
    1738                 :            : 
    1739         [ +  - ]:      10236 :         if (udp4_csum_init(skb, uh, proto))
    1740                 :            :                 goto csum_error;
    1741                 :            : 
    1742                 :            :         sk = skb_steal_sock(skb);
    1743         [ +  + ]:      10236 :         if (sk) {
    1744                 :            :                 struct dst_entry *dst = skb_dst(skb);
    1745                 :            :                 int ret;
    1746                 :            : 
    1747         [ +  + ]:        177 :                 if (unlikely(sk->sk_rx_dst != dst))
    1748                 :          6 :                         udp_sk_rx_dst_set(sk, dst);
    1749                 :            : 
    1750                 :        177 :                 ret = udp_queue_rcv_skb(sk, skb);
    1751                 :            :                 sock_put(sk);
    1752                 :            :                 /* a return value > 0 means to resubmit the input, but
    1753                 :            :                  * it wants the return to be -protocol, or 0
    1754                 :            :                  */
    1755         [ -  + ]:        177 :                 if (ret > 0)
    1756                 :          0 :                         return -ret;
    1757                 :            :                 return 0;
    1758                 :            :         } else {
    1759         [ +  + ]:      10059 :                 if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST))
    1760                 :      10040 :                         return __udp4_lib_mcast_deliver(net, skb, uh,
    1761                 :            :                                         saddr, daddr, udptable);
    1762                 :            : 
    1763                 :         19 :                 sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable);
    1764                 :            :         }
    1765                 :            : 
    1766         [ +  - ]:         19 :         if (sk != NULL) {
    1767                 :            :                 int ret;
    1768                 :            : 
    1769                 :         19 :                 ret = udp_queue_rcv_skb(sk, skb);
    1770                 :            :                 sock_put(sk);
    1771                 :            : 
    1772                 :            :                 /* a return value > 0 means to resubmit the input, but
    1773                 :            :                  * it wants the return to be -protocol, or 0
    1774                 :            :                  */
    1775         [ -  + ]:         19 :                 if (ret > 0)
    1776                 :          0 :                         return -ret;
    1777                 :            :                 return 0;
    1778                 :            :         }
    1779                 :            : 
    1780         [ #  # ]:          0 :         if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
    1781                 :            :                 goto drop;
    1782                 :            :         nf_reset(skb);
    1783                 :            : 
    1784                 :            :         /* No socket. Drop packet silently, if checksum is wrong */
    1785         [ #  # ]:          0 :         if (udp_lib_checksum_complete(skb))
    1786                 :            :                 goto csum_error;
    1787                 :            : 
    1788         [ #  # ]:          0 :         UDP_INC_STATS_BH(net, UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE);
    1789                 :          0 :         icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
    1790                 :            : 
    1791                 :            :         /*
    1792                 :            :          * Hmm.  We got an UDP packet to a port to which we
    1793                 :            :          * don't wanna listen.  Ignore it.
    1794                 :            :          */
    1795                 :          0 :         kfree_skb(skb);
    1796                 :          0 :         return 0;
    1797                 :            : 
    1798                 :            : short_packet:
    1799 [ #  # ][ #  # ]:          0 :         LIMIT_NETDEBUG(KERN_DEBUG "UDP%s: short packet: From %pI4:%u %d/%d to %pI4:%u\n",
         [ #  # ][ #  # ]
                 [ #  # ]
    1800                 :            :                        proto == IPPROTO_UDPLITE ? "Lite" : "",
    1801                 :            :                        &saddr, ntohs(uh->source),
    1802                 :            :                        ulen, skb->len,
    1803                 :            :                        &daddr, ntohs(uh->dest));
    1804                 :            :         goto drop;
    1805                 :            : 
    1806                 :            : csum_error:
    1807                 :            :         /*
    1808                 :            :          * RFC1122: OK.  Discards the bad packet silently (as far as
    1809                 :            :          * the network is concerned, anyway) as per 4.1.3.4 (MUST).
    1810                 :            :          */
    1811 [ #  # ][ #  # ]:          0 :         LIMIT_NETDEBUG(KERN_DEBUG "UDP%s: bad checksum. From %pI4:%u to %pI4:%u ulen %d\n",
         [ #  # ][ #  # ]
                 [ #  # ]
    1812                 :            :                        proto == IPPROTO_UDPLITE ? "Lite" : "",
    1813                 :            :                        &saddr, ntohs(uh->source), &daddr, ntohs(uh->dest),
    1814                 :            :                        ulen);
    1815         [ #  # ]:          0 :         UDP_INC_STATS_BH(net, UDP_MIB_CSUMERRORS, proto == IPPROTO_UDPLITE);
    1816                 :            : drop:
    1817         [ #  # ]:          0 :         UDP_INC_STATS_BH(net, UDP_MIB_INERRORS, proto == IPPROTO_UDPLITE);
    1818                 :          0 :         kfree_skb(skb);
    1819                 :          0 :         return 0;
    1820                 :            : }
    1821                 :            : 
    1822                 :            : /* We can only early demux multicast if there is a single matching socket.
    1823                 :            :  * If more than one socket found returns NULL
    1824                 :            :  */
    1825                 :          0 : static struct sock *__udp4_lib_mcast_demux_lookup(struct net *net,
    1826                 :            :                                                   __be16 loc_port, __be32 loc_addr,
    1827                 :            :                                                   __be16 rmt_port, __be32 rmt_addr,
    1828                 :            :                                                   int dif)
    1829                 :            : {
    1830                 :            :         struct sock *sk, *result;
    1831                 :            :         struct hlist_nulls_node *node;
    1832         [ -  + ]:      17026 :         unsigned short hnum = ntohs(loc_port);
    1833                 :      17026 :         unsigned int count, slot = udp_hashfn(net, hnum, udp_table.mask);
    1834                 :      17026 :         struct udp_hslot *hslot = &udp_table.hash[slot];
    1835                 :            : 
    1836                 :            :         rcu_read_lock();
    1837                 :            : begin:
    1838                 :            :         count = 0;
    1839                 :            :         result = NULL;
    1840         [ +  + ]:      17195 :         sk_nulls_for_each_rcu(sk, node, &hslot->head) {
    1841         [ +  - ]:        169 :                 if (__udp_is_mcast_sock(net, sk,
    1842                 :            :                                         loc_port, loc_addr,
    1843                 :            :                                         rmt_port, rmt_addr,
    1844                 :            :                                         dif, hnum)) {
    1845                 :            :                         result = sk;
    1846                 :        169 :                         ++count;
    1847                 :            :                 }
    1848                 :            :         }
    1849                 :            :         /*
    1850                 :            :          * if the nulls value we got at the end of this lookup is
    1851                 :            :          * not the expected one, we must restart lookup.
    1852                 :            :          * We probably met an item that was moved to another chain.
    1853                 :            :          */
    1854         [ -  + ]:      17026 :         if (get_nulls_value(node) != slot)
    1855                 :            :                 goto begin;
    1856                 :            : 
    1857         [ +  + ]:      17026 :         if (result) {
    1858 [ +  - ][ +  - ]:        338 :                 if (count != 1 ||
    1859                 :        169 :                     unlikely(!atomic_inc_not_zero_hint(&result->sk_refcnt, 2)))
    1860                 :            :                         result = NULL;
    1861         [ -  + ]:        169 :                 else if (unlikely(!__udp_is_mcast_sock(net, result,
    1862                 :            :                                                        loc_port, loc_addr,
    1863                 :            :                                                        rmt_port, rmt_addr,
    1864                 :            :                                                        dif, hnum))) {
    1865                 :            :                         sock_put(result);
    1866                 :            :                         result = NULL;
    1867                 :            :                 }
    1868                 :            :         }
    1869                 :            :         rcu_read_unlock();
    1870                 :      17026 :         return result;
    1871                 :            : }
    1872                 :            : 
    1873                 :            : /* For unicast we should only early demux connected sockets or we can
    1874                 :            :  * break forwarding setups.  The chains here can be long so only check
    1875                 :            :  * if the first socket is an exact match and if not move on.
    1876                 :            :  */
    1877                 :          0 : static struct sock *__udp4_lib_demux_lookup(struct net *net,
    1878                 :            :                                             __be16 loc_port, __be32 loc_addr,
    1879                 :            :                                             __be16 rmt_port, __be32 rmt_addr,
    1880                 :            :                                             int dif)
    1881                 :            : {
    1882                 :            :         struct sock *sk, *result;
    1883                 :            :         struct hlist_nulls_node *node;
    1884         [ -  + ]:         11 :         unsigned short hnum = ntohs(loc_port);
    1885                 :         11 :         unsigned int hash2 = udp4_portaddr_hash(net, loc_addr, hnum);
    1886                 :         11 :         unsigned int slot2 = hash2 & udp_table.mask;
    1887                 :         11 :         struct udp_hslot *hslot2 = &udp_table.hash2[slot2];
    1888                 :            :         INET_ADDR_COOKIE(acookie, rmt_addr, loc_addr)
    1889                 :         11 :         const __portpair ports = INET_COMBINED_PORTS(rmt_port, hnum);
    1890                 :            : 
    1891                 :            :         rcu_read_lock();
    1892                 :            :         result = NULL;
    1893         [ +  + ]:         11 :         udp_portaddr_for_each_entry_rcu(sk, node, &hslot2->head) {
    1894 [ +  - ][ +  - ]:          8 :                 if (INET_MATCH(sk, net, acookie,
         [ -  + ][ #  # ]
                 [ +  - ]
    1895                 :            :                                rmt_addr, loc_addr, ports, dif))
    1896                 :            :                         result = sk;
    1897                 :            :                 /* Only check first socket in chain */
    1898                 :            :                 break;
    1899                 :            :         }
    1900                 :            : 
    1901         [ +  + ]:         11 :         if (result) {
    1902         [ +  - ]:         16 :                 if (unlikely(!atomic_inc_not_zero_hint(&result->sk_refcnt, 2)))
    1903                 :            :                         result = NULL;
    1904 [ +  - ][ +  - ]:          8 :                 else if (unlikely(!INET_MATCH(sk, net, acookie,
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
         [ #  # ][ +  - ]
                    [ - ]
    1905                 :            :                                               rmt_addr, loc_addr,
    1906                 :            :                                               ports, dif))) {
    1907                 :            :                         sock_put(result);
    1908                 :            :                         result = NULL;
    1909                 :            :                 }
    1910                 :            :         }
    1911                 :            :         rcu_read_unlock();
    1912                 :         11 :         return result;
    1913                 :            : }
    1914                 :            : 
    1915                 :          0 : void udp_v4_early_demux(struct sk_buff *skb)
    1916                 :            : {
    1917                 :            :         struct net *net = dev_net(skb->dev);
    1918                 :            :         const struct iphdr *iph;
    1919                 :            :         const struct udphdr *uh;
    1920                 :            :         struct sock *sk;
    1921                 :            :         struct dst_entry *dst;
    1922                 :      17037 :         int dif = skb->dev->ifindex;
    1923                 :            : 
    1924                 :            :         /* validate the packet */
    1925         [ +  - ]:      17037 :         if (!pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct udphdr)))
    1926                 :            :                 return;
    1927                 :            : 
    1928                 :            :         iph = ip_hdr(skb);
    1929                 :            :         uh = udp_hdr(skb);
    1930                 :            : 
    1931         [ +  + ]:      17037 :         if (skb->pkt_type == PACKET_BROADCAST ||
    1932                 :            :             skb->pkt_type == PACKET_MULTICAST)
    1933                 :      17026 :                 sk = __udp4_lib_mcast_demux_lookup(net, uh->dest, iph->daddr,
    1934                 :            :                                                    uh->source, iph->saddr, dif);
    1935         [ +  - ]:         11 :         else if (skb->pkt_type == PACKET_HOST)
    1936                 :         11 :                 sk = __udp4_lib_demux_lookup(net, uh->dest, iph->daddr,
    1937                 :            :                                              uh->source, iph->saddr, dif);
    1938                 :            :         else
    1939                 :            :                 return;
    1940                 :            : 
    1941         [ +  + ]:      17037 :         if (!sk)
    1942                 :            :                 return;
    1943                 :            : 
    1944                 :        177 :         skb->sk = sk;
    1945                 :        177 :         skb->destructor = sock_edemux;
    1946                 :        177 :         dst = sk->sk_rx_dst;
    1947                 :            : 
    1948         [ +  + ]:        177 :         if (dst)
    1949                 :            :                 dst = dst_check(dst, 0);
    1950         [ +  + ]:        177 :         if (dst)
    1951                 :            :                 skb_dst_set_noref(skb, dst);
    1952                 :            : }
    1953                 :            : 
    1954                 :          0 : int udp_rcv(struct sk_buff *skb)
    1955                 :            : {
    1956                 :      10236 :         return __udp4_lib_rcv(skb, &udp_table, IPPROTO_UDP);
    1957                 :            : }
    1958                 :            : 
    1959                 :          0 : void udp_destroy_sock(struct sock *sk)
    1960                 :            : {
    1961                 :            :         struct udp_sock *up = udp_sk(sk);
    1962                 :         72 :         bool slow = lock_sock_fast(sk);
    1963                 :            :         udp_flush_pending_frames(sk);
    1964                 :            :         unlock_sock_fast(sk, slow);
    1965 [ -  + ][ #  # ]:         72 :         if (static_key_false(&udp_encap_needed) && up->encap_type) {
    1966                 :            :                 void (*encap_destroy)(struct sock *sk);
    1967                 :          0 :                 encap_destroy = ACCESS_ONCE(up->encap_destroy);
    1968         [ #  # ]:          0 :                 if (encap_destroy)
    1969                 :          0 :                         encap_destroy(sk);
    1970                 :            :         }
    1971                 :         72 : }
    1972                 :            : 
    1973                 :            : /*
    1974                 :            :  *      Socket option code for UDP
    1975                 :            :  */
    1976                 :          0 : int udp_lib_setsockopt(struct sock *sk, int level, int optname,
    1977                 :            :                        char __user *optval, unsigned int optlen,
    1978                 :            :                        int (*push_pending_frames)(struct sock *))
    1979                 :            : {
    1980                 :            :         struct udp_sock *up = udp_sk(sk);
    1981                 :            :         int val;
    1982                 :            :         int err = 0;
    1983                 :          0 :         int is_udplite = IS_UDPLITE(sk);
    1984                 :            : 
    1985         [ #  # ]:          0 :         if (optlen < sizeof(int))
    1986                 :            :                 return -EINVAL;
    1987                 :            : 
    1988         [ #  # ]:          0 :         if (get_user(val, (int __user *)optval))
    1989                 :            :                 return -EFAULT;
    1990                 :            : 
    1991   [ #  #  #  #  :          0 :         switch (optname) {
                      # ]
    1992                 :            :         case UDP_CORK:
    1993         [ #  # ]:          0 :                 if (val != 0) {
    1994                 :          0 :                         up->corkflag = 1;
    1995                 :            :                 } else {
    1996                 :          0 :                         up->corkflag = 0;
    1997                 :            :                         lock_sock(sk);
    1998                 :          0 :                         (*push_pending_frames)(sk);
    1999                 :          0 :                         release_sock(sk);
    2000                 :            :                 }
    2001                 :            :                 break;
    2002                 :            : 
    2003                 :            :         case UDP_ENCAP:
    2004      [ #  #  # ]:          0 :                 switch (val) {
    2005                 :            :                 case 0:
    2006                 :            :                 case UDP_ENCAP_ESPINUDP:
    2007                 :            :                 case UDP_ENCAP_ESPINUDP_NON_IKE:
    2008                 :          0 :                         up->encap_rcv = xfrm4_udp_encap_rcv;
    2009                 :            :                         /* FALLTHROUGH */
    2010                 :            :                 case UDP_ENCAP_L2TPINUDP:
    2011                 :          0 :                         up->encap_type = val;
    2012                 :          0 :                         udp_encap_enable();
    2013                 :          0 :                         break;
    2014                 :            :                 default:
    2015                 :            :                         err = -ENOPROTOOPT;
    2016                 :            :                         break;
    2017                 :            :                 }
    2018                 :            :                 break;
    2019                 :            : 
    2020                 :            :         /*
    2021                 :            :          *      UDP-Lite's partial checksum coverage (RFC 3828).
    2022                 :            :          */
    2023                 :            :         /* The sender sets actual checksum coverage length via this option.
    2024                 :            :          * The case coverage > packet length is handled by send module. */
    2025                 :            :         case UDPLITE_SEND_CSCOV:
    2026         [ #  # ]:          0 :                 if (!is_udplite)         /* Disable the option on UDP sockets */
    2027                 :            :                         return -ENOPROTOOPT;
    2028         [ #  # ]:          0 :                 if (val != 0 && val < 8) /* Illegal coverage: use default (8) */
    2029                 :            :                         val = 8;
    2030         [ #  # ]:          0 :                 else if (val > USHRT_MAX)
    2031                 :            :                         val = USHRT_MAX;
    2032                 :          0 :                 up->pcslen = val;
    2033                 :          0 :                 up->pcflag |= UDPLITE_SEND_CC;
    2034                 :          0 :                 break;
    2035                 :            : 
    2036                 :            :         /* The receiver specifies a minimum checksum coverage value. To make
    2037                 :            :          * sense, this should be set to at least 8 (as done below). If zero is
    2038                 :            :          * used, this again means full checksum coverage.                     */
    2039                 :            :         case UDPLITE_RECV_CSCOV:
    2040         [ #  # ]:          0 :                 if (!is_udplite)         /* Disable the option on UDP sockets */
    2041                 :            :                         return -ENOPROTOOPT;
    2042         [ #  # ]:          0 :                 if (val != 0 && val < 8) /* Avoid silly minimal values.       */
    2043                 :            :                         val = 8;
    2044         [ #  # ]:          0 :                 else if (val > USHRT_MAX)
    2045                 :            :                         val = USHRT_MAX;
    2046                 :          0 :                 up->pcrlen = val;
    2047                 :          0 :                 up->pcflag |= UDPLITE_RECV_CC;
    2048                 :          0 :                 break;
    2049                 :            : 
    2050                 :            :         default:
    2051                 :            :                 err = -ENOPROTOOPT;
    2052                 :            :                 break;
    2053                 :            :         }
    2054                 :            : 
    2055                 :          0 :         return err;
    2056                 :            : }
    2057                 :            : EXPORT_SYMBOL(udp_lib_setsockopt);
    2058                 :            : 
    2059                 :          0 : int udp_setsockopt(struct sock *sk, int level, int optname,
    2060                 :            :                    char __user *optval, unsigned int optlen)
    2061                 :            : {
    2062         [ #  # ]:          0 :         if (level == SOL_UDP  ||  level == SOL_UDPLITE)
    2063                 :          0 :                 return udp_lib_setsockopt(sk, level, optname, optval, optlen,
    2064                 :            :                                           udp_push_pending_frames);
    2065                 :          0 :         return ip_setsockopt(sk, level, optname, optval, optlen);
    2066                 :            : }
    2067                 :            : 
    2068                 :            : #ifdef CONFIG_COMPAT
    2069                 :            : int compat_udp_setsockopt(struct sock *sk, int level, int optname,
    2070                 :            :                           char __user *optval, unsigned int optlen)
    2071                 :            : {
    2072                 :            :         if (level == SOL_UDP  ||  level == SOL_UDPLITE)
    2073                 :            :                 return udp_lib_setsockopt(sk, level, optname, optval, optlen,
    2074                 :            :                                           udp_push_pending_frames);
    2075                 :            :         return compat_ip_setsockopt(sk, level, optname, optval, optlen);
    2076                 :            : }
    2077                 :            : #endif
    2078                 :            : 
    2079                 :          0 : int udp_lib_getsockopt(struct sock *sk, int level, int optname,
    2080                 :            :                        char __user *optval, int __user *optlen)
    2081                 :            : {
    2082                 :            :         struct udp_sock *up = udp_sk(sk);
    2083                 :            :         int val, len;
    2084                 :            : 
    2085         [ #  # ]:          0 :         if (get_user(len, optlen))
    2086                 :            :                 return -EFAULT;
    2087                 :            : 
    2088                 :          0 :         len = min_t(unsigned int, len, sizeof(int));
    2089                 :            : 
    2090         [ #  # ]:          0 :         if (len < 0)
    2091                 :            :                 return -EINVAL;
    2092                 :            : 
    2093   [ #  #  #  #  :          0 :         switch (optname) {
                      # ]
    2094                 :            :         case UDP_CORK:
    2095                 :          0 :                 val = up->corkflag;
    2096                 :          0 :                 break;
    2097                 :            : 
    2098                 :            :         case UDP_ENCAP:
    2099                 :          0 :                 val = up->encap_type;
    2100                 :          0 :                 break;
    2101                 :            : 
    2102                 :            :         /* The following two cannot be changed on UDP sockets, the return is
    2103                 :            :          * always 0 (which corresponds to the full checksum coverage of UDP). */
    2104                 :            :         case UDPLITE_SEND_CSCOV:
    2105                 :          0 :                 val = up->pcslen;
    2106                 :          0 :                 break;
    2107                 :            : 
    2108                 :            :         case UDPLITE_RECV_CSCOV:
    2109                 :          0 :                 val = up->pcrlen;
    2110                 :          0 :                 break;
    2111                 :            : 
    2112                 :            :         default:
    2113                 :            :                 return -ENOPROTOOPT;
    2114                 :            :         }
    2115                 :            : 
    2116         [ #  # ]:          0 :         if (put_user(len, optlen))
    2117                 :            :                 return -EFAULT;
    2118         [ #  # ]:          0 :         if (copy_to_user(optval, &val, len))
    2119                 :            :                 return -EFAULT;
    2120                 :          0 :         return 0;
    2121                 :            : }
    2122                 :            : EXPORT_SYMBOL(udp_lib_getsockopt);
    2123                 :            : 
    2124                 :          0 : int udp_getsockopt(struct sock *sk, int level, int optname,
    2125                 :            :                    char __user *optval, int __user *optlen)
    2126                 :            : {
    2127         [ #  # ]:          0 :         if (level == SOL_UDP  ||  level == SOL_UDPLITE)
    2128                 :          0 :                 return udp_lib_getsockopt(sk, level, optname, optval, optlen);
    2129                 :          0 :         return ip_getsockopt(sk, level, optname, optval, optlen);
    2130                 :            : }
    2131                 :            : 
    2132                 :            : #ifdef CONFIG_COMPAT
    2133                 :            : int compat_udp_getsockopt(struct sock *sk, int level, int optname,
    2134                 :            :                                  char __user *optval, int __user *optlen)
    2135                 :            : {
    2136                 :            :         if (level == SOL_UDP  ||  level == SOL_UDPLITE)
    2137                 :            :                 return udp_lib_getsockopt(sk, level, optname, optval, optlen);
    2138                 :            :         return compat_ip_getsockopt(sk, level, optname, optval, optlen);
    2139                 :            : }
    2140                 :            : #endif
    2141                 :            : /**
    2142                 :            :  *      udp_poll - wait for a UDP event.
    2143                 :            :  *      @file - file struct
    2144                 :            :  *      @sock - socket
    2145                 :            :  *      @wait - poll table
    2146                 :            :  *
    2147                 :            :  *      This is same as datagram poll, except for the special case of
    2148                 :            :  *      blocking sockets. If application is using a blocking fd
    2149                 :            :  *      and a packet with checksum error is in the queue;
    2150                 :            :  *      then it could get return from select indicating data available
    2151                 :            :  *      but then block when reading it. Add special case code
    2152                 :            :  *      to work around these arguably broken applications.
    2153                 :            :  */
    2154                 :          0 : unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait)
    2155                 :            : {
    2156                 :        380 :         unsigned int mask = datagram_poll(file, sock, wait);
    2157                 :        380 :         struct sock *sk = sock->sk;
    2158                 :            : 
    2159                 :            :         sock_rps_record_flow(sk);
    2160                 :            : 
    2161                 :            :         /* Check for false positives due to checksum errors */
    2162 [ +  + ][ +  + ]:        380 :         if ((mask & POLLRDNORM) && !(file->f_flags & O_NONBLOCK) &&
                 [ +  - ]
    2163         [ -  + ]:        172 :             !(sk->sk_shutdown & RCV_SHUTDOWN) && !first_packet_length(sk))
    2164                 :          0 :                 mask &= ~(POLLIN | POLLRDNORM);
    2165                 :            : 
    2166                 :        380 :         return mask;
    2167                 :            : 
    2168                 :            : }
    2169                 :            : EXPORT_SYMBOL(udp_poll);
    2170                 :            : 
    2171                 :            : struct proto udp_prot = {
    2172                 :            :         .name              = "UDP",
    2173                 :            :         .owner             = THIS_MODULE,
    2174                 :            :         .close             = udp_lib_close,
    2175                 :            :         .connect           = ip4_datagram_connect,
    2176                 :            :         .disconnect        = udp_disconnect,
    2177                 :            :         .ioctl             = udp_ioctl,
    2178                 :            :         .destroy           = udp_destroy_sock,
    2179                 :            :         .setsockopt        = udp_setsockopt,
    2180                 :            :         .getsockopt        = udp_getsockopt,
    2181                 :            :         .sendmsg           = udp_sendmsg,
    2182                 :            :         .recvmsg           = udp_recvmsg,
    2183                 :            :         .sendpage          = udp_sendpage,
    2184                 :            :         .backlog_rcv       = __udp_queue_rcv_skb,
    2185                 :            :         .release_cb        = ip4_datagram_release_cb,
    2186                 :            :         .hash              = udp_lib_hash,
    2187                 :            :         .unhash            = udp_lib_unhash,
    2188                 :            :         .rehash            = udp_v4_rehash,
    2189                 :            :         .get_port          = udp_v4_get_port,
    2190                 :            :         .memory_allocated  = &udp_memory_allocated,
    2191                 :            :         .sysctl_mem        = sysctl_udp_mem,
    2192                 :            :         .sysctl_wmem       = &sysctl_udp_wmem_min,
    2193                 :            :         .sysctl_rmem       = &sysctl_udp_rmem_min,
    2194                 :            :         .obj_size          = sizeof(struct udp_sock),
    2195                 :            :         .slab_flags        = SLAB_DESTROY_BY_RCU,
    2196                 :            :         .h.udp_table       = &udp_table,
    2197                 :            : #ifdef CONFIG_COMPAT
    2198                 :            :         .compat_setsockopt = compat_udp_setsockopt,
    2199                 :            :         .compat_getsockopt = compat_udp_getsockopt,
    2200                 :            : #endif
    2201                 :            :         .clear_sk          = sk_prot_clear_portaddr_nulls,
    2202                 :            : };
    2203                 :            : EXPORT_SYMBOL(udp_prot);
    2204                 :            : 
    2205                 :            : /* ------------------------------------------------------------------------ */
    2206                 :            : #ifdef CONFIG_PROC_FS
    2207                 :            : 
    2208                 :         14 : static struct sock *udp_get_first(struct seq_file *seq, int start)
    2209                 :            : {
    2210                 :            :         struct sock *sk;
    2211                 :         14 :         struct udp_iter_state *state = seq->private;
    2212                 :            :         struct net *net = seq_file_net(seq);
    2213                 :            : 
    2214         [ +  + ]:       4104 :         for (state->bucket = start; state->bucket <= state->udp_table->mask;
    2215                 :       4090 :              ++state->bucket) {
    2216                 :            :                 struct hlist_nulls_node *node;
    2217                 :       4096 :                 struct udp_hslot *hslot = &state->udp_table->hash[state->bucket];
    2218                 :            : 
    2219         [ +  + ]:       4096 :                 if (hlist_nulls_empty(&hslot->head))
    2220                 :       4084 :                         continue;
    2221                 :            : 
    2222                 :            :                 spin_lock_bh(&hslot->lock);
    2223         [ +  + ]:         18 :                 sk_nulls_for_each(sk, node, &hslot->head) {
    2224                 :            :                         if (!net_eq(sock_net(sk), net))
    2225                 :            :                                 continue;
    2226         [ +  + ]:         12 :                         if (sk->sk_family == state->family)
    2227                 :            :                                 goto found;
    2228                 :            :                 }
    2229                 :            :                 spin_unlock_bh(&hslot->lock);
    2230                 :            :         }
    2231                 :            :         sk = NULL;
    2232                 :            : found:
    2233                 :         14 :         return sk;
    2234                 :            : }
    2235                 :            : 
    2236                 :          0 : static struct sock *udp_get_next(struct seq_file *seq, struct sock *sk)
    2237                 :            : {
    2238                 :          6 :         struct udp_iter_state *state = seq->private;
    2239                 :            :         struct net *net = seq_file_net(seq);
    2240                 :            : 
    2241                 :            :         do {
    2242                 :            :                 sk = sk_nulls_next(sk);
    2243 [ -  + ][ #  # ]:          6 :         } while (sk && (!net_eq(sock_net(sk), net) || sk->sk_family != state->family));
    2244                 :            : 
    2245         [ +  - ]:          6 :         if (!sk) {
    2246         [ +  - ]:          6 :                 if (state->bucket <= state->udp_table->mask)
    2247                 :          6 :                         spin_unlock_bh(&state->udp_table->hash[state->bucket].lock);
    2248                 :          6 :                 return udp_get_first(seq, state->bucket + 1);
    2249                 :            :         }
    2250                 :            :         return sk;
    2251                 :            : }
    2252                 :            : 
    2253                 :          0 : static struct sock *udp_get_idx(struct seq_file *seq, loff_t pos)
    2254                 :            : {
    2255                 :          8 :         struct sock *sk = udp_get_first(seq, 0);
    2256                 :            : 
    2257         [ +  + ]:          8 :         if (sk)
    2258 [ +  + ][ +  + ]:          5 :                 while (pos && (sk = udp_get_next(seq, sk)) != NULL)
    2259                 :          1 :                         --pos;
    2260         [ #  # ]:          8 :         return pos ? NULL : sk;
    2261                 :            : }
    2262                 :            : 
    2263                 :          0 : static void *udp_seq_start(struct seq_file *seq, loff_t *pos)
    2264                 :            : {
    2265                 :          8 :         struct udp_iter_state *state = seq->private;
    2266                 :          8 :         state->bucket = MAX_UDP_PORTS;
    2267                 :            : 
    2268         [ +  + ]:          8 :         return *pos ? udp_get_idx(seq, *pos-1) : SEQ_START_TOKEN;
    2269                 :            : }
    2270                 :            : 
    2271                 :          0 : static void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
    2272                 :            : {
    2273                 :            :         struct sock *sk;
    2274                 :            : 
    2275         [ +  + ]:          7 :         if (v == SEQ_START_TOKEN)
    2276                 :          4 :                 sk = udp_get_idx(seq, 0);
    2277                 :            :         else
    2278                 :          3 :                 sk = udp_get_next(seq, v);
    2279                 :            : 
    2280                 :          7 :         ++*pos;
    2281                 :          7 :         return sk;
    2282                 :            : }
    2283                 :            : 
    2284                 :          0 : static void udp_seq_stop(struct seq_file *seq, void *v)
    2285                 :            : {
    2286                 :          8 :         struct udp_iter_state *state = seq->private;
    2287                 :            : 
    2288         [ -  + ]:          8 :         if (state->bucket <= state->udp_table->mask)
    2289                 :          0 :                 spin_unlock_bh(&state->udp_table->hash[state->bucket].lock);
    2290                 :          0 : }
    2291                 :            : 
    2292                 :          0 : int udp_seq_open(struct inode *inode, struct file *file)
    2293                 :            : {
    2294                 :          4 :         struct udp_seq_afinfo *afinfo = PDE_DATA(inode);
    2295                 :            :         struct udp_iter_state *s;
    2296                 :            :         int err;
    2297                 :            : 
    2298                 :          4 :         err = seq_open_net(inode, file, &afinfo->seq_ops,
    2299                 :            :                            sizeof(struct udp_iter_state));
    2300         [ +  - ]:          4 :         if (err < 0)
    2301                 :            :                 return err;
    2302                 :            : 
    2303                 :          4 :         s = ((struct seq_file *)file->private_data)->private;
    2304                 :          4 :         s->family            = afinfo->family;
    2305                 :          4 :         s->udp_table         = afinfo->udp_table;
    2306                 :          4 :         return err;
    2307                 :            : }
    2308                 :            : EXPORT_SYMBOL(udp_seq_open);
    2309                 :            : 
    2310                 :            : /* ------------------------------------------------------------------------ */
    2311                 :          0 : int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo)
    2312                 :            : {
    2313                 :            :         struct proc_dir_entry *p;
    2314                 :            :         int rc = 0;
    2315                 :            : 
    2316                 :          0 :         afinfo->seq_ops.start                = udp_seq_start;
    2317                 :          0 :         afinfo->seq_ops.next         = udp_seq_next;
    2318                 :          0 :         afinfo->seq_ops.stop         = udp_seq_stop;
    2319                 :            : 
    2320                 :          0 :         p = proc_create_data(afinfo->name, S_IRUGO, net->proc_net,
    2321                 :            :                              afinfo->seq_fops, afinfo);
    2322         [ #  # ]:          0 :         if (!p)
    2323                 :            :                 rc = -ENOMEM;
    2324                 :          0 :         return rc;
    2325                 :            : }
    2326                 :            : EXPORT_SYMBOL(udp_proc_register);
    2327                 :            : 
    2328                 :          0 : void udp_proc_unregister(struct net *net, struct udp_seq_afinfo *afinfo)
    2329                 :            : {
    2330                 :          0 :         remove_proc_entry(afinfo->name, net->proc_net);
    2331                 :          0 : }
    2332                 :            : EXPORT_SYMBOL(udp_proc_unregister);
    2333                 :            : 
    2334                 :            : /* ------------------------------------------------------------------------ */
    2335                 :          0 : static void udp4_format_sock(struct sock *sp, struct seq_file *f,
    2336                 :            :                 int bucket)
    2337                 :            : {
    2338                 :            :         struct inet_sock *inet = inet_sk(sp);
    2339                 :          2 :         __be32 dest = inet->inet_daddr;
    2340                 :          2 :         __be32 src  = inet->inet_rcv_saddr;
    2341         [ -  + ]:          2 :         __u16 destp       = ntohs(inet->inet_dport);
    2342         [ -  + ]:          2 :         __u16 srcp        = ntohs(inet->inet_sport);
    2343                 :            : 
    2344                 :          4 :         seq_printf(f, "%5d: %08X:%04X %08X:%04X"
    2345                 :            :                 " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d",
    2346                 :          2 :                 bucket, src, srcp, dest, destp, sp->sk_state,
    2347                 :            :                 sk_wmem_alloc_get(sp),
    2348                 :            :                 sk_rmem_alloc_get(sp),
    2349                 :            :                 0, 0L, 0,
    2350                 :            :                 from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)),
    2351                 :            :                 0, sock_i_ino(sp),
    2352                 :            :                 atomic_read(&sp->sk_refcnt), sp,
    2353                 :            :                 atomic_read(&sp->sk_drops));
    2354                 :          2 : }
    2355                 :            : 
    2356                 :          0 : int udp4_seq_show(struct seq_file *seq, void *v)
    2357                 :            : {
    2358                 :            :         seq_setwidth(seq, 127);
    2359         [ +  + ]:          4 :         if (v == SEQ_START_TOKEN)
    2360                 :          2 :                 seq_puts(seq, "  sl  local_address rem_address   st tx_queue "
    2361                 :            :                            "rx_queue tr tm->when retrnsmt   uid  timeout "
    2362                 :            :                            "inode ref pointer drops");
    2363                 :            :         else {
    2364                 :          2 :                 struct udp_iter_state *state = seq->private;
    2365                 :            : 
    2366                 :          2 :                 udp4_format_sock(v, seq, state->bucket);
    2367                 :            :         }
    2368                 :          4 :         seq_pad(seq, '\n');
    2369                 :          4 :         return 0;
    2370                 :            : }
    2371                 :            : 
    2372                 :            : static const struct file_operations udp_afinfo_seq_fops = {
    2373                 :            :         .owner    = THIS_MODULE,
    2374                 :            :         .open     = udp_seq_open,
    2375                 :            :         .read     = seq_read,
    2376                 :            :         .llseek   = seq_lseek,
    2377                 :            :         .release  = seq_release_net
    2378                 :            : };
    2379                 :            : 
    2380                 :            : /* ------------------------------------------------------------------------ */
    2381                 :            : static struct udp_seq_afinfo udp4_seq_afinfo = {
    2382                 :            :         .name           = "udp",
    2383                 :            :         .family         = AF_INET,
    2384                 :            :         .udp_table      = &udp_table,
    2385                 :            :         .seq_fops       = &udp_afinfo_seq_fops,
    2386                 :            :         .seq_ops        = {
    2387                 :            :                 .show           = udp4_seq_show,
    2388                 :            :         },
    2389                 :            : };
    2390                 :            : 
    2391                 :          0 : static int __net_init udp4_proc_init_net(struct net *net)
    2392                 :            : {
    2393                 :          0 :         return udp_proc_register(net, &udp4_seq_afinfo);
    2394                 :            : }
    2395                 :            : 
    2396                 :          0 : static void __net_exit udp4_proc_exit_net(struct net *net)
    2397                 :            : {
    2398                 :            :         udp_proc_unregister(net, &udp4_seq_afinfo);
    2399                 :          0 : }
    2400                 :            : 
    2401                 :            : static struct pernet_operations udp4_net_ops = {
    2402                 :            :         .init = udp4_proc_init_net,
    2403                 :            :         .exit = udp4_proc_exit_net,
    2404                 :            : };
    2405                 :            : 
    2406                 :          0 : int __init udp4_proc_init(void)
    2407                 :            : {
    2408                 :          0 :         return register_pernet_subsys(&udp4_net_ops);
    2409                 :            : }
    2410                 :            : 
    2411                 :          0 : void udp4_proc_exit(void)
    2412                 :            : {
    2413                 :          0 :         unregister_pernet_subsys(&udp4_net_ops);
    2414                 :          0 : }
    2415                 :            : #endif /* CONFIG_PROC_FS */
    2416                 :            : 
    2417                 :            : static __initdata unsigned long uhash_entries;
    2418                 :          0 : static int __init set_uhash_entries(char *str)
    2419                 :            : {
    2420                 :            :         ssize_t ret;
    2421                 :            : 
    2422         [ #  # ]:          0 :         if (!str)
    2423                 :            :                 return 0;
    2424                 :            : 
    2425                 :            :         ret = kstrtoul(str, 0, &uhash_entries);
    2426         [ #  # ]:          0 :         if (ret)
    2427                 :            :                 return 0;
    2428                 :            : 
    2429         [ #  # ]:          0 :         if (uhash_entries && uhash_entries < UDP_HTABLE_SIZE_MIN)
    2430                 :          0 :                 uhash_entries = UDP_HTABLE_SIZE_MIN;
    2431                 :            :         return 1;
    2432                 :            : }
    2433                 :            : __setup("uhash_entries=", set_uhash_entries);
    2434                 :            : 
    2435                 :          0 : void __init udp_table_init(struct udp_table *table, const char *name)
    2436                 :            : {
    2437                 :            :         unsigned int i;
    2438                 :            : 
    2439                 :          0 :         table->hash = alloc_large_system_hash(name,
    2440                 :            :                                               2 * sizeof(struct udp_hslot),
    2441                 :            :                                               uhash_entries,
    2442                 :            :                                               21, /* one slot per 2 MB */
    2443                 :            :                                               0,
    2444                 :            :                                               &table->log,
    2445                 :            :                                               &table->mask,
    2446                 :            :                                               UDP_HTABLE_SIZE_MIN,
    2447                 :            :                                               64 * 1024);
    2448                 :            : 
    2449                 :          0 :         table->hash2 = table->hash + (table->mask + 1);
    2450         [ #  # ]:          0 :         for (i = 0; i <= table->mask; i++) {
    2451                 :          0 :                 INIT_HLIST_NULLS_HEAD(&table->hash[i].head, i);
    2452                 :          0 :                 table->hash[i].count = 0;
    2453                 :          0 :                 spin_lock_init(&table->hash[i].lock);
    2454                 :            :         }
    2455         [ #  # ]:          0 :         for (i = 0; i <= table->mask; i++) {
    2456                 :          0 :                 INIT_HLIST_NULLS_HEAD(&table->hash2[i].head, i);
    2457                 :          0 :                 table->hash2[i].count = 0;
    2458                 :          0 :                 spin_lock_init(&table->hash2[i].lock);
    2459                 :            :         }
    2460                 :          0 : }
    2461                 :            : 
    2462                 :          0 : void __init udp_init(void)
    2463                 :            : {
    2464                 :            :         unsigned long limit;
    2465                 :            : 
    2466                 :          0 :         udp_table_init(&udp_table, "UDP");
    2467                 :          0 :         limit = nr_free_buffer_pages() / 8;
    2468                 :          0 :         limit = max(limit, 128UL);
    2469                 :          0 :         sysctl_udp_mem[0] = limit / 4 * 3;
    2470                 :          0 :         sysctl_udp_mem[1] = limit;
    2471                 :          0 :         sysctl_udp_mem[2] = sysctl_udp_mem[0] * 2;
    2472                 :            : 
    2473                 :          0 :         sysctl_udp_rmem_min = SK_MEM_QUANTUM;
    2474                 :          0 :         sysctl_udp_wmem_min = SK_MEM_QUANTUM;
    2475                 :          0 : }
    2476                 :            : 
    2477                 :          0 : struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb,
    2478                 :            :                                        netdev_features_t features)
    2479                 :            : {
    2480                 :            :         struct sk_buff *segs = ERR_PTR(-EINVAL);
    2481                 :          0 :         u16 mac_offset = skb->mac_header;
    2482                 :          0 :         int mac_len = skb->mac_len;
    2483                 :          0 :         int tnl_hlen = skb_inner_mac_header(skb) - skb_transport_header(skb);
    2484                 :          0 :         __be16 protocol = skb->protocol;
    2485                 :            :         netdev_features_t enc_features;
    2486                 :            :         int outer_hlen;
    2487                 :            : 
    2488         [ #  # ]:          0 :         if (unlikely(!pskb_may_pull(skb, tnl_hlen)))
    2489                 :            :                 goto out;
    2490                 :            : 
    2491                 :          0 :         skb->encapsulation = 0;
    2492                 :            :         __skb_pull(skb, tnl_hlen);
    2493                 :            :         skb_reset_mac_header(skb);
    2494                 :            :         skb_set_network_header(skb, skb_inner_network_offset(skb));
    2495                 :          0 :         skb->mac_len = skb_inner_network_offset(skb);
    2496                 :          0 :         skb->protocol = htons(ETH_P_TEB);
    2497                 :            : 
    2498                 :            :         /* segment inner packet. */
    2499                 :          0 :         enc_features = skb->dev->hw_enc_features & netif_skb_features(skb);
    2500                 :          0 :         segs = skb_mac_gso_segment(skb, enc_features);
    2501 [ #  # ][ #  # ]:          0 :         if (!segs || IS_ERR(segs)) {
    2502                 :            :                 skb_gso_error_unwind(skb, protocol, tnl_hlen, mac_offset,
    2503                 :            :                                      mac_len);
    2504                 :            :                 goto out;
    2505                 :            :         }
    2506                 :            : 
    2507                 :            :         outer_hlen = skb_tnl_header_len(skb);
    2508                 :            :         skb = segs;
    2509                 :            :         do {
    2510                 :            :                 struct udphdr *uh;
    2511                 :          0 :                 int udp_offset = outer_hlen - tnl_hlen;
    2512                 :            : 
    2513                 :            :                 skb_reset_inner_headers(skb);
    2514                 :          0 :                 skb->encapsulation = 1;
    2515                 :            : 
    2516                 :          0 :                 skb->mac_len = mac_len;
    2517                 :            : 
    2518                 :          0 :                 skb_push(skb, outer_hlen);
    2519                 :            :                 skb_reset_mac_header(skb);
    2520                 :            :                 skb_set_network_header(skb, mac_len);
    2521                 :            :                 skb_set_transport_header(skb, udp_offset);
    2522                 :            :                 uh = udp_hdr(skb);
    2523         [ #  # ]:          0 :                 uh->len = htons(skb->len - udp_offset);
    2524                 :            : 
    2525                 :            :                 /* csum segment if tunnel sets skb with csum. */
    2526 [ #  # ][ #  # ]:          0 :                 if (protocol == htons(ETH_P_IP) && unlikely(uh->check)) {
    2527                 :            :                         struct iphdr *iph = ip_hdr(skb);
    2528                 :            : 
    2529                 :          0 :                         uh->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
    2530                 :          0 :                                                        skb->len - udp_offset,
    2531                 :            :                                                        IPPROTO_UDP, 0);
    2532                 :          0 :                         uh->check = csum_fold(skb_checksum(skb, udp_offset,
    2533                 :          0 :                                                            skb->len - udp_offset, 0));
    2534         [ #  # ]:          0 :                         if (uh->check == 0)
    2535                 :          0 :                                 uh->check = CSUM_MANGLED_0;
    2536                 :            : 
    2537         [ #  # ]:          0 :                 } else if (protocol == htons(ETH_P_IPV6)) {
    2538                 :            :                         struct ipv6hdr *ipv6h = ipv6_hdr(skb);
    2539                 :          0 :                         u32 len = skb->len - udp_offset;
    2540                 :            : 
    2541                 :          0 :                         uh->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr,
    2542                 :            :                                                      len, IPPROTO_UDP, 0);
    2543                 :          0 :                         uh->check = csum_fold(skb_checksum(skb, udp_offset, len, 0));
    2544         [ #  # ]:          0 :                         if (uh->check == 0)
    2545                 :          0 :                                 uh->check = CSUM_MANGLED_0;
    2546                 :          0 :                         skb->ip_summed = CHECKSUM_NONE;
    2547                 :            :                 }
    2548                 :            : 
    2549                 :          0 :                 skb->protocol = protocol;
    2550         [ #  # ]:          0 :         } while ((skb = skb->next));
    2551                 :            : out:
    2552                 :          0 :         return segs;
    2553                 :            : }

Generated by: LCOV version 1.9