Lines Matching +full:sock +full:- +full:priv
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* drivers/atm/atmtcp.c - ATM over TCP "device" driver */
4 /* Written 1997-2000 by Werner Almesberger, EPFL LRC/ICA */
21 #define PRIV(dev) ((struct atmtcp_dev_data *) ((dev)->dev_data)) macro
26 int persist; /* non-zero if persistent */
38 * waiting for an answer, so we need to re-validate out_vcc every once
53 out_vcc = PRIV(vcc->dev) ? PRIV(vcc->dev)->vcc : NULL; in atmtcp_send_control()
54 if (!out_vcc) return -EUNATCH; in atmtcp_send_control()
56 if (!skb) return -ENOMEM; in atmtcp_send_control()
58 out_vcc = PRIV(vcc->dev) ? PRIV(vcc->dev)->vcc : NULL; in atmtcp_send_control()
61 return -EUNATCH; in atmtcp_send_control()
63 atm_force_charge(out_vcc,skb->truesize); in atmtcp_send_control()
66 new_msg->hdr.length = ATMTCP_HDR_MAGIC; in atmtcp_send_control()
67 new_msg->type = type; in atmtcp_send_control()
68 memset(&new_msg->vcc,0,sizeof(atm_kptr_t)); in atmtcp_send_control()
69 *(struct atm_vcc **) &new_msg->vcc = vcc; in atmtcp_send_control()
70 old_test = test_bit(flag,&vcc->flags); in atmtcp_send_control()
71 out_vcc->push(out_vcc,skb); in atmtcp_send_control()
73 while (test_bit(flag,&vcc->flags) == old_test) { in atmtcp_send_control()
75 out_vcc = PRIV(vcc->dev) ? PRIV(vcc->dev)->vcc : NULL; in atmtcp_send_control()
77 error = -EUNATCH; in atmtcp_send_control()
91 struct atm_vcc *vcc = *(struct atm_vcc **) &msg->vcc; in atmtcp_recv_control()
93 vcc->vpi = msg->addr.sap_addr.vpi; in atmtcp_recv_control()
94 vcc->vci = msg->addr.sap_addr.vci; in atmtcp_recv_control()
95 vcc->qos = msg->qos; in atmtcp_recv_control()
96 sk_atm(vcc)->sk_err = -msg->result; in atmtcp_recv_control()
97 switch (msg->type) { in atmtcp_recv_control()
99 change_bit(ATM_VF_READY,&vcc->flags); in atmtcp_recv_control()
102 change_bit(ATM_VF_ADDR,&vcc->flags); in atmtcp_recv_control()
106 msg->type); in atmtcp_recv_control()
107 return -EINVAL; in atmtcp_recv_control()
116 /* Nothing.... Isn't this simple :-) -- REW */ in atmtcp_v_dev_close()
124 short vpi = vcc->vpi; in atmtcp_v_open()
125 int vci = vcc->vci; in atmtcp_v_open()
135 msg.qos = vcc->qos; in atmtcp_v_open()
136 set_bit(ATM_VF_ADDR,&vcc->flags); in atmtcp_v_open()
137 clear_bit(ATM_VF_READY,&vcc->flags); /* just in case ... */ in atmtcp_v_open()
140 return -sk_atm(vcc)->sk_err; in atmtcp_v_open()
150 msg.addr.sap_addr.vpi = vcc->vpi; in atmtcp_v_close()
151 msg.addr.sap_addr.vci = vcc->vci; in atmtcp_v_close()
152 clear_bit(ATM_VF_READY,&vcc->flags); in atmtcp_v_close()
161 struct sock *s; in atmtcp_v_ioctl()
164 if (cmd != ATM_SETCIRANGE) return -ENOIOCTLCMD; in atmtcp_v_ioctl()
165 if (copy_from_user(&ci, arg,sizeof(ci))) return -EFAULT; in atmtcp_v_ioctl()
169 ci.vci_bits > MAX_VCI_BITS || ci.vci_bits < 0) return -EINVAL; in atmtcp_v_ioctl()
176 if (vcc->dev != dev) in atmtcp_v_ioctl()
178 if ((vcc->vpi >> ci.vpi_bits) || in atmtcp_v_ioctl()
179 (vcc->vci >> ci.vci_bits)) { in atmtcp_v_ioctl()
181 return -EBUSY; in atmtcp_v_ioctl()
186 dev->ci_range = ci; in atmtcp_v_ioctl()
199 if (vcc->qos.txtp.traffic_class == ATM_NONE) { in atmtcp_v_send()
200 if (vcc->pop) vcc->pop(vcc,skb); in atmtcp_v_send()
202 return -EINVAL; in atmtcp_v_send()
204 dev_data = PRIV(vcc->dev); in atmtcp_v_send()
205 if (dev_data) out_vcc = dev_data->vcc; in atmtcp_v_send()
207 if (vcc->pop) vcc->pop(vcc,skb); in atmtcp_v_send()
210 atomic_inc(&vcc->stats->tx_err); in atmtcp_v_send()
211 return -ENOLINK; in atmtcp_v_send()
213 size = skb->len+sizeof(struct atmtcp_hdr); in atmtcp_v_send()
216 if (vcc->pop) vcc->pop(vcc,skb); in atmtcp_v_send()
218 atomic_inc(&vcc->stats->tx_err); in atmtcp_v_send()
219 return -ENOBUFS; in atmtcp_v_send()
222 hdr->vpi = htons(vcc->vpi); in atmtcp_v_send()
223 hdr->vci = htons(vcc->vci); in atmtcp_v_send()
224 hdr->length = htonl(skb->len); in atmtcp_v_send()
225 skb_copy_from_linear_data(skb, skb_put(new_skb, skb->len), skb->len); in atmtcp_v_send()
226 if (vcc->pop) vcc->pop(vcc,skb); in atmtcp_v_send()
228 out_vcc->push(out_vcc,new_skb); in atmtcp_v_send()
229 atomic_inc(&vcc->stats->tx); in atmtcp_v_send()
230 atomic_inc(&out_vcc->stats->rx); in atmtcp_v_send()
237 struct atmtcp_dev_data *dev_data = PRIV(dev); in atmtcp_v_proc()
240 if (!dev_data->persist) return sprintf(page,"ephemeral\n"); in atmtcp_v_proc()
242 dev_data->vcc ? "" : "dis"); in atmtcp_v_proc()
251 atmtcp_dev = (struct atm_dev *) vcc->dev_data; in atmtcp_c_close()
252 dev_data = PRIV(atmtcp_dev); in atmtcp_c_close()
253 dev_data->vcc = NULL; in atmtcp_c_close()
254 if (dev_data->persist) return; in atmtcp_c_close()
255 atmtcp_dev->dev_data = NULL; in atmtcp_c_close()
258 vcc->dev_data = NULL; in atmtcp_c_close()
267 struct sock *s; in find_vcc()
269 head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)]; in find_vcc()
273 if (vcc->dev == dev && in find_vcc()
274 vcc->vci == vci && vcc->vpi == vpi && in find_vcc()
275 vcc->qos.rxtp.traffic_class != ATM_NONE) { in find_vcc()
291 if (!skb->len) return 0; in atmtcp_c_send()
292 dev = vcc->dev_data; in atmtcp_c_send()
293 hdr = (struct atmtcp_hdr *) skb->data; in atmtcp_c_send()
294 if (hdr->length == ATMTCP_HDR_MAGIC) { in atmtcp_c_send()
296 (struct atmtcp_control *) skb->data); in atmtcp_c_send()
300 out_vcc = find_vcc(dev, ntohs(hdr->vpi), ntohs(hdr->vci)); in atmtcp_c_send()
303 result = -EUNATCH; in atmtcp_c_send()
304 atomic_inc(&vcc->stats->tx_err); in atmtcp_c_send()
308 new_skb = atm_alloc_charge(out_vcc,skb->len,GFP_KERNEL); in atmtcp_c_send()
310 result = -ENOBUFS; in atmtcp_c_send()
314 skb_copy_from_linear_data(skb, skb_put(new_skb, skb->len), skb->len); in atmtcp_c_send()
315 out_vcc->push(out_vcc,new_skb); in atmtcp_c_send()
316 atomic_inc(&vcc->stats->tx); in atmtcp_c_send()
317 atomic_inc(&out_vcc->stats->rx); in atmtcp_c_send()
319 if (vcc->pop) vcc->pop(vcc,skb); in atmtcp_c_send()
367 return -ENOMEM; in atmtcp_create()
372 return itf == -1 ? -ENOMEM : -EBUSY; in atmtcp_create()
374 dev->ci_range.vpi_bits = MAX_VPI_BITS; in atmtcp_create()
375 dev->ci_range.vci_bits = MAX_VCI_BITS; in atmtcp_create()
376 dev->dev_data = dev_data; in atmtcp_create()
377 PRIV(dev)->vcc = NULL; in atmtcp_create()
378 PRIV(dev)->persist = persist; in atmtcp_create()
389 if (itf != -1) dev = atm_dev_lookup(itf); in atmtcp_attach()
391 if (dev->ops != &atmtcp_v_dev_ops) { in atmtcp_attach()
393 return -EMEDIUMTYPE; in atmtcp_attach()
395 if (PRIV(dev)->vcc) { in atmtcp_attach()
397 return -EBUSY; in atmtcp_attach()
406 PRIV(dev)->vcc = vcc; in atmtcp_attach()
407 vcc->dev = &atmtcp_control_dev; in atmtcp_attach()
409 set_bit(ATM_VF_META,&vcc->flags); in atmtcp_attach()
410 set_bit(ATM_VF_READY,&vcc->flags); in atmtcp_attach()
411 vcc->dev_data = dev; in atmtcp_attach()
413 vcc->stats = &atmtcp_control_dev.stats.aal5; in atmtcp_attach()
414 return dev->number; in atmtcp_attach()
430 if (!dev) return -ENODEV; in atmtcp_remove_persistent()
431 if (dev->ops != &atmtcp_v_dev_ops) { in atmtcp_remove_persistent()
433 return -EMEDIUMTYPE; in atmtcp_remove_persistent()
435 dev_data = PRIV(dev); in atmtcp_remove_persistent()
436 if (!dev_data->persist) { in atmtcp_remove_persistent()
440 dev_data->persist = 0; in atmtcp_remove_persistent()
441 if (PRIV(dev)->vcc) { in atmtcp_remove_persistent()
451 static int atmtcp_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) in atmtcp_ioctl() argument
454 struct atm_vcc *vcc = ATM_SD(sock); in atmtcp_ioctl()
457 return -ENOIOCTLCMD; in atmtcp_ioctl()
460 return -EPERM; in atmtcp_ioctl()
466 sock->state = SS_CONNECTED; in atmtcp_ioctl()