ip6mr.c (7ae9fb1b7ecbb5d85d07857943f677fd1a559b18) ip6mr.c (e1d001fa5b477c4da46a29be1fcece91db7c7c6f)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Linux IPv6 multicast routing support for BSD pim6sd
4 * Based on net/ipv4/ipmr.c.
5 *
6 * (c) 2004 Mickael Hoerdt, <hoerdt@clarinet.u-strasbg.fr>
7 * LSIIT Laboratory, Strasbourg, France
8 * (c) 2004 Jean-Philippe Andriot, <jean-philippe.andriot@6WIND.com>

--- 1865 unchanged lines hidden (view full) ---

1874 if (copy_to_sockptr(optval, &val, olr))
1875 return -EFAULT;
1876 return 0;
1877}
1878
1879/*
1880 * The IP multicast ioctl support routines.
1881 */
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Linux IPv6 multicast routing support for BSD pim6sd
4 * Based on net/ipv4/ipmr.c.
5 *
6 * (c) 2004 Mickael Hoerdt, <hoerdt@clarinet.u-strasbg.fr>
7 * LSIIT Laboratory, Strasbourg, France
8 * (c) 2004 Jean-Philippe Andriot, <jean-philippe.andriot@6WIND.com>

--- 1865 unchanged lines hidden (view full) ---

1874 if (copy_to_sockptr(optval, &val, olr))
1875 return -EFAULT;
1876 return 0;
1877}
1878
1879/*
1880 * The IP multicast ioctl support routines.
1881 */
1882
1883int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg)
1882int ip6mr_ioctl(struct sock *sk, int cmd, void *arg)
1884{
1883{
1885 struct sioc_sg_req6 sr;
1886 struct sioc_mif_req6 vr;
1884 struct sioc_sg_req6 *sr;
1885 struct sioc_mif_req6 *vr;
1887 struct vif_device *vif;
1888 struct mfc6_cache *c;
1889 struct net *net = sock_net(sk);
1890 struct mr_table *mrt;
1891
1892 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
1893 if (!mrt)
1894 return -ENOENT;
1895
1896 switch (cmd) {
1897 case SIOCGETMIFCNT_IN6:
1886 struct vif_device *vif;
1887 struct mfc6_cache *c;
1888 struct net *net = sock_net(sk);
1889 struct mr_table *mrt;
1890
1891 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT);
1892 if (!mrt)
1893 return -ENOENT;
1894
1895 switch (cmd) {
1896 case SIOCGETMIFCNT_IN6:
1898 if (copy_from_user(&vr, arg, sizeof(vr)))
1899 return -EFAULT;
1900 if (vr.mifi >= mrt->maxvif)
1897 vr = (struct sioc_mif_req6 *)arg;
1898 if (vr->mifi >= mrt->maxvif)
1901 return -EINVAL;
1899 return -EINVAL;
1902 vr.mifi = array_index_nospec(vr.mifi, mrt->maxvif);
1900 vr->mifi = array_index_nospec(vr->mifi, mrt->maxvif);
1903 rcu_read_lock();
1901 rcu_read_lock();
1904 vif = &mrt->vif_table[vr.mifi];
1905 if (VIF_EXISTS(mrt, vr.mifi)) {
1906 vr.icount = READ_ONCE(vif->pkt_in);
1907 vr.ocount = READ_ONCE(vif->pkt_out);
1908 vr.ibytes = READ_ONCE(vif->bytes_in);
1909 vr.obytes = READ_ONCE(vif->bytes_out);
1902 vif = &mrt->vif_table[vr->mifi];
1903 if (VIF_EXISTS(mrt, vr->mifi)) {
1904 vr->icount = READ_ONCE(vif->pkt_in);
1905 vr->ocount = READ_ONCE(vif->pkt_out);
1906 vr->ibytes = READ_ONCE(vif->bytes_in);
1907 vr->obytes = READ_ONCE(vif->bytes_out);
1910 rcu_read_unlock();
1908 rcu_read_unlock();
1911
1912 if (copy_to_user(arg, &vr, sizeof(vr)))
1913 return -EFAULT;
1914 return 0;
1915 }
1916 rcu_read_unlock();
1917 return -EADDRNOTAVAIL;
1918 case SIOCGETSGCNT_IN6:
1909 return 0;
1910 }
1911 rcu_read_unlock();
1912 return -EADDRNOTAVAIL;
1913 case SIOCGETSGCNT_IN6:
1919 if (copy_from_user(&sr, arg, sizeof(sr)))
1920 return -EFAULT;
1914 sr = (struct sioc_sg_req6 *)arg;
1921
1922 rcu_read_lock();
1915
1916 rcu_read_lock();
1923 c = ip6mr_cache_find(mrt, &sr.src.sin6_addr, &sr.grp.sin6_addr);
1917 c = ip6mr_cache_find(mrt, &sr->src.sin6_addr,
1918 &sr->grp.sin6_addr);
1924 if (c) {
1919 if (c) {
1925 sr.pktcnt = c->_c.mfc_un.res.pkt;
1926 sr.bytecnt = c->_c.mfc_un.res.bytes;
1927 sr.wrong_if = c->_c.mfc_un.res.wrong_if;
1920 sr->pktcnt = c->_c.mfc_un.res.pkt;
1921 sr->bytecnt = c->_c.mfc_un.res.bytes;
1922 sr->wrong_if = c->_c.mfc_un.res.wrong_if;
1928 rcu_read_unlock();
1923 rcu_read_unlock();
1929
1930 if (copy_to_user(arg, &sr, sizeof(sr)))
1931 return -EFAULT;
1932 return 0;
1933 }
1934 rcu_read_unlock();
1935 return -EADDRNOTAVAIL;
1936 default:
1937 return -ENOIOCTLCMD;
1938 }
1939}

--- 697 unchanged lines hidden ---
1924 return 0;
1925 }
1926 rcu_read_unlock();
1927 return -EADDRNOTAVAIL;
1928 default:
1929 return -ENOIOCTLCMD;
1930 }
1931}

--- 697 unchanged lines hidden ---