From 4219cb5081d73e16636bd41598a1e138ce27bfce Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 16 Jul 2017 16:56:10 +0200 Subject: [PATCH] lib: add uevent_next_seqnum() Signed-off-by: Felix Fietkau --- include/linux/kobject.h | 5 +++++ lib/kobject_uevent.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/include/linux/kobject.h b/include/linux/kobject.h index e6d8e1b8ab0aa8..652c36653a0e9d 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h @@ -33,6 +33,8 @@ #define UEVENT_NUM_ENVP 64 /* number of env pointers */ #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */ +struct sk_buff; + #ifdef CONFIG_UEVENT_HELPER /* path to the userspace helper executed on an event */ extern char uevent_helper[]; @@ -260,4 +262,7 @@ int kobject_synth_uevent(struct kobject *kobj, const char *buf, size_t count); __printf(2, 3) int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...); +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, + gfp_t allocation); + #endif /* _KOBJECT_H_ */ diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c index 57f63ca98ea540..8bde56867c4d09 100644 --- a/lib/kobject_uevent.c +++ b/lib/kobject_uevent.c @@ -690,6 +690,43 @@ int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) } EXPORT_SYMBOL_GPL(add_uevent_var); +#if defined(CONFIG_NET) +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, + gfp_t allocation) +{ + struct uevent_sock *ue_sk; + int err = 0; + + /* send netlink message */ + mutex_lock(&uevent_sock_mutex); + list_for_each_entry(ue_sk, &uevent_sock_list, list) { + struct sock *uevent_sock = ue_sk->sk; + struct sk_buff *skb2; + + skb2 = skb_clone(skb, allocation); + if (!skb2) + break; + + err = netlink_broadcast(uevent_sock, skb2, pid, group, + allocation); + if (err) + break; + } + mutex_unlock(&uevent_sock_mutex); + + kfree_skb(skb); + return err; +} +#else +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, + gfp_t allocation) +{ + kfree_skb(skb); + return 0; +} +#endif +EXPORT_SYMBOL_GPL(broadcast_uevent); + #if defined(CONFIG_NET) static int uevent_net_broadcast(struct sock *usk, struct sk_buff *skb, struct netlink_ext_ack *extack)