af_netlink.c (818b26588994d9d95743fca0a427f08ec6c1c41d) af_netlink.c (01757f536ac825e3614d583fee9acb48c64ed084)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * NETLINK Kernel-user communication protocol.
4 *
5 * Authors: Alan Cox <alan@lxorguk.ukuu.org.uk>
6 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
7 * Patrick McHardy <kaber@trash.net>
8 *

--- 337 unchanged lines hidden (view full) ---

346static void netlink_overrun(struct sock *sk)
347{
348 struct netlink_sock *nlk = nlk_sk(sk);
349
350 if (!(nlk->flags & NETLINK_F_RECV_NO_ENOBUFS)) {
351 if (!test_and_set_bit(NETLINK_S_CONGESTED,
352 &nlk_sk(sk)->state)) {
353 sk->sk_err = ENOBUFS;
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * NETLINK Kernel-user communication protocol.
4 *
5 * Authors: Alan Cox <alan@lxorguk.ukuu.org.uk>
6 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
7 * Patrick McHardy <kaber@trash.net>
8 *

--- 337 unchanged lines hidden (view full) ---

346static void netlink_overrun(struct sock *sk)
347{
348 struct netlink_sock *nlk = nlk_sk(sk);
349
350 if (!(nlk->flags & NETLINK_F_RECV_NO_ENOBUFS)) {
351 if (!test_and_set_bit(NETLINK_S_CONGESTED,
352 &nlk_sk(sk)->state)) {
353 sk->sk_err = ENOBUFS;
354 sk->sk_error_report(sk);
354 sk_error_report(sk);
355 }
356 }
357 atomic_inc(&sk->sk_drops);
358}
359
360static void netlink_rcv_wake(struct sock *sk)
361{
362 struct netlink_sock *nlk = nlk_sk(sk);

--- 93 unchanged lines hidden (view full) ---

456{
457 write_unlock_irq(&nl_table_lock);
458 wake_up(&nl_table_wait);
459}
460
461static inline void
462netlink_lock_table(void)
463{
355 }
356 }
357 atomic_inc(&sk->sk_drops);
358}
359
360static void netlink_rcv_wake(struct sock *sk)
361{
362 struct netlink_sock *nlk = nlk_sk(sk);

--- 93 unchanged lines hidden (view full) ---

456{
457 write_unlock_irq(&nl_table_lock);
458 wake_up(&nl_table_wait);
459}
460
461static inline void
462netlink_lock_table(void)
463{
464 unsigned long flags;
465
464 /* read_lock() synchronizes us to netlink_table_grab */
465
466 /* read_lock() synchronizes us to netlink_table_grab */
467
466 read_lock(&nl_table_lock);
468 read_lock_irqsave(&nl_table_lock, flags);
467 atomic_inc(&nl_table_users);
469 atomic_inc(&nl_table_users);
468 read_unlock(&nl_table_lock);
470 read_unlock_irqrestore(&nl_table_lock, flags);
469}
470
471static inline void
472netlink_unlock_table(void)
473{
474 if (atomic_dec_and_test(&nl_table_users))
475 wake_up(&nl_table_wait);
476}

--- 1092 unchanged lines hidden (view full) ---

1569 goto out;
1570
1571 if (p->code == ENOBUFS && nlk->flags & NETLINK_F_RECV_NO_ENOBUFS) {
1572 ret = 1;
1573 goto out;
1574 }
1575
1576 sk->sk_err = p->code;
471}
472
473static inline void
474netlink_unlock_table(void)
475{
476 if (atomic_dec_and_test(&nl_table_users))
477 wake_up(&nl_table_wait);
478}

--- 1092 unchanged lines hidden (view full) ---

1571 goto out;
1572
1573 if (p->code == ENOBUFS && nlk->flags & NETLINK_F_RECV_NO_ENOBUFS) {
1574 ret = 1;
1575 goto out;
1576 }
1577
1578 sk->sk_err = p->code;
1577 sk->sk_error_report(sk);
1579 sk_error_report(sk);
1578out:
1579 return ret;
1580}
1581
1582/**
1583 * netlink_set_err - report error to broadcast listeners
1584 * @ssk: the kernel netlink socket, as returned by netlink_kernel_create()
1585 * @portid: the PORTID of a process that we want to skip (if any)

--- 419 unchanged lines hidden (view full) ---

2005
2006 skb_free_datagram(sk, skb);
2007
2008 if (nlk->cb_running &&
2009 atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) {
2010 ret = netlink_dump(sk);
2011 if (ret) {
2012 sk->sk_err = -ret;
1580out:
1581 return ret;
1582}
1583
1584/**
1585 * netlink_set_err - report error to broadcast listeners
1586 * @ssk: the kernel netlink socket, as returned by netlink_kernel_create()
1587 * @portid: the PORTID of a process that we want to skip (if any)

--- 419 unchanged lines hidden (view full) ---

2007
2008 skb_free_datagram(sk, skb);
2009
2010 if (nlk->cb_running &&
2011 atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) {
2012 ret = netlink_dump(sk);
2013 if (ret) {
2014 sk->sk_err = -ret;
2013 sk->sk_error_report(sk);
2015 sk_error_report(sk);
2014 }
2015 }
2016
2017 scm_recv(sock, msg, &scm, flags);
2018out:
2019 netlink_rcv_wake(sk);
2020 return err ? : copied;
2021}

--- 410 unchanged lines hidden (view full) ---

2432 tlvlen += netlink_policy_dump_attr_size_estimate(extack->policy);
2433
2434 if (tlvlen)
2435 flags |= NLM_F_ACK_TLVS;
2436
2437 skb = nlmsg_new(payload + tlvlen, GFP_KERNEL);
2438 if (!skb) {
2439 NETLINK_CB(in_skb).sk->sk_err = ENOBUFS;
2016 }
2017 }
2018
2019 scm_recv(sock, msg, &scm, flags);
2020out:
2021 netlink_rcv_wake(sk);
2022 return err ? : copied;
2023}

--- 410 unchanged lines hidden (view full) ---

2434 tlvlen += netlink_policy_dump_attr_size_estimate(extack->policy);
2435
2436 if (tlvlen)
2437 flags |= NLM_F_ACK_TLVS;
2438
2439 skb = nlmsg_new(payload + tlvlen, GFP_KERNEL);
2440 if (!skb) {
2441 NETLINK_CB(in_skb).sk->sk_err = ENOBUFS;
2440 NETLINK_CB(in_skb).sk->sk_error_report(NETLINK_CB(in_skb).sk);
2442 sk_error_report(NETLINK_CB(in_skb).sk);
2441 return;
2442 }
2443
2444 rep = __nlmsg_put(skb, NETLINK_CB(in_skb).portid, nlh->nlmsg_seq,
2445 NLMSG_ERROR, payload, flags);
2446 errmsg = nlmsg_data(rep);
2447 errmsg->error = err;
2448 memcpy(&errmsg->msg, nlh, payload > sizeof(*errmsg) ? nlh->nlmsg_len : sizeof(*nlh));

--- 15 unchanged lines hidden (view full) ---

2464 extack->cookie_len, extack->cookie));
2465 if (extack->policy)
2466 netlink_policy_dump_write_attr(skb, extack->policy,
2467 NLMSGERR_ATTR_POLICY);
2468 }
2469
2470 nlmsg_end(skb, rep);
2471
2443 return;
2444 }
2445
2446 rep = __nlmsg_put(skb, NETLINK_CB(in_skb).portid, nlh->nlmsg_seq,
2447 NLMSG_ERROR, payload, flags);
2448 errmsg = nlmsg_data(rep);
2449 errmsg->error = err;
2450 memcpy(&errmsg->msg, nlh, payload > sizeof(*errmsg) ? nlh->nlmsg_len : sizeof(*nlh));

--- 15 unchanged lines hidden (view full) ---

2466 extack->cookie_len, extack->cookie));
2467 if (extack->policy)
2468 netlink_policy_dump_write_attr(skb, extack->policy,
2469 NLMSGERR_ATTR_POLICY);
2470 }
2471
2472 nlmsg_end(skb, rep);
2473
2472 netlink_unicast(in_skb->sk, skb, NETLINK_CB(in_skb).portid, MSG_DONTWAIT);
2474 nlmsg_unicast(in_skb->sk, skb, NETLINK_CB(in_skb).portid);
2473}
2474EXPORT_SYMBOL(netlink_ack);
2475
2476int netlink_rcv_skb(struct sk_buff *skb, int (*cb)(struct sk_buff *,
2477 struct nlmsghdr *,
2478 struct netlink_ext_ack *))
2479{
2480 struct netlink_ext_ack extack;

--- 429 unchanged lines hidden ---
2475}
2476EXPORT_SYMBOL(netlink_ack);
2477
2478int netlink_rcv_skb(struct sk_buff *skb, int (*cb)(struct sk_buff *,
2479 struct nlmsghdr *,
2480 struct netlink_ext_ack *))
2481{
2482 struct netlink_ext_ack extack;

--- 429 unchanged lines hidden ---