Lines Matching refs:session
55 struct cmtp_session *session; in __cmtp_get_session() local
59 list_for_each_entry(session, &cmtp_session_list, list) in __cmtp_get_session()
60 if (!bacmp(bdaddr, &session->bdaddr)) in __cmtp_get_session()
61 return session; in __cmtp_get_session()
66 static void __cmtp_link_session(struct cmtp_session *session) in __cmtp_link_session() argument
68 list_add(&session->list, &cmtp_session_list); in __cmtp_link_session()
71 static void __cmtp_unlink_session(struct cmtp_session *session) in __cmtp_unlink_session() argument
73 list_del(&session->list); in __cmtp_unlink_session()
76 static void __cmtp_copy_session(struct cmtp_session *session, struct cmtp_conninfo *ci) in __cmtp_copy_session() argument
80 bacpy(&ci->bdaddr, &session->bdaddr); in __cmtp_copy_session()
82 ci->flags = session->flags & valid_flags; in __cmtp_copy_session()
83 ci->state = session->state; in __cmtp_copy_session()
85 ci->num = session->num; in __cmtp_copy_session()
89 static inline int cmtp_alloc_block_id(struct cmtp_session *session) in cmtp_alloc_block_id() argument
94 if (!test_and_set_bit(i, &session->blockids)) { in cmtp_alloc_block_id()
102 static inline void cmtp_free_block_id(struct cmtp_session *session, int id) in cmtp_free_block_id() argument
104 clear_bit(id, &session->blockids); in cmtp_free_block_id()
107 static inline void cmtp_add_msgpart(struct cmtp_session *session, int id, const unsigned char *buf,… in cmtp_add_msgpart() argument
109 struct sk_buff *skb = session->reassembly[id], *nskb; in cmtp_add_msgpart()
112 BT_DBG("session %p buf %p count %d", session, buf, count); in cmtp_add_msgpart()
127 session->reassembly[id] = nskb; in cmtp_add_msgpart()
132 static inline int cmtp_recv_frame(struct cmtp_session *session, struct sk_buff *skb) in cmtp_recv_frame() argument
137 BT_DBG("session %p skb %p len %d", session, skb, skb->len); in cmtp_recv_frame()
173 cmtp_add_msgpart(session, id, skb->data + hdrlen, len); in cmtp_recv_frame()
174 cmtp_recv_capimsg(session, session->reassembly[id]); in cmtp_recv_frame()
175 session->reassembly[id] = NULL; in cmtp_recv_frame()
178 cmtp_add_msgpart(session, id, skb->data + hdrlen, len); in cmtp_recv_frame()
181 if (session->reassembly[id] != NULL) in cmtp_recv_frame()
182 kfree_skb(session->reassembly[id]); in cmtp_recv_frame()
183 session->reassembly[id] = NULL; in cmtp_recv_frame()
194 static int cmtp_send_frame(struct cmtp_session *session, unsigned char *data, int len) in cmtp_send_frame() argument
196 struct socket *sock = session->sock; in cmtp_send_frame()
200 BT_DBG("session %p data %p len %d", session, data, len); in cmtp_send_frame()
210 static void cmtp_process_transmit(struct cmtp_session *session) in cmtp_process_transmit() argument
216 BT_DBG("session %p", session); in cmtp_process_transmit()
218 nskb = alloc_skb(session->mtu, GFP_ATOMIC); in cmtp_process_transmit()
224 while ((skb = skb_dequeue(&session->transmit))) { in cmtp_process_transmit()
227 tail = session->mtu - nskb->len; in cmtp_process_transmit()
229 cmtp_send_frame(session, nskb->data, nskb->len); in cmtp_process_transmit()
231 tail = session->mtu; in cmtp_process_transmit()
237 scb->id = cmtp_alloc_block_id(session); in cmtp_process_transmit()
239 skb_queue_head(&session->transmit, skb); in cmtp_process_transmit()
263 skb_queue_head(&session->transmit, skb); in cmtp_process_transmit()
265 cmtp_free_block_id(session, scb->id); in cmtp_process_transmit()
267 cmtp_send_frame(session, nskb->data, nskb->len); in cmtp_process_transmit()
274 cmtp_send_frame(session, nskb->data, nskb->len); in cmtp_process_transmit()
281 struct cmtp_session *session = arg; in cmtp_session() local
282 struct sock *sk = session->sock->sk; in cmtp_session()
286 BT_DBG("session %p", session); in cmtp_session()
295 if (atomic_read(&session->terminate)) in cmtp_session()
303 cmtp_recv_frame(session, skb); in cmtp_session()
308 cmtp_process_transmit(session); in cmtp_session()
317 if (!(session->flags & BIT(CMTP_LOOPBACK))) in cmtp_session()
318 cmtp_detach_device(session); in cmtp_session()
320 fput(session->sock->file); in cmtp_session()
322 __cmtp_unlink_session(session); in cmtp_session()
326 kfree(session); in cmtp_session()
334 struct cmtp_session *session, *s; in cmtp_add_connection() local
345 session = kzalloc(sizeof(struct cmtp_session), GFP_KERNEL); in cmtp_add_connection()
346 if (!session) in cmtp_add_connection()
357 bacpy(&session->bdaddr, &l2cap_pi(sock->sk)->chan->dst); in cmtp_add_connection()
359 session->mtu = min_t(uint, l2cap_pi(sock->sk)->chan->omtu, in cmtp_add_connection()
362 BT_DBG("mtu %d", session->mtu); in cmtp_add_connection()
364 sprintf(session->name, "%pMR", &session->bdaddr); in cmtp_add_connection()
366 session->sock = sock; in cmtp_add_connection()
367 session->state = BT_CONFIG; in cmtp_add_connection()
369 init_waitqueue_head(&session->wait); in cmtp_add_connection()
371 session->msgnum = CMTP_INITIAL_MSGNUM; in cmtp_add_connection()
373 INIT_LIST_HEAD(&session->applications); in cmtp_add_connection()
375 skb_queue_head_init(&session->transmit); in cmtp_add_connection()
378 session->reassembly[i] = NULL; in cmtp_add_connection()
380 session->flags = req->flags; in cmtp_add_connection()
382 __cmtp_link_session(session); in cmtp_add_connection()
385 session->task = kthread_run(cmtp_session, session, "kcmtpd_ctr_%d", in cmtp_add_connection()
386 session->num); in cmtp_add_connection()
387 if (IS_ERR(session->task)) { in cmtp_add_connection()
389 err = PTR_ERR(session->task); in cmtp_add_connection()
393 if (!(session->flags & BIT(CMTP_LOOPBACK))) { in cmtp_add_connection()
394 err = cmtp_attach_device(session); in cmtp_add_connection()
396 atomic_inc(&session->terminate); in cmtp_add_connection()
397 wake_up_process(session->task); in cmtp_add_connection()
407 __cmtp_unlink_session(session); in cmtp_add_connection()
411 kfree(session); in cmtp_add_connection()
418 struct cmtp_session *session; in cmtp_del_connection() local
428 session = __cmtp_get_session(&req->bdaddr); in cmtp_del_connection()
429 if (session) { in cmtp_del_connection()
431 skb_queue_purge(&session->transmit); in cmtp_del_connection()
434 atomic_inc(&session->terminate); in cmtp_del_connection()
435 wake_up_process(session->task); in cmtp_del_connection()
445 struct cmtp_session *session; in cmtp_get_connlist() local
452 list_for_each_entry(session, &cmtp_session_list, list) { in cmtp_get_connlist()
455 __cmtp_copy_session(session, &ci); in cmtp_get_connlist()
475 struct cmtp_session *session; in cmtp_get_conninfo() local
480 session = __cmtp_get_session(&ci->bdaddr); in cmtp_get_conninfo()
481 if (session) in cmtp_get_conninfo()
482 __cmtp_copy_session(session, ci); in cmtp_get_conninfo()