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