2333#ifdef CONFIG_PROC_FS
2334struct igmp6_mc_iter_state {
2335 struct seq_net_private p;
2336 struct net_device *dev;
2337 struct inet6_dev *idev;
2338};
2339
2340#define igmp6_mc_seq_private(seq) ((struct igmp6_mc_iter_state *)(seq)->private)
2341
2342static inline struct ifmcaddr6 *igmp6_mc_get_first(struct seq_file *seq)
2343{
2344 struct ifmcaddr6 *im = NULL;
2345 struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq);
2346 struct net *net = seq_file_net(seq);
2347
2348 state->idev = NULL;
2349 for_each_netdev(net, state->dev) {
2350 struct inet6_dev *idev;
2351 idev = in6_dev_get(state->dev);
2352 if (!idev)
2353 continue;
2354 read_lock_bh(&idev->lock);
2355 im = idev->mc_list;
2356 if (im) {
2357 state->idev = idev;
2358 break;
2359 }
2360 read_unlock_bh(&idev->lock);
2361 in6_dev_put(idev);
2362 }
2363 return im;
2364}
2365
2366static struct ifmcaddr6 *igmp6_mc_get_next(struct seq_file *seq, struct ifmcaddr6 *im)
2367{
2368 struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq);
2369
2370 im = im->next;
2371 while (!im) {
2372 if (likely(state->idev != NULL)) {
2373 read_unlock_bh(&state->idev->lock);