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 --- |