Blame view

net/atm/pvc.c 3.76 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
  /* net/atm/pvc.c - ATM PVC sockets */
  
  /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
10
11
12
  #include <linux/net.h>		/* struct socket, struct proto_ops */
  #include <linux/atm.h>		/* ATM stuff */
  #include <linux/atmdev.h>	/* ATM devices */
  #include <linux/errno.h>	/* error codes */
  #include <linux/kernel.h>	/* printk */
  #include <linux/init.h>
  #include <linux/skbuff.h>
  #include <linux/bitops.h>
bc3b2d7fb   Paul Gortmaker   net: Add export.h...
13
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
  #include <net/sock.h>		/* for sock_no_* */
  
  #include "resources.h"		/* devs and vccs */
  #include "common.h"		/* common for PVCs and SVCs */
6b6dd498f   Joe Perches   net/atm/pvc.c: ch...
18
  static int pvc_shutdown(struct socket *sock, int how)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
21
  {
  	return 0;
  }
6b6dd498f   Joe Perches   net/atm/pvc.c: ch...
22
23
  static int pvc_bind(struct socket *sock, struct sockaddr *sockaddr,
  		    int sockaddr_len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
  {
  	struct sock *sk = sock->sk;
  	struct sockaddr_atmpvc *addr;
  	struct atm_vcc *vcc;
  	int error;
6b6dd498f   Joe Perches   net/atm/pvc.c: ch...
29
30
31
32
33
  	if (sockaddr_len != sizeof(struct sockaddr_atmpvc))
  		return -EINVAL;
  	addr = (struct sockaddr_atmpvc *)sockaddr;
  	if (addr->sap_family != AF_ATMPVC)
  		return -EAFNOSUPPORT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
37
38
39
  	lock_sock(sk);
  	vcc = ATM_SD(sock);
  	if (!test_bit(ATM_VF_HASQOS, &vcc->flags)) {
  		error = -EBADFD;
  		goto out;
  	}
6b6dd498f   Joe Perches   net/atm/pvc.c: ch...
40
41
42
43
44
  	if (test_bit(ATM_VF_PARTIAL, &vcc->flags)) {
  		if (vcc->vpi != ATM_VPI_UNSPEC)
  			addr->sap_addr.vpi = vcc->vpi;
  		if (vcc->vci != ATM_VCI_UNSPEC)
  			addr->sap_addr.vci = vcc->vci;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
47
48
49
50
51
  	}
  	error = vcc_connect(sock, addr->sap_addr.itf, addr->sap_addr.vpi,
  			    addr->sap_addr.vci);
  out:
  	release_sock(sk);
  	return error;
  }
6b6dd498f   Joe Perches   net/atm/pvc.c: ch...
52
53
  static int pvc_connect(struct socket *sock, struct sockaddr *sockaddr,
  		       int sockaddr_len, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  {
6b6dd498f   Joe Perches   net/atm/pvc.c: ch...
55
  	return pvc_bind(sock, sockaddr, sockaddr_len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
  }
  
  static int pvc_setsockopt(struct socket *sock, int level, int optname,
b7058842c   David S. Miller   net: Make setsock...
59
  			  char __user *optval, unsigned int optlen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
62
63
64
65
66
67
68
  {
  	struct sock *sk = sock->sk;
  	int error;
  
  	lock_sock(sk);
  	error = vcc_setsockopt(sock, level, optname, optval, optlen);
  	release_sock(sk);
  	return error;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
  static int pvc_getsockopt(struct socket *sock, int level, int optname,
f7d57453d   YOSHIFUJI Hideaki   [NET] ATM: Fix wh...
70
  			  char __user *optval, int __user *optlen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
73
74
75
76
77
78
79
  {
  	struct sock *sk = sock->sk;
  	int error;
  
  	lock_sock(sk);
  	error = vcc_getsockopt(sock, level, optname, optval, optlen);
  	release_sock(sk);
  	return error;
  }
6b6dd498f   Joe Perches   net/atm/pvc.c: ch...
80
81
  static int pvc_getname(struct socket *sock, struct sockaddr *sockaddr,
  		       int *sockaddr_len, int peer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
83
84
  {
  	struct sockaddr_atmpvc *addr;
  	struct atm_vcc *vcc = ATM_SD(sock);
6b6dd498f   Joe Perches   net/atm/pvc.c: ch...
85
86
  	if (!vcc->dev || !test_bit(ATM_VF_ADDR, &vcc->flags))
  		return -ENOTCONN;
f7d57453d   YOSHIFUJI Hideaki   [NET] ATM: Fix wh...
87
  	*sockaddr_len = sizeof(struct sockaddr_atmpvc);
6b6dd498f   Joe Perches   net/atm/pvc.c: ch...
88
  	addr = (struct sockaddr_atmpvc *)sockaddr;
3c0c5cfdc   Mathias Krause   atm: fix info lea...
89
  	memset(addr, 0, sizeof(*addr));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
91
92
93
94
95
  	addr->sap_family = AF_ATMPVC;
  	addr->sap_addr.itf = vcc->dev->number;
  	addr->sap_addr.vpi = vcc->vpi;
  	addr->sap_addr.vci = vcc->vci;
  	return 0;
  }
90ddc4f04   Eric Dumazet   [NET]: move struc...
96
  static const struct proto_ops pvc_proto_ops = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
99
100
101
102
103
104
105
106
107
  	.family =	PF_ATMPVC,
  	.owner =	THIS_MODULE,
  
  	.release =	vcc_release,
  	.bind =		pvc_bind,
  	.connect =	pvc_connect,
  	.socketpair =	sock_no_socketpair,
  	.accept =	sock_no_accept,
  	.getname =	pvc_getname,
  	.poll =		vcc_poll,
  	.ioctl =	vcc_ioctl,
8865c418c   David Woodhouse   atm: 32-bit ioctl...
108
109
110
  #ifdef CONFIG_COMPAT
  	.compat_ioctl = vcc_compat_ioctl,
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
114
115
116
117
118
119
  	.listen =	sock_no_listen,
  	.shutdown =	pvc_shutdown,
  	.setsockopt =	pvc_setsockopt,
  	.getsockopt =	pvc_getsockopt,
  	.sendmsg =	vcc_sendmsg,
  	.recvmsg =	vcc_recvmsg,
  	.mmap =		sock_no_mmap,
  	.sendpage =	sock_no_sendpage,
  };
3f378b684   Eric Paris   net: pass kern to...
120
121
  static int pvc_create(struct net *net, struct socket *sock, int protocol,
  		      int kern)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
  {
1b8d7ae42   Eric W. Biederman   [NET]: Make socke...
123
124
  	if (net != &init_net)
  		return -EAFNOSUPPORT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
  	sock->ops = &pvc_proto_ops;
11aa9c28b   Eric W. Biederman   net: Pass kern fr...
126
  	return vcc_create(net, sock, protocol, PF_ATMPVC, kern);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
  }
ec1b4cf74   Stephen Hemminger   net: mark net_pro...
128
  static const struct net_proto_family pvc_family_ops = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
  	.family = PF_ATMPVC,
  	.create = pvc_create,
  	.owner = THIS_MODULE,
  };
  
  
  /*
   *	Initialize the ATM PVC protocol family
   */
  
  
  int __init atmpvc_init(void)
  {
  	return sock_register(&pvc_family_ops);
  }
  
  void atmpvc_exit(void)
  {
  	sock_unregister(PF_ATMPVC);
  }