Lines Matching +full:vcc +full:- +full:p
1 // SPDX-License-Identifier: GPL-2.0
2 /* net/atm/signaling.c - ATM signaling */
4 /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
32 atm_force_charge(sigd, skb->truesize); in sigd_put_skb()
33 skb_queue_tail(&sk_atm(sigd)->sk_receive_queue, skb); in sigd_put_skb()
34 sk_atm(sigd)->sk_data_ready(sk_atm(sigd)); in sigd_put_skb()
37 static void modify_qos(struct atm_vcc *vcc, struct atmsvc_msg *msg) in modify_qos() argument
41 if (test_bit(ATM_VF_RELEASED, &vcc->flags) || in modify_qos()
42 !test_bit(ATM_VF_READY, &vcc->flags)) in modify_qos()
44 msg->type = as_error; in modify_qos()
45 if (!vcc->dev->ops->change_qos) in modify_qos()
46 msg->reply = -EOPNOTSUPP; in modify_qos()
48 /* should lock VCC */ in modify_qos()
49 msg->reply = vcc->dev->ops->change_qos(vcc, &msg->qos, in modify_qos()
50 msg->reply); in modify_qos()
51 if (!msg->reply) in modify_qos()
52 msg->type = as_okay; in modify_qos()
64 static int sigd_send(struct atm_vcc *vcc, struct sk_buff *skb) in sigd_send() argument
70 msg = (struct atmsvc_msg *) skb->data; in sigd_send()
71 WARN_ON(refcount_sub_and_test(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc)); in sigd_send()
72 vcc = *(struct atm_vcc **) &msg->vcc; in sigd_send()
73 pr_debug("%d (0x%lx)\n", (int)msg->type, (unsigned long)vcc); in sigd_send()
74 sk = sk_atm(vcc); in sigd_send()
76 switch (msg->type) { in sigd_send()
78 sk->sk_err = -msg->reply; in sigd_send()
79 clear_bit(ATM_VF_WAITING, &vcc->flags); in sigd_send()
80 if (!*vcc->local.sas_addr.prv && !*vcc->local.sas_addr.pub) { in sigd_send()
81 vcc->local.sas_family = AF_ATMSVC; in sigd_send()
82 memcpy(vcc->local.sas_addr.prv, in sigd_send()
83 msg->local.sas_addr.prv, ATM_ESA_LEN); in sigd_send()
84 memcpy(vcc->local.sas_addr.pub, in sigd_send()
85 msg->local.sas_addr.pub, ATM_E164_LEN + 1); in sigd_send()
87 session_vcc = vcc->session ? vcc->session : vcc; in sigd_send()
88 if (session_vcc->vpi || session_vcc->vci) in sigd_send()
90 session_vcc->itf = msg->pvc.sap_addr.itf; in sigd_send()
91 session_vcc->vpi = msg->pvc.sap_addr.vpi; in sigd_send()
92 session_vcc->vci = msg->pvc.sap_addr.vci; in sigd_send()
93 if (session_vcc->vpi || session_vcc->vci) in sigd_send()
94 session_vcc->qos = msg->qos; in sigd_send()
97 clear_bit(ATM_VF_REGIS, &vcc->flags); in sigd_send()
98 clear_bit(ATM_VF_READY, &vcc->flags); in sigd_send()
99 sk->sk_err = -msg->reply; in sigd_send()
100 clear_bit(ATM_VF_WAITING, &vcc->flags); in sigd_send()
103 vcc = *(struct atm_vcc **)&msg->listen_vcc; in sigd_send()
104 sk = sk_atm(vcc); in sigd_send()
108 sigd_enq(NULL, as_reject, vcc, NULL, NULL); in sigd_send()
113 skb_queue_tail(&sk->sk_receive_queue, skb); in sigd_send()
114 pr_debug("waking sk_sleep(sk) 0x%p\n", sk_sleep(sk)); in sigd_send()
115 sk->sk_state_change(sk); in sigd_send()
120 set_bit(ATM_VF_RELEASED, &vcc->flags); in sigd_send()
121 vcc_release_async(vcc, msg->reply); in sigd_send()
124 modify_qos(vcc, msg); in sigd_send()
128 sk->sk_err_soft = -msg->reply; in sigd_send()
130 clear_bit(ATM_VF_WAITING, &vcc->flags); in sigd_send()
133 pr_alert("bad message type %d\n", (int)msg->type); in sigd_send()
134 return -EINVAL; in sigd_send()
136 sk->sk_state_change(sk); in sigd_send()
142 void sigd_enq2(struct atm_vcc *vcc, enum atmsvc_msg_type type, in sigd_enq2() argument
151 pr_debug("%d (0x%p)\n", (int)type, vcc); in sigd_enq2()
155 msg->type = type; in sigd_enq2()
156 *(struct atm_vcc **) &msg->vcc = vcc; in sigd_enq2()
157 *(struct atm_vcc **) &msg->listen_vcc = listen_vcc; in sigd_enq2()
158 msg->reply = reply; in sigd_enq2()
160 msg->qos = *qos; in sigd_enq2()
161 if (vcc) in sigd_enq2()
162 msg->sap = vcc->sap; in sigd_enq2()
164 msg->svc = *svc; in sigd_enq2()
165 if (vcc) in sigd_enq2()
166 msg->local = vcc->local; in sigd_enq2()
168 msg->pvc = *pvc; in sigd_enq2()
169 if (vcc) { in sigd_enq2()
170 if (type == as_connect && test_bit(ATM_VF_SESSION, &vcc->flags)) in sigd_enq2()
171 msg->session = ++session; in sigd_enq2()
175 if (vcc) in sigd_enq2()
176 set_bit(ATM_VF_REGIS, &vcc->flags); in sigd_enq2()
179 void sigd_enq(struct atm_vcc *vcc, enum atmsvc_msg_type type, in sigd_enq() argument
183 sigd_enq2(vcc, type, listen_vcc, pvc, svc, vcc ? &vcc->qos : NULL, 0); in sigd_enq()
187 static void purge_vcc(struct atm_vcc *vcc) in purge_vcc() argument
189 if (sk_atm(vcc)->sk_family == PF_ATMSVC && in purge_vcc()
190 !test_bit(ATM_VF_META, &vcc->flags)) { in purge_vcc()
191 set_bit(ATM_VF_RELEASED, &vcc->flags); in purge_vcc()
192 clear_bit(ATM_VF_REGIS, &vcc->flags); in purge_vcc()
193 vcc_release_async(vcc, -EUNATCH); in purge_vcc()
197 static void sigd_close(struct atm_vcc *vcc) in sigd_close() argument
204 if (skb_peek(&sk_atm(vcc)->sk_receive_queue)) in sigd_close()
206 skb_queue_purge(&sk_atm(vcc)->sk_receive_queue); in sigd_close()
213 vcc = atm_sk(s); in sigd_close()
215 purge_vcc(vcc); in sigd_close()
233 int sigd_attach(struct atm_vcc *vcc) in sigd_attach() argument
236 return -EADDRINUSE; in sigd_attach()
238 sigd = vcc; in sigd_attach()
239 vcc->dev = &sigd_dev; in sigd_attach()
240 vcc_insert_socket(sk_atm(vcc)); in sigd_attach()
241 set_bit(ATM_VF_META, &vcc->flags); in sigd_attach()
242 set_bit(ATM_VF_READY, &vcc->flags); in sigd_attach()