static int deth_netlink_broadcast_addresses(struct net* net, u32 index) { struct deth_net* dn = net_generic(net, deth_net_id); if (!dn || !dn->nl_sk || !netlink_has_listeners(dn->nl_sk, NETLINK_DETH_GROUP)) { return -ESRCH; } return deth_netlink_do_broadcast_addresses(dn->nl_sk, index); }
static int deth_netlink_broadcast_packet(struct net* net, const char* pkt, int size, u32 index) { struct deth_net* dn = net_generic(net, deth_net_id); if (!dn || !dn->nl_sk || !netlink_has_listeners(dn->nl_sk, NETLINK_DETH_GROUP)) { return -ESRCH; } return deth_netlink_do_broadcast_packet(dn->nl_sk, pkt, size, index); }
int netlink_send(struct sock *sock, int group, u16 type, void *msg, int len) { static u32 seq; struct sk_buff *skb = NULL; struct nlmsghdr *nlh; int ret = 0; if (group > ND_MAX_GROUP) return -EINVAL; if (!netlink_has_listeners(sock, group + 1)) return -ESRCH; skb = alloc_skb(NLMSG_SPACE(len), GFP_ATOMIC); if (!skb) return -ENOMEM; seq++; nlh = nlmsg_put(skb, 0, seq, type, len, 0); memcpy(NLMSG_DATA(nlh), msg, len); NETLINK_CB(skb).portid = 0; NETLINK_CB(skb).dst_group = 0; ret = netlink_broadcast(sock, skb, 0, group + 1, GFP_ATOMIC); if (!ret) return len; if (ret != -ESRCH) pr_err("nl broadcast g=%d, t=%d, l=%d, r=%d\n", group, type, len, ret); else if (netlink_has_listeners(sock, group + 1)) return -EAGAIN; return ret; }
int nfnetlink_has_listeners(struct net *net, unsigned int group) { return netlink_has_listeners(net->nfnl, group); }
int nfnetlink_has_listeners(unsigned int group) { return netlink_has_listeners(nfnl, group); }
bool rdma_nl_chk_listeners(unsigned int group) { return netlink_has_listeners(nls, group); }
int rdma_nl_chk_listeners(unsigned int group) { return (netlink_has_listeners(nls, group)) ? 0 : -1; }