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 ---