Lines Matching refs:local

38 static long rxrpc_local_cmp_key(const struct rxrpc_local *local,  in rxrpc_local_cmp_key()  argument
43 diff = ((local->srx.transport_type - srx->transport_type) ?: in rxrpc_local_cmp_key()
44 (local->srx.transport_len - srx->transport_len) ?: in rxrpc_local_cmp_key()
45 (local->srx.transport.family - srx->transport.family)); in rxrpc_local_cmp_key()
54 return ((u16 __force)local->srx.transport.sin.sin_port - in rxrpc_local_cmp_key()
56 memcmp(&local->srx.transport.sin.sin_addr, in rxrpc_local_cmp_key()
64 return ((u16 __force)local->srx.transport.sin6.sin6_port - in rxrpc_local_cmp_key()
66 memcmp(&local->srx.transport.sin6.sin6_addr, in rxrpc_local_cmp_key()
81 struct rxrpc_local *local; in rxrpc_alloc_local() local
83 local = kzalloc(sizeof(struct rxrpc_local), GFP_KERNEL); in rxrpc_alloc_local()
84 if (local) { in rxrpc_alloc_local()
85 atomic_set(&local->usage, 1); in rxrpc_alloc_local()
86 local->rxnet = rxnet; in rxrpc_alloc_local()
87 INIT_LIST_HEAD(&local->link); in rxrpc_alloc_local()
88 INIT_WORK(&local->processor, rxrpc_local_processor); in rxrpc_alloc_local()
89 init_rwsem(&local->defrag_sem); in rxrpc_alloc_local()
90 skb_queue_head_init(&local->reject_queue); in rxrpc_alloc_local()
91 skb_queue_head_init(&local->event_queue); in rxrpc_alloc_local()
92 local->client_conns = RB_ROOT; in rxrpc_alloc_local()
93 spin_lock_init(&local->client_conns_lock); in rxrpc_alloc_local()
94 spin_lock_init(&local->lock); in rxrpc_alloc_local()
95 rwlock_init(&local->services_lock); in rxrpc_alloc_local()
96 local->debug_id = atomic_inc_return(&rxrpc_debug_id); in rxrpc_alloc_local()
97 memcpy(&local->srx, srx, sizeof(*srx)); in rxrpc_alloc_local()
98 local->srx.srx_service = 0; in rxrpc_alloc_local()
99 trace_rxrpc_local(local, rxrpc_local_new, 1, NULL); in rxrpc_alloc_local()
102 _leave(" = %p", local); in rxrpc_alloc_local()
103 return local; in rxrpc_alloc_local()
110 static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net) in rxrpc_open_socket() argument
116 local, local->srx.transport_type, local->srx.transport.family); in rxrpc_open_socket()
119 ret = sock_create_kern(net, local->srx.transport.family, in rxrpc_open_socket()
120 local->srx.transport_type, 0, &local->socket); in rxrpc_open_socket()
127 usk = local->socket->sk; in rxrpc_open_socket()
133 rcu_assign_sk_user_data(usk, local); in rxrpc_open_socket()
143 if (local->srx.transport.family == AF_INET6) in rxrpc_open_socket()
149 if (local->srx.transport_len > sizeof(sa_family_t)) { in rxrpc_open_socket()
151 ret = kernel_bind(local->socket, in rxrpc_open_socket()
152 (struct sockaddr *)&local->srx.transport, in rxrpc_open_socket()
153 local->srx.transport_len); in rxrpc_open_socket()
160 switch (local->srx.transport.family) { in rxrpc_open_socket()
164 ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_RECVERR, in rxrpc_open_socket()
173 ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_MTU_DISCOVER, in rxrpc_open_socket()
187 ret = kernel_setsockopt(local->socket, SOL_IP, IP_RECVERR, in rxrpc_open_socket()
196 ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER, in rxrpc_open_socket()
205 ret = kernel_setsockopt(local->socket, SOL_SOCKET, SO_TIMESTAMPNS, in rxrpc_open_socket()
221 kernel_sock_shutdown(local->socket, SHUT_RDWR); in rxrpc_open_socket()
222 local->socket->sk->sk_user_data = NULL; in rxrpc_open_socket()
223 sock_release(local->socket); in rxrpc_open_socket()
224 local->socket = NULL; in rxrpc_open_socket()
236 struct rxrpc_local *local; in rxrpc_lookup_local() local
251 local = list_entry(cursor, struct rxrpc_local, link); in rxrpc_lookup_local()
253 diff = rxrpc_local_cmp_key(local, srx); in rxrpc_lookup_local()
265 local = NULL; in rxrpc_lookup_local()
273 if (!rxrpc_get_local_maybe(local)) { in rxrpc_lookup_local()
275 list_del_init(&local->link); in rxrpc_lookup_local()
283 local = rxrpc_alloc_local(rxnet, srx); in rxrpc_lookup_local()
284 if (!local) in rxrpc_lookup_local()
287 ret = rxrpc_open_socket(local, net); in rxrpc_lookup_local()
291 list_add_tail(&local->link, cursor); in rxrpc_lookup_local()
298 age, local->debug_id, &local->srx.transport); in rxrpc_lookup_local()
300 _leave(" = %p", local); in rxrpc_lookup_local()
301 return local; in rxrpc_lookup_local()
307 kfree(local); in rxrpc_lookup_local()
320 struct rxrpc_local *rxrpc_get_local(struct rxrpc_local *local) in rxrpc_get_local() argument
325 n = atomic_inc_return(&local->usage); in rxrpc_get_local()
326 trace_rxrpc_local(local, rxrpc_local_got, n, here); in rxrpc_get_local()
327 return local; in rxrpc_get_local()
333 struct rxrpc_local *rxrpc_get_local_maybe(struct rxrpc_local *local) in rxrpc_get_local_maybe() argument
337 if (local) { in rxrpc_get_local_maybe()
338 int n = atomic_fetch_add_unless(&local->usage, 1, 0); in rxrpc_get_local_maybe()
340 trace_rxrpc_local(local, rxrpc_local_got, n + 1, here); in rxrpc_get_local_maybe()
342 local = NULL; in rxrpc_get_local_maybe()
344 return local; in rxrpc_get_local_maybe()
350 void rxrpc_queue_local(struct rxrpc_local *local) in rxrpc_queue_local() argument
354 if (rxrpc_queue_work(&local->processor)) in rxrpc_queue_local()
355 trace_rxrpc_local(local, rxrpc_local_queued, in rxrpc_queue_local()
356 atomic_read(&local->usage), here); in rxrpc_queue_local()
362 static void __rxrpc_put_local(struct rxrpc_local *local) in __rxrpc_put_local() argument
364 _enter("%d", local->debug_id); in __rxrpc_put_local()
365 rxrpc_queue_work(&local->processor); in __rxrpc_put_local()
371 void rxrpc_put_local(struct rxrpc_local *local) in rxrpc_put_local() argument
376 if (local) { in rxrpc_put_local()
377 n = atomic_dec_return(&local->usage); in rxrpc_put_local()
378 trace_rxrpc_local(local, rxrpc_local_put, n, here); in rxrpc_put_local()
381 __rxrpc_put_local(local); in rxrpc_put_local()
392 static void rxrpc_local_destroyer(struct rxrpc_local *local) in rxrpc_local_destroyer() argument
394 struct socket *socket = local->socket; in rxrpc_local_destroyer()
395 struct rxrpc_net *rxnet = local->rxnet; in rxrpc_local_destroyer()
397 _enter("%d", local->debug_id); in rxrpc_local_destroyer()
403 if (local->dead) { in rxrpc_local_destroyer()
407 local->dead = true; in rxrpc_local_destroyer()
410 list_del_init(&local->link); in rxrpc_local_destroyer()
413 ASSERT(RB_EMPTY_ROOT(&local->client_conns)); in rxrpc_local_destroyer()
414 ASSERT(!local->service); in rxrpc_local_destroyer()
417 local->socket = NULL; in rxrpc_local_destroyer()
426 rxrpc_purge_queue(&local->reject_queue); in rxrpc_local_destroyer()
427 rxrpc_purge_queue(&local->event_queue); in rxrpc_local_destroyer()
429 _debug("rcu local %d", local->debug_id); in rxrpc_local_destroyer()
430 call_rcu(&local->rcu, rxrpc_local_rcu); in rxrpc_local_destroyer()
438 struct rxrpc_local *local = in rxrpc_local_processor() local
442 trace_rxrpc_local(local, rxrpc_local_processing, in rxrpc_local_processor()
443 atomic_read(&local->usage), NULL); in rxrpc_local_processor()
447 if (atomic_read(&local->usage) == 0) in rxrpc_local_processor()
448 return rxrpc_local_destroyer(local); in rxrpc_local_processor()
450 if (!skb_queue_empty(&local->reject_queue)) { in rxrpc_local_processor()
451 rxrpc_reject_packets(local); in rxrpc_local_processor()
455 if (!skb_queue_empty(&local->event_queue)) { in rxrpc_local_processor()
456 rxrpc_process_local_events(local); in rxrpc_local_processor()
467 struct rxrpc_local *local = container_of(rcu, struct rxrpc_local, rcu); in rxrpc_local_rcu() local
469 _enter("%d", local->debug_id); in rxrpc_local_rcu()
471 ASSERT(!work_pending(&local->processor)); in rxrpc_local_rcu()
473 _net("DESTROY LOCAL %d", local->debug_id); in rxrpc_local_rcu()
474 kfree(local); in rxrpc_local_rcu()
483 struct rxrpc_local *local; in rxrpc_destroy_all_locals() local
491 list_for_each_entry(local, &rxnet->local_endpoints, link) { in rxrpc_destroy_all_locals()
493 local, atomic_read(&local->usage)); in rxrpc_destroy_all_locals()