Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[NEIGH]: Convert neighbour table modification to new netlink api

Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Thomas Graf and committed by
David S. Miller
6b3f8674 9067c722

+107 -71
+107 -71
net/core/neighbour.c
··· 1754 1754 return NULL; 1755 1755 } 1756 1756 1757 + static struct nla_policy nl_neightbl_policy[NDTA_MAX+1] __read_mostly = { 1758 + [NDTA_NAME] = { .type = NLA_STRING }, 1759 + [NDTA_THRESH1] = { .type = NLA_U32 }, 1760 + [NDTA_THRESH2] = { .type = NLA_U32 }, 1761 + [NDTA_THRESH3] = { .type = NLA_U32 }, 1762 + [NDTA_GC_INTERVAL] = { .type = NLA_U64 }, 1763 + [NDTA_PARMS] = { .type = NLA_NESTED }, 1764 + }; 1765 + 1766 + static struct nla_policy nl_ntbl_parm_policy[NDTPA_MAX+1] __read_mostly = { 1767 + [NDTPA_IFINDEX] = { .type = NLA_U32 }, 1768 + [NDTPA_QUEUE_LEN] = { .type = NLA_U32 }, 1769 + [NDTPA_PROXY_QLEN] = { .type = NLA_U32 }, 1770 + [NDTPA_APP_PROBES] = { .type = NLA_U32 }, 1771 + [NDTPA_UCAST_PROBES] = { .type = NLA_U32 }, 1772 + [NDTPA_MCAST_PROBES] = { .type = NLA_U32 }, 1773 + [NDTPA_BASE_REACHABLE_TIME] = { .type = NLA_U64 }, 1774 + [NDTPA_GC_STALETIME] = { .type = NLA_U64 }, 1775 + [NDTPA_DELAY_PROBE_TIME] = { .type = NLA_U64 }, 1776 + [NDTPA_RETRANS_TIME] = { .type = NLA_U64 }, 1777 + [NDTPA_ANYCAST_DELAY] = { .type = NLA_U64 }, 1778 + [NDTPA_PROXY_DELAY] = { .type = NLA_U64 }, 1779 + [NDTPA_LOCKTIME] = { .type = NLA_U64 }, 1780 + }; 1781 + 1757 1782 int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) 1758 1783 { 1759 1784 struct neigh_table *tbl; 1760 - struct ndtmsg *ndtmsg = NLMSG_DATA(nlh); 1761 - struct rtattr **tb = arg; 1762 - int err = -EINVAL; 1785 + struct ndtmsg *ndtmsg; 1786 + struct nlattr *tb[NDTA_MAX+1]; 1787 + int err; 1763 1788 1764 - if (!tb[NDTA_NAME - 1] || !RTA_PAYLOAD(tb[NDTA_NAME - 1])) 1765 - return -EINVAL; 1789 + err = nlmsg_parse(nlh, sizeof(*ndtmsg), tb, NDTA_MAX, 1790 + nl_neightbl_policy); 1791 + if (err < 0) 1792 + goto errout; 1766 1793 1794 + if (tb[NDTA_NAME] == NULL) { 1795 + err = -EINVAL; 1796 + goto errout; 1797 + } 1798 + 1799 + ndtmsg = nlmsg_data(nlh); 1767 1800 read_lock(&neigh_tbl_lock); 1768 1801 for (tbl = neigh_tables; tbl; tbl = tbl->next) { 1769 1802 if (ndtmsg->ndtm_family && tbl->family != ndtmsg->ndtm_family) 1770 1803 continue; 1771 1804 1772 - if (!rtattr_strcmp(tb[NDTA_NAME - 1], tbl->id)) 1805 + if (nla_strcmp(tb[NDTA_NAME], tbl->id) == 0) 1773 1806 break; 1774 1807 } 1775 1808 1776 1809 if (tbl == NULL) { 1777 1810 err = -ENOENT; 1778 - goto errout; 1811 + goto errout_locked; 1779 1812 } 1780 1813 1781 1814 /* ··· 1817 1784 */ 1818 1785 write_lock_bh(&tbl->lock); 1819 1786 1820 - if (tb[NDTA_THRESH1 - 1]) 1821 - tbl->gc_thresh1 = RTA_GET_U32(tb[NDTA_THRESH1 - 1]); 1822 - 1823 - if (tb[NDTA_THRESH2 - 1]) 1824 - tbl->gc_thresh2 = RTA_GET_U32(tb[NDTA_THRESH2 - 1]); 1825 - 1826 - if (tb[NDTA_THRESH3 - 1]) 1827 - tbl->gc_thresh3 = RTA_GET_U32(tb[NDTA_THRESH3 - 1]); 1828 - 1829 - if (tb[NDTA_GC_INTERVAL - 1]) 1830 - tbl->gc_interval = RTA_GET_MSECS(tb[NDTA_GC_INTERVAL - 1]); 1831 - 1832 - if (tb[NDTA_PARMS - 1]) { 1833 - struct rtattr *tbp[NDTPA_MAX]; 1787 + if (tb[NDTA_PARMS]) { 1788 + struct nlattr *tbp[NDTPA_MAX+1]; 1834 1789 struct neigh_parms *p; 1835 - u32 ifindex = 0; 1790 + int i, ifindex = 0; 1836 1791 1837 - if (rtattr_parse_nested(tbp, NDTPA_MAX, tb[NDTA_PARMS - 1]) < 0) 1838 - goto rtattr_failure; 1792 + err = nla_parse_nested(tbp, NDTPA_MAX, tb[NDTA_PARMS], 1793 + nl_ntbl_parm_policy); 1794 + if (err < 0) 1795 + goto errout_tbl_lock; 1839 1796 1840 - if (tbp[NDTPA_IFINDEX - 1]) 1841 - ifindex = RTA_GET_U32(tbp[NDTPA_IFINDEX - 1]); 1797 + if (tbp[NDTPA_IFINDEX]) 1798 + ifindex = nla_get_u32(tbp[NDTPA_IFINDEX]); 1842 1799 1843 1800 p = lookup_neigh_params(tbl, ifindex); 1844 1801 if (p == NULL) { 1845 1802 err = -ENOENT; 1846 - goto rtattr_failure; 1803 + goto errout_tbl_lock; 1847 1804 } 1848 - 1849 - if (tbp[NDTPA_QUEUE_LEN - 1]) 1850 - p->queue_len = RTA_GET_U32(tbp[NDTPA_QUEUE_LEN - 1]); 1851 1805 1852 - if (tbp[NDTPA_PROXY_QLEN - 1]) 1853 - p->proxy_qlen = RTA_GET_U32(tbp[NDTPA_PROXY_QLEN - 1]); 1806 + for (i = 1; i <= NDTPA_MAX; i++) { 1807 + if (tbp[i] == NULL) 1808 + continue; 1854 1809 1855 - if (tbp[NDTPA_APP_PROBES - 1]) 1856 - p->app_probes = RTA_GET_U32(tbp[NDTPA_APP_PROBES - 1]); 1857 - 1858 - if (tbp[NDTPA_UCAST_PROBES - 1]) 1859 - p->ucast_probes = 1860 - RTA_GET_U32(tbp[NDTPA_UCAST_PROBES - 1]); 1861 - 1862 - if (tbp[NDTPA_MCAST_PROBES - 1]) 1863 - p->mcast_probes = 1864 - RTA_GET_U32(tbp[NDTPA_MCAST_PROBES - 1]); 1865 - 1866 - if (tbp[NDTPA_BASE_REACHABLE_TIME - 1]) 1867 - p->base_reachable_time = 1868 - RTA_GET_MSECS(tbp[NDTPA_BASE_REACHABLE_TIME - 1]); 1869 - 1870 - if (tbp[NDTPA_GC_STALETIME - 1]) 1871 - p->gc_staletime = 1872 - RTA_GET_MSECS(tbp[NDTPA_GC_STALETIME - 1]); 1873 - 1874 - if (tbp[NDTPA_DELAY_PROBE_TIME - 1]) 1875 - p->delay_probe_time = 1876 - RTA_GET_MSECS(tbp[NDTPA_DELAY_PROBE_TIME - 1]); 1877 - 1878 - if (tbp[NDTPA_RETRANS_TIME - 1]) 1879 - p->retrans_time = 1880 - RTA_GET_MSECS(tbp[NDTPA_RETRANS_TIME - 1]); 1881 - 1882 - if (tbp[NDTPA_ANYCAST_DELAY - 1]) 1883 - p->anycast_delay = 1884 - RTA_GET_MSECS(tbp[NDTPA_ANYCAST_DELAY - 1]); 1885 - 1886 - if (tbp[NDTPA_PROXY_DELAY - 1]) 1887 - p->proxy_delay = 1888 - RTA_GET_MSECS(tbp[NDTPA_PROXY_DELAY - 1]); 1889 - 1890 - if (tbp[NDTPA_LOCKTIME - 1]) 1891 - p->locktime = RTA_GET_MSECS(tbp[NDTPA_LOCKTIME - 1]); 1810 + switch (i) { 1811 + case NDTPA_QUEUE_LEN: 1812 + p->queue_len = nla_get_u32(tbp[i]); 1813 + break; 1814 + case NDTPA_PROXY_QLEN: 1815 + p->proxy_qlen = nla_get_u32(tbp[i]); 1816 + break; 1817 + case NDTPA_APP_PROBES: 1818 + p->app_probes = nla_get_u32(tbp[i]); 1819 + break; 1820 + case NDTPA_UCAST_PROBES: 1821 + p->ucast_probes = nla_get_u32(tbp[i]); 1822 + break; 1823 + case NDTPA_MCAST_PROBES: 1824 + p->mcast_probes = nla_get_u32(tbp[i]); 1825 + break; 1826 + case NDTPA_BASE_REACHABLE_TIME: 1827 + p->base_reachable_time = nla_get_msecs(tbp[i]); 1828 + break; 1829 + case NDTPA_GC_STALETIME: 1830 + p->gc_staletime = nla_get_msecs(tbp[i]); 1831 + break; 1832 + case NDTPA_DELAY_PROBE_TIME: 1833 + p->delay_probe_time = nla_get_msecs(tbp[i]); 1834 + break; 1835 + case NDTPA_RETRANS_TIME: 1836 + p->retrans_time = nla_get_msecs(tbp[i]); 1837 + break; 1838 + case NDTPA_ANYCAST_DELAY: 1839 + p->anycast_delay = nla_get_msecs(tbp[i]); 1840 + break; 1841 + case NDTPA_PROXY_DELAY: 1842 + p->proxy_delay = nla_get_msecs(tbp[i]); 1843 + break; 1844 + case NDTPA_LOCKTIME: 1845 + p->locktime = nla_get_msecs(tbp[i]); 1846 + break; 1847 + } 1848 + } 1892 1849 } 1850 + 1851 + if (tb[NDTA_THRESH1]) 1852 + tbl->gc_thresh1 = nla_get_u32(tb[NDTA_THRESH1]); 1853 + 1854 + if (tb[NDTA_THRESH2]) 1855 + tbl->gc_thresh2 = nla_get_u32(tb[NDTA_THRESH2]); 1856 + 1857 + if (tb[NDTA_THRESH3]) 1858 + tbl->gc_thresh3 = nla_get_u32(tb[NDTA_THRESH3]); 1859 + 1860 + if (tb[NDTA_GC_INTERVAL]) 1861 + tbl->gc_interval = nla_get_msecs(tb[NDTA_GC_INTERVAL]); 1893 1862 1894 1863 err = 0; 1895 1864 1896 - rtattr_failure: 1865 + errout_tbl_lock: 1897 1866 write_unlock_bh(&tbl->lock); 1898 - errout: 1867 + errout_locked: 1899 1868 read_unlock(&neigh_tbl_lock); 1869 + errout: 1900 1870 return err; 1901 1871 } 1902 1872