458 if (psl) {
459 for (i=0; i<psl->sl_count; i++)
460 newpsl->sl_addr[i] = psl->sl_addr[i];
461 sock_kfree_s(sk, psl, IP6_SFLSIZE(psl->sl_max));
462 }
463 pmc->sflist = psl = newpsl;
464 }
465 rv = 1;
466 for (i=0; i<psl->sl_count; i++) {
467 rv = memcmp(&psl->sl_addr[i], source, sizeof(struct in6_addr));
468 if (rv == 0)
469 break;
470 }
471 if (rv == 0)
472 goto done;
473 for (j=psl->sl_count-1; j>=i; j--)
474 psl->sl_addr[j+1] = psl->sl_addr[j];
475 psl->sl_addr[i] = *source;
476 psl->sl_count++;
477 err = 0;
478
479 ip6_mc_add_src(idev, group, omode, 1, source, 1);
480done:
481 if (pmclocked)
482 write_unlock_bh(&pmc->sflock);
483 read_unlock_bh(&ipv6_sk_mc_lock);
484 read_unlock_bh(&idev->lock);
485 in6_dev_put(idev);
486 dev_put(dev);
487 if (leavegroup)
488 return ipv6_sock_mc_drop(sk, pgsr->gsr_interface, group);
489 return err;
490}
491
492int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf)
493{
494 struct in6_addr *group;
495 struct ipv6_mc_socklist *pmc;
496 struct net_device *dev;
497 struct inet6_dev *idev;
498 struct ipv6_pinfo *inet6 = inet6_sk(sk);