root/net/ipv4/igmp.c

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

DEFINITIONS

This source file includes following definitions.
  1. unsolicited_report_interval
  2. ip_ma_put
  3. ip_sf_list_clear_all
  4. igmp_stop_timer
  5. igmp_start_timer
  6. igmp_gq_start_timer
  7. igmp_ifc_start_timer
  8. igmp_mod_timer
  9. igmp_scount
  10. igmpv3_get_srcaddr
  11. igmpv3_newpack
  12. igmpv3_sendpack
  13. grec_size
  14. add_grhead
  15. add_grec
  16. igmpv3_send_report
  17. igmpv3_clear_zeros
  18. kfree_pmc
  19. igmpv3_send_cr
  20. igmp_send_report
  21. igmp_gq_timer_expire
  22. igmp_ifc_timer_expire
  23. igmp_ifc_event
  24. igmp_timer_expire
  25. igmp_xmarksources
  26. igmp_marksources
  27. igmp_heard_report
  28. igmp_heard_query
  29. igmp_rcv
  30. ip_mc_filter_add
  31. ip_mc_filter_del
  32. igmpv3_add_delrec
  33. igmpv3_del_delrec
  34. igmpv3_clear_delrec
  35. __igmp_group_dropped
  36. igmp_group_dropped
  37. igmp_group_added
  38. ip_mc_hash
  39. ip_mc_hash_add
  40. ip_mc_hash_remove
  41. ____ip_mc_inc_group
  42. __ip_mc_inc_group
  43. ip_mc_inc_group
  44. ip_mc_check_iphdr
  45. ip_mc_check_igmp_reportv3
  46. ip_mc_check_igmp_query
  47. ip_mc_check_igmp_msg
  48. ip_mc_validate_checksum
  49. ip_mc_check_igmp_csum
  50. ip_mc_check_igmp
  51. ip_mc_rejoin_groups
  52. __ip_mc_dec_group
  53. ip_mc_unmap
  54. ip_mc_remap
  55. ip_mc_down
  56. ip_mc_reset
  57. ip_mc_reset
  58. ip_mc_init_dev
  59. ip_mc_up
  60. ip_mc_destroy_dev
  61. ip_mc_find_dev
  62. ip_mc_del1_src
  63. ip_mc_del_src
  64. ip_mc_add1_src
  65. sf_markstate
  66. sf_setstate
  67. ip_mc_add_src
  68. ip_mc_clear_src
  69. __ip_mc_join_group
  70. ip_mc_join_group
  71. ip_mc_join_group_ssm
  72. ip_mc_leave_src
  73. ip_mc_leave_group
  74. ip_mc_source
  75. ip_mc_msfilter
  76. ip_mc_msfget
  77. ip_mc_gsfget
  78. ip_mc_sf_allow
  79. ip_mc_drop_socket
  80. ip_check_mc_rcu
  81. igmp_mc_get_first
  82. igmp_mc_get_next
  83. igmp_mc_get_idx
  84. igmp_mc_seq_start
  85. igmp_mc_seq_next
  86. igmp_mc_seq_stop
  87. igmp_mc_seq_show
  88. igmp_mcf_get_first
  89. igmp_mcf_get_next
  90. igmp_mcf_get_idx
  91. igmp_mcf_seq_start
  92. igmp_mcf_seq_next
  93. igmp_mcf_seq_stop
  94. igmp_mcf_seq_show
  95. igmp_net_init
  96. igmp_net_exit
  97. igmp_netdev_event
  98. igmp_mc_init

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *      Linux NET3:     Internet Group Management Protocol  [IGMP]
   4  *
   5  *      This code implements the IGMP protocol as defined in RFC1112. There has
   6  *      been a further revision of this protocol since which is now supported.
   7  *
   8  *      If you have trouble with this module be careful what gcc you have used,
   9  *      the older version didn't come out right using gcc 2.5.8, the newer one
  10  *      seems to fall out with gcc 2.6.2.
  11  *
  12  *      Authors:
  13  *              Alan Cox <alan@lxorguk.ukuu.org.uk>
  14  *
  15  *      Fixes:
  16  *
  17  *              Alan Cox        :       Added lots of __inline__ to optimise
  18  *                                      the memory usage of all the tiny little
  19  *                                      functions.
  20  *              Alan Cox        :       Dumped the header building experiment.
  21  *              Alan Cox        :       Minor tweaks ready for multicast routing
  22  *                                      and extended IGMP protocol.
  23  *              Alan Cox        :       Removed a load of inline directives. Gcc 2.5.8
  24  *                                      writes utterly bogus code otherwise (sigh)
  25  *                                      fixed IGMP loopback to behave in the manner
  26  *                                      desired by mrouted, fixed the fact it has been
  27  *                                      broken since 1.3.6 and cleaned up a few minor
  28  *                                      points.
  29  *
  30  *              Chih-Jen Chang  :       Tried to revise IGMP to Version 2
  31  *              Tsu-Sheng Tsao          E-mail: chihjenc@scf.usc.edu and tsusheng@scf.usc.edu
  32  *                                      The enhancements are mainly based on Steve Deering's
  33  *                                      ipmulti-3.5 source code.
  34  *              Chih-Jen Chang  :       Added the igmp_get_mrouter_info and
  35  *              Tsu-Sheng Tsao          igmp_set_mrouter_info to keep track of
  36  *                                      the mrouted version on that device.
  37  *              Chih-Jen Chang  :       Added the max_resp_time parameter to
  38  *              Tsu-Sheng Tsao          igmp_heard_query(). Using this parameter
  39  *                                      to identify the multicast router version
  40  *                                      and do what the IGMP version 2 specified.
  41  *              Chih-Jen Chang  :       Added a timer to revert to IGMP V2 router
  42  *              Tsu-Sheng Tsao          if the specified time expired.
  43  *              Alan Cox        :       Stop IGMP from 0.0.0.0 being accepted.
  44  *              Alan Cox        :       Use GFP_ATOMIC in the right places.
  45  *              Christian Daudt :       igmp timer wasn't set for local group
  46  *                                      memberships but was being deleted,
  47  *                                      which caused a "del_timer() called
  48  *                                      from %p with timer not initialized\n"
  49  *                                      message (960131).
  50  *              Christian Daudt :       removed del_timer from
  51  *                                      igmp_timer_expire function (960205).
  52  *             Christian Daudt :       igmp_heard_report now only calls
  53  *                                     igmp_timer_expire if tm->running is
  54  *                                     true (960216).
  55  *              Malcolm Beattie :       ttl comparison wrong in igmp_rcv made
  56  *                                      igmp_heard_query never trigger. Expiry
  57  *                                      miscalculation fixed in igmp_heard_query
  58  *                                      and random() made to return unsigned to
  59  *                                      prevent negative expiry times.
  60  *              Alexey Kuznetsov:       Wrong group leaving behaviour, backport
  61  *                                      fix from pending 2.1.x patches.
  62  *              Alan Cox:               Forget to enable FDDI support earlier.
  63  *              Alexey Kuznetsov:       Fixed leaving groups on device down.
  64  *              Alexey Kuznetsov:       Accordance to igmp-v2-06 draft.
  65  *              David L Stevens:        IGMPv3 support, with help from
  66  *                                      Vinay Kulkarni
  67  */
  68 
  69 #include <linux/module.h>
  70 #include <linux/slab.h>
  71 #include <linux/uaccess.h>
  72 #include <linux/types.h>
  73 #include <linux/kernel.h>
  74 #include <linux/jiffies.h>
  75 #include <linux/string.h>
  76 #include <linux/socket.h>
  77 #include <linux/sockios.h>
  78 #include <linux/in.h>
  79 #include <linux/inet.h>
  80 #include <linux/netdevice.h>
  81 #include <linux/skbuff.h>
  82 #include <linux/inetdevice.h>
  83 #include <linux/igmp.h>
  84 #include <linux/if_arp.h>
  85 #include <linux/rtnetlink.h>
  86 #include <linux/times.h>
  87 #include <linux/pkt_sched.h>
  88 #include <linux/byteorder/generic.h>
  89 
  90 #include <net/net_namespace.h>
  91 #include <net/arp.h>
  92 #include <net/ip.h>
  93 #include <net/protocol.h>
  94 #include <net/route.h>
  95 #include <net/sock.h>
  96 #include <net/checksum.h>
  97 #include <net/inet_common.h>
  98 #include <linux/netfilter_ipv4.h>
  99 #ifdef CONFIG_IP_MROUTE
 100 #include <linux/mroute.h>
 101 #endif
 102 #ifdef CONFIG_PROC_FS
 103 #include <linux/proc_fs.h>
 104 #include <linux/seq_file.h>
 105 #endif
 106 
 107 #ifdef CONFIG_IP_MULTICAST
 108 /* Parameter names and values are taken from igmp-v2-06 draft */
 109 
 110 #define IGMP_V2_UNSOLICITED_REPORT_INTERVAL     (10*HZ)
 111 #define IGMP_V3_UNSOLICITED_REPORT_INTERVAL     (1*HZ)
 112 #define IGMP_QUERY_INTERVAL                     (125*HZ)
 113 #define IGMP_QUERY_RESPONSE_INTERVAL            (10*HZ)
 114 
 115 #define IGMP_INITIAL_REPORT_DELAY               (1)
 116 
 117 /* IGMP_INITIAL_REPORT_DELAY is not from IGMP specs!
 118  * IGMP specs require to report membership immediately after
 119  * joining a group, but we delay the first report by a
 120  * small interval. It seems more natural and still does not
 121  * contradict to specs provided this delay is small enough.
 122  */
 123 
 124 #define IGMP_V1_SEEN(in_dev) \
 125         (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 1 || \
 126          IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 1 || \
 127          ((in_dev)->mr_v1_seen && \
 128           time_before(jiffies, (in_dev)->mr_v1_seen)))
 129 #define IGMP_V2_SEEN(in_dev) \
 130         (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 2 || \
 131          IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 2 || \
 132          ((in_dev)->mr_v2_seen && \
 133           time_before(jiffies, (in_dev)->mr_v2_seen)))
 134 
 135 static int unsolicited_report_interval(struct in_device *in_dev)
 136 {
 137         int interval_ms, interval_jiffies;
 138 
 139         if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev))
 140                 interval_ms = IN_DEV_CONF_GET(
 141                         in_dev,
 142                         IGMPV2_UNSOLICITED_REPORT_INTERVAL);
 143         else /* v3 */
 144                 interval_ms = IN_DEV_CONF_GET(
 145                         in_dev,
 146                         IGMPV3_UNSOLICITED_REPORT_INTERVAL);
 147 
 148         interval_jiffies = msecs_to_jiffies(interval_ms);
 149 
 150         /* _timer functions can't handle a delay of 0 jiffies so ensure
 151          *  we always return a positive value.
 152          */
 153         if (interval_jiffies <= 0)
 154                 interval_jiffies = 1;
 155         return interval_jiffies;
 156 }
 157 
 158 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im,
 159                               gfp_t gfp);
 160 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im);
 161 static void igmpv3_clear_delrec(struct in_device *in_dev);
 162 static int sf_setstate(struct ip_mc_list *pmc);
 163 static void sf_markstate(struct ip_mc_list *pmc);
 164 #endif
 165 static void ip_mc_clear_src(struct ip_mc_list *pmc);
 166 static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
 167                          int sfcount, __be32 *psfsrc, int delta);
 168 
 169 static void ip_ma_put(struct ip_mc_list *im)
 170 {
 171         if (refcount_dec_and_test(&im->refcnt)) {
 172                 in_dev_put(im->interface);
 173                 kfree_rcu(im, rcu);
 174         }
 175 }
 176 
 177 #define for_each_pmc_rcu(in_dev, pmc)                           \
 178         for (pmc = rcu_dereference(in_dev->mc_list);            \
 179              pmc != NULL;                                       \
 180              pmc = rcu_dereference(pmc->next_rcu))
 181 
 182 #define for_each_pmc_rtnl(in_dev, pmc)                          \
 183         for (pmc = rtnl_dereference(in_dev->mc_list);           \
 184              pmc != NULL;                                       \
 185              pmc = rtnl_dereference(pmc->next_rcu))
 186 
 187 static void ip_sf_list_clear_all(struct ip_sf_list *psf)
 188 {
 189         struct ip_sf_list *next;
 190 
 191         while (psf) {
 192                 next = psf->sf_next;
 193                 kfree(psf);
 194                 psf = next;
 195         }
 196 }
 197 
 198 #ifdef CONFIG_IP_MULTICAST
 199 
 200 /*
 201  *      Timer management
 202  */
 203 
 204 static void igmp_stop_timer(struct ip_mc_list *im)
 205 {
 206         spin_lock_bh(&im->lock);
 207         if (del_timer(&im->timer))
 208                 refcount_dec(&im->refcnt);
 209         im->tm_running = 0;
 210         im->reporter = 0;
 211         im->unsolicit_count = 0;
 212         spin_unlock_bh(&im->lock);
 213 }
 214 
 215 /* It must be called with locked im->lock */
 216 static void igmp_start_timer(struct ip_mc_list *im, int max_delay)
 217 {
 218         int tv = prandom_u32() % max_delay;
 219 
 220         im->tm_running = 1;
 221         if (!mod_timer(&im->timer, jiffies+tv+2))
 222                 refcount_inc(&im->refcnt);
 223 }
 224 
 225 static void igmp_gq_start_timer(struct in_device *in_dev)
 226 {
 227         int tv = prandom_u32() % in_dev->mr_maxdelay;
 228         unsigned long exp = jiffies + tv + 2;
 229 
 230         if (in_dev->mr_gq_running &&
 231             time_after_eq(exp, (in_dev->mr_gq_timer).expires))
 232                 return;
 233 
 234         in_dev->mr_gq_running = 1;
 235         if (!mod_timer(&in_dev->mr_gq_timer, exp))
 236                 in_dev_hold(in_dev);
 237 }
 238 
 239 static void igmp_ifc_start_timer(struct in_device *in_dev, int delay)
 240 {
 241         int tv = prandom_u32() % delay;
 242 
 243         if (!mod_timer(&in_dev->mr_ifc_timer, jiffies+tv+2))
 244                 in_dev_hold(in_dev);
 245 }
 246 
 247 static void igmp_mod_timer(struct ip_mc_list *im, int max_delay)
 248 {
 249         spin_lock_bh(&im->lock);
 250         im->unsolicit_count = 0;
 251         if (del_timer(&im->timer)) {
 252                 if ((long)(im->timer.expires-jiffies) < max_delay) {
 253                         add_timer(&im->timer);
 254                         im->tm_running = 1;
 255                         spin_unlock_bh(&im->lock);
 256                         return;
 257                 }
 258                 refcount_dec(&im->refcnt);
 259         }
 260         igmp_start_timer(im, max_delay);
 261         spin_unlock_bh(&im->lock);
 262 }
 263 
 264 
 265 /*
 266  *      Send an IGMP report.
 267  */
 268 
 269 #define IGMP_SIZE (sizeof(struct igmphdr)+sizeof(struct iphdr)+4)
 270 
 271 
 272 static int is_in(struct ip_mc_list *pmc, struct ip_sf_list *psf, int type,
 273         int gdeleted, int sdeleted)
 274 {
 275         switch (type) {
 276         case IGMPV3_MODE_IS_INCLUDE:
 277         case IGMPV3_MODE_IS_EXCLUDE:
 278                 if (gdeleted || sdeleted)
 279                         return 0;
 280                 if (!(pmc->gsquery && !psf->sf_gsresp)) {
 281                         if (pmc->sfmode == MCAST_INCLUDE)
 282                                 return 1;
 283                         /* don't include if this source is excluded
 284                          * in all filters
 285                          */
 286                         if (psf->sf_count[MCAST_INCLUDE])
 287                                 return type == IGMPV3_MODE_IS_INCLUDE;
 288                         return pmc->sfcount[MCAST_EXCLUDE] ==
 289                                 psf->sf_count[MCAST_EXCLUDE];
 290                 }
 291                 return 0;
 292         case IGMPV3_CHANGE_TO_INCLUDE:
 293                 if (gdeleted || sdeleted)
 294                         return 0;
 295                 return psf->sf_count[MCAST_INCLUDE] != 0;
 296         case IGMPV3_CHANGE_TO_EXCLUDE:
 297                 if (gdeleted || sdeleted)
 298                         return 0;
 299                 if (pmc->sfcount[MCAST_EXCLUDE] == 0 ||
 300                     psf->sf_count[MCAST_INCLUDE])
 301                         return 0;
 302                 return pmc->sfcount[MCAST_EXCLUDE] ==
 303                         psf->sf_count[MCAST_EXCLUDE];
 304         case IGMPV3_ALLOW_NEW_SOURCES:
 305                 if (gdeleted || !psf->sf_crcount)
 306                         return 0;
 307                 return (pmc->sfmode == MCAST_INCLUDE) ^ sdeleted;
 308         case IGMPV3_BLOCK_OLD_SOURCES:
 309                 if (pmc->sfmode == MCAST_INCLUDE)
 310                         return gdeleted || (psf->sf_crcount && sdeleted);
 311                 return psf->sf_crcount && !gdeleted && !sdeleted;
 312         }
 313         return 0;
 314 }
 315 
 316 static int
 317 igmp_scount(struct ip_mc_list *pmc, int type, int gdeleted, int sdeleted)
 318 {
 319         struct ip_sf_list *psf;
 320         int scount = 0;
 321 
 322         for (psf = pmc->sources; psf; psf = psf->sf_next) {
 323                 if (!is_in(pmc, psf, type, gdeleted, sdeleted))
 324                         continue;
 325                 scount++;
 326         }
 327         return scount;
 328 }
 329 
 330 /* source address selection per RFC 3376 section 4.2.13 */
 331 static __be32 igmpv3_get_srcaddr(struct net_device *dev,
 332                                  const struct flowi4 *fl4)
 333 {
 334         struct in_device *in_dev = __in_dev_get_rcu(dev);
 335         const struct in_ifaddr *ifa;
 336 
 337         if (!in_dev)
 338                 return htonl(INADDR_ANY);
 339 
 340         in_dev_for_each_ifa_rcu(ifa, in_dev) {
 341                 if (fl4->saddr == ifa->ifa_local)
 342                         return fl4->saddr;
 343         }
 344 
 345         return htonl(INADDR_ANY);
 346 }
 347 
 348 static struct sk_buff *igmpv3_newpack(struct net_device *dev, unsigned int mtu)
 349 {
 350         struct sk_buff *skb;
 351         struct rtable *rt;
 352         struct iphdr *pip;
 353         struct igmpv3_report *pig;
 354         struct net *net = dev_net(dev);
 355         struct flowi4 fl4;
 356         int hlen = LL_RESERVED_SPACE(dev);
 357         int tlen = dev->needed_tailroom;
 358         unsigned int size = mtu;
 359 
 360         while (1) {
 361                 skb = alloc_skb(size + hlen + tlen,
 362                                 GFP_ATOMIC | __GFP_NOWARN);
 363                 if (skb)
 364                         break;
 365                 size >>= 1;
 366                 if (size < 256)
 367                         return NULL;
 368         }
 369         skb->priority = TC_PRIO_CONTROL;
 370 
 371         rt = ip_route_output_ports(net, &fl4, NULL, IGMPV3_ALL_MCR, 0,
 372                                    0, 0,
 373                                    IPPROTO_IGMP, 0, dev->ifindex);
 374         if (IS_ERR(rt)) {
 375                 kfree_skb(skb);
 376                 return NULL;
 377         }
 378 
 379         skb_dst_set(skb, &rt->dst);
 380         skb->dev = dev;
 381 
 382         skb_reserve(skb, hlen);
 383         skb_tailroom_reserve(skb, mtu, tlen);
 384 
 385         skb_reset_network_header(skb);
 386         pip = ip_hdr(skb);
 387         skb_put(skb, sizeof(struct iphdr) + 4);
 388 
 389         pip->version  = 4;
 390         pip->ihl      = (sizeof(struct iphdr)+4)>>2;
 391         pip->tos      = 0xc0;
 392         pip->frag_off = htons(IP_DF);
 393         pip->ttl      = 1;
 394         pip->daddr    = fl4.daddr;
 395 
 396         rcu_read_lock();
 397         pip->saddr    = igmpv3_get_srcaddr(dev, &fl4);
 398         rcu_read_unlock();
 399 
 400         pip->protocol = IPPROTO_IGMP;
 401         pip->tot_len  = 0;      /* filled in later */
 402         ip_select_ident(net, skb, NULL);
 403         ((u8 *)&pip[1])[0] = IPOPT_RA;
 404         ((u8 *)&pip[1])[1] = 4;
 405         ((u8 *)&pip[1])[2] = 0;
 406         ((u8 *)&pip[1])[3] = 0;
 407 
 408         skb->transport_header = skb->network_header + sizeof(struct iphdr) + 4;
 409         skb_put(skb, sizeof(*pig));
 410         pig = igmpv3_report_hdr(skb);
 411         pig->type = IGMPV3_HOST_MEMBERSHIP_REPORT;
 412         pig->resv1 = 0;
 413         pig->csum = 0;
 414         pig->resv2 = 0;
 415         pig->ngrec = 0;
 416         return skb;
 417 }
 418 
 419 static int igmpv3_sendpack(struct sk_buff *skb)
 420 {
 421         struct igmphdr *pig = igmp_hdr(skb);
 422         const int igmplen = skb_tail_pointer(skb) - skb_transport_header(skb);
 423 
 424         pig->csum = ip_compute_csum(igmp_hdr(skb), igmplen);
 425 
 426         return ip_local_out(dev_net(skb_dst(skb)->dev), skb->sk, skb);
 427 }
 428 
 429 static int grec_size(struct ip_mc_list *pmc, int type, int gdel, int sdel)
 430 {
 431         return sizeof(struct igmpv3_grec) + 4*igmp_scount(pmc, type, gdel, sdel);
 432 }
 433 
 434 static struct sk_buff *add_grhead(struct sk_buff *skb, struct ip_mc_list *pmc,
 435         int type, struct igmpv3_grec **ppgr, unsigned int mtu)
 436 {
 437         struct net_device *dev = pmc->interface->dev;
 438         struct igmpv3_report *pih;
 439         struct igmpv3_grec *pgr;
 440 
 441         if (!skb) {
 442                 skb = igmpv3_newpack(dev, mtu);
 443                 if (!skb)
 444                         return NULL;
 445         }
 446         pgr = skb_put(skb, sizeof(struct igmpv3_grec));
 447         pgr->grec_type = type;
 448         pgr->grec_auxwords = 0;
 449         pgr->grec_nsrcs = 0;
 450         pgr->grec_mca = pmc->multiaddr;
 451         pih = igmpv3_report_hdr(skb);
 452         pih->ngrec = htons(ntohs(pih->ngrec)+1);
 453         *ppgr = pgr;
 454         return skb;
 455 }
 456 
 457 #define AVAILABLE(skb)  ((skb) ? skb_availroom(skb) : 0)
 458 
 459 static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,
 460         int type, int gdeleted, int sdeleted)
 461 {
 462         struct net_device *dev = pmc->interface->dev;
 463         struct net *net = dev_net(dev);
 464         struct igmpv3_report *pih;
 465         struct igmpv3_grec *pgr = NULL;
 466         struct ip_sf_list *psf, *psf_next, *psf_prev, **psf_list;
 467         int scount, stotal, first, isquery, truncate;
 468         unsigned int mtu;
 469 
 470         if (pmc->multiaddr == IGMP_ALL_HOSTS)
 471                 return skb;
 472         if (ipv4_is_local_multicast(pmc->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports)
 473                 return skb;
 474 
 475         mtu = READ_ONCE(dev->mtu);
 476         if (mtu < IPV4_MIN_MTU)
 477                 return skb;
 478 
 479         isquery = type == IGMPV3_MODE_IS_INCLUDE ||
 480                   type == IGMPV3_MODE_IS_EXCLUDE;
 481         truncate = type == IGMPV3_MODE_IS_EXCLUDE ||
 482                     type == IGMPV3_CHANGE_TO_EXCLUDE;
 483 
 484         stotal = scount = 0;
 485 
 486         psf_list = sdeleted ? &pmc->tomb : &pmc->sources;
 487 
 488         if (!*psf_list)
 489                 goto empty_source;
 490 
 491         pih = skb ? igmpv3_report_hdr(skb) : NULL;
 492 
 493         /* EX and TO_EX get a fresh packet, if needed */
 494         if (truncate) {
 495                 if (pih && pih->ngrec &&
 496                     AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) {
 497                         if (skb)
 498                                 igmpv3_sendpack(skb);
 499                         skb = igmpv3_newpack(dev, mtu);
 500                 }
 501         }
 502         first = 1;
 503         psf_prev = NULL;
 504         for (psf = *psf_list; psf; psf = psf_next) {
 505                 __be32 *psrc;
 506 
 507                 psf_next = psf->sf_next;
 508 
 509                 if (!is_in(pmc, psf, type, gdeleted, sdeleted)) {
 510                         psf_prev = psf;
 511                         continue;
 512                 }
 513 
 514                 /* Based on RFC3376 5.1. Should not send source-list change
 515                  * records when there is a filter mode change.
 516                  */
 517                 if (((gdeleted && pmc->sfmode == MCAST_EXCLUDE) ||
 518                      (!gdeleted && pmc->crcount)) &&
 519                     (type == IGMPV3_ALLOW_NEW_SOURCES ||
 520                      type == IGMPV3_BLOCK_OLD_SOURCES) && psf->sf_crcount)
 521                         goto decrease_sf_crcount;
 522 
 523                 /* clear marks on query responses */
 524                 if (isquery)
 525                         psf->sf_gsresp = 0;
 526 
 527                 if (AVAILABLE(skb) < sizeof(__be32) +
 528                     first*sizeof(struct igmpv3_grec)) {
 529                         if (truncate && !first)
 530                                 break;   /* truncate these */
 531                         if (pgr)
 532                                 pgr->grec_nsrcs = htons(scount);
 533                         if (skb)
 534                                 igmpv3_sendpack(skb);
 535                         skb = igmpv3_newpack(dev, mtu);
 536                         first = 1;
 537                         scount = 0;
 538                 }
 539                 if (first) {
 540                         skb = add_grhead(skb, pmc, type, &pgr, mtu);
 541                         first = 0;
 542                 }
 543                 if (!skb)
 544                         return NULL;
 545                 psrc = skb_put(skb, sizeof(__be32));
 546                 *psrc = psf->sf_inaddr;
 547                 scount++; stotal++;
 548                 if ((type == IGMPV3_ALLOW_NEW_SOURCES ||
 549                      type == IGMPV3_BLOCK_OLD_SOURCES) && psf->sf_crcount) {
 550 decrease_sf_crcount:
 551                         psf->sf_crcount--;
 552                         if ((sdeleted || gdeleted) && psf->sf_crcount == 0) {
 553                                 if (psf_prev)
 554                                         psf_prev->sf_next = psf->sf_next;
 555                                 else
 556                                         *psf_list = psf->sf_next;
 557                                 kfree(psf);
 558                                 continue;
 559                         }
 560                 }
 561                 psf_prev = psf;
 562         }
 563 
 564 empty_source:
 565         if (!stotal) {
 566                 if (type == IGMPV3_ALLOW_NEW_SOURCES ||
 567                     type == IGMPV3_BLOCK_OLD_SOURCES)
 568                         return skb;
 569                 if (pmc->crcount || isquery) {
 570                         /* make sure we have room for group header */
 571                         if (skb && AVAILABLE(skb) < sizeof(struct igmpv3_grec)) {
 572                                 igmpv3_sendpack(skb);
 573                                 skb = NULL; /* add_grhead will get a new one */
 574                         }
 575                         skb = add_grhead(skb, pmc, type, &pgr, mtu);
 576                 }
 577         }
 578         if (pgr)
 579                 pgr->grec_nsrcs = htons(scount);
 580 
 581         if (isquery)
 582                 pmc->gsquery = 0;       /* clear query state on report */
 583         return skb;
 584 }
 585 
 586 static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc)
 587 {
 588         struct sk_buff *skb = NULL;
 589         struct net *net = dev_net(in_dev->dev);
 590         int type;
 591 
 592         if (!pmc) {
 593                 rcu_read_lock();
 594                 for_each_pmc_rcu(in_dev, pmc) {
 595                         if (pmc->multiaddr == IGMP_ALL_HOSTS)
 596                                 continue;
 597                         if (ipv4_is_local_multicast(pmc->multiaddr) &&
 598                              !net->ipv4.sysctl_igmp_llm_reports)
 599                                 continue;
 600                         spin_lock_bh(&pmc->lock);
 601                         if (pmc->sfcount[MCAST_EXCLUDE])
 602                                 type = IGMPV3_MODE_IS_EXCLUDE;
 603                         else
 604                                 type = IGMPV3_MODE_IS_INCLUDE;
 605                         skb = add_grec(skb, pmc, type, 0, 0);
 606                         spin_unlock_bh(&pmc->lock);
 607                 }
 608                 rcu_read_unlock();
 609         } else {
 610                 spin_lock_bh(&pmc->lock);
 611                 if (pmc->sfcount[MCAST_EXCLUDE])
 612                         type = IGMPV3_MODE_IS_EXCLUDE;
 613                 else
 614                         type = IGMPV3_MODE_IS_INCLUDE;
 615                 skb = add_grec(skb, pmc, type, 0, 0);
 616                 spin_unlock_bh(&pmc->lock);
 617         }
 618         if (!skb)
 619                 return 0;
 620         return igmpv3_sendpack(skb);
 621 }
 622 
 623 /*
 624  * remove zero-count source records from a source filter list
 625  */
 626 static void igmpv3_clear_zeros(struct ip_sf_list **ppsf)
 627 {
 628         struct ip_sf_list *psf_prev, *psf_next, *psf;
 629 
 630         psf_prev = NULL;
 631         for (psf = *ppsf; psf; psf = psf_next) {
 632                 psf_next = psf->sf_next;
 633                 if (psf->sf_crcount == 0) {
 634                         if (psf_prev)
 635                                 psf_prev->sf_next = psf->sf_next;
 636                         else
 637                                 *ppsf = psf->sf_next;
 638                         kfree(psf);
 639                 } else
 640                         psf_prev = psf;
 641         }
 642 }
 643 
 644 static void kfree_pmc(struct ip_mc_list *pmc)
 645 {
 646         ip_sf_list_clear_all(pmc->sources);
 647         ip_sf_list_clear_all(pmc->tomb);
 648         kfree(pmc);
 649 }
 650 
 651 static void igmpv3_send_cr(struct in_device *in_dev)
 652 {
 653         struct ip_mc_list *pmc, *pmc_prev, *pmc_next;
 654         struct sk_buff *skb = NULL;
 655         int type, dtype;
 656 
 657         rcu_read_lock();
 658         spin_lock_bh(&in_dev->mc_tomb_lock);
 659 
 660         /* deleted MCA's */
 661         pmc_prev = NULL;
 662         for (pmc = in_dev->mc_tomb; pmc; pmc = pmc_next) {
 663                 pmc_next = pmc->next;
 664                 if (pmc->sfmode == MCAST_INCLUDE) {
 665                         type = IGMPV3_BLOCK_OLD_SOURCES;
 666                         dtype = IGMPV3_BLOCK_OLD_SOURCES;
 667                         skb = add_grec(skb, pmc, type, 1, 0);
 668                         skb = add_grec(skb, pmc, dtype, 1, 1);
 669                 }
 670                 if (pmc->crcount) {
 671                         if (pmc->sfmode == MCAST_EXCLUDE) {
 672                                 type = IGMPV3_CHANGE_TO_INCLUDE;
 673                                 skb = add_grec(skb, pmc, type, 1, 0);
 674                         }
 675                         pmc->crcount--;
 676                         if (pmc->crcount == 0) {
 677                                 igmpv3_clear_zeros(&pmc->tomb);
 678                                 igmpv3_clear_zeros(&pmc->sources);
 679                         }
 680                 }
 681                 if (pmc->crcount == 0 && !pmc->tomb && !pmc->sources) {
 682                         if (pmc_prev)
 683                                 pmc_prev->next = pmc_next;
 684                         else
 685                                 in_dev->mc_tomb = pmc_next;
 686                         in_dev_put(pmc->interface);
 687                         kfree_pmc(pmc);
 688                 } else
 689                         pmc_prev = pmc;
 690         }
 691         spin_unlock_bh(&in_dev->mc_tomb_lock);
 692 
 693         /* change recs */
 694         for_each_pmc_rcu(in_dev, pmc) {
 695                 spin_lock_bh(&pmc->lock);
 696                 if (pmc->sfcount[MCAST_EXCLUDE]) {
 697                         type = IGMPV3_BLOCK_OLD_SOURCES;
 698                         dtype = IGMPV3_ALLOW_NEW_SOURCES;
 699                 } else {
 700                         type = IGMPV3_ALLOW_NEW_SOURCES;
 701                         dtype = IGMPV3_BLOCK_OLD_SOURCES;
 702                 }
 703                 skb = add_grec(skb, pmc, type, 0, 0);
 704                 skb = add_grec(skb, pmc, dtype, 0, 1);  /* deleted sources */
 705 
 706                 /* filter mode changes */
 707                 if (pmc->crcount) {
 708                         if (pmc->sfmode == MCAST_EXCLUDE)
 709                                 type = IGMPV3_CHANGE_TO_EXCLUDE;
 710                         else
 711                                 type = IGMPV3_CHANGE_TO_INCLUDE;
 712                         skb = add_grec(skb, pmc, type, 0, 0);
 713                         pmc->crcount--;
 714                 }
 715                 spin_unlock_bh(&pmc->lock);
 716         }
 717         rcu_read_unlock();
 718 
 719         if (!skb)
 720                 return;
 721         (void) igmpv3_sendpack(skb);
 722 }
 723 
 724 static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
 725         int type)
 726 {
 727         struct sk_buff *skb;
 728         struct iphdr *iph;
 729         struct igmphdr *ih;
 730         struct rtable *rt;
 731         struct net_device *dev = in_dev->dev;
 732         struct net *net = dev_net(dev);
 733         __be32  group = pmc ? pmc->multiaddr : 0;
 734         struct flowi4 fl4;
 735         __be32  dst;
 736         int hlen, tlen;
 737 
 738         if (type == IGMPV3_HOST_MEMBERSHIP_REPORT)
 739                 return igmpv3_send_report(in_dev, pmc);
 740 
 741         if (ipv4_is_local_multicast(group) && !net->ipv4.sysctl_igmp_llm_reports)
 742                 return 0;
 743 
 744         if (type == IGMP_HOST_LEAVE_MESSAGE)
 745                 dst = IGMP_ALL_ROUTER;
 746         else
 747                 dst = group;
 748 
 749         rt = ip_route_output_ports(net, &fl4, NULL, dst, 0,
 750                                    0, 0,
 751                                    IPPROTO_IGMP, 0, dev->ifindex);
 752         if (IS_ERR(rt))
 753                 return -1;
 754 
 755         hlen = LL_RESERVED_SPACE(dev);
 756         tlen = dev->needed_tailroom;
 757         skb = alloc_skb(IGMP_SIZE + hlen + tlen, GFP_ATOMIC);
 758         if (!skb) {
 759                 ip_rt_put(rt);
 760                 return -1;
 761         }
 762         skb->priority = TC_PRIO_CONTROL;
 763 
 764         skb_dst_set(skb, &rt->dst);
 765 
 766         skb_reserve(skb, hlen);
 767 
 768         skb_reset_network_header(skb);
 769         iph = ip_hdr(skb);
 770         skb_put(skb, sizeof(struct iphdr) + 4);
 771 
 772         iph->version  = 4;
 773         iph->ihl      = (sizeof(struct iphdr)+4)>>2;
 774         iph->tos      = 0xc0;
 775         iph->frag_off = htons(IP_DF);
 776         iph->ttl      = 1;
 777         iph->daddr    = dst;
 778         iph->saddr    = fl4.saddr;
 779         iph->protocol = IPPROTO_IGMP;
 780         ip_select_ident(net, skb, NULL);
 781         ((u8 *)&iph[1])[0] = IPOPT_RA;
 782         ((u8 *)&iph[1])[1] = 4;
 783         ((u8 *)&iph[1])[2] = 0;
 784         ((u8 *)&iph[1])[3] = 0;
 785 
 786         ih = skb_put(skb, sizeof(struct igmphdr));
 787         ih->type = type;
 788         ih->code = 0;
 789         ih->csum = 0;
 790         ih->group = group;
 791         ih->csum = ip_compute_csum((void *)ih, sizeof(struct igmphdr));
 792 
 793         return ip_local_out(net, skb->sk, skb);
 794 }
 795 
 796 static void igmp_gq_timer_expire(struct timer_list *t)
 797 {
 798         struct in_device *in_dev = from_timer(in_dev, t, mr_gq_timer);
 799 
 800         in_dev->mr_gq_running = 0;
 801         igmpv3_send_report(in_dev, NULL);
 802         in_dev_put(in_dev);
 803 }
 804 
 805 static void igmp_ifc_timer_expire(struct timer_list *t)
 806 {
 807         struct in_device *in_dev = from_timer(in_dev, t, mr_ifc_timer);
 808 
 809         igmpv3_send_cr(in_dev);
 810         if (in_dev->mr_ifc_count) {
 811                 in_dev->mr_ifc_count--;
 812                 igmp_ifc_start_timer(in_dev,
 813                                      unsolicited_report_interval(in_dev));
 814         }
 815         in_dev_put(in_dev);
 816 }
 817 
 818 static void igmp_ifc_event(struct in_device *in_dev)
 819 {
 820         struct net *net = dev_net(in_dev->dev);
 821         if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev))
 822                 return;
 823         in_dev->mr_ifc_count = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
 824         igmp_ifc_start_timer(in_dev, 1);
 825 }
 826 
 827 
 828 static void igmp_timer_expire(struct timer_list *t)
 829 {
 830         struct ip_mc_list *im = from_timer(im, t, timer);
 831         struct in_device *in_dev = im->interface;
 832 
 833         spin_lock(&im->lock);
 834         im->tm_running = 0;
 835 
 836         if (im->unsolicit_count && --im->unsolicit_count)
 837                 igmp_start_timer(im, unsolicited_report_interval(in_dev));
 838 
 839         im->reporter = 1;
 840         spin_unlock(&im->lock);
 841 
 842         if (IGMP_V1_SEEN(in_dev))
 843                 igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT);
 844         else if (IGMP_V2_SEEN(in_dev))
 845                 igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT);
 846         else
 847                 igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT);
 848 
 849         ip_ma_put(im);
 850 }
 851 
 852 /* mark EXCLUDE-mode sources */
 853 static int igmp_xmarksources(struct ip_mc_list *pmc, int nsrcs, __be32 *srcs)
 854 {
 855         struct ip_sf_list *psf;
 856         int i, scount;
 857 
 858         scount = 0;
 859         for (psf = pmc->sources; psf; psf = psf->sf_next) {
 860                 if (scount == nsrcs)
 861                         break;
 862                 for (i = 0; i < nsrcs; i++) {
 863                         /* skip inactive filters */
 864                         if (psf->sf_count[MCAST_INCLUDE] ||
 865                             pmc->sfcount[MCAST_EXCLUDE] !=
 866                             psf->sf_count[MCAST_EXCLUDE])
 867                                 break;
 868                         if (srcs[i] == psf->sf_inaddr) {
 869                                 scount++;
 870                                 break;
 871                         }
 872                 }
 873         }
 874         pmc->gsquery = 0;
 875         if (scount == nsrcs)    /* all sources excluded */
 876                 return 0;
 877         return 1;
 878 }
 879 
 880 static int igmp_marksources(struct ip_mc_list *pmc, int nsrcs, __be32 *srcs)
 881 {
 882         struct ip_sf_list *psf;
 883         int i, scount;
 884 
 885         if (pmc->sfmode == MCAST_EXCLUDE)
 886                 return igmp_xmarksources(pmc, nsrcs, srcs);
 887 
 888         /* mark INCLUDE-mode sources */
 889         scount = 0;
 890         for (psf = pmc->sources; psf; psf = psf->sf_next) {
 891                 if (scount == nsrcs)
 892                         break;
 893                 for (i = 0; i < nsrcs; i++)
 894                         if (srcs[i] == psf->sf_inaddr) {
 895                                 psf->sf_gsresp = 1;
 896                                 scount++;
 897                                 break;
 898                         }
 899         }
 900         if (!scount) {
 901                 pmc->gsquery = 0;
 902                 return 0;
 903         }
 904         pmc->gsquery = 1;
 905         return 1;
 906 }
 907 
 908 /* return true if packet was dropped */
 909 static bool igmp_heard_report(struct in_device *in_dev, __be32 group)
 910 {
 911         struct ip_mc_list *im;
 912         struct net *net = dev_net(in_dev->dev);
 913 
 914         /* Timers are only set for non-local groups */
 915 
 916         if (group == IGMP_ALL_HOSTS)
 917                 return false;
 918         if (ipv4_is_local_multicast(group) && !net->ipv4.sysctl_igmp_llm_reports)
 919                 return false;
 920 
 921         rcu_read_lock();
 922         for_each_pmc_rcu(in_dev, im) {
 923                 if (im->multiaddr == group) {
 924                         igmp_stop_timer(im);
 925                         break;
 926                 }
 927         }
 928         rcu_read_unlock();
 929         return false;
 930 }
 931 
 932 /* return true if packet was dropped */
 933 static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
 934         int len)
 935 {
 936         struct igmphdr          *ih = igmp_hdr(skb);
 937         struct igmpv3_query *ih3 = igmpv3_query_hdr(skb);
 938         struct ip_mc_list       *im;
 939         __be32                  group = ih->group;
 940         int                     max_delay;
 941         int                     mark = 0;
 942         struct net              *net = dev_net(in_dev->dev);
 943 
 944 
 945         if (len == 8) {
 946                 if (ih->code == 0) {
 947                         /* Alas, old v1 router presents here. */
 948 
 949                         max_delay = IGMP_QUERY_RESPONSE_INTERVAL;
 950                         in_dev->mr_v1_seen = jiffies +
 951                                 (in_dev->mr_qrv * in_dev->mr_qi) +
 952                                 in_dev->mr_qri;
 953                         group = 0;
 954                 } else {
 955                         /* v2 router present */
 956                         max_delay = ih->code*(HZ/IGMP_TIMER_SCALE);
 957                         in_dev->mr_v2_seen = jiffies +
 958                                 (in_dev->mr_qrv * in_dev->mr_qi) +
 959                                 in_dev->mr_qri;
 960                 }
 961                 /* cancel the interface change timer */
 962                 in_dev->mr_ifc_count = 0;
 963                 if (del_timer(&in_dev->mr_ifc_timer))
 964                         __in_dev_put(in_dev);
 965                 /* clear deleted report items */
 966                 igmpv3_clear_delrec(in_dev);
 967         } else if (len < 12) {
 968                 return true;    /* ignore bogus packet; freed by caller */
 969         } else if (IGMP_V1_SEEN(in_dev)) {
 970                 /* This is a v3 query with v1 queriers present */
 971                 max_delay = IGMP_QUERY_RESPONSE_INTERVAL;
 972                 group = 0;
 973         } else if (IGMP_V2_SEEN(in_dev)) {
 974                 /* this is a v3 query with v2 queriers present;
 975                  * Interpretation of the max_delay code is problematic here.
 976                  * A real v2 host would use ih_code directly, while v3 has a
 977                  * different encoding. We use the v3 encoding as more likely
 978                  * to be intended in a v3 query.
 979                  */
 980                 max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE);
 981                 if (!max_delay)
 982                         max_delay = 1;  /* can't mod w/ 0 */
 983         } else { /* v3 */
 984                 if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)))
 985                         return true;
 986 
 987                 ih3 = igmpv3_query_hdr(skb);
 988                 if (ih3->nsrcs) {
 989                         if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)
 990                                            + ntohs(ih3->nsrcs)*sizeof(__be32)))
 991                                 return true;
 992                         ih3 = igmpv3_query_hdr(skb);
 993                 }
 994 
 995                 max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE);
 996                 if (!max_delay)
 997                         max_delay = 1;  /* can't mod w/ 0 */
 998                 in_dev->mr_maxdelay = max_delay;
 999 
1000                 /* RFC3376, 4.1.6. QRV and 4.1.7. QQIC, when the most recently
1001                  * received value was zero, use the default or statically
1002                  * configured value.
1003                  */
1004                 in_dev->mr_qrv = ih3->qrv ?: net->ipv4.sysctl_igmp_qrv;
1005                 in_dev->mr_qi = IGMPV3_QQIC(ih3->qqic)*HZ ?: IGMP_QUERY_INTERVAL;
1006 
1007                 /* RFC3376, 8.3. Query Response Interval:
1008                  * The number of seconds represented by the [Query Response
1009                  * Interval] must be less than the [Query Interval].
1010                  */
1011                 if (in_dev->mr_qri >= in_dev->mr_qi)
1012                         in_dev->mr_qri = (in_dev->mr_qi/HZ - 1)*HZ;
1013 
1014                 if (!group) { /* general query */
1015                         if (ih3->nsrcs)
1016                                 return true;    /* no sources allowed */
1017                         igmp_gq_start_timer(in_dev);
1018                         return false;
1019                 }
1020                 /* mark sources to include, if group & source-specific */
1021                 mark = ih3->nsrcs != 0;
1022         }
1023 
1024         /*
1025          * - Start the timers in all of our membership records
1026          *   that the query applies to for the interface on
1027          *   which the query arrived excl. those that belong
1028          *   to a "local" group (224.0.0.X)
1029          * - For timers already running check if they need to
1030          *   be reset.
1031          * - Use the igmp->igmp_code field as the maximum
1032          *   delay possible
1033          */
1034         rcu_read_lock();
1035         for_each_pmc_rcu(in_dev, im) {
1036                 int changed;
1037 
1038                 if (group && group != im->multiaddr)
1039                         continue;
1040                 if (im->multiaddr == IGMP_ALL_HOSTS)
1041                         continue;
1042                 if (ipv4_is_local_multicast(im->multiaddr) &&
1043                     !net->ipv4.sysctl_igmp_llm_reports)
1044                         continue;
1045                 spin_lock_bh(&im->lock);
1046                 if (im->tm_running)
1047                         im->gsquery = im->gsquery && mark;
1048                 else
1049                         im->gsquery = mark;
1050                 changed = !im->gsquery ||
1051                         igmp_marksources(im, ntohs(ih3->nsrcs), ih3->srcs);
1052                 spin_unlock_bh(&im->lock);
1053                 if (changed)
1054                         igmp_mod_timer(im, max_delay);
1055         }
1056         rcu_read_unlock();
1057         return false;
1058 }
1059 
1060 /* called in rcu_read_lock() section */
1061 int igmp_rcv(struct sk_buff *skb)
1062 {
1063         /* This basically follows the spec line by line -- see RFC1112 */
1064         struct igmphdr *ih;
1065         struct net_device *dev = skb->dev;
1066         struct in_device *in_dev;
1067         int len = skb->len;
1068         bool dropped = true;
1069 
1070         if (netif_is_l3_master(dev)) {
1071                 dev = dev_get_by_index_rcu(dev_net(dev), IPCB(skb)->iif);
1072                 if (!dev)
1073                         goto drop;
1074         }
1075 
1076         in_dev = __in_dev_get_rcu(dev);
1077         if (!in_dev)
1078                 goto drop;
1079 
1080         if (!pskb_may_pull(skb, sizeof(struct igmphdr)))
1081                 goto drop;
1082 
1083         if (skb_checksum_simple_validate(skb))
1084                 goto drop;
1085 
1086         ih = igmp_hdr(skb);
1087         switch (ih->type) {
1088         case IGMP_HOST_MEMBERSHIP_QUERY:
1089                 dropped = igmp_heard_query(in_dev, skb, len);
1090                 break;
1091         case IGMP_HOST_MEMBERSHIP_REPORT:
1092         case IGMPV2_HOST_MEMBERSHIP_REPORT:
1093                 /* Is it our report looped back? */
1094                 if (rt_is_output_route(skb_rtable(skb)))
1095                         break;
1096                 /* don't rely on MC router hearing unicast reports */
1097                 if (skb->pkt_type == PACKET_MULTICAST ||
1098                     skb->pkt_type == PACKET_BROADCAST)
1099                         dropped = igmp_heard_report(in_dev, ih->group);
1100                 break;
1101         case IGMP_PIM:
1102 #ifdef CONFIG_IP_PIMSM_V1
1103                 return pim_rcv_v1(skb);
1104 #endif
1105         case IGMPV3_HOST_MEMBERSHIP_REPORT:
1106         case IGMP_DVMRP:
1107         case IGMP_TRACE:
1108         case IGMP_HOST_LEAVE_MESSAGE:
1109         case IGMP_MTRACE:
1110         case IGMP_MTRACE_RESP:
1111                 break;
1112         default:
1113                 break;
1114         }
1115 
1116 drop:
1117         if (dropped)
1118                 kfree_skb(skb);
1119         else
1120                 consume_skb(skb);
1121         return 0;
1122 }
1123 
1124 #endif
1125 
1126 
1127 /*
1128  *      Add a filter to a device
1129  */
1130 
1131 static void ip_mc_filter_add(struct in_device *in_dev, __be32 addr)
1132 {
1133         char buf[MAX_ADDR_LEN];
1134         struct net_device *dev = in_dev->dev;
1135 
1136         /* Checking for IFF_MULTICAST here is WRONG-WRONG-WRONG.
1137            We will get multicast token leakage, when IFF_MULTICAST
1138            is changed. This check should be done in ndo_set_rx_mode
1139            routine. Something sort of:
1140            if (dev->mc_list && dev->flags&IFF_MULTICAST) { do it; }
1141            --ANK
1142            */
1143         if (arp_mc_map(addr, buf, dev, 0) == 0)
1144                 dev_mc_add(dev, buf);
1145 }
1146 
1147 /*
1148  *      Remove a filter from a device
1149  */
1150 
1151 static void ip_mc_filter_del(struct in_device *in_dev, __be32 addr)
1152 {
1153         char buf[MAX_ADDR_LEN];
1154         struct net_device *dev = in_dev->dev;
1155 
1156         if (arp_mc_map(addr, buf, dev, 0) == 0)
1157                 dev_mc_del(dev, buf);
1158 }
1159 
1160 #ifdef CONFIG_IP_MULTICAST
1161 /*
1162  * deleted ip_mc_list manipulation
1163  */
1164 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im,
1165                               gfp_t gfp)
1166 {
1167         struct ip_mc_list *pmc;
1168         struct net *net = dev_net(in_dev->dev);
1169 
1170         /* this is an "ip_mc_list" for convenience; only the fields below
1171          * are actually used. In particular, the refcnt and users are not
1172          * used for management of the delete list. Using the same structure
1173          * for deleted items allows change reports to use common code with
1174          * non-deleted or query-response MCA's.
1175          */
1176         pmc = kzalloc(sizeof(*pmc), gfp);
1177         if (!pmc)
1178                 return;
1179         spin_lock_init(&pmc->lock);
1180         spin_lock_bh(&im->lock);
1181         pmc->interface = im->interface;
1182         in_dev_hold(in_dev);
1183         pmc->multiaddr = im->multiaddr;
1184         pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
1185         pmc->sfmode = im->sfmode;
1186         if (pmc->sfmode == MCAST_INCLUDE) {
1187                 struct ip_sf_list *psf;
1188 
1189                 pmc->tomb = im->tomb;
1190                 pmc->sources = im->sources;
1191                 im->tomb = im->sources = NULL;
1192                 for (psf = pmc->sources; psf; psf = psf->sf_next)
1193                         psf->sf_crcount = pmc->crcount;
1194         }
1195         spin_unlock_bh(&im->lock);
1196 
1197         spin_lock_bh(&in_dev->mc_tomb_lock);
1198         pmc->next = in_dev->mc_tomb;
1199         in_dev->mc_tomb = pmc;
1200         spin_unlock_bh(&in_dev->mc_tomb_lock);
1201 }
1202 
1203 /*
1204  * restore ip_mc_list deleted records
1205  */
1206 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im)
1207 {
1208         struct ip_mc_list *pmc, *pmc_prev;
1209         struct ip_sf_list *psf;
1210         struct net *net = dev_net(in_dev->dev);
1211         __be32 multiaddr = im->multiaddr;
1212 
1213         spin_lock_bh(&in_dev->mc_tomb_lock);
1214         pmc_prev = NULL;
1215         for (pmc = in_dev->mc_tomb; pmc; pmc = pmc->next) {
1216                 if (pmc->multiaddr == multiaddr)
1217                         break;
1218                 pmc_prev = pmc;
1219         }
1220         if (pmc) {
1221                 if (pmc_prev)
1222                         pmc_prev->next = pmc->next;
1223                 else
1224                         in_dev->mc_tomb = pmc->next;
1225         }
1226         spin_unlock_bh(&in_dev->mc_tomb_lock);
1227 
1228         spin_lock_bh(&im->lock);
1229         if (pmc) {
1230                 im->interface = pmc->interface;
1231                 if (im->sfmode == MCAST_INCLUDE) {
1232                         swap(im->tomb, pmc->tomb);
1233                         swap(im->sources, pmc->sources);
1234                         for (psf = im->sources; psf; psf = psf->sf_next)
1235                                 psf->sf_crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
1236                 } else {
1237                         im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
1238                 }
1239                 in_dev_put(pmc->interface);
1240                 kfree_pmc(pmc);
1241         }
1242         spin_unlock_bh(&im->lock);
1243 }
1244 
1245 /*
1246  * flush ip_mc_list deleted records
1247  */
1248 static void igmpv3_clear_delrec(struct in_device *in_dev)
1249 {
1250         struct ip_mc_list *pmc, *nextpmc;
1251 
1252         spin_lock_bh(&in_dev->mc_tomb_lock);
1253         pmc = in_dev->mc_tomb;
1254         in_dev->mc_tomb = NULL;
1255         spin_unlock_bh(&in_dev->mc_tomb_lock);
1256 
1257         for (; pmc; pmc = nextpmc) {
1258                 nextpmc = pmc->next;
1259                 ip_mc_clear_src(pmc);
1260                 in_dev_put(pmc->interface);
1261                 kfree_pmc(pmc);
1262         }
1263         /* clear dead sources, too */
1264         rcu_read_lock();
1265         for_each_pmc_rcu(in_dev, pmc) {
1266                 struct ip_sf_list *psf;
1267 
1268                 spin_lock_bh(&pmc->lock);
1269                 psf = pmc->tomb;
1270                 pmc->tomb = NULL;
1271                 spin_unlock_bh(&pmc->lock);
1272                 ip_sf_list_clear_all(psf);
1273         }
1274         rcu_read_unlock();
1275 }
1276 #endif
1277 
1278 static void __igmp_group_dropped(struct ip_mc_list *im, gfp_t gfp)
1279 {
1280         struct in_device *in_dev = im->interface;
1281 #ifdef CONFIG_IP_MULTICAST
1282         struct net *net = dev_net(in_dev->dev);
1283         int reporter;
1284 #endif
1285 
1286         if (im->loaded) {
1287                 im->loaded = 0;
1288                 ip_mc_filter_del(in_dev, im->multiaddr);
1289         }
1290 
1291 #ifdef CONFIG_IP_MULTICAST
1292         if (im->multiaddr == IGMP_ALL_HOSTS)
1293                 return;
1294         if (ipv4_is_local_multicast(im->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports)
1295                 return;
1296 
1297         reporter = im->reporter;
1298         igmp_stop_timer(im);
1299 
1300         if (!in_dev->dead) {
1301                 if (IGMP_V1_SEEN(in_dev))
1302                         return;
1303                 if (IGMP_V2_SEEN(in_dev)) {
1304                         if (reporter)
1305                                 igmp_send_report(in_dev, im, IGMP_HOST_LEAVE_MESSAGE);
1306                         return;
1307                 }
1308                 /* IGMPv3 */
1309                 igmpv3_add_delrec(in_dev, im, gfp);
1310 
1311                 igmp_ifc_event(in_dev);
1312         }
1313 #endif
1314 }
1315 
1316 static void igmp_group_dropped(struct ip_mc_list *im)
1317 {
1318         __igmp_group_dropped(im, GFP_KERNEL);
1319 }
1320 
1321 static void igmp_group_added(struct ip_mc_list *im)
1322 {
1323         struct in_device *in_dev = im->interface;
1324 #ifdef CONFIG_IP_MULTICAST
1325         struct net *net = dev_net(in_dev->dev);
1326 #endif
1327 
1328         if (im->loaded == 0) {
1329                 im->loaded = 1;
1330                 ip_mc_filter_add(in_dev, im->multiaddr);
1331         }
1332 
1333 #ifdef CONFIG_IP_MULTICAST
1334         if (im->multiaddr == IGMP_ALL_HOSTS)
1335                 return;
1336         if (ipv4_is_local_multicast(im->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports)
1337                 return;
1338 
1339         if (in_dev->dead)
1340                 return;
1341 
1342         im->unsolicit_count = net->ipv4.sysctl_igmp_qrv;
1343         if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) {
1344                 spin_lock_bh(&im->lock);
1345                 igmp_start_timer(im, IGMP_INITIAL_REPORT_DELAY);
1346                 spin_unlock_bh(&im->lock);
1347                 return;
1348         }
1349         /* else, v3 */
1350 
1351         /* Based on RFC3376 5.1, for newly added INCLUDE SSM, we should
1352          * not send filter-mode change record as the mode should be from
1353          * IN() to IN(A).
1354          */
1355         if (im->sfmode == MCAST_EXCLUDE)
1356                 im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
1357 
1358         igmp_ifc_event(in_dev);
1359 #endif
1360 }
1361 
1362 
1363 /*
1364  *      Multicast list managers
1365  */
1366 
1367 static u32 ip_mc_hash(const struct ip_mc_list *im)
1368 {
1369         return hash_32((__force u32)im->multiaddr, MC_HASH_SZ_LOG);
1370 }
1371 
1372 static void ip_mc_hash_add(struct in_device *in_dev,
1373                            struct ip_mc_list *im)
1374 {
1375         struct ip_mc_list __rcu **mc_hash;
1376         u32 hash;
1377 
1378         mc_hash = rtnl_dereference(in_dev->mc_hash);
1379         if (mc_hash) {
1380                 hash = ip_mc_hash(im);
1381                 im->next_hash = mc_hash[hash];
1382                 rcu_assign_pointer(mc_hash[hash], im);
1383                 return;
1384         }
1385 
1386         /* do not use a hash table for small number of items */
1387         if (in_dev->mc_count < 4)
1388                 return;
1389 
1390         mc_hash = kzalloc(sizeof(struct ip_mc_list *) << MC_HASH_SZ_LOG,
1391                           GFP_KERNEL);
1392         if (!mc_hash)
1393                 return;
1394 
1395         for_each_pmc_rtnl(in_dev, im) {
1396                 hash = ip_mc_hash(im);
1397                 im->next_hash = mc_hash[hash];
1398                 RCU_INIT_POINTER(mc_hash[hash], im);
1399         }
1400 
1401         rcu_assign_pointer(in_dev->mc_hash, mc_hash);
1402 }
1403 
1404 static void ip_mc_hash_remove(struct in_device *in_dev,
1405                               struct ip_mc_list *im)
1406 {
1407         struct ip_mc_list __rcu **mc_hash = rtnl_dereference(in_dev->mc_hash);
1408         struct ip_mc_list *aux;
1409 
1410         if (!mc_hash)
1411                 return;
1412         mc_hash += ip_mc_hash(im);
1413         while ((aux = rtnl_dereference(*mc_hash)) != im)
1414                 mc_hash = &aux->next_hash;
1415         *mc_hash = im->next_hash;
1416 }
1417 
1418 
1419 /*
1420  *      A socket has joined a multicast group on device dev.
1421  */
1422 static void ____ip_mc_inc_group(struct in_device *in_dev, __be32 addr,
1423                                 unsigned int mode, gfp_t gfp)
1424 {
1425         struct ip_mc_list *im;
1426 
1427         ASSERT_RTNL();
1428 
1429         for_each_pmc_rtnl(in_dev, im) {
1430                 if (im->multiaddr == addr) {
1431                         im->users++;
1432                         ip_mc_add_src(in_dev, &addr, mode, 0, NULL, 0);
1433                         goto out;
1434                 }
1435         }
1436 
1437         im = kzalloc(sizeof(*im), gfp);
1438         if (!im)
1439                 goto out;
1440 
1441         im->users = 1;
1442         im->interface = in_dev;
1443         in_dev_hold(in_dev);
1444         im->multiaddr = addr;
1445         /* initial mode is (EX, empty) */
1446         im->sfmode = mode;
1447         im->sfcount[mode] = 1;
1448         refcount_set(&im->refcnt, 1);
1449         spin_lock_init(&im->lock);
1450 #ifdef CONFIG_IP_MULTICAST
1451         timer_setup(&im->timer, igmp_timer_expire, 0);
1452 #endif
1453 
1454         im->next_rcu = in_dev->mc_list;
1455         in_dev->mc_count++;
1456         rcu_assign_pointer(in_dev->mc_list, im);
1457 
1458         ip_mc_hash_add(in_dev, im);
1459 
1460 #ifdef CONFIG_IP_MULTICAST
1461         igmpv3_del_delrec(in_dev, im);
1462 #endif
1463         igmp_group_added(im);
1464         if (!in_dev->dead)
1465                 ip_rt_multicast_event(in_dev);
1466 out:
1467         return;
1468 }
1469 
1470 void __ip_mc_inc_group(struct in_device *in_dev, __be32 addr, gfp_t gfp)
1471 {
1472         ____ip_mc_inc_group(in_dev, addr, MCAST_EXCLUDE, gfp);
1473 }
1474 EXPORT_SYMBOL(__ip_mc_inc_group);
1475 
1476 void ip_mc_inc_group(struct in_device *in_dev, __be32 addr)
1477 {
1478         __ip_mc_inc_group(in_dev, addr, GFP_KERNEL);
1479 }
1480 EXPORT_SYMBOL(ip_mc_inc_group);
1481 
1482 static int ip_mc_check_iphdr(struct sk_buff *skb)
1483 {
1484         const struct iphdr *iph;
1485         unsigned int len;
1486         unsigned int offset = skb_network_offset(skb) + sizeof(*iph);
1487 
1488         if (!pskb_may_pull(skb, offset))
1489                 return -EINVAL;
1490 
1491         iph = ip_hdr(skb);
1492 
1493         if (iph->version != 4 || ip_hdrlen(skb) < sizeof(*iph))
1494                 return -EINVAL;
1495 
1496         offset += ip_hdrlen(skb) - sizeof(*iph);
1497 
1498         if (!pskb_may_pull(skb, offset))
1499                 return -EINVAL;
1500 
1501         iph = ip_hdr(skb);
1502 
1503         if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
1504                 return -EINVAL;
1505 
1506         len = skb_network_offset(skb) + ntohs(iph->tot_len);
1507         if (skb->len < len || len < offset)
1508                 return -EINVAL;
1509 
1510         skb_set_transport_header(skb, offset);
1511 
1512         return 0;
1513 }
1514 
1515 static int ip_mc_check_igmp_reportv3(struct sk_buff *skb)
1516 {
1517         unsigned int len = skb_transport_offset(skb);
1518 
1519         len += sizeof(struct igmpv3_report);
1520 
1521         return ip_mc_may_pull(skb, len) ? 0 : -EINVAL;
1522 }
1523 
1524 static int ip_mc_check_igmp_query(struct sk_buff *skb)
1525 {
1526         unsigned int transport_len = ip_transport_len(skb);
1527         unsigned int len;
1528 
1529         /* IGMPv{1,2}? */
1530         if (transport_len != sizeof(struct igmphdr)) {
1531                 /* or IGMPv3? */
1532                 if (transport_len < sizeof(struct igmpv3_query))
1533                         return -EINVAL;
1534 
1535                 len = skb_transport_offset(skb) + sizeof(struct igmpv3_query);
1536                 if (!ip_mc_may_pull(skb, len))
1537                         return -EINVAL;
1538         }
1539 
1540         /* RFC2236+RFC3376 (IGMPv2+IGMPv3) require the multicast link layer
1541          * all-systems destination addresses (224.0.0.1) for general queries
1542          */
1543         if (!igmp_hdr(skb)->group &&
1544             ip_hdr(skb)->daddr != htonl(INADDR_ALLHOSTS_GROUP))
1545                 return -EINVAL;
1546 
1547         return 0;
1548 }
1549 
1550 static int ip_mc_check_igmp_msg(struct sk_buff *skb)
1551 {
1552         switch (igmp_hdr(skb)->type) {
1553         case IGMP_HOST_LEAVE_MESSAGE:
1554         case IGMP_HOST_MEMBERSHIP_REPORT:
1555         case IGMPV2_HOST_MEMBERSHIP_REPORT:
1556                 return 0;
1557         case IGMPV3_HOST_MEMBERSHIP_REPORT:
1558                 return ip_mc_check_igmp_reportv3(skb);
1559         case IGMP_HOST_MEMBERSHIP_QUERY:
1560                 return ip_mc_check_igmp_query(skb);
1561         default:
1562                 return -ENOMSG;
1563         }
1564 }
1565 
1566 static inline __sum16 ip_mc_validate_checksum(struct sk_buff *skb)
1567 {
1568         return skb_checksum_simple_validate(skb);
1569 }
1570 
1571 static int ip_mc_check_igmp_csum(struct sk_buff *skb)
1572 {
1573         unsigned int len = skb_transport_offset(skb) + sizeof(struct igmphdr);
1574         unsigned int transport_len = ip_transport_len(skb);
1575         struct sk_buff *skb_chk;
1576 
1577         if (!ip_mc_may_pull(skb, len))
1578                 return -EINVAL;
1579 
1580         skb_chk = skb_checksum_trimmed(skb, transport_len,
1581                                        ip_mc_validate_checksum);
1582         if (!skb_chk)
1583                 return -EINVAL;
1584 
1585         if (skb_chk != skb)
1586                 kfree_skb(skb_chk);
1587 
1588         return 0;
1589 }
1590 
1591 /**
1592  * ip_mc_check_igmp - checks whether this is a sane IGMP packet
1593  * @skb: the skb to validate
1594  *
1595  * Checks whether an IPv4 packet is a valid IGMP packet. If so sets
1596  * skb transport header accordingly and returns zero.
1597  *
1598  * -EINVAL: A broken packet was detected, i.e. it violates some internet
1599  *  standard
1600  * -ENOMSG: IP header validation succeeded but it is not an IGMP packet.
1601  * -ENOMEM: A memory allocation failure happened.
1602  *
1603  * Caller needs to set the skb network header and free any returned skb if it
1604  * differs from the provided skb.
1605  */
1606 int ip_mc_check_igmp(struct sk_buff *skb)
1607 {
1608         int ret = ip_mc_check_iphdr(skb);
1609 
1610         if (ret < 0)
1611                 return ret;
1612 
1613         if (ip_hdr(skb)->protocol != IPPROTO_IGMP)
1614                 return -ENOMSG;
1615 
1616         ret = ip_mc_check_igmp_csum(skb);
1617         if (ret < 0)
1618                 return ret;
1619 
1620         return ip_mc_check_igmp_msg(skb);
1621 }
1622 EXPORT_SYMBOL(ip_mc_check_igmp);
1623 
1624 /*
1625  *      Resend IGMP JOIN report; used by netdev notifier.
1626  */
1627 static void ip_mc_rejoin_groups(struct in_device *in_dev)
1628 {
1629 #ifdef CONFIG_IP_MULTICAST
1630         struct ip_mc_list *im;
1631         int type;
1632         struct net *net = dev_net(in_dev->dev);
1633 
1634         ASSERT_RTNL();
1635 
1636         for_each_pmc_rtnl(in_dev, im) {
1637                 if (im->multiaddr == IGMP_ALL_HOSTS)
1638                         continue;
1639                 if (ipv4_is_local_multicast(im->multiaddr) &&
1640                     !net->ipv4.sysctl_igmp_llm_reports)
1641                         continue;
1642 
1643                 /* a failover is happening and switches
1644                  * must be notified immediately
1645                  */
1646                 if (IGMP_V1_SEEN(in_dev))
1647                         type = IGMP_HOST_MEMBERSHIP_REPORT;
1648                 else if (IGMP_V2_SEEN(in_dev))
1649                         type = IGMPV2_HOST_MEMBERSHIP_REPORT;
1650                 else
1651                         type = IGMPV3_HOST_MEMBERSHIP_REPORT;
1652                 igmp_send_report(in_dev, im, type);
1653         }
1654 #endif
1655 }
1656 
1657 /*
1658  *      A socket has left a multicast group on device dev
1659  */
1660 
1661 void __ip_mc_dec_group(struct in_device *in_dev, __be32 addr, gfp_t gfp)
1662 {
1663         struct ip_mc_list *i;
1664         struct ip_mc_list __rcu **ip;
1665 
1666         ASSERT_RTNL();
1667 
1668         for (ip = &in_dev->mc_list;
1669              (i = rtnl_dereference(*ip)) != NULL;
1670              ip = &i->next_rcu) {
1671                 if (i->multiaddr == addr) {
1672                         if (--i->users == 0) {
1673                                 ip_mc_hash_remove(in_dev, i);
1674                                 *ip = i->next_rcu;
1675                                 in_dev->mc_count--;
1676                                 __igmp_group_dropped(i, gfp);
1677                                 ip_mc_clear_src(i);
1678 
1679                                 if (!in_dev->dead)
1680                                         ip_rt_multicast_event(in_dev);
1681 
1682                                 ip_ma_put(i);
1683                                 return;
1684                         }
1685                         break;
1686                 }
1687         }
1688 }
1689 EXPORT_SYMBOL(__ip_mc_dec_group);
1690 
1691 /* Device changing type */
1692 
1693 void ip_mc_unmap(struct in_device *in_dev)
1694 {
1695         struct ip_mc_list *pmc;
1696 
1697         ASSERT_RTNL();
1698 
1699         for_each_pmc_rtnl(in_dev, pmc)
1700                 igmp_group_dropped(pmc);
1701 }
1702 
1703 void ip_mc_remap(struct in_device *in_dev)
1704 {
1705         struct ip_mc_list *pmc;
1706 
1707         ASSERT_RTNL();
1708 
1709         for_each_pmc_rtnl(in_dev, pmc) {
1710 #ifdef CONFIG_IP_MULTICAST
1711                 igmpv3_del_delrec(in_dev, pmc);
1712 #endif
1713                 igmp_group_added(pmc);
1714         }
1715 }
1716 
1717 /* Device going down */
1718 
1719 void ip_mc_down(struct in_device *in_dev)
1720 {
1721         struct ip_mc_list *pmc;
1722 
1723         ASSERT_RTNL();
1724 
1725         for_each_pmc_rtnl(in_dev, pmc)
1726                 igmp_group_dropped(pmc);
1727 
1728 #ifdef CONFIG_IP_MULTICAST
1729         in_dev->mr_ifc_count = 0;
1730         if (del_timer(&in_dev->mr_ifc_timer))
1731                 __in_dev_put(in_dev);
1732         in_dev->mr_gq_running = 0;
1733         if (del_timer(&in_dev->mr_gq_timer))
1734                 __in_dev_put(in_dev);
1735 #endif
1736 
1737         ip_mc_dec_group(in_dev, IGMP_ALL_HOSTS);
1738 }
1739 
1740 #ifdef CONFIG_IP_MULTICAST
1741 static void ip_mc_reset(struct in_device *in_dev)
1742 {
1743         struct net *net = dev_net(in_dev->dev);
1744 
1745         in_dev->mr_qi = IGMP_QUERY_INTERVAL;
1746         in_dev->mr_qri = IGMP_QUERY_RESPONSE_INTERVAL;
1747         in_dev->mr_qrv = net->ipv4.sysctl_igmp_qrv;
1748 }
1749 #else
1750 static void ip_mc_reset(struct in_device *in_dev)
1751 {
1752 }
1753 #endif
1754 
1755 void ip_mc_init_dev(struct in_device *in_dev)
1756 {
1757         ASSERT_RTNL();
1758 
1759 #ifdef CONFIG_IP_MULTICAST
1760         timer_setup(&in_dev->mr_gq_timer, igmp_gq_timer_expire, 0);
1761         timer_setup(&in_dev->mr_ifc_timer, igmp_ifc_timer_expire, 0);
1762 #endif
1763         ip_mc_reset(in_dev);
1764 
1765         spin_lock_init(&in_dev->mc_tomb_lock);
1766 }
1767 
1768 /* Device going up */
1769 
1770 void ip_mc_up(struct in_device *in_dev)
1771 {
1772         struct ip_mc_list *pmc;
1773 
1774         ASSERT_RTNL();
1775 
1776         ip_mc_reset(in_dev);
1777         ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS);
1778 
1779         for_each_pmc_rtnl(in_dev, pmc) {
1780 #ifdef CONFIG_IP_MULTICAST
1781                 igmpv3_del_delrec(in_dev, pmc);
1782 #endif
1783                 igmp_group_added(pmc);
1784         }
1785 }
1786 
1787 /*
1788  *      Device is about to be destroyed: clean up.
1789  */
1790 
1791 void ip_mc_destroy_dev(struct in_device *in_dev)
1792 {
1793         struct ip_mc_list *i;
1794 
1795         ASSERT_RTNL();
1796 
1797         /* Deactivate timers */
1798         ip_mc_down(in_dev);
1799 #ifdef CONFIG_IP_MULTICAST
1800         igmpv3_clear_delrec(in_dev);
1801 #endif
1802 
1803         while ((i = rtnl_dereference(in_dev->mc_list)) != NULL) {
1804                 in_dev->mc_list = i->next_rcu;
1805                 in_dev->mc_count--;
1806                 ip_ma_put(i);
1807         }
1808 }
1809 
1810 /* RTNL is locked */
1811 static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr)
1812 {
1813         struct net_device *dev = NULL;
1814         struct in_device *idev = NULL;
1815 
1816         if (imr->imr_ifindex) {
1817                 idev = inetdev_by_index(net, imr->imr_ifindex);
1818                 return idev;
1819         }
1820         if (imr->imr_address.s_addr) {
1821                 dev = __ip_dev_find(net, imr->imr_address.s_addr, false);
1822                 if (!dev)
1823                         return NULL;
1824         }
1825 
1826         if (!dev) {
1827                 struct rtable *rt = ip_route_output(net,
1828                                                     imr->imr_multiaddr.s_addr,
1829                                                     0, 0, 0);
1830                 if (!IS_ERR(rt)) {
1831                         dev = rt->dst.dev;
1832                         ip_rt_put(rt);
1833                 }
1834         }
1835         if (dev) {
1836                 imr->imr_ifindex = dev->ifindex;
1837                 idev = __in_dev_get_rtnl(dev);
1838         }
1839         return idev;
1840 }
1841 
1842 /*
1843  *      Join a socket to a group
1844  */
1845 
1846 static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode,
1847         __be32 *psfsrc)
1848 {
1849         struct ip_sf_list *psf, *psf_prev;
1850         int rv = 0;
1851 
1852         psf_prev = NULL;
1853         for (psf = pmc->sources; psf; psf = psf->sf_next) {
1854                 if (psf->sf_inaddr == *psfsrc)
1855                         break;
1856                 psf_prev = psf;
1857         }
1858         if (!psf || psf->sf_count[sfmode] == 0) {
1859                 /* source filter not found, or count wrong =>  bug */
1860                 return -ESRCH;
1861         }
1862         psf->sf_count[sfmode]--;
1863         if (psf->sf_count[sfmode] == 0) {
1864                 ip_rt_multicast_event(pmc->interface);
1865         }
1866         if (!psf->sf_count[MCAST_INCLUDE] && !psf->sf_count[MCAST_EXCLUDE]) {
1867 #ifdef CONFIG_IP_MULTICAST
1868                 struct in_device *in_dev = pmc->interface;
1869                 struct net *net = dev_net(in_dev->dev);
1870 #endif
1871 
1872                 /* no more filters for this source */
1873                 if (psf_prev)
1874                         psf_prev->sf_next = psf->sf_next;
1875                 else
1876                         pmc->sources = psf->sf_next;
1877 #ifdef CONFIG_IP_MULTICAST
1878                 if (psf->sf_oldin &&
1879                     !IGMP_V1_SEEN(in_dev) && !IGMP_V2_SEEN(in_dev)) {
1880                         psf->sf_crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
1881                         psf->sf_next = pmc->tomb;
1882                         pmc->tomb = psf;
1883                         rv = 1;
1884                 } else
1885 #endif
1886                         kfree(psf);
1887         }
1888         return rv;
1889 }
1890 
1891 #ifndef CONFIG_IP_MULTICAST
1892 #define igmp_ifc_event(x)       do { } while (0)
1893 #endif
1894 
1895 static int ip_mc_del_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
1896                          int sfcount, __be32 *psfsrc, int delta)
1897 {
1898         struct ip_mc_list *pmc;
1899         int     changerec = 0;
1900         int     i, err;
1901 
1902         if (!in_dev)
1903                 return -ENODEV;
1904         rcu_read_lock();
1905         for_each_pmc_rcu(in_dev, pmc) {
1906                 if (*pmca == pmc->multiaddr)
1907                         break;
1908         }
1909         if (!pmc) {
1910                 /* MCA not found?? bug */
1911                 rcu_read_unlock();
1912                 return -ESRCH;
1913         }
1914         spin_lock_bh(&pmc->lock);
1915         rcu_read_unlock();
1916 #ifdef CONFIG_IP_MULTICAST
1917         sf_markstate(pmc);
1918 #endif
1919         if (!delta) {
1920                 err = -EINVAL;
1921                 if (!pmc->sfcount[sfmode])
1922                         goto out_unlock;
1923                 pmc->sfcount[sfmode]--;
1924         }
1925         err = 0;
1926         for (i = 0; i < sfcount; i++) {
1927                 int rv = ip_mc_del1_src(pmc, sfmode, &psfsrc[i]);
1928 
1929                 changerec |= rv > 0;
1930                 if (!err && rv < 0)
1931                         err = rv;
1932         }
1933         if (pmc->sfmode == MCAST_EXCLUDE &&
1934             pmc->sfcount[MCAST_EXCLUDE] == 0 &&
1935             pmc->sfcount[MCAST_INCLUDE]) {
1936 #ifdef CONFIG_IP_MULTICAST
1937                 struct ip_sf_list *psf;
1938                 struct net *net = dev_net(in_dev->dev);
1939 #endif
1940 
1941                 /* filter mode change */
1942                 pmc->sfmode = MCAST_INCLUDE;
1943 #ifdef CONFIG_IP_MULTICAST
1944                 pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
1945                 in_dev->mr_ifc_count = pmc->crcount;
1946                 for (psf = pmc->sources; psf; psf = psf->sf_next)
1947                         psf->sf_crcount = 0;
1948                 igmp_ifc_event(pmc->interface);
1949         } else if (sf_setstate(pmc) || changerec) {
1950                 igmp_ifc_event(pmc->interface);
1951 #endif
1952         }
1953 out_unlock:
1954         spin_unlock_bh(&pmc->lock);
1955         return err;
1956 }
1957 
1958 /*
1959  * Add multicast single-source filter to the interface list
1960  */
1961 static int ip_mc_add1_src(struct ip_mc_list *pmc, int sfmode,
1962         __be32 *psfsrc)
1963 {
1964         struct ip_sf_list *psf, *psf_prev;
1965 
1966         psf_prev = NULL;
1967         for (psf = pmc->sources; psf; psf = psf->sf_next) {
1968                 if (psf->sf_inaddr == *psfsrc)
1969                         break;
1970                 psf_prev = psf;
1971         }
1972         if (!psf) {
1973                 psf = kzalloc(sizeof(*psf), GFP_ATOMIC);
1974                 if (!psf)
1975                         return -ENOBUFS;
1976                 psf->sf_inaddr = *psfsrc;
1977                 if (psf_prev) {
1978                         psf_prev->sf_next = psf;
1979                 } else
1980                         pmc->sources = psf;
1981         }
1982         psf->sf_count[sfmode]++;
1983         if (psf->sf_count[sfmode] == 1) {
1984                 ip_rt_multicast_event(pmc->interface);
1985         }
1986         return 0;
1987 }
1988 
1989 #ifdef CONFIG_IP_MULTICAST
1990 static void sf_markstate(struct ip_mc_list *pmc)
1991 {
1992         struct ip_sf_list *psf;
1993         int mca_xcount = pmc->sfcount[MCAST_EXCLUDE];
1994 
1995         for (psf = pmc->sources; psf; psf = psf->sf_next)
1996                 if (pmc->sfcount[MCAST_EXCLUDE]) {
1997                         psf->sf_oldin = mca_xcount ==
1998                                 psf->sf_count[MCAST_EXCLUDE] &&
1999                                 !psf->sf_count[MCAST_INCLUDE];
2000                 } else
2001                         psf->sf_oldin = psf->sf_count[MCAST_INCLUDE] != 0;
2002 }
2003 
2004 static int sf_setstate(struct ip_mc_list *pmc)
2005 {
2006         struct ip_sf_list *psf, *dpsf;
2007         int mca_xcount = pmc->sfcount[MCAST_EXCLUDE];
2008         int qrv = pmc->interface->mr_qrv;
2009         int new_in, rv;
2010 
2011         rv = 0;
2012         for (psf = pmc->sources; psf; psf = psf->sf_next) {
2013                 if (pmc->sfcount[MCAST_EXCLUDE]) {
2014                         new_in = mca_xcount == psf->sf_count[MCAST_EXCLUDE] &&
2015                                 !psf->sf_count[MCAST_INCLUDE];
2016                 } else
2017                         new_in = psf->sf_count[MCAST_INCLUDE] != 0;
2018                 if (new_in) {
2019                         if (!psf->sf_oldin) {
2020                                 struct ip_sf_list *prev = NULL;
2021 
2022                                 for (dpsf = pmc->tomb; dpsf; dpsf = dpsf->sf_next) {
2023                                         if (dpsf->sf_inaddr == psf->sf_inaddr)
2024                                                 break;
2025                                         prev = dpsf;
2026                                 }
2027                                 if (dpsf) {
2028                                         if (prev)
2029                                                 prev->sf_next = dpsf->sf_next;
2030                                         else
2031                                                 pmc->tomb = dpsf->sf_next;
2032                                         kfree(dpsf);
2033                                 }
2034                                 psf->sf_crcount = qrv;
2035                                 rv++;
2036                         }
2037                 } else if (psf->sf_oldin) {
2038 
2039                         psf->sf_crcount = 0;
2040                         /*
2041                          * add or update "delete" records if an active filter
2042                          * is now inactive
2043                          */
2044                         for (dpsf = pmc->tomb; dpsf; dpsf = dpsf->sf_next)
2045                                 if (dpsf->sf_inaddr == psf->sf_inaddr)
2046                                         break;
2047                         if (!dpsf) {
2048                                 dpsf = kmalloc(sizeof(*dpsf), GFP_ATOMIC);
2049                                 if (!dpsf)
2050                                         continue;
2051                                 *dpsf = *psf;
2052                                 /* pmc->lock held by callers */
2053                                 dpsf->sf_next = pmc->tomb;
2054                                 pmc->tomb = dpsf;
2055                         }
2056                         dpsf->sf_crcount = qrv;
2057                         rv++;
2058                 }
2059         }
2060         return rv;
2061 }
2062 #endif
2063 
2064 /*
2065  * Add multicast source filter list to the interface list
2066  */
2067 static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
2068                          int sfcount, __be32 *psfsrc, int delta)
2069 {
2070         struct ip_mc_list *pmc;
2071         int     isexclude;
2072         int     i, err;
2073 
2074         if (!in_dev)
2075                 return -ENODEV;
2076         rcu_read_lock();
2077         for_each_pmc_rcu(in_dev, pmc) {
2078                 if (*pmca == pmc->multiaddr)
2079                         break;
2080         }
2081         if (!pmc) {
2082                 /* MCA not found?? bug */
2083                 rcu_read_unlock();
2084                 return -ESRCH;
2085         }
2086         spin_lock_bh(&pmc->lock);
2087         rcu_read_unlock();
2088 
2089 #ifdef CONFIG_IP_MULTICAST
2090         sf_markstate(pmc);
2091 #endif
2092         isexclude = pmc->sfmode == MCAST_EXCLUDE;
2093         if (!delta)
2094                 pmc->sfcount[sfmode]++;
2095         err = 0;
2096         for (i = 0; i < sfcount; i++) {
2097                 err = ip_mc_add1_src(pmc, sfmode, &psfsrc[i]);
2098                 if (err)
2099                         break;
2100         }
2101         if (err) {
2102                 int j;
2103 
2104                 if (!delta)
2105                         pmc->sfcount[sfmode]--;
2106                 for (j = 0; j < i; j++)
2107                         (void) ip_mc_del1_src(pmc, sfmode, &psfsrc[j]);
2108         } else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE] != 0)) {
2109 #ifdef CONFIG_IP_MULTICAST
2110                 struct ip_sf_list *psf;
2111                 struct net *net = dev_net(pmc->interface->dev);
2112                 in_dev = pmc->interface;
2113 #endif
2114 
2115                 /* filter mode change */
2116                 if (pmc->sfcount[MCAST_EXCLUDE])
2117                         pmc->sfmode = MCAST_EXCLUDE;
2118                 else if (pmc->sfcount[MCAST_INCLUDE])
2119                         pmc->sfmode = MCAST_INCLUDE;
2120 #ifdef CONFIG_IP_MULTICAST
2121                 /* else no filters; keep old mode for reports */
2122 
2123                 pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
2124                 in_dev->mr_ifc_count = pmc->crcount;
2125                 for (psf = pmc->sources; psf; psf = psf->sf_next)
2126                         psf->sf_crcount = 0;
2127                 igmp_ifc_event(in_dev);
2128         } else if (sf_setstate(pmc)) {
2129                 igmp_ifc_event(in_dev);
2130 #endif
2131         }
2132         spin_unlock_bh(&pmc->lock);
2133         return err;
2134 }
2135 
2136 static void ip_mc_clear_src(struct ip_mc_list *pmc)
2137 {
2138         struct ip_sf_list *tomb, *sources;
2139 
2140         spin_lock_bh(&pmc->lock);
2141         tomb = pmc->tomb;
2142         pmc->tomb = NULL;
2143         sources = pmc->sources;
2144         pmc->sources = NULL;
2145         pmc->sfmode = MCAST_EXCLUDE;
2146         pmc->sfcount[MCAST_INCLUDE] = 0;
2147         pmc->sfcount[MCAST_EXCLUDE] = 1;
2148         spin_unlock_bh(&pmc->lock);
2149 
2150         ip_sf_list_clear_all(tomb);
2151         ip_sf_list_clear_all(sources);
2152 }
2153 
2154 /* Join a multicast group
2155  */
2156 static int __ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr,
2157                               unsigned int mode)
2158 {
2159         __be32 addr = imr->imr_multiaddr.s_addr;
2160         struct ip_mc_socklist *iml, *i;
2161         struct in_device *in_dev;
2162         struct inet_sock *inet = inet_sk(sk);
2163         struct net *net = sock_net(sk);
2164         int ifindex;
2165         int count = 0;
2166         int err;
2167 
2168         ASSERT_RTNL();
2169 
2170         if (!ipv4_is_multicast(addr))
2171                 return -EINVAL;
2172 
2173         in_dev = ip_mc_find_dev(net, imr);
2174 
2175         if (!in_dev) {
2176                 err = -ENODEV;
2177                 goto done;
2178         }
2179 
2180         err = -EADDRINUSE;
2181         ifindex = imr->imr_ifindex;
2182         for_each_pmc_rtnl(inet, i) {
2183                 if (i->multi.imr_multiaddr.s_addr == addr &&
2184                     i->multi.imr_ifindex == ifindex)
2185                         goto done;
2186                 count++;
2187         }
2188         err = -ENOBUFS;
2189         if (count >= net->ipv4.sysctl_igmp_max_memberships)
2190                 goto done;
2191         iml = sock_kmalloc(sk, sizeof(*iml), GFP_KERNEL);
2192         if (!iml)
2193                 goto done;
2194 
2195         memcpy(&iml->multi, imr, sizeof(*imr));
2196         iml->next_rcu = inet->mc_list;
2197         iml->sflist = NULL;
2198         iml->sfmode = mode;
2199         rcu_assign_pointer(inet->mc_list, iml);
2200         ____ip_mc_inc_group(in_dev, addr, mode, GFP_KERNEL);
2201         err = 0;
2202 done:
2203         return err;
2204 }
2205 
2206 /* Join ASM (Any-Source Multicast) group
2207  */
2208 int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr)
2209 {
2210         return __ip_mc_join_group(sk, imr, MCAST_EXCLUDE);
2211 }
2212 EXPORT_SYMBOL(ip_mc_join_group);
2213 
2214 /* Join SSM (Source-Specific Multicast) group
2215  */
2216 int ip_mc_join_group_ssm(struct sock *sk, struct ip_mreqn *imr,
2217                          unsigned int mode)
2218 {
2219         return __ip_mc_join_group(sk, imr, mode);
2220 }
2221 
2222 static int ip_mc_leave_src(struct sock *sk, struct ip_mc_socklist *iml,
2223                            struct in_device *in_dev)
2224 {
2225         struct ip_sf_socklist *psf = rtnl_dereference(iml->sflist);
2226         int err;
2227 
2228         if (!psf) {
2229                 /* any-source empty exclude case */
2230                 return ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr,
2231                         iml->sfmode, 0, NULL, 0);
2232         }
2233         err = ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr,
2234                         iml->sfmode, psf->sl_count, psf->sl_addr, 0);
2235         RCU_INIT_POINTER(iml->sflist, NULL);
2236         /* decrease mem now to avoid the memleak warning */
2237         atomic_sub(IP_SFLSIZE(psf->sl_max), &sk->sk_omem_alloc);
2238         kfree_rcu(psf, rcu);
2239         return err;
2240 }
2241 
2242 int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr)
2243 {
2244         struct inet_sock *inet = inet_sk(sk);
2245         struct ip_mc_socklist *iml;
2246         struct ip_mc_socklist __rcu **imlp;
2247         struct in_device *in_dev;
2248         struct net *net = sock_net(sk);
2249         __be32 group = imr->imr_multiaddr.s_addr;
2250         u32 ifindex;
2251         int ret = -EADDRNOTAVAIL;
2252 
2253         ASSERT_RTNL();
2254 
2255         in_dev = ip_mc_find_dev(net, imr);
2256         if (!imr->imr_ifindex && !imr->imr_address.s_addr && !in_dev) {
2257                 ret = -ENODEV;
2258                 goto out;
2259         }
2260         ifindex = imr->imr_ifindex;
2261         for (imlp = &inet->mc_list;
2262              (iml = rtnl_dereference(*imlp)) != NULL;
2263              imlp = &iml->next_rcu) {
2264                 if (iml->multi.imr_multiaddr.s_addr != group)
2265                         continue;
2266                 if (ifindex) {
2267                         if (iml->multi.imr_ifindex != ifindex)
2268                                 continue;
2269                 } else if (imr->imr_address.s_addr && imr->imr_address.s_addr !=
2270                                 iml->multi.imr_address.s_addr)
2271                         continue;
2272 
2273                 (void) ip_mc_leave_src(sk, iml, in_dev);
2274 
2275                 *imlp = iml->next_rcu;
2276 
2277                 if (in_dev)
2278                         ip_mc_dec_group(in_dev, group);
2279 
2280                 /* decrease mem now to avoid the memleak warning */
2281                 atomic_sub(sizeof(*iml), &sk->sk_omem_alloc);
2282                 kfree_rcu(iml, rcu);
2283                 return 0;
2284         }
2285 out:
2286         return ret;
2287 }
2288 EXPORT_SYMBOL(ip_mc_leave_group);
2289 
2290 int ip_mc_source(int add, int omode, struct sock *sk, struct
2291         ip_mreq_source *mreqs, int ifindex)
2292 {
2293         int err;
2294         struct ip_mreqn imr;
2295         __be32 addr = mreqs->imr_multiaddr;
2296         struct ip_mc_socklist *pmc;
2297         struct in_device *in_dev = NULL;
2298         struct inet_sock *inet = inet_sk(sk);
2299         struct ip_sf_socklist *psl;
2300         struct net *net = sock_net(sk);
2301         int leavegroup = 0;
2302         int i, j, rv;
2303 
2304         if (!ipv4_is_multicast(addr))
2305                 return -EINVAL;
2306 
2307         ASSERT_RTNL();
2308 
2309         imr.imr_multiaddr.s_addr = mreqs->imr_multiaddr;
2310         imr.imr_address.s_addr = mreqs->imr_interface;
2311         imr.imr_ifindex = ifindex;
2312         in_dev = ip_mc_find_dev(net, &imr);
2313 
2314         if (!in_dev) {
2315                 err = -ENODEV;
2316                 goto done;
2317         }
2318         err = -EADDRNOTAVAIL;
2319 
2320         for_each_pmc_rtnl(inet, pmc) {
2321                 if ((pmc->multi.imr_multiaddr.s_addr ==
2322                      imr.imr_multiaddr.s_addr) &&
2323                     (pmc->multi.imr_ifindex == imr.imr_ifindex))
2324                         break;
2325         }
2326         if (!pmc) {             /* must have a prior join */
2327                 err = -EINVAL;
2328                 goto done;
2329         }
2330         /* if a source filter was set, must be the same mode as before */
2331         if (pmc->sflist) {
2332                 if (pmc->sfmode != omode) {
2333                         err = -EINVAL;
2334                         goto done;
2335                 }
2336         } else if (pmc->sfmode != omode) {
2337                 /* allow mode switches for empty-set filters */
2338                 ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 0, NULL, 0);
2339                 ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, pmc->sfmode, 0,
2340                         NULL, 0);
2341                 pmc->sfmode = omode;
2342         }
2343 
2344         psl = rtnl_dereference(pmc->sflist);
2345         if (!add) {
2346                 if (!psl)
2347                         goto done;      /* err = -EADDRNOTAVAIL */
2348                 rv = !0;
2349                 for (i = 0; i < psl->sl_count; i++) {
2350                         rv = memcmp(&psl->sl_addr[i], &mreqs->imr_sourceaddr,
2351                                 sizeof(__be32));
2352                         if (rv == 0)
2353                                 break;
2354                 }
2355                 if (rv)         /* source not found */
2356                         goto done;      /* err = -EADDRNOTAVAIL */
2357 
2358                 /* special case - (INCLUDE, empty) == LEAVE_GROUP */
2359                 if (psl->sl_count == 1 && omode == MCAST_INCLUDE) {
2360                         leavegroup = 1;
2361                         goto done;
2362                 }
2363 
2364                 /* update the interface filter */
2365                 ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, omode, 1,
2366                         &mreqs->imr_sourceaddr, 1);
2367 
2368                 for (j = i+1; j < psl->sl_count; j++)
2369                         psl->sl_addr[j-1] = psl->sl_addr[j];
2370                 psl->sl_count--;
2371                 err = 0;
2372                 goto done;
2373         }
2374         /* else, add a new source to the filter */
2375 
2376         if (psl && psl->sl_count >= net->ipv4.sysctl_igmp_max_msf) {
2377                 err = -ENOBUFS;
2378                 goto done;
2379         }
2380         if (!psl || psl->sl_count == psl->sl_max) {
2381                 struct ip_sf_socklist *newpsl;
2382                 int count = IP_SFBLOCK;
2383 
2384                 if (psl)
2385                         count += psl->sl_max;
2386                 newpsl = sock_kmalloc(sk, IP_SFLSIZE(count), GFP_KERNEL);
2387                 if (!newpsl) {
2388                         err = -ENOBUFS;
2389                         goto done;
2390                 }
2391                 newpsl->sl_max = count;
2392                 newpsl->sl_count = count - IP_SFBLOCK;
2393                 if (psl) {
2394                         for (i = 0; i < psl->sl_count; i++)
2395                                 newpsl->sl_addr[i] = psl->sl_addr[i];
2396                         /* decrease mem now to avoid the memleak warning */
2397                         atomic_sub(IP_SFLSIZE(psl->sl_max), &sk->sk_omem_alloc);
2398                         kfree_rcu(psl, rcu);
2399                 }
2400                 rcu_assign_pointer(pmc->sflist, newpsl);
2401                 psl = newpsl;
2402         }
2403         rv = 1; /* > 0 for insert logic below if sl_count is 0 */
2404         for (i = 0; i < psl->sl_count; i++) {
2405                 rv = memcmp(&psl->sl_addr[i], &mreqs->imr_sourceaddr,
2406                         sizeof(__be32));
2407                 if (rv == 0)
2408                         break;
2409         }
2410         if (rv == 0)            /* address already there is an error */
2411                 goto done;
2412         for (j = psl->sl_count-1; j >= i; j--)
2413                 psl->sl_addr[j+1] = psl->sl_addr[j];
2414         psl->sl_addr[i] = mreqs->imr_sourceaddr;
2415         psl->sl_count++;
2416         err = 0;
2417         /* update the interface list */
2418         ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 1,
2419                 &mreqs->imr_sourceaddr, 1);
2420 done:
2421         if (leavegroup)
2422                 err = ip_mc_leave_group(sk, &imr);
2423         return err;
2424 }
2425 
2426 int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf, int ifindex)
2427 {
2428         int err = 0;
2429         struct ip_mreqn imr;
2430         __be32 addr = msf->imsf_multiaddr;
2431         struct ip_mc_socklist *pmc;
2432         struct in_device *in_dev;
2433         struct inet_sock *inet = inet_sk(sk);
2434         struct ip_sf_socklist *newpsl, *psl;
2435         struct net *net = sock_net(sk);
2436         int leavegroup = 0;
2437 
2438         if (!ipv4_is_multicast(addr))
2439                 return -EINVAL;
2440         if (msf->imsf_fmode != MCAST_INCLUDE &&
2441             msf->imsf_fmode != MCAST_EXCLUDE)
2442                 return -EINVAL;
2443 
2444         ASSERT_RTNL();
2445 
2446         imr.imr_multiaddr.s_addr = msf->imsf_multiaddr;
2447         imr.imr_address.s_addr = msf->imsf_interface;
2448         imr.imr_ifindex = ifindex;
2449         in_dev = ip_mc_find_dev(net, &imr);
2450 
2451         if (!in_dev) {
2452                 err = -ENODEV;
2453                 goto done;
2454         }
2455 
2456         /* special case - (INCLUDE, empty) == LEAVE_GROUP */
2457         if (msf->imsf_fmode == MCAST_INCLUDE && msf->imsf_numsrc == 0) {
2458                 leavegroup = 1;
2459                 goto done;
2460         }
2461 
2462         for_each_pmc_rtnl(inet, pmc) {
2463                 if (pmc->multi.imr_multiaddr.s_addr == msf->imsf_multiaddr &&
2464                     pmc->multi.imr_ifindex == imr.imr_ifindex)
2465                         break;
2466         }
2467         if (!pmc) {             /* must have a prior join */
2468                 err = -EINVAL;
2469                 goto done;
2470         }
2471         if (msf->imsf_numsrc) {
2472                 newpsl = sock_kmalloc(sk, IP_SFLSIZE(msf->imsf_numsrc),
2473                                                            GFP_KERNEL);
2474                 if (!newpsl) {
2475                         err = -ENOBUFS;
2476                         goto done;
2477                 }
2478                 newpsl->sl_max = newpsl->sl_count = msf->imsf_numsrc;
2479                 memcpy(newpsl->sl_addr, msf->imsf_slist,
2480                         msf->imsf_numsrc * sizeof(msf->imsf_slist[0]));
2481                 err = ip_mc_add_src(in_dev, &msf->imsf_multiaddr,
2482                         msf->imsf_fmode, newpsl->sl_count, newpsl->sl_addr, 0);
2483                 if (err) {
2484                         sock_kfree_s(sk, newpsl, IP_SFLSIZE(newpsl->sl_max));
2485                         goto done;
2486                 }
2487         } else {
2488                 newpsl = NULL;
2489                 (void) ip_mc_add_src(in_dev, &msf->imsf_multiaddr,
2490                                      msf->imsf_fmode, 0, NULL, 0);
2491         }
2492         psl = rtnl_dereference(pmc->sflist);
2493         if (psl) {
2494                 (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
2495                         psl->sl_count, psl->sl_addr, 0);
2496                 /* decrease mem now to avoid the memleak warning */
2497                 atomic_sub(IP_SFLSIZE(psl->sl_max), &sk->sk_omem_alloc);
2498                 kfree_rcu(psl, rcu);
2499         } else
2500                 (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
2501                         0, NULL, 0);
2502         rcu_assign_pointer(pmc->sflist, newpsl);
2503         pmc->sfmode = msf->imsf_fmode;
2504         err = 0;
2505 done:
2506         if (leavegroup)
2507                 err = ip_mc_leave_group(sk, &imr);
2508         return err;
2509 }
2510 
2511 int ip_mc_msfget(struct sock *sk, struct ip_msfilter *msf,
2512         struct ip_msfilter __user *optval, int __user *optlen)
2513 {
2514         int err, len, count, copycount;
2515         struct ip_mreqn imr;
2516         __be32 addr = msf->imsf_multiaddr;
2517         struct ip_mc_socklist *pmc;
2518         struct in_device *in_dev;
2519         struct inet_sock *inet = inet_sk(sk);
2520         struct ip_sf_socklist *psl;
2521         struct net *net = sock_net(sk);
2522 
2523         ASSERT_RTNL();
2524 
2525         if (!ipv4_is_multicast(addr))
2526                 return -EINVAL;
2527 
2528         imr.imr_multiaddr.s_addr = msf->imsf_multiaddr;
2529         imr.imr_address.s_addr = msf->imsf_interface;
2530         imr.imr_ifindex = 0;
2531         in_dev = ip_mc_find_dev(net, &imr);
2532 
2533         if (!in_dev) {
2534                 err = -ENODEV;
2535                 goto done;
2536         }
2537         err = -EADDRNOTAVAIL;
2538 
2539         for_each_pmc_rtnl(inet, pmc) {
2540                 if (pmc->multi.imr_multiaddr.s_addr == msf->imsf_multiaddr &&
2541                     pmc->multi.imr_ifindex == imr.imr_ifindex)
2542                         break;
2543         }
2544         if (!pmc)               /* must have a prior join */
2545                 goto done;
2546         msf->imsf_fmode = pmc->sfmode;
2547         psl = rtnl_dereference(pmc->sflist);
2548         if (!psl) {
2549                 len = 0;
2550                 count = 0;
2551         } else {
2552                 count = psl->sl_count;
2553         }
2554         copycount = count < msf->imsf_numsrc ? count : msf->imsf_numsrc;
2555         len = copycount * sizeof(psl->sl_addr[0]);
2556         msf->imsf_numsrc = count;
2557         if (put_user(IP_MSFILTER_SIZE(copycount), optlen) ||
2558             copy_to_user(optval, msf, IP_MSFILTER_SIZE(0))) {
2559                 return -EFAULT;
2560         }
2561         if (len &&
2562             copy_to_user(&optval->imsf_slist[0], psl->sl_addr, len))
2563                 return -EFAULT;
2564         return 0;
2565 done:
2566         return err;
2567 }
2568 
2569 int ip_mc_gsfget(struct sock *sk, struct group_filter *gsf,
2570         struct group_filter __user *optval, int __user *optlen)
2571 {
2572         int err, i, count, copycount;
2573         struct sockaddr_in *psin;
2574         __be32 addr;
2575         struct ip_mc_socklist *pmc;
2576         struct inet_sock *inet = inet_sk(sk);
2577         struct ip_sf_socklist *psl;
2578 
2579         ASSERT_RTNL();
2580 
2581         psin = (struct sockaddr_in *)&gsf->gf_group;
2582         if (psin->sin_family != AF_INET)
2583                 return -EINVAL;
2584         addr = psin->sin_addr.s_addr;
2585         if (!ipv4_is_multicast(addr))
2586                 return -EINVAL;
2587 
2588         err = -EADDRNOTAVAIL;
2589 
2590         for_each_pmc_rtnl(inet, pmc) {
2591                 if (pmc->multi.imr_multiaddr.s_addr == addr &&
2592                     pmc->multi.imr_ifindex == gsf->gf_interface)
2593                         break;
2594         }
2595         if (!pmc)               /* must have a prior join */
2596                 goto done;
2597         gsf->gf_fmode = pmc->sfmode;
2598         psl = rtnl_dereference(pmc->sflist);
2599         count = psl ? psl->sl_count : 0;
2600         copycount = count < gsf->gf_numsrc ? count : gsf->gf_numsrc;
2601         gsf->gf_numsrc = count;
2602         if (put_user(GROUP_FILTER_SIZE(copycount), optlen) ||
2603             copy_to_user(optval, gsf, GROUP_FILTER_SIZE(0))) {
2604                 return -EFAULT;
2605         }
2606         for (i = 0; i < copycount; i++) {
2607                 struct sockaddr_storage ss;
2608 
2609                 psin = (struct sockaddr_in *)&ss;
2610                 memset(&ss, 0, sizeof(ss));
2611                 psin->sin_family = AF_INET;
2612                 psin->sin_addr.s_addr = psl->sl_addr[i];
2613                 if (copy_to_user(&optval->gf_slist[i], &ss, sizeof(ss)))
2614                         return -EFAULT;
2615         }
2616         return 0;
2617 done:
2618         return err;
2619 }
2620 
2621 /*
2622  * check if a multicast source filter allows delivery for a given <src,dst,intf>
2623  */
2624 int ip_mc_sf_allow(struct sock *sk, __be32 loc_addr, __be32 rmt_addr,
2625                    int dif, int sdif)
2626 {
2627         struct inet_sock *inet = inet_sk(sk);
2628         struct ip_mc_socklist *pmc;
2629         struct ip_sf_socklist *psl;
2630         int i;
2631         int ret;
2632 
2633         ret = 1;
2634         if (!ipv4_is_multicast(loc_addr))
2635                 goto out;
2636 
2637         rcu_read_lock();
2638         for_each_pmc_rcu(inet, pmc) {
2639                 if (pmc->multi.imr_multiaddr.s_addr == loc_addr &&
2640                     (pmc->multi.imr_ifindex == dif ||
2641                      (sdif && pmc->multi.imr_ifindex == sdif)))
2642                         break;
2643         }
2644         ret = inet->mc_all;
2645         if (!pmc)
2646                 goto unlock;
2647         psl = rcu_dereference(pmc->sflist);
2648         ret = (pmc->sfmode == MCAST_EXCLUDE);
2649         if (!psl)
2650                 goto unlock;
2651 
2652         for (i = 0; i < psl->sl_count; i++) {
2653                 if (psl->sl_addr[i] == rmt_addr)
2654                         break;
2655         }
2656         ret = 0;
2657         if (pmc->sfmode == MCAST_INCLUDE && i >= psl->sl_count)
2658                 goto unlock;
2659         if (pmc->sfmode == MCAST_EXCLUDE && i < psl->sl_count)
2660                 goto unlock;
2661         ret = 1;
2662 unlock:
2663         rcu_read_unlock();
2664 out:
2665         return ret;
2666 }
2667 
2668 /*
2669  *      A socket is closing.
2670  */
2671 
2672 void ip_mc_drop_socket(struct sock *sk)
2673 {
2674         struct inet_sock *inet = inet_sk(sk);
2675         struct ip_mc_socklist *iml;
2676         struct net *net = sock_net(sk);
2677 
2678         if (!inet->mc_list)
2679                 return;
2680 
2681         rtnl_lock();
2682         while ((iml = rtnl_dereference(inet->mc_list)) != NULL) {
2683                 struct in_device *in_dev;
2684 
2685                 inet->mc_list = iml->next_rcu;
2686                 in_dev = inetdev_by_index(net, iml->multi.imr_ifindex);
2687                 (void) ip_mc_leave_src(sk, iml, in_dev);
2688                 if (in_dev)
2689                         ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr);
2690                 /* decrease mem now to avoid the memleak warning */
2691                 atomic_sub(sizeof(*iml), &sk->sk_omem_alloc);
2692                 kfree_rcu(iml, rcu);
2693         }
2694         rtnl_unlock();
2695 }
2696 
2697 /* called with rcu_read_lock() */
2698 int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u8 proto)
2699 {
2700         struct ip_mc_list *im;
2701         struct ip_mc_list __rcu **mc_hash;
2702         struct ip_sf_list *psf;
2703         int rv = 0;
2704 
2705         mc_hash = rcu_dereference(in_dev->mc_hash);
2706         if (mc_hash) {
2707                 u32 hash = hash_32((__force u32)mc_addr, MC_HASH_SZ_LOG);
2708 
2709                 for (im = rcu_dereference(mc_hash[hash]);
2710                      im != NULL;
2711                      im = rcu_dereference(im->next_hash)) {
2712                         if (im->multiaddr == mc_addr)
2713                                 break;
2714                 }
2715         } else {
2716                 for_each_pmc_rcu(in_dev, im) {
2717                         if (im->multiaddr == mc_addr)
2718                                 break;
2719                 }
2720         }
2721         if (im && proto == IPPROTO_IGMP) {
2722                 rv = 1;
2723         } else if (im) {
2724                 if (src_addr) {
2725                         for (psf = im->sources; psf; psf = psf->sf_next) {
2726                                 if (psf->sf_inaddr == src_addr)
2727                                         break;
2728                         }
2729                         if (psf)
2730                                 rv = psf->sf_count[MCAST_INCLUDE] ||
2731                                         psf->sf_count[MCAST_EXCLUDE] !=
2732                                         im->sfcount[MCAST_EXCLUDE];
2733                         else
2734                                 rv = im->sfcount[MCAST_EXCLUDE] != 0;
2735                 } else
2736                         rv = 1; /* unspecified source; tentatively allow */
2737         }
2738         return rv;
2739 }
2740 
2741 #if defined(CONFIG_PROC_FS)
2742 struct igmp_mc_iter_state {
2743         struct seq_net_private p;
2744         struct net_device *dev;
2745         struct in_device *in_dev;
2746 };
2747 
2748 #define igmp_mc_seq_private(seq)        ((struct igmp_mc_iter_state *)(seq)->private)
2749 
2750 static inline struct ip_mc_list *igmp_mc_get_first(struct seq_file *seq)
2751 {
2752         struct net *net = seq_file_net(seq);
2753         struct ip_mc_list *im = NULL;
2754         struct igmp_mc_iter_state *state = igmp_mc_seq_private(seq);
2755 
2756         state->in_dev = NULL;
2757         for_each_netdev_rcu(net, state->dev) {
2758                 struct in_device *in_dev;
2759 
2760                 in_dev = __in_dev_get_rcu(state->dev);
2761                 if (!in_dev)
2762                         continue;
2763                 im = rcu_dereference(in_dev->mc_list);
2764                 if (im) {
2765                         state->in_dev = in_dev;
2766                         break;
2767                 }
2768         }
2769         return im;
2770 }
2771 
2772 static struct ip_mc_list *igmp_mc_get_next(struct seq_file *seq, struct ip_mc_list *im)
2773 {
2774         struct igmp_mc_iter_state *state = igmp_mc_seq_private(seq);
2775 
2776         im = rcu_dereference(im->next_rcu);
2777         while (!im) {
2778                 state->dev = next_net_device_rcu(state->dev);
2779                 if (!state->dev) {
2780                         state->in_dev = NULL;
2781                         break;
2782                 }
2783                 state->in_dev = __in_dev_get_rcu(state->dev);
2784                 if (!state->in_dev)
2785                         continue;
2786                 im = rcu_dereference(state->in_dev->mc_list);
2787         }
2788         return im;
2789 }
2790 
2791 static struct ip_mc_list *igmp_mc_get_idx(struct seq_file *seq, loff_t pos)
2792 {
2793         struct ip_mc_list *im = igmp_mc_get_first(seq);
2794         if (im)
2795                 while (pos && (im = igmp_mc_get_next(seq, im)) != NULL)
2796                         --pos;
2797         return pos ? NULL : im;
2798 }
2799 
2800 static void *igmp_mc_seq_start(struct seq_file *seq, loff_t *pos)
2801         __acquires(rcu)
2802 {
2803         rcu_read_lock();
2804         return *pos ? igmp_mc_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
2805 }
2806 
2807 static void *igmp_mc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2808 {
2809         struct ip_mc_list *im;
2810         if (v == SEQ_START_TOKEN)
2811                 im = igmp_mc_get_first(seq);
2812         else
2813                 im = igmp_mc_get_next(seq, v);
2814         ++*pos;
2815         return im;
2816 }
2817 
2818 static void igmp_mc_seq_stop(struct seq_file *seq, void *v)
2819         __releases(rcu)
2820 {
2821         struct igmp_mc_iter_state *state = igmp_mc_seq_private(seq);
2822 
2823         state->in_dev = NULL;
2824         state->dev = NULL;
2825         rcu_read_unlock();
2826 }
2827 
2828 static int igmp_mc_seq_show(struct seq_file *seq, void *v)
2829 {
2830         if (v == SEQ_START_TOKEN)
2831                 seq_puts(seq,
2832                          "Idx\tDevice    : Count Querier\tGroup    Users Timer\tReporter\n");
2833         else {
2834                 struct ip_mc_list *im = (struct ip_mc_list *)v;
2835                 struct igmp_mc_iter_state *state = igmp_mc_seq_private(seq);
2836                 char   *querier;
2837                 long delta;
2838 
2839 #ifdef CONFIG_IP_MULTICAST
2840                 querier = IGMP_V1_SEEN(state->in_dev) ? "V1" :
2841                           IGMP_V2_SEEN(state->in_dev) ? "V2" :
2842                           "V3";
2843 #else
2844                 querier = "NONE";
2845 #endif
2846 
2847                 if (rcu_access_pointer(state->in_dev->mc_list) == im) {
2848                         seq_printf(seq, "%d\t%-10s: %5d %7s\n",
2849                                    state->dev->ifindex, state->dev->name, state->in_dev->mc_count, querier);
2850                 }
2851 
2852                 delta = im->timer.expires - jiffies;
2853                 seq_printf(seq,
2854                            "\t\t\t\t%08X %5d %d:%08lX\t\t%d\n",
2855                            im->multiaddr, im->users,
2856                            im->tm_running,
2857                            im->tm_running ? jiffies_delta_to_clock_t(delta) : 0,
2858                            im->reporter);
2859         }
2860         return 0;
2861 }
2862 
2863 static const struct seq_operations igmp_mc_seq_ops = {
2864         .start  =       igmp_mc_seq_start,
2865         .next   =       igmp_mc_seq_next,
2866         .stop   =       igmp_mc_seq_stop,
2867         .show   =       igmp_mc_seq_show,
2868 };
2869 
2870 struct igmp_mcf_iter_state {
2871         struct seq_net_private p;
2872         struct net_device *dev;
2873         struct in_device *idev;
2874         struct ip_mc_list *im;
2875 };
2876 
2877 #define igmp_mcf_seq_private(seq)       ((struct igmp_mcf_iter_state *)(seq)->private)
2878 
2879 static inline struct ip_sf_list *igmp_mcf_get_first(struct seq_file *seq)
2880 {
2881         struct net *net = seq_file_net(seq);
2882         struct ip_sf_list *psf = NULL;
2883         struct ip_mc_list *im = NULL;
2884         struct igmp_mcf_iter_state *state = igmp_mcf_seq_private(seq);
2885 
2886         state->idev = NULL;
2887         state->im = NULL;
2888         for_each_netdev_rcu(net, state->dev) {
2889                 struct in_device *idev;
2890                 idev = __in_dev_get_rcu(state->dev);
2891                 if (unlikely(!idev))
2892                         continue;
2893                 im = rcu_dereference(idev->mc_list);
2894                 if (likely(im)) {
2895                         spin_lock_bh(&im->lock);
2896                         psf = im->sources;
2897                         if (likely(psf)) {
2898                                 state->im = im;
2899                                 state->idev = idev;
2900                                 break;
2901                         }
2902                         spin_unlock_bh(&im->lock);
2903                 }
2904         }
2905         return psf;
2906 }
2907 
2908 static struct ip_sf_list *igmp_mcf_get_next(struct seq_file *seq, struct ip_sf_list *psf)
2909 {
2910         struct igmp_mcf_iter_state *state = igmp_mcf_seq_private(seq);
2911 
2912         psf = psf->sf_next;
2913         while (!psf) {
2914                 spin_unlock_bh(&state->im->lock);
2915                 state->im = state->im->next;
2916                 while (!state->im) {
2917                         state->dev = next_net_device_rcu(state->dev);
2918                         if (!state->dev) {
2919                                 state->idev = NULL;
2920                                 goto out;
2921                         }
2922                         state->idev = __in_dev_get_rcu(state->dev);
2923                         if (!state->idev)
2924                                 continue;
2925                         state->im = rcu_dereference(state->idev->mc_list);
2926                 }
2927                 if (!state->im)
2928                         break;
2929                 spin_lock_bh(&state->im->lock);
2930                 psf = state->im->sources;
2931         }
2932 out:
2933         return psf;
2934 }
2935 
2936 static struct ip_sf_list *igmp_mcf_get_idx(struct seq_file *seq, loff_t pos)
2937 {
2938         struct ip_sf_list *psf = igmp_mcf_get_first(seq);
2939         if (psf)
2940                 while (pos && (psf = igmp_mcf_get_next(seq, psf)) != NULL)
2941                         --pos;
2942         return pos ? NULL : psf;
2943 }
2944 
2945 static void *igmp_mcf_seq_start(struct seq_file *seq, loff_t *pos)
2946         __acquires(rcu)
2947 {
2948         rcu_read_lock();
2949         return *pos ? igmp_mcf_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
2950 }
2951 
2952 static void *igmp_mcf_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2953 {
2954         struct ip_sf_list *psf;
2955         if (v == SEQ_START_TOKEN)
2956                 psf = igmp_mcf_get_first(seq);
2957         else
2958                 psf = igmp_mcf_get_next(seq, v);
2959         ++*pos;
2960         return psf;
2961 }
2962 
2963 static void igmp_mcf_seq_stop(struct seq_file *seq, void *v)
2964         __releases(rcu)
2965 {
2966         struct igmp_mcf_iter_state *state = igmp_mcf_seq_private(seq);
2967         if (likely(state->im)) {
2968                 spin_unlock_bh(&state->im->lock);
2969                 state->im = NULL;
2970         }
2971         state->idev = NULL;
2972         state->dev = NULL;
2973         rcu_read_unlock();
2974 }
2975 
2976 static int igmp_mcf_seq_show(struct seq_file *seq, void *v)
2977 {
2978         struct ip_sf_list *psf = (struct ip_sf_list *)v;
2979         struct igmp_mcf_iter_state *state = igmp_mcf_seq_private(seq);
2980 
2981         if (v == SEQ_START_TOKEN) {
2982                 seq_puts(seq, "Idx Device        MCA        SRC    INC    EXC\n");
2983         } else {
2984                 seq_printf(seq,
2985                            "%3d %6.6s 0x%08x "
2986                            "0x%08x %6lu %6lu\n",
2987                            state->dev->ifindex, state->dev->name,
2988                            ntohl(state->im->multiaddr),
2989                            ntohl(psf->sf_inaddr),
2990                            psf->sf_count[MCAST_INCLUDE],
2991                            psf->sf_count[MCAST_EXCLUDE]);
2992         }
2993         return 0;
2994 }
2995 
2996 static const struct seq_operations igmp_mcf_seq_ops = {
2997         .start  =       igmp_mcf_seq_start,
2998         .next   =       igmp_mcf_seq_next,
2999         .stop   =       igmp_mcf_seq_stop,
3000         .show   =       igmp_mcf_seq_show,
3001 };
3002 
3003 static int __net_init igmp_net_init(struct net *net)
3004 {
3005         struct proc_dir_entry *pde;
3006         int err;
3007 
3008         pde = proc_create_net("igmp", 0444, net->proc_net, &igmp_mc_seq_ops,
3009                         sizeof(struct igmp_mc_iter_state));
3010         if (!pde)
3011                 goto out_igmp;
3012         pde = proc_create_net("mcfilter", 0444, net->proc_net,
3013                         &igmp_mcf_seq_ops, sizeof(struct igmp_mcf_iter_state));
3014         if (!pde)
3015                 goto out_mcfilter;
3016         err = inet_ctl_sock_create(&net->ipv4.mc_autojoin_sk, AF_INET,
3017                                    SOCK_DGRAM, 0, net);
3018         if (err < 0) {
3019                 pr_err("Failed to initialize the IGMP autojoin socket (err %d)\n",
3020                        err);
3021                 goto out_sock;
3022         }
3023 
3024         return 0;
3025 
3026 out_sock:
3027         remove_proc_entry("mcfilter", net->proc_net);
3028 out_mcfilter:
3029         remove_proc_entry("igmp", net->proc_net);
3030 out_igmp:
3031         return -ENOMEM;
3032 }
3033 
3034 static void __net_exit igmp_net_exit(struct net *net)
3035 {
3036         remove_proc_entry("mcfilter", net->proc_net);
3037         remove_proc_entry("igmp", net->proc_net);
3038         inet_ctl_sock_destroy(net->ipv4.mc_autojoin_sk);
3039 }
3040 
3041 static struct pernet_operations igmp_net_ops = {
3042         .init = igmp_net_init,
3043         .exit = igmp_net_exit,
3044 };
3045 #endif
3046 
3047 static int igmp_netdev_event(struct notifier_block *this,
3048                              unsigned long event, void *ptr)
3049 {
3050         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
3051         struct in_device *in_dev;
3052 
3053         switch (event) {
3054         case NETDEV_RESEND_IGMP:
3055                 in_dev = __in_dev_get_rtnl(dev);
3056                 if (in_dev)
3057                         ip_mc_rejoin_groups(in_dev);
3058                 break;
3059         default:
3060                 break;
3061         }
3062         return NOTIFY_DONE;
3063 }
3064 
3065 static struct notifier_block igmp_notifier = {
3066         .notifier_call = igmp_netdev_event,
3067 };
3068 
3069 int __init igmp_mc_init(void)
3070 {
3071 #if defined(CONFIG_PROC_FS)
3072         int err;
3073 
3074         err = register_pernet_subsys(&igmp_net_ops);
3075         if (err)
3076                 return err;
3077         err = register_netdevice_notifier(&igmp_notifier);
3078         if (err)
3079                 goto reg_notif_fail;
3080         return 0;
3081 
3082 reg_notif_fail:
3083         unregister_pernet_subsys(&igmp_net_ops);
3084         return err;
3085 #else
3086         return register_netdevice_notifier(&igmp_notifier);
3087 #endif
3088 }

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