1 /* drivers/atm/atmtcp.c - ATM over TCP "device" driver */
3 /* Written 1997-2000 by Werner Almesberger, EPFL LRC/ICA */
6 #include <linux/module.h>
7 #include <linux/wait.h>
8 #include <linux/atmdev.h>
9 #include <linux/atm_tcp.h>
10 #include <linux/bitops.h>
11 #include <asm/uaccess.h>
12 #include <asm/atomic.h>
15 extern int atm_init_aal5(struct atm_vcc
*vcc
); /* "raw" AAL5 transport */
18 #define PRIV(dev) ((struct atmtcp_dev_data *) ((dev)->dev_data))
21 struct atmtcp_dev_data
{
22 struct atm_vcc
*vcc
; /* control VCC; NULL if detached */
23 int persist
; /* non-zero if persistent */
27 #define DEV_LABEL "atmtcp"
29 #define MAX_VPI_BITS 8 /* simplifies life */
30 #define MAX_VCI_BITS 16
34 * Hairy code ahead: the control VCC may be closed while we're still
35 * waiting for an answer, so we need to re-validate out_vcc every once
40 static int atmtcp_send_control(struct atm_vcc
*vcc
,int type
,
41 const struct atmtcp_control
*msg
,int flag
)
43 DECLARE_WAITQUEUE(wait
,current
);
44 struct atm_vcc
*out_vcc
;
46 struct atmtcp_control
*new_msg
;
50 out_vcc
= PRIV(vcc
->dev
) ? PRIV(vcc
->dev
)->vcc
: NULL
;
51 if (!out_vcc
) return -EUNATCH
;
52 skb
= alloc_skb(sizeof(*msg
),GFP_KERNEL
);
53 if (!skb
) return -ENOMEM
;
55 out_vcc
= PRIV(vcc
->dev
) ? PRIV(vcc
->dev
)->vcc
: NULL
;
60 atm_force_charge(out_vcc
,skb
->truesize
);
61 new_msg
= (struct atmtcp_control
*) skb_put(skb
,sizeof(*new_msg
));
63 new_msg
->hdr
.length
= ATMTCP_HDR_MAGIC
;
65 memset(&new_msg
->vcc
,0,sizeof(atm_kptr_t
));
66 *(struct atm_vcc
**) &new_msg
->vcc
= vcc
;
67 old_test
= test_bit(flag
,&vcc
->flags
);
68 out_vcc
->push(out_vcc
,skb
);
69 add_wait_queue(&vcc
->sleep
,&wait
);
70 while (test_bit(flag
,&vcc
->flags
) == old_test
) {
72 out_vcc
= PRIV(vcc
->dev
) ? PRIV(vcc
->dev
)->vcc
: NULL
;
77 set_current_state(TASK_UNINTERRUPTIBLE
);
80 current
->state
= TASK_RUNNING
;
81 remove_wait_queue(&vcc
->sleep
,&wait
);
86 static int atmtcp_recv_control(const struct atmtcp_control
*msg
)
88 struct atm_vcc
*vcc
= *(struct atm_vcc
**) &msg
->vcc
;
90 vcc
->vpi
= msg
->addr
.sap_addr
.vpi
;
91 vcc
->vci
= msg
->addr
.sap_addr
.vci
;
93 vcc
->reply
= msg
->result
;
95 case ATMTCP_CTRL_OPEN
:
96 change_bit(ATM_VF_READY
,&vcc
->flags
);
98 case ATMTCP_CTRL_CLOSE
:
99 change_bit(ATM_VF_ADDR
,&vcc
->flags
);
102 printk(KERN_ERR
"atmtcp_recv_control: unknown type %d\n",
106 wake_up(&vcc
->sleep
);
111 static void atmtcp_v_dev_close(struct atm_dev
*dev
)
117 static int atmtcp_v_open(struct atm_vcc
*vcc
,short vpi
,int vci
)
119 struct atmtcp_control msg
;
122 memset(&msg
,0,sizeof(msg
));
123 msg
.addr
.sap_family
= AF_ATMPVC
;
124 msg
.hdr
.vpi
= htons(vpi
);
125 msg
.addr
.sap_addr
.vpi
= vpi
;
126 msg
.hdr
.vci
= htons(vci
);
127 msg
.addr
.sap_addr
.vci
= vci
;
128 error
= atm_find_ci(vcc
,&msg
.addr
.sap_addr
.vpi
,&msg
.addr
.sap_addr
.vci
);
129 if (error
) return error
;
130 if (vpi
== ATM_VPI_UNSPEC
|| vci
== ATM_VCI_UNSPEC
) return 0;
131 msg
.type
= ATMTCP_CTRL_OPEN
;
133 set_bit(ATM_VF_ADDR
,&vcc
->flags
);
134 clear_bit(ATM_VF_READY
,&vcc
->flags
); /* just in case ... */
135 error
= atmtcp_send_control(vcc
,ATMTCP_CTRL_OPEN
,&msg
,ATM_VF_READY
);
136 if (error
) return error
;
141 static void atmtcp_v_close(struct atm_vcc
*vcc
)
143 struct atmtcp_control msg
;
145 memset(&msg
,0,sizeof(msg
));
146 msg
.addr
.sap_family
= AF_ATMPVC
;
147 msg
.addr
.sap_addr
.vpi
= vcc
->vpi
;
148 msg
.addr
.sap_addr
.vci
= vcc
->vci
;
149 clear_bit(ATM_VF_READY
,&vcc
->flags
);
150 (void) atmtcp_send_control(vcc
,ATMTCP_CTRL_CLOSE
,&msg
,ATM_VF_ADDR
);
154 static int atmtcp_v_ioctl(struct atm_dev
*dev
,unsigned int cmd
,void *arg
)
156 struct atm_cirange ci
;
159 if (cmd
!= ATM_SETCIRANGE
) return -ENOIOCTLCMD
;
160 if (copy_from_user(&ci
,(void *) arg
,sizeof(ci
))) return -EFAULT
;
161 if (ci
.vpi_bits
== ATM_CI_MAX
) ci
.vpi_bits
= MAX_VPI_BITS
;
162 if (ci
.vci_bits
== ATM_CI_MAX
) ci
.vci_bits
= MAX_VCI_BITS
;
163 if (ci
.vpi_bits
> MAX_VPI_BITS
|| ci
.vpi_bits
< 0 ||
164 ci
.vci_bits
> MAX_VCI_BITS
|| ci
.vci_bits
< 0) return -EINVAL
;
165 for (vcc
= dev
->vccs
; vcc
; vcc
= vcc
->next
)
166 if ((vcc
->vpi
>> ci
.vpi_bits
) ||
167 (vcc
->vci
>> ci
.vci_bits
)) return -EBUSY
;
173 static int atmtcp_v_send(struct atm_vcc
*vcc
,struct sk_buff
*skb
)
175 struct atmtcp_dev_data
*dev_data
;
176 struct atm_vcc
*out_vcc
;
177 struct sk_buff
*new_skb
;
178 struct atmtcp_hdr
*hdr
;
181 if (vcc
->qos
.txtp
.traffic_class
== ATM_NONE
) {
182 if (vcc
->pop
) vcc
->pop(vcc
,skb
);
183 else dev_kfree_skb(skb
);
186 dev_data
= PRIV(vcc
->dev
);
187 if (dev_data
) out_vcc
= dev_data
->vcc
;
188 if (!dev_data
|| !out_vcc
) {
189 if (vcc
->pop
) vcc
->pop(vcc
,skb
);
190 else dev_kfree_skb(skb
);
191 if (dev_data
) return 0;
192 atomic_inc(&vcc
->stats
->tx_err
);
195 size
= skb
->len
+sizeof(struct atmtcp_hdr
);
196 new_skb
= atm_alloc_charge(out_vcc
,size
,GFP_ATOMIC
);
198 if (vcc
->pop
) vcc
->pop(vcc
,skb
);
199 else dev_kfree_skb(skb
);
200 atomic_inc(&vcc
->stats
->tx_err
);
203 hdr
= (void *) skb_put(new_skb
,sizeof(struct atmtcp_hdr
));
204 hdr
->vpi
= htons(vcc
->vpi
);
205 hdr
->vci
= htons(vcc
->vci
);
206 hdr
->length
= htonl(skb
->len
);
207 memcpy(skb_put(new_skb
,skb
->len
),skb
->data
,skb
->len
);
208 if (vcc
->pop
) vcc
->pop(vcc
,skb
);
209 else dev_kfree_skb(skb
);
210 out_vcc
->push(out_vcc
,new_skb
);
211 atomic_inc(&vcc
->stats
->tx
);
212 atomic_inc(&out_vcc
->stats
->rx
);
217 static int atmtcp_v_proc(struct atm_dev
*dev
,loff_t
*pos
,char *page
)
219 struct atmtcp_dev_data
*dev_data
= PRIV(dev
);
222 if (!dev_data
->persist
) return sprintf(page
,"ephemeral\n");
223 return sprintf(page
,"persistent, %sconnected\n",
224 dev_data
->vcc
? "" : "dis");
228 static void atmtcp_c_close(struct atm_vcc
*vcc
)
230 struct atm_dev
*atmtcp_dev
;
231 struct atmtcp_dev_data
*dev_data
;
232 struct atm_vcc
*walk
;
234 atmtcp_dev
= (struct atm_dev
*) vcc
->dev_data
;
235 dev_data
= PRIV(atmtcp_dev
);
236 dev_data
->vcc
= NULL
;
237 if (dev_data
->persist
) return;
238 PRIV(atmtcp_dev
) = NULL
;
240 shutdown_atm_dev(atmtcp_dev
);
241 vcc
->dev_data
= NULL
;
242 for (walk
= atmtcp_dev
->vccs
; walk
; walk
= walk
->next
)
243 wake_up(&walk
->sleep
);
247 static int atmtcp_c_send(struct atm_vcc
*vcc
,struct sk_buff
*skb
)
250 struct atmtcp_hdr
*hdr
;
251 struct atm_vcc
*out_vcc
;
252 struct sk_buff
*new_skb
;
255 if (!skb
->len
) return 0;
257 hdr
= (struct atmtcp_hdr
*) skb
->data
;
258 if (hdr
->length
== ATMTCP_HDR_MAGIC
) {
259 result
= atmtcp_recv_control(
260 (struct atmtcp_control
*) skb
->data
);
263 for (out_vcc
= dev
->vccs
; out_vcc
; out_vcc
= out_vcc
->next
)
264 if (out_vcc
->vpi
== ntohs(hdr
->vpi
) &&
265 out_vcc
->vci
== ntohs(hdr
->vci
) &&
266 out_vcc
->qos
.rxtp
.traffic_class
!= ATM_NONE
)
269 atomic_inc(&vcc
->stats
->tx_err
);
272 skb_pull(skb
,sizeof(struct atmtcp_hdr
));
273 new_skb
= atm_alloc_charge(out_vcc
,skb
->len
,GFP_KERNEL
);
278 new_skb
->stamp
= xtime
;
279 memcpy(skb_put(new_skb
,skb
->len
),skb
->data
,skb
->len
);
280 out_vcc
->push(out_vcc
,new_skb
);
281 atomic_inc(&vcc
->stats
->tx
);
282 atomic_inc(&out_vcc
->stats
->rx
);
284 if (vcc
->pop
) vcc
->pop(vcc
,skb
);
285 else dev_kfree_skb(skb
);
291 * Device operations for the virtual ATM devices created by ATMTCP.
295 static struct atmdev_ops atmtcp_v_dev_ops
= {
296 dev_close
: atmtcp_v_dev_close
,
298 close
: atmtcp_v_close
,
299 ioctl
: atmtcp_v_ioctl
,
301 proc_read
: atmtcp_v_proc
306 * Device operations for the ATMTCP control device.
310 static struct atmdev_ops atmtcp_c_dev_ops
= {
311 close
: atmtcp_c_close
,
316 static struct atm_dev atmtcp_control_dev
= {
320 999, /* dummy device number */
321 NULL
,NULL
, /* pretend not to have any VCCs */
322 NULL
,NULL
, /* no data */
323 { 0 }, /* no flags */
324 NULL
, /* no local address */
325 { 0 } /* no ESI, no statistics */
329 static int atmtcp_create(int itf
,int persist
,struct atm_dev
**result
)
331 struct atmtcp_dev_data
*dev_data
;
336 dev_data
= kmalloc(sizeof(*dev_data
),GFP_KERNEL
);
342 dev
= atm_dev_register(DEV_LABEL
,&atmtcp_v_dev_ops
,itf
,NULL
);
346 return itf
== -1 ? -ENOMEM
: -EBUSY
;
348 dev
->ci_range
.vpi_bits
= MAX_VPI_BITS
;
349 dev
->ci_range
.vci_bits
= MAX_VCI_BITS
;
350 PRIV(dev
) = dev_data
;
351 PRIV(dev
)->vcc
= NULL
;
352 PRIV(dev
)->persist
= persist
;
353 if (result
) *result
= dev
;
358 int atmtcp_attach(struct atm_vcc
*vcc
,int itf
)
363 if (itf
!= -1) dev
= atm_find_dev(itf
);
365 if (dev
->ops
!= &atmtcp_v_dev_ops
) return -EMEDIUMTYPE
;
366 if (PRIV(dev
)->vcc
) return -EBUSY
;
371 error
= atmtcp_create(itf
,0,&dev
);
372 if (error
) return error
;
374 PRIV(dev
)->vcc
= vcc
;
375 bind_vcc(vcc
,&atmtcp_control_dev
);
376 set_bit(ATM_VF_META
,&vcc
->flags
);
377 set_bit(ATM_VF_READY
,&vcc
->flags
);
379 (void) atm_init_aal5(vcc
); /* @@@ losing AAL in transit ... */
380 vcc
->stats
= &atmtcp_control_dev
.stats
.aal5
;
385 int atmtcp_create_persistent(int itf
)
387 return atmtcp_create(itf
,1,NULL
);
391 int atmtcp_remove_persistent(int itf
)
394 struct atmtcp_dev_data
*dev_data
;
396 dev
= atm_find_dev(itf
);
397 if (!dev
) return -ENODEV
;
398 if (dev
->ops
!= &atmtcp_v_dev_ops
) return -EMEDIUMTYPE
;
399 dev_data
= PRIV(dev
);
400 if (!dev_data
->persist
) return 0;
401 dev_data
->persist
= 0;
402 if (PRIV(dev
)->vcc
) return 0;
404 shutdown_atm_dev(dev
);
411 int init_module(void)
413 atm_tcp_ops
.attach
= atmtcp_attach
;
414 atm_tcp_ops
.create_persistent
= atmtcp_create_persistent
;
415 atm_tcp_ops
.remove_persistent
= atmtcp_remove_persistent
;
420 void cleanup_module(void)
422 atm_tcp_ops
.attach
= NULL
;
423 atm_tcp_ops
.create_persistent
= NULL
;
424 atm_tcp_ops
.remove_persistent
= NULL
;
429 struct atm_tcp_ops atm_tcp_ops
= {
430 atmtcp_attach
, /* attach */
431 atmtcp_create_persistent
, /* create_persistent */
432 atmtcp_remove_persistent
/* remove_persistent */