aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipx
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipx')
-rw-r--r--net/ipx/af_ipx.c62
-rw-r--r--net/ipx/ipx_proc.c90
-rw-r--r--net/ipx/ipx_route.c1
-rw-r--r--net/ipx/sysctl_net_ipx.c7
4 files changed, 67 insertions, 93 deletions
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c
index 66c7a20011f3..da3d21c41d90 100644
--- a/net/ipx/af_ipx.c
+++ b/net/ipx/af_ipx.c
@@ -40,6 +40,7 @@
40#include <linux/net.h> 40#include <linux/net.h>
41#include <linux/netdevice.h> 41#include <linux/netdevice.h>
42#include <linux/uio.h> 42#include <linux/uio.h>
43#include <linux/slab.h>
43#include <linux/skbuff.h> 44#include <linux/skbuff.h>
44#include <linux/smp_lock.h> 45#include <linux/smp_lock.h>
45#include <linux/socket.h> 46#include <linux/socket.h>
@@ -1298,6 +1299,7 @@ static int ipx_setsockopt(struct socket *sock, int level, int optname,
1298 int opt; 1299 int opt;
1299 int rc = -EINVAL; 1300 int rc = -EINVAL;
1300 1301
1302 lock_kernel();
1301 if (optlen != sizeof(int)) 1303 if (optlen != sizeof(int))
1302 goto out; 1304 goto out;
1303 1305
@@ -1312,6 +1314,7 @@ static int ipx_setsockopt(struct socket *sock, int level, int optname,
1312 ipx_sk(sk)->type = opt; 1314 ipx_sk(sk)->type = opt;
1313 rc = 0; 1315 rc = 0;
1314out: 1316out:
1317 unlock_kernel();
1315 return rc; 1318 return rc;
1316} 1319}
1317 1320
@@ -1323,6 +1326,7 @@ static int ipx_getsockopt(struct socket *sock, int level, int optname,
1323 int len; 1326 int len;
1324 int rc = -ENOPROTOOPT; 1327 int rc = -ENOPROTOOPT;
1325 1328
1329 lock_kernel();
1326 if (!(level == SOL_IPX && optname == IPX_TYPE)) 1330 if (!(level == SOL_IPX && optname == IPX_TYPE))
1327 goto out; 1331 goto out;
1328 1332
@@ -1343,6 +1347,7 @@ static int ipx_getsockopt(struct socket *sock, int level, int optname,
1343 1347
1344 rc = 0; 1348 rc = 0;
1345out: 1349out:
1350 unlock_kernel();
1346 return rc; 1351 return rc;
1347} 1352}
1348 1353
@@ -1352,12 +1357,13 @@ static struct proto ipx_proto = {
1352 .obj_size = sizeof(struct ipx_sock), 1357 .obj_size = sizeof(struct ipx_sock),
1353}; 1358};
1354 1359
1355static int ipx_create(struct net *net, struct socket *sock, int protocol) 1360static int ipx_create(struct net *net, struct socket *sock, int protocol,
1361 int kern)
1356{ 1362{
1357 int rc = -ESOCKTNOSUPPORT; 1363 int rc = -ESOCKTNOSUPPORT;
1358 struct sock *sk; 1364 struct sock *sk;
1359 1365
1360 if (net != &init_net) 1366 if (!net_eq(net, &init_net))
1361 return -EAFNOSUPPORT; 1367 return -EAFNOSUPPORT;
1362 1368
1363 /* 1369 /*
@@ -1390,6 +1396,7 @@ static int ipx_release(struct socket *sock)
1390 if (!sk) 1396 if (!sk)
1391 goto out; 1397 goto out;
1392 1398
1399 lock_kernel();
1393 if (!sock_flag(sk, SOCK_DEAD)) 1400 if (!sock_flag(sk, SOCK_DEAD))
1394 sk->sk_state_change(sk); 1401 sk->sk_state_change(sk);
1395 1402
@@ -1397,6 +1404,7 @@ static int ipx_release(struct socket *sock)
1397 sock->sk = NULL; 1404 sock->sk = NULL;
1398 sk_refcnt_debug_release(sk); 1405 sk_refcnt_debug_release(sk);
1399 ipx_destroy_socket(sk); 1406 ipx_destroy_socket(sk);
1407 unlock_kernel();
1400out: 1408out:
1401 return 0; 1409 return 0;
1402} 1410}
@@ -1424,7 +1432,8 @@ static __be16 ipx_first_free_socketnum(struct ipx_interface *intrfc)
1424 return htons(socketNum); 1432 return htons(socketNum);
1425} 1433}
1426 1434
1427static int ipx_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) 1435static int __ipx_bind(struct socket *sock,
1436 struct sockaddr *uaddr, int addr_len)
1428{ 1437{
1429 struct sock *sk = sock->sk; 1438 struct sock *sk = sock->sk;
1430 struct ipx_sock *ipxs = ipx_sk(sk); 1439 struct ipx_sock *ipxs = ipx_sk(sk);
@@ -1519,6 +1528,17 @@ out:
1519 return rc; 1528 return rc;
1520} 1529}
1521 1530
1531static int ipx_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1532{
1533 int rc;
1534
1535 lock_kernel();
1536 rc = __ipx_bind(sock, uaddr, addr_len);
1537 unlock_kernel();
1538
1539 return rc;
1540}
1541
1522static int ipx_connect(struct socket *sock, struct sockaddr *uaddr, 1542static int ipx_connect(struct socket *sock, struct sockaddr *uaddr,
1523 int addr_len, int flags) 1543 int addr_len, int flags)
1524{ 1544{
@@ -1531,6 +1551,7 @@ static int ipx_connect(struct socket *sock, struct sockaddr *uaddr,
1531 sk->sk_state = TCP_CLOSE; 1551 sk->sk_state = TCP_CLOSE;
1532 sock->state = SS_UNCONNECTED; 1552 sock->state = SS_UNCONNECTED;
1533 1553
1554 lock_kernel();
1534 if (addr_len != sizeof(*addr)) 1555 if (addr_len != sizeof(*addr))
1535 goto out; 1556 goto out;
1536 addr = (struct sockaddr_ipx *)uaddr; 1557 addr = (struct sockaddr_ipx *)uaddr;
@@ -1550,7 +1571,7 @@ static int ipx_connect(struct socket *sock, struct sockaddr *uaddr,
1550 IPX_NODE_LEN); 1571 IPX_NODE_LEN);
1551#endif /* CONFIG_IPX_INTERN */ 1572#endif /* CONFIG_IPX_INTERN */
1552 1573
1553 rc = ipx_bind(sock, (struct sockaddr *)&uaddr, 1574 rc = __ipx_bind(sock, (struct sockaddr *)&uaddr,
1554 sizeof(struct sockaddr_ipx)); 1575 sizeof(struct sockaddr_ipx));
1555 if (rc) 1576 if (rc)
1556 goto out; 1577 goto out;
@@ -1577,6 +1598,7 @@ static int ipx_connect(struct socket *sock, struct sockaddr *uaddr,
1577 ipxrtr_put(rt); 1598 ipxrtr_put(rt);
1578 rc = 0; 1599 rc = 0;
1579out: 1600out:
1601 unlock_kernel();
1580 return rc; 1602 return rc;
1581} 1603}
1582 1604
@@ -1592,6 +1614,7 @@ static int ipx_getname(struct socket *sock, struct sockaddr *uaddr,
1592 1614
1593 *uaddr_len = sizeof(struct sockaddr_ipx); 1615 *uaddr_len = sizeof(struct sockaddr_ipx);
1594 1616
1617 lock_kernel();
1595 if (peer) { 1618 if (peer) {
1596 rc = -ENOTCONN; 1619 rc = -ENOTCONN;
1597 if (sk->sk_state != TCP_ESTABLISHED) 1620 if (sk->sk_state != TCP_ESTABLISHED)
@@ -1626,6 +1649,19 @@ static int ipx_getname(struct socket *sock, struct sockaddr *uaddr,
1626 1649
1627 rc = 0; 1650 rc = 0;
1628out: 1651out:
1652 unlock_kernel();
1653 return rc;
1654}
1655
1656static unsigned int ipx_datagram_poll(struct file *file, struct socket *sock,
1657 poll_table *wait)
1658{
1659 int rc;
1660
1661 lock_kernel();
1662 rc = datagram_poll(file, sock, wait);
1663 unlock_kernel();
1664
1629 return rc; 1665 return rc;
1630} 1666}
1631 1667
@@ -1700,6 +1736,7 @@ static int ipx_sendmsg(struct kiocb *iocb, struct socket *sock,
1700 int rc = -EINVAL; 1736 int rc = -EINVAL;
1701 int flags = msg->msg_flags; 1737 int flags = msg->msg_flags;
1702 1738
1739 lock_kernel();
1703 /* Socket gets bound below anyway */ 1740 /* Socket gets bound below anyway */
1704/* if (sk->sk_zapped) 1741/* if (sk->sk_zapped)
1705 return -EIO; */ /* Socket not bound */ 1742 return -EIO; */ /* Socket not bound */
@@ -1723,7 +1760,7 @@ static int ipx_sendmsg(struct kiocb *iocb, struct socket *sock,
1723 memcpy(uaddr.sipx_node, ipxs->intrfc->if_node, 1760 memcpy(uaddr.sipx_node, ipxs->intrfc->if_node,
1724 IPX_NODE_LEN); 1761 IPX_NODE_LEN);
1725#endif 1762#endif
1726 rc = ipx_bind(sock, (struct sockaddr *)&uaddr, 1763 rc = __ipx_bind(sock, (struct sockaddr *)&uaddr,
1727 sizeof(struct sockaddr_ipx)); 1764 sizeof(struct sockaddr_ipx));
1728 if (rc) 1765 if (rc)
1729 goto out; 1766 goto out;
@@ -1751,6 +1788,7 @@ static int ipx_sendmsg(struct kiocb *iocb, struct socket *sock,
1751 if (rc >= 0) 1788 if (rc >= 0)
1752 rc = len; 1789 rc = len;
1753out: 1790out:
1791 unlock_kernel();
1754 return rc; 1792 return rc;
1755} 1793}
1756 1794
@@ -1765,6 +1803,7 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
1765 struct sk_buff *skb; 1803 struct sk_buff *skb;
1766 int copied, rc; 1804 int copied, rc;
1767 1805
1806 lock_kernel();
1768 /* put the autobinding in */ 1807 /* put the autobinding in */
1769 if (!ipxs->port) { 1808 if (!ipxs->port) {
1770 struct sockaddr_ipx uaddr; 1809 struct sockaddr_ipx uaddr;
@@ -1779,7 +1818,7 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
1779 memcpy(uaddr.sipx_node, ipxs->intrfc->if_node, IPX_NODE_LEN); 1818 memcpy(uaddr.sipx_node, ipxs->intrfc->if_node, IPX_NODE_LEN);
1780#endif /* CONFIG_IPX_INTERN */ 1819#endif /* CONFIG_IPX_INTERN */
1781 1820
1782 rc = ipx_bind(sock, (struct sockaddr *)&uaddr, 1821 rc = __ipx_bind(sock, (struct sockaddr *)&uaddr,
1783 sizeof(struct sockaddr_ipx)); 1822 sizeof(struct sockaddr_ipx));
1784 if (rc) 1823 if (rc)
1785 goto out; 1824 goto out;
@@ -1823,6 +1862,7 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
1823out_free: 1862out_free:
1824 skb_free_datagram(sk, skb); 1863 skb_free_datagram(sk, skb);
1825out: 1864out:
1865 unlock_kernel();
1826 return rc; 1866 return rc;
1827} 1867}
1828 1868
@@ -1834,6 +1874,7 @@ static int ipx_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1834 struct sock *sk = sock->sk; 1874 struct sock *sk = sock->sk;
1835 void __user *argp = (void __user *)arg; 1875 void __user *argp = (void __user *)arg;
1836 1876
1877 lock_kernel();
1837 switch (cmd) { 1878 switch (cmd) {
1838 case TIOCOUTQ: 1879 case TIOCOUTQ:
1839 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk); 1880 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
@@ -1896,6 +1937,7 @@ static int ipx_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1896 rc = -ENOIOCTLCMD; 1937 rc = -ENOIOCTLCMD;
1897 break; 1938 break;
1898 } 1939 }
1940 unlock_kernel();
1899 1941
1900 return rc; 1942 return rc;
1901} 1943}
@@ -1927,13 +1969,13 @@ static int ipx_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long
1927 * Socket family declarations 1969 * Socket family declarations
1928 */ 1970 */
1929 1971
1930static struct net_proto_family ipx_family_ops = { 1972static const struct net_proto_family ipx_family_ops = {
1931 .family = PF_IPX, 1973 .family = PF_IPX,
1932 .create = ipx_create, 1974 .create = ipx_create,
1933 .owner = THIS_MODULE, 1975 .owner = THIS_MODULE,
1934}; 1976};
1935 1977
1936static const struct proto_ops SOCKOPS_WRAPPED(ipx_dgram_ops) = { 1978static const struct proto_ops ipx_dgram_ops = {
1937 .family = PF_IPX, 1979 .family = PF_IPX,
1938 .owner = THIS_MODULE, 1980 .owner = THIS_MODULE,
1939 .release = ipx_release, 1981 .release = ipx_release,
@@ -1942,7 +1984,7 @@ static const struct proto_ops SOCKOPS_WRAPPED(ipx_dgram_ops) = {
1942 .socketpair = sock_no_socketpair, 1984 .socketpair = sock_no_socketpair,
1943 .accept = sock_no_accept, 1985 .accept = sock_no_accept,
1944 .getname = ipx_getname, 1986 .getname = ipx_getname,
1945 .poll = datagram_poll, 1987 .poll = ipx_datagram_poll,
1946 .ioctl = ipx_ioctl, 1988 .ioctl = ipx_ioctl,
1947#ifdef CONFIG_COMPAT 1989#ifdef CONFIG_COMPAT
1948 .compat_ioctl = ipx_compat_ioctl, 1990 .compat_ioctl = ipx_compat_ioctl,
@@ -1957,8 +1999,6 @@ static const struct proto_ops SOCKOPS_WRAPPED(ipx_dgram_ops) = {
1957 .sendpage = sock_no_sendpage, 1999 .sendpage = sock_no_sendpage,
1958}; 2000};
1959 2001
1960SOCKOPS_WRAP(ipx_dgram, PF_IPX);
1961
1962static struct packet_type ipx_8023_packet_type __read_mostly = { 2002static struct packet_type ipx_8023_packet_type __read_mostly = {
1963 .type = cpu_to_be16(ETH_P_802_3), 2003 .type = cpu_to_be16(ETH_P_802_3),
1964 .func = ipx_rcv, 2004 .func = ipx_rcv,
diff --git a/net/ipx/ipx_proc.c b/net/ipx/ipx_proc.c
index 576178482f89..26b5bfcf1d03 100644
--- a/net/ipx/ipx_proc.c
+++ b/net/ipx/ipx_proc.c
@@ -13,45 +13,15 @@
13#include <net/tcp_states.h> 13#include <net/tcp_states.h>
14#include <net/ipx.h> 14#include <net/ipx.h>
15 15
16static __inline__ struct ipx_interface *ipx_get_interface_idx(loff_t pos)
17{
18 struct ipx_interface *i;
19
20 list_for_each_entry(i, &ipx_interfaces, node)
21 if (!pos--)
22 goto out;
23 i = NULL;
24out:
25 return i;
26}
27
28static struct ipx_interface *ipx_interfaces_next(struct ipx_interface *i)
29{
30 struct ipx_interface *rc = NULL;
31
32 if (i->node.next != &ipx_interfaces)
33 rc = list_entry(i->node.next, struct ipx_interface, node);
34 return rc;
35}
36
37static void *ipx_seq_interface_start(struct seq_file *seq, loff_t *pos) 16static void *ipx_seq_interface_start(struct seq_file *seq, loff_t *pos)
38{ 17{
39 loff_t l = *pos;
40
41 spin_lock_bh(&ipx_interfaces_lock); 18 spin_lock_bh(&ipx_interfaces_lock);
42 return l ? ipx_get_interface_idx(--l) : SEQ_START_TOKEN; 19 return seq_list_start_head(&ipx_interfaces, *pos);
43} 20}
44 21
45static void *ipx_seq_interface_next(struct seq_file *seq, void *v, loff_t *pos) 22static void *ipx_seq_interface_next(struct seq_file *seq, void *v, loff_t *pos)
46{ 23{
47 struct ipx_interface *i; 24 return seq_list_next(v, &ipx_interfaces, pos);
48
49 ++*pos;
50 if (v == SEQ_START_TOKEN)
51 i = ipx_interfaces_head();
52 else
53 i = ipx_interfaces_next(v);
54 return i;
55} 25}
56 26
57static void ipx_seq_interface_stop(struct seq_file *seq, void *v) 27static void ipx_seq_interface_stop(struct seq_file *seq, void *v)
@@ -63,7 +33,7 @@ static int ipx_seq_interface_show(struct seq_file *seq, void *v)
63{ 33{
64 struct ipx_interface *i; 34 struct ipx_interface *i;
65 35
66 if (v == SEQ_START_TOKEN) { 36 if (v == &ipx_interfaces) {
67 seq_puts(seq, "Network Node_Address Primary Device " 37 seq_puts(seq, "Network Node_Address Primary Device "
68 "Frame_Type"); 38 "Frame_Type");
69#ifdef IPX_REFCNT_DEBUG 39#ifdef IPX_REFCNT_DEBUG
@@ -73,7 +43,7 @@ static int ipx_seq_interface_show(struct seq_file *seq, void *v)
73 goto out; 43 goto out;
74 } 44 }
75 45
76 i = v; 46 i = list_entry(v, struct ipx_interface, node);
77 seq_printf(seq, "%08lX ", (unsigned long int)ntohl(i->if_netnum)); 47 seq_printf(seq, "%08lX ", (unsigned long int)ntohl(i->if_netnum));
78 seq_printf(seq, "%02X%02X%02X%02X%02X%02X ", 48 seq_printf(seq, "%02X%02X%02X%02X%02X%02X ",
79 i->if_node[0], i->if_node[1], i->if_node[2], 49 i->if_node[0], i->if_node[1], i->if_node[2],
@@ -89,53 +59,15 @@ out:
89 return 0; 59 return 0;
90} 60}
91 61
92static struct ipx_route *ipx_routes_head(void)
93{
94 struct ipx_route *rc = NULL;
95
96 if (!list_empty(&ipx_routes))
97 rc = list_entry(ipx_routes.next, struct ipx_route, node);
98 return rc;
99}
100
101static struct ipx_route *ipx_routes_next(struct ipx_route *r)
102{
103 struct ipx_route *rc = NULL;
104
105 if (r->node.next != &ipx_routes)
106 rc = list_entry(r->node.next, struct ipx_route, node);
107 return rc;
108}
109
110static __inline__ struct ipx_route *ipx_get_route_idx(loff_t pos)
111{
112 struct ipx_route *r;
113
114 list_for_each_entry(r, &ipx_routes, node)
115 if (!pos--)
116 goto out;
117 r = NULL;
118out:
119 return r;
120}
121
122static void *ipx_seq_route_start(struct seq_file *seq, loff_t *pos) 62static void *ipx_seq_route_start(struct seq_file *seq, loff_t *pos)
123{ 63{
124 loff_t l = *pos;
125 read_lock_bh(&ipx_routes_lock); 64 read_lock_bh(&ipx_routes_lock);
126 return l ? ipx_get_route_idx(--l) : SEQ_START_TOKEN; 65 return seq_list_start_head(&ipx_routes, *pos);
127} 66}
128 67
129static void *ipx_seq_route_next(struct seq_file *seq, void *v, loff_t *pos) 68static void *ipx_seq_route_next(struct seq_file *seq, void *v, loff_t *pos)
130{ 69{
131 struct ipx_route *r; 70 return seq_list_next(v, &ipx_routes, pos);
132
133 ++*pos;
134 if (v == SEQ_START_TOKEN)
135 r = ipx_routes_head();
136 else
137 r = ipx_routes_next(v);
138 return r;
139} 71}
140 72
141static void ipx_seq_route_stop(struct seq_file *seq, void *v) 73static void ipx_seq_route_stop(struct seq_file *seq, void *v)
@@ -147,11 +79,13 @@ static int ipx_seq_route_show(struct seq_file *seq, void *v)
147{ 79{
148 struct ipx_route *rt; 80 struct ipx_route *rt;
149 81
150 if (v == SEQ_START_TOKEN) { 82 if (v == &ipx_routes) {
151 seq_puts(seq, "Network Router_Net Router_Node\n"); 83 seq_puts(seq, "Network Router_Net Router_Node\n");
152 goto out; 84 goto out;
153 } 85 }
154 rt = v; 86
87 rt = list_entry(v, struct ipx_route, node);
88
155 seq_printf(seq, "%08lX ", (unsigned long int)ntohl(rt->ir_net)); 89 seq_printf(seq, "%08lX ", (unsigned long int)ntohl(rt->ir_net));
156 if (rt->ir_routed) 90 if (rt->ir_routed)
157 seq_printf(seq, "%08lX %02X%02X%02X%02X%02X%02X\n", 91 seq_printf(seq, "%08lX %02X%02X%02X%02X%02X%02X\n",
@@ -226,9 +160,9 @@ static void *ipx_seq_socket_next(struct seq_file *seq, void *v, loff_t *pos)
226 spin_unlock_bh(&i->if_sklist_lock); 160 spin_unlock_bh(&i->if_sklist_lock);
227 sk = NULL; 161 sk = NULL;
228 for (;;) { 162 for (;;) {
229 i = ipx_interfaces_next(i); 163 if (i->node.next == &ipx_interfaces)
230 if (!i)
231 break; 164 break;
165 i = list_entry(i->node.next, struct ipx_interface, node);
232 spin_lock_bh(&i->if_sklist_lock); 166 spin_lock_bh(&i->if_sklist_lock);
233 if (!hlist_empty(&i->if_sklist)) { 167 if (!hlist_empty(&i->if_sklist)) {
234 sk = sk_head(&i->if_sklist); 168 sk = sk_head(&i->if_sklist);
diff --git a/net/ipx/ipx_route.c b/net/ipx/ipx_route.c
index e16c11423527..30f4519b092f 100644
--- a/net/ipx/ipx_route.c
+++ b/net/ipx/ipx_route.c
@@ -9,6 +9,7 @@
9 9
10#include <linux/list.h> 10#include <linux/list.h>
11#include <linux/route.h> 11#include <linux/route.h>
12#include <linux/slab.h>
12#include <linux/spinlock.h> 13#include <linux/spinlock.h>
13 14
14#include <net/ipx.h> 15#include <net/ipx.h>
diff --git a/net/ipx/sysctl_net_ipx.c b/net/ipx/sysctl_net_ipx.c
index 633fcab35580..bd6dca00fb85 100644
--- a/net/ipx/sysctl_net_ipx.c
+++ b/net/ipx/sysctl_net_ipx.c
@@ -18,19 +18,18 @@ extern int sysctl_ipx_pprop_broadcasting;
18 18
19static struct ctl_table ipx_table[] = { 19static struct ctl_table ipx_table[] = {
20 { 20 {
21 .ctl_name = NET_IPX_PPROP_BROADCASTING,
22 .procname = "ipx_pprop_broadcasting", 21 .procname = "ipx_pprop_broadcasting",
23 .data = &sysctl_ipx_pprop_broadcasting, 22 .data = &sysctl_ipx_pprop_broadcasting,
24 .maxlen = sizeof(int), 23 .maxlen = sizeof(int),
25 .mode = 0644, 24 .mode = 0644,
26 .proc_handler = proc_dointvec, 25 .proc_handler = proc_dointvec,
27 }, 26 },
28 { 0 }, 27 { },
29}; 28};
30 29
31static struct ctl_path ipx_path[] = { 30static struct ctl_path ipx_path[] = {
32 { .procname = "net", .ctl_name = CTL_NET, }, 31 { .procname = "net", },
33 { .procname = "ipx", .ctl_name = NET_IPX, }, 32 { .procname = "ipx", },
34 { } 33 { }
35}; 34};
36 35