Lines Matching refs:nlk
352 struct netlink_sock *nlk = nlk_sk(sk); in netlink_overrun() local
354 if (!(nlk->flags & NETLINK_F_RECV_NO_ENOBUFS)) { in netlink_overrun()
366 struct netlink_sock *nlk = nlk_sk(sk); in netlink_rcv_wake() local
369 clear_bit(NETLINK_S_CONGESTED, &nlk->state); in netlink_rcv_wake()
370 if (!test_bit(NETLINK_S_CONGESTED, &nlk->state)) in netlink_rcv_wake()
371 wake_up_interruptible(&nlk->wait); in netlink_rcv_wake()
398 struct netlink_sock *nlk = nlk_sk(sk); in netlink_sock_destruct() local
400 if (nlk->cb_running) { in netlink_sock_destruct()
401 if (nlk->cb.done) in netlink_sock_destruct()
402 nlk->cb.done(&nlk->cb); in netlink_sock_destruct()
403 module_put(nlk->cb.module); in netlink_sock_destruct()
404 kfree_skb(nlk->cb.skb); in netlink_sock_destruct()
421 struct netlink_sock *nlk = container_of(work, struct netlink_sock, in netlink_sock_destruct_work() local
424 sk_free(&nlk->sk); in netlink_sock_destruct_work()
498 const struct netlink_sock *nlk = ptr; in netlink_compare() local
500 return nlk->portid != x->portid || in netlink_compare()
501 !net_eq(sock_net(&nlk->sk), read_pnet(&x->pnet)); in netlink_compare()
643 struct netlink_sock *nlk; in __netlink_create() local
653 nlk = nlk_sk(sk); in __netlink_create()
655 nlk->cb_mutex = cb_mutex; in __netlink_create()
657 nlk->cb_mutex = &nlk->cb_def_mutex; in __netlink_create()
658 mutex_init(nlk->cb_mutex); in __netlink_create()
659 lockdep_set_class_and_name(nlk->cb_mutex, in __netlink_create()
663 init_waitqueue_head(&nlk->wait); in __netlink_create()
675 struct netlink_sock *nlk; in netlink_create() local
716 nlk = nlk_sk(sock->sk); in netlink_create()
717 nlk->module = module; in netlink_create()
718 nlk->netlink_bind = bind; in netlink_create()
719 nlk->netlink_unbind = unbind; in netlink_create()
730 struct netlink_sock *nlk = container_of(head, struct netlink_sock, rcu); in deferred_put_nlk_sk() local
731 struct sock *sk = &nlk->sk; in deferred_put_nlk_sk()
733 kfree(nlk->groups); in deferred_put_nlk_sk()
734 nlk->groups = NULL; in deferred_put_nlk_sk()
739 if (nlk->cb_running && nlk->cb.done) { in deferred_put_nlk_sk()
740 INIT_WORK(&nlk->work, netlink_sock_destruct_work); in deferred_put_nlk_sk()
741 schedule_work(&nlk->work); in deferred_put_nlk_sk()
751 struct netlink_sock *nlk; in netlink_release() local
758 nlk = nlk_sk(sk); in netlink_release()
768 if (nlk->netlink_unbind) { in netlink_release()
771 for (i = 0; i < nlk->ngroups; i++) in netlink_release()
772 if (test_bit(i, nlk->groups)) in netlink_release()
773 nlk->netlink_unbind(sock_net(sk), i + 1); in netlink_release()
780 wake_up_interruptible_all(&nlk->wait); in netlink_release()
784 if (nlk->portid && nlk->bound) { in netlink_release()
788 .portid = nlk->portid, in netlink_release()
794 module_put(nlk->module); in netlink_release()
815 call_rcu(&nlk->rcu, deferred_put_nlk_sk); in netlink_release()
932 struct netlink_sock *nlk = nlk_sk(sk); in netlink_update_subscriptions() local
934 if (nlk->subscriptions && !subscriptions) in netlink_update_subscriptions()
936 else if (!nlk->subscriptions && subscriptions) in netlink_update_subscriptions()
938 nlk->subscriptions = subscriptions; in netlink_update_subscriptions()
943 struct netlink_sock *nlk = nlk_sk(sk); in netlink_realloc_groups() local
956 if (nlk->ngroups >= groups) in netlink_realloc_groups()
959 new_groups = krealloc(nlk->groups, NLGRPSZ(groups), GFP_ATOMIC); in netlink_realloc_groups()
964 memset((char *)new_groups + NLGRPSZ(nlk->ngroups), 0, in netlink_realloc_groups()
965 NLGRPSZ(groups) - NLGRPSZ(nlk->ngroups)); in netlink_realloc_groups()
967 nlk->groups = new_groups; in netlink_realloc_groups()
968 nlk->ngroups = groups; in netlink_realloc_groups()
977 struct netlink_sock *nlk = nlk_sk(sk); in netlink_undo_bind() local
980 if (!nlk->netlink_unbind) in netlink_undo_bind()
985 nlk->netlink_unbind(sock_net(sk), undo + 1); in netlink_undo_bind()
993 struct netlink_sock *nlk = nlk_sk(sk); in netlink_bind() local
1015 if (nlk->ngroups < BITS_PER_LONG) in netlink_bind()
1016 groups &= (1UL << nlk->ngroups) - 1; in netlink_bind()
1019 bound = READ_ONCE(nlk->bound); in netlink_bind()
1024 if (nladdr->nl_pid != nlk->portid) in netlink_bind()
1028 if (nlk->netlink_bind && groups) { in netlink_bind()
1035 err = nlk->netlink_bind(net, group + 1); in netlink_bind()
1057 if (!groups && (nlk->groups == NULL || !(u32)nlk->groups[0])) in netlink_bind()
1062 netlink_update_subscriptions(sk, nlk->subscriptions + in netlink_bind()
1064 hweight32(nlk->groups[0])); in netlink_bind()
1065 nlk->groups[0] = (nlk->groups[0] & ~0xffffffffUL) | groups; in netlink_bind()
1081 struct netlink_sock *nlk = nlk_sk(sk); in netlink_connect() local
1089 nlk->dst_portid = 0; in netlink_connect()
1090 nlk->dst_group = 0; in netlink_connect()
1107 if (!READ_ONCE(nlk->bound)) in netlink_connect()
1112 nlk->dst_portid = nladdr->nl_pid; in netlink_connect()
1113 nlk->dst_group = ffs(nladdr->nl_groups); in netlink_connect()
1123 struct netlink_sock *nlk = nlk_sk(sk); in netlink_getname() local
1130 nladdr->nl_pid = nlk->dst_portid; in netlink_getname()
1131 nladdr->nl_groups = netlink_group_mask(nlk->dst_group); in netlink_getname()
1133 nladdr->nl_pid = nlk->portid; in netlink_getname()
1135 nladdr->nl_groups = nlk->groups ? nlk->groups[0] : 0; in netlink_getname()
1152 struct netlink_sock *nlk; in netlink_getsockbyportid() local
1159 nlk = nlk_sk(sock); in netlink_getsockbyportid()
1161 nlk->dst_portid != nlk_sk(ssk)->portid) { in netlink_getsockbyportid()
1222 struct netlink_sock *nlk; in netlink_attachskb() local
1224 nlk = nlk_sk(sk); in netlink_attachskb()
1227 test_bit(NETLINK_S_CONGESTED, &nlk->state))) { in netlink_attachskb()
1238 add_wait_queue(&nlk->wait, &wait); in netlink_attachskb()
1241 test_bit(NETLINK_S_CONGESTED, &nlk->state)) && in netlink_attachskb()
1246 remove_wait_queue(&nlk->wait, &wait); in netlink_attachskb()
1311 struct netlink_sock *nlk = nlk_sk(sk); in netlink_unicast_kernel() local
1314 if (nlk->netlink_rcv != NULL) { in netlink_unicast_kernel()
1319 nlk->netlink_rcv(skb); in netlink_unicast_kernel()
1385 const struct netlink_sock *nlk = nlk_sk(NETLINK_CB(skb).sk); in netlink_strict_get_check() local
1387 return nlk->flags & NETLINK_F_STRICT_CHK; in netlink_strict_get_check()
1393 struct netlink_sock *nlk = nlk_sk(sk); in netlink_broadcast_deliver() local
1396 !test_bit(NETLINK_S_CONGESTED, &nlk->state)) { in netlink_broadcast_deliver()
1420 struct netlink_sock *nlk = nlk_sk(sk); in do_one_broadcast() local
1426 if (nlk->portid == p->portid || p->group - 1 >= nlk->ngroups || in do_one_broadcast()
1427 !test_bit(p->group - 1, nlk->groups)) in do_one_broadcast()
1431 if (!(nlk->flags & NETLINK_F_LISTEN_ALL_NSID)) in do_one_broadcast()
1464 if (nlk->flags & NETLINK_F_BROADCAST_SEND_ERROR) in do_one_broadcast()
1479 if (nlk->flags & NETLINK_F_BROADCAST_SEND_ERROR) in do_one_broadcast()
1546 struct netlink_sock *nlk = nlk_sk(sk); in do_one_set_err() local
1555 if (nlk->portid == p->portid || p->group - 1 >= nlk->ngroups || in do_one_set_err()
1556 !test_bit(p->group - 1, nlk->groups)) in do_one_set_err()
1559 if (p->code == ENOBUFS && nlk->flags & NETLINK_F_RECV_NO_ENOBUFS) { in do_one_set_err()
1603 static void netlink_update_socket_mc(struct netlink_sock *nlk, in netlink_update_socket_mc() argument
1609 old = test_bit(group - 1, nlk->groups); in netlink_update_socket_mc()
1610 subscriptions = nlk->subscriptions - old + new; in netlink_update_socket_mc()
1612 __set_bit(group - 1, nlk->groups); in netlink_update_socket_mc()
1614 __clear_bit(group - 1, nlk->groups); in netlink_update_socket_mc()
1615 netlink_update_subscriptions(&nlk->sk, subscriptions); in netlink_update_socket_mc()
1616 netlink_update_listeners(&nlk->sk); in netlink_update_socket_mc()
1623 struct netlink_sock *nlk = nlk_sk(sk); in netlink_setsockopt() local
1637 nlk->flags |= NETLINK_F_RECV_PKTINFO; in netlink_setsockopt()
1639 nlk->flags &= ~NETLINK_F_RECV_PKTINFO; in netlink_setsockopt()
1649 if (!val || val - 1 >= nlk->ngroups) in netlink_setsockopt()
1651 if (optname == NETLINK_ADD_MEMBERSHIP && nlk->netlink_bind) { in netlink_setsockopt()
1652 err = nlk->netlink_bind(sock_net(sk), val); in netlink_setsockopt()
1657 netlink_update_socket_mc(nlk, val, in netlink_setsockopt()
1660 if (optname == NETLINK_DROP_MEMBERSHIP && nlk->netlink_unbind) in netlink_setsockopt()
1661 nlk->netlink_unbind(sock_net(sk), val); in netlink_setsockopt()
1668 nlk->flags |= NETLINK_F_BROADCAST_SEND_ERROR; in netlink_setsockopt()
1670 nlk->flags &= ~NETLINK_F_BROADCAST_SEND_ERROR; in netlink_setsockopt()
1675 nlk->flags |= NETLINK_F_RECV_NO_ENOBUFS; in netlink_setsockopt()
1676 clear_bit(NETLINK_S_CONGESTED, &nlk->state); in netlink_setsockopt()
1677 wake_up_interruptible(&nlk->wait); in netlink_setsockopt()
1679 nlk->flags &= ~NETLINK_F_RECV_NO_ENOBUFS; in netlink_setsockopt()
1688 nlk->flags |= NETLINK_F_LISTEN_ALL_NSID; in netlink_setsockopt()
1690 nlk->flags &= ~NETLINK_F_LISTEN_ALL_NSID; in netlink_setsockopt()
1695 nlk->flags |= NETLINK_F_CAP_ACK; in netlink_setsockopt()
1697 nlk->flags &= ~NETLINK_F_CAP_ACK; in netlink_setsockopt()
1702 nlk->flags |= NETLINK_F_EXT_ACK; in netlink_setsockopt()
1704 nlk->flags &= ~NETLINK_F_EXT_ACK; in netlink_setsockopt()
1709 nlk->flags |= NETLINK_F_STRICT_CHK; in netlink_setsockopt()
1711 nlk->flags &= ~NETLINK_F_STRICT_CHK; in netlink_setsockopt()
1724 struct netlink_sock *nlk = nlk_sk(sk); in netlink_getsockopt() local
1740 val = nlk->flags & NETLINK_F_RECV_PKTINFO ? 1 : 0; in netlink_getsockopt()
1750 val = nlk->flags & NETLINK_F_BROADCAST_SEND_ERROR ? 1 : 0; in netlink_getsockopt()
1760 val = nlk->flags & NETLINK_F_RECV_NO_ENOBUFS ? 1 : 0; in netlink_getsockopt()
1771 for (pos = 0; pos * 8 < nlk->ngroups; pos += sizeof(u32)) { in netlink_getsockopt()
1777 if (put_user((u32)(nlk->groups[idx] >> shift), in netlink_getsockopt()
1783 if (put_user(ALIGN(nlk->ngroups / 8, sizeof(u32)), optlen)) in netlink_getsockopt()
1792 val = nlk->flags & NETLINK_F_CAP_ACK ? 1 : 0; in netlink_getsockopt()
1802 val = nlk->flags & NETLINK_F_EXT_ACK ? 1 : 0; in netlink_getsockopt()
1811 val = nlk->flags & NETLINK_F_STRICT_CHK ? 1 : 0; in netlink_getsockopt()
1843 struct netlink_sock *nlk = nlk_sk(sk); in netlink_sendmsg() local
1878 dst_portid = nlk->dst_portid; in netlink_sendmsg()
1879 dst_group = nlk->dst_group; in netlink_sendmsg()
1883 if (!READ_ONCE(nlk->bound)) { in netlink_sendmsg()
1900 NETLINK_CB(skb).portid = nlk->portid; in netlink_sendmsg()
1933 struct netlink_sock *nlk = nlk_sk(sk); in netlink_recvmsg() local
1967 nlk->max_recvmsg_len = max(nlk->max_recvmsg_len, len); in netlink_recvmsg()
1968 nlk->max_recvmsg_len = min_t(size_t, nlk->max_recvmsg_len, in netlink_recvmsg()
1988 if (nlk->flags & NETLINK_F_RECV_PKTINFO) in netlink_recvmsg()
1990 if (nlk->flags & NETLINK_F_LISTEN_ALL_NSID) in netlink_recvmsg()
2000 if (nlk->cb_running && in netlink_recvmsg()
2032 struct netlink_sock *nlk; in __netlink_kernel_create() local
2066 nlk = nlk_sk(sk); in __netlink_kernel_create()
2067 nlk->flags |= NETLINK_F_KERNEL_SOCKET; in __netlink_kernel_create()
2189 static int netlink_dump_done(struct netlink_sock *nlk, struct sk_buff *skb, in netlink_dump_done() argument
2195 nlh = nlmsg_put_answer(skb, cb, NLMSG_DONE, sizeof(nlk->dump_done_errno), in netlink_dump_done()
2201 memcpy(nlmsg_data(nlh), &nlk->dump_done_errno, sizeof(nlk->dump_done_errno)); in netlink_dump_done()
2203 if (extack->_msg && nlk->flags & NETLINK_F_EXT_ACK) { in netlink_dump_done()
2214 struct netlink_sock *nlk = nlk_sk(sk); in netlink_dump() local
2223 mutex_lock(nlk->cb_mutex); in netlink_dump()
2224 if (!nlk->cb_running) { in netlink_dump()
2237 cb = &nlk->cb; in netlink_dump()
2240 if (alloc_min_size < nlk->max_recvmsg_len) { in netlink_dump()
2241 alloc_size = nlk->max_recvmsg_len; in netlink_dump()
2273 if (nlk->dump_done_errno > 0) { in netlink_dump()
2275 nlk->dump_done_errno = cb->dump(skb, cb); in netlink_dump()
2279 if (nlk->dump_done_errno > 0 || in netlink_dump()
2280 skb_tailroom(skb) < nlmsg_total_size(sizeof(nlk->dump_done_errno))) { in netlink_dump()
2281 mutex_unlock(nlk->cb_mutex); in netlink_dump()
2290 if (netlink_dump_done(nlk, skb, cb, &extack)) in netlink_dump()
2299 if (netlink_dump_done(nlk, skb_shinfo(skb)->frag_list, cb, &extack)) in netlink_dump()
2312 nlk->cb_running = false; in netlink_dump()
2315 mutex_unlock(nlk->cb_mutex); in netlink_dump()
2321 mutex_unlock(nlk->cb_mutex); in netlink_dump()
2330 struct netlink_sock *nlk, *nlk2; in __netlink_dump_start() local
2343 nlk = nlk_sk(sk); in __netlink_dump_start()
2344 mutex_lock(nlk->cb_mutex); in __netlink_dump_start()
2346 if (nlk->cb_running) { in __netlink_dump_start()
2356 cb = &nlk->cb; in __netlink_dump_start()
2375 nlk->cb_running = true; in __netlink_dump_start()
2376 nlk->dump_done_errno = INT_MAX; in __netlink_dump_start()
2378 mutex_unlock(nlk->cb_mutex); in __netlink_dump_start()
2396 mutex_unlock(nlk->cb_mutex); in __netlink_dump_start()
2404 netlink_ack_tlv_len(struct netlink_sock *nlk, int err, in netlink_ack_tlv_len() argument
2409 if (!extack || !(nlk->flags & NETLINK_F_EXT_ACK)) in netlink_ack_tlv_len()
2473 struct netlink_sock *nlk = nlk_sk(NETLINK_CB(in_skb).sk); in netlink_ack() local
2481 if (err && !(nlk->flags & NETLINK_F_CAP_ACK)) in netlink_ack()
2486 tlvlen = netlink_ack_tlv_len(nlk, err, extack); in netlink_ack()
2622 struct netlink_sock *nlk; in __netlink_seq_next() local
2626 nlk = rhashtable_walk_next(&iter->hti); in __netlink_seq_next()
2628 if (IS_ERR(nlk)) { in __netlink_seq_next()
2629 if (PTR_ERR(nlk) == -EAGAIN) in __netlink_seq_next()
2632 return nlk; in __netlink_seq_next()
2635 if (nlk) in __netlink_seq_next()
2644 } while (sock_net(&nlk->sk) != seq_file_net(seq)); in __netlink_seq_next()
2646 return nlk; in __netlink_seq_next()
2691 struct netlink_sock *nlk = nlk_sk(s); in netlink_native_seq_show() local
2696 nlk->portid, in netlink_native_seq_show()
2697 nlk->groups ? (u32)nlk->groups[0] : 0, in netlink_native_seq_show()
2700 nlk->cb_running, in netlink_native_seq_show()
2863 const struct netlink_sock *nlk = data; in netlink_hash() local
2866 netlink_compare_arg_init(&arg, sock_net(&nlk->sk), nlk->portid); in netlink_hash()