Lines Matching refs:local
39 struct rxrpc_local *local; in rxrpc_alloc_local() local
41 local = kzalloc(sizeof(struct rxrpc_local), GFP_KERNEL); in rxrpc_alloc_local()
42 if (local) { in rxrpc_alloc_local()
43 INIT_WORK(&local->destroyer, &rxrpc_destroy_local); in rxrpc_alloc_local()
44 INIT_WORK(&local->acceptor, &rxrpc_accept_incoming_calls); in rxrpc_alloc_local()
45 INIT_WORK(&local->rejecter, &rxrpc_reject_packets); in rxrpc_alloc_local()
46 INIT_WORK(&local->event_processor, &rxrpc_process_local_events); in rxrpc_alloc_local()
47 INIT_LIST_HEAD(&local->services); in rxrpc_alloc_local()
48 INIT_LIST_HEAD(&local->link); in rxrpc_alloc_local()
49 init_rwsem(&local->defrag_sem); in rxrpc_alloc_local()
50 skb_queue_head_init(&local->accept_queue); in rxrpc_alloc_local()
51 skb_queue_head_init(&local->reject_queue); in rxrpc_alloc_local()
52 skb_queue_head_init(&local->event_queue); in rxrpc_alloc_local()
53 spin_lock_init(&local->lock); in rxrpc_alloc_local()
54 rwlock_init(&local->services_lock); in rxrpc_alloc_local()
55 atomic_set(&local->usage, 1); in rxrpc_alloc_local()
56 local->debug_id = atomic_inc_return(&rxrpc_debug_id); in rxrpc_alloc_local()
57 memcpy(&local->srx, srx, sizeof(*srx)); in rxrpc_alloc_local()
60 _leave(" = %p", local); in rxrpc_alloc_local()
61 return local; in rxrpc_alloc_local()
68 static int rxrpc_create_local(struct rxrpc_local *local) in rxrpc_create_local() argument
73 _enter("%p{%d}", local, local->srx.transport_type); in rxrpc_create_local()
76 ret = sock_create_kern(PF_INET, local->srx.transport_type, IPPROTO_UDP, in rxrpc_create_local()
77 &local->socket); in rxrpc_create_local()
84 if (local->srx.transport_len > sizeof(sa_family_t)) { in rxrpc_create_local()
86 ret = kernel_bind(local->socket, in rxrpc_create_local()
87 (struct sockaddr *) &local->srx.transport, in rxrpc_create_local()
88 local->srx.transport_len); in rxrpc_create_local()
97 ret = kernel_setsockopt(local->socket, SOL_IP, IP_RECVERR, in rxrpc_create_local()
106 ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER, in rxrpc_create_local()
114 list_add(&local->link, &rxrpc_locals); in rxrpc_create_local()
118 sock = local->socket->sk; in rxrpc_create_local()
119 sock->sk_user_data = local; in rxrpc_create_local()
126 kernel_sock_shutdown(local->socket, SHUT_RDWR); in rxrpc_create_local()
127 local->socket->sk->sk_user_data = NULL; in rxrpc_create_local()
128 sock_release(local->socket); in rxrpc_create_local()
129 local->socket = NULL; in rxrpc_create_local()
140 struct rxrpc_local *local; in rxrpc_lookup_local() local
154 list_for_each_entry(local, &rxrpc_locals, link) { in rxrpc_lookup_local()
156 local->srx.transport_type, in rxrpc_lookup_local()
157 local->srx.transport.family, in rxrpc_lookup_local()
158 &local->srx.transport.sin.sin_addr, in rxrpc_lookup_local()
159 ntohs(local->srx.transport.sin.sin_port)); in rxrpc_lookup_local()
161 if (local->srx.transport_type != srx->transport_type || in rxrpc_lookup_local()
162 local->srx.transport.family != srx->transport.family) in rxrpc_lookup_local()
167 if (local->srx.transport.sin.sin_port != in rxrpc_lookup_local()
170 if (memcmp(&local->srx.transport.sin.sin_addr, in rxrpc_lookup_local()
184 local = rxrpc_alloc_local(srx); in rxrpc_lookup_local()
185 if (!local) { in rxrpc_lookup_local()
190 ret = rxrpc_create_local(local); in rxrpc_lookup_local()
193 kfree(local); in rxrpc_lookup_local()
201 local->debug_id, in rxrpc_lookup_local()
202 local->srx.transport_type, in rxrpc_lookup_local()
203 local->srx.transport.family, in rxrpc_lookup_local()
204 &local->srx.transport.sin.sin_addr, in rxrpc_lookup_local()
205 ntohs(local->srx.transport.sin.sin_port)); in rxrpc_lookup_local()
207 _leave(" = %p [new]", local); in rxrpc_lookup_local()
208 return local; in rxrpc_lookup_local()
211 rxrpc_get_local(local); in rxrpc_lookup_local()
216 local->debug_id, in rxrpc_lookup_local()
217 local->srx.transport_type, in rxrpc_lookup_local()
218 local->srx.transport.family, in rxrpc_lookup_local()
219 &local->srx.transport.sin.sin_addr, in rxrpc_lookup_local()
220 ntohs(local->srx.transport.sin.sin_port)); in rxrpc_lookup_local()
222 _leave(" = %p [reuse]", local); in rxrpc_lookup_local()
223 return local; in rxrpc_lookup_local()
229 void rxrpc_put_local(struct rxrpc_local *local) in rxrpc_put_local() argument
231 _enter("%p{u=%d}", local, atomic_read(&local->usage)); in rxrpc_put_local()
233 ASSERTCMP(atomic_read(&local->usage), >, 0); in rxrpc_put_local()
238 if (unlikely(atomic_dec_and_test(&local->usage))) { in rxrpc_put_local()
240 rxrpc_queue_work(&local->destroyer); in rxrpc_put_local()
251 struct rxrpc_local *local = in rxrpc_destroy_local() local
254 _enter("%p{%d}", local, atomic_read(&local->usage)); in rxrpc_destroy_local()
259 if (atomic_read(&local->usage) > 0) { in rxrpc_destroy_local()
266 list_del(&local->link); in rxrpc_destroy_local()
267 local->socket->sk->sk_user_data = NULL; in rxrpc_destroy_local()
272 ASSERT(list_empty(&local->services)); in rxrpc_destroy_local()
273 ASSERT(!work_pending(&local->acceptor)); in rxrpc_destroy_local()
274 ASSERT(!work_pending(&local->rejecter)); in rxrpc_destroy_local()
275 ASSERT(!work_pending(&local->event_processor)); in rxrpc_destroy_local()
278 rxrpc_purge_queue(&local->accept_queue); in rxrpc_destroy_local()
279 rxrpc_purge_queue(&local->reject_queue); in rxrpc_destroy_local()
280 rxrpc_purge_queue(&local->event_queue); in rxrpc_destroy_local()
281 kernel_sock_shutdown(local->socket, SHUT_RDWR); in rxrpc_destroy_local()
282 sock_release(local->socket); in rxrpc_destroy_local()
286 _net("DESTROY LOCAL %d", local->debug_id); in rxrpc_destroy_local()
287 kfree(local); in rxrpc_destroy_local()
325 static void rxrpc_send_version_request(struct rxrpc_local *local, in rxrpc_send_version_request() argument
363 ret = kernel_sendmsg(local->socket, &msg, iov, 2, len); in rxrpc_send_version_request()
375 struct rxrpc_local *local = container_of(work, struct rxrpc_local, event_processor); in rxrpc_process_local_events() local
381 atomic_inc(&local->usage); in rxrpc_process_local_events()
383 while ((skb = skb_dequeue(&local->event_queue))) { in rxrpc_process_local_events()
386 kdebug("{%d},{%u}", local->debug_id, sp->hdr.type); in rxrpc_process_local_events()
394 rxrpc_send_version_request(local, &sp->hdr, skb); in rxrpc_process_local_events()
402 rxrpc_put_local(local); in rxrpc_process_local_events()
406 rxrpc_put_local(local); in rxrpc_process_local_events()