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