addrconf.c (786e0007e29a58f563bce744e958c692c7cbd435) | addrconf.c (addd383f5a0ba9bf8336be3cc8b7a2916c08a77a) |
---|---|
1/* 2 * IPv6 Address [auto]configuration 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> 8 * --- 652 unchanged lines hidden (view full) --- 661 if (dev) 662 dev_put(dev); 663 return err; 664} 665 666static int inet6_netconf_dump_devconf(struct sk_buff *skb, 667 struct netlink_callback *cb) 668{ | 1/* 2 * IPv6 Address [auto]configuration 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> 8 * --- 652 unchanged lines hidden (view full) --- 661 if (dev) 662 dev_put(dev); 663 return err; 664} 665 666static int inet6_netconf_dump_devconf(struct sk_buff *skb, 667 struct netlink_callback *cb) 668{ |
669 const struct nlmsghdr *nlh = cb->nlh; |
|
669 struct net *net = sock_net(skb->sk); 670 int h, s_h; 671 int idx, s_idx; 672 struct net_device *dev; 673 struct inet6_dev *idev; 674 struct hlist_head *head; 675 | 670 struct net *net = sock_net(skb->sk); 671 int h, s_h; 672 int idx, s_idx; 673 struct net_device *dev; 674 struct inet6_dev *idev; 675 struct hlist_head *head; 676 |
677 if (cb->strict_check) { 678 struct netlink_ext_ack *extack = cb->extack; 679 struct netconfmsg *ncm; 680 681 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ncm))) { 682 NL_SET_ERR_MSG_MOD(extack, "Invalid header for netconf dump request"); 683 return -EINVAL; 684 } 685 686 if (nlmsg_attrlen(nlh, sizeof(*ncm))) { 687 NL_SET_ERR_MSG_MOD(extack, "Invalid data after header in netconf dump request"); 688 return -EINVAL; 689 } 690 } 691 |
|
676 s_h = cb->args[0]; 677 s_idx = idx = cb->args[1]; 678 679 for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { 680 idx = 0; 681 head = &net->dev_index_head[h]; 682 rcu_read_lock(); 683 cb->seq = atomic_read(&net->ipv6.dev_addr_genid) ^ 684 net->dev_base_seq; 685 hlist_for_each_entry_rcu(dev, head, index_hlist) { 686 if (idx < s_idx) 687 goto cont; 688 idev = __in6_dev_get(dev); 689 if (!idev) 690 goto cont; 691 692 if (inet6_netconf_fill_devconf(skb, dev->ifindex, 693 &idev->cnf, 694 NETLINK_CB(cb->skb).portid, | 692 s_h = cb->args[0]; 693 s_idx = idx = cb->args[1]; 694 695 for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { 696 idx = 0; 697 head = &net->dev_index_head[h]; 698 rcu_read_lock(); 699 cb->seq = atomic_read(&net->ipv6.dev_addr_genid) ^ 700 net->dev_base_seq; 701 hlist_for_each_entry_rcu(dev, head, index_hlist) { 702 if (idx < s_idx) 703 goto cont; 704 idev = __in6_dev_get(dev); 705 if (!idev) 706 goto cont; 707 708 if (inet6_netconf_fill_devconf(skb, dev->ifindex, 709 &idev->cnf, 710 NETLINK_CB(cb->skb).portid, |
695 cb->nlh->nlmsg_seq, | 711 nlh->nlmsg_seq, |
696 RTM_NEWNETCONF, 697 NLM_F_MULTI, 698 NETCONFA_ALL) < 0) { 699 rcu_read_unlock(); 700 goto done; 701 } 702 nl_dump_check_consistent(cb, nlmsg_hdr(skb)); 703cont: 704 idx++; 705 } 706 rcu_read_unlock(); 707 } 708 if (h == NETDEV_HASHENTRIES) { 709 if (inet6_netconf_fill_devconf(skb, NETCONFA_IFINDEX_ALL, 710 net->ipv6.devconf_all, 711 NETLINK_CB(cb->skb).portid, | 712 RTM_NEWNETCONF, 713 NLM_F_MULTI, 714 NETCONFA_ALL) < 0) { 715 rcu_read_unlock(); 716 goto done; 717 } 718 nl_dump_check_consistent(cb, nlmsg_hdr(skb)); 719cont: 720 idx++; 721 } 722 rcu_read_unlock(); 723 } 724 if (h == NETDEV_HASHENTRIES) { 725 if (inet6_netconf_fill_devconf(skb, NETCONFA_IFINDEX_ALL, 726 net->ipv6.devconf_all, 727 NETLINK_CB(cb->skb).portid, |
712 cb->nlh->nlmsg_seq, | 728 nlh->nlmsg_seq, |
713 RTM_NEWNETCONF, NLM_F_MULTI, 714 NETCONFA_ALL) < 0) 715 goto done; 716 else 717 h++; 718 } 719 if (h == NETDEV_HASHENTRIES + 1) { 720 if (inet6_netconf_fill_devconf(skb, NETCONFA_IFINDEX_DEFAULT, 721 net->ipv6.devconf_dflt, 722 NETLINK_CB(cb->skb).portid, | 729 RTM_NEWNETCONF, NLM_F_MULTI, 730 NETCONFA_ALL) < 0) 731 goto done; 732 else 733 h++; 734 } 735 if (h == NETDEV_HASHENTRIES + 1) { 736 if (inet6_netconf_fill_devconf(skb, NETCONFA_IFINDEX_DEFAULT, 737 net->ipv6.devconf_dflt, 738 NETLINK_CB(cb->skb).portid, |
723 cb->nlh->nlmsg_seq, | 739 nlh->nlmsg_seq, |
724 RTM_NEWNETCONF, NLM_F_MULTI, 725 NETCONFA_ALL) < 0) 726 goto done; 727 else 728 h++; 729 } 730done: 731 cb->args[0] = h; --- 6257 unchanged lines hidden --- | 740 RTM_NEWNETCONF, NLM_F_MULTI, 741 NETCONFA_ALL) < 0) 742 goto done; 743 else 744 h++; 745 } 746done: 747 cb->args[0] = h; --- 6257 unchanged lines hidden --- |