--- a/include/linux/kobject.h +++ b/include/linux/kobject.h @@ -30,6 +30,8 @@ #define UEVENT_NUM_ENVP 32 /* number of env pointers */ #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */ +struct sk_buff; + /* path to the userspace helper executed on an event */ extern char uevent_helper[]; @@ -208,6 +210,10 @@ int add_uevent_var(struct kobj_uevent_en int kobject_action_type(const char *buf, size_t count, enum kobject_action *type); + +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, + gfp_t allocation); + #else static inline int kobject_uevent(struct kobject *kobj, enum kobject_action action) @@ -224,6 +230,16 @@ static inline int add_uevent_var(struct static inline int kobject_action_type(const char *buf, size_t count, enum kobject_action *type) { return -EINVAL; } + +void kfree_skb(struct sk_buff *); + +static inline int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, + gfp_t allocation) +{ + kfree_skb(skb); + return 0; +} + #endif #endif /* _KOBJECT_H_ */ --- a/lib/kobject_uevent.c +++ b/lib/kobject_uevent.c @@ -330,6 +330,27 @@ int add_uevent_var(struct kobj_uevent_en EXPORT_SYMBOL_GPL(add_uevent_var); #if defined(CONFIG_NET) +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, + gfp_t allocation) +{ + if (!uevent_sock) { + kfree_skb(skb); + return -ENODEV; + } + + return netlink_broadcast(uevent_sock, skb, pid, group, allocation);; +} +#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 __init kobject_uevent_init(void) { uevent_sock = netlink_kernel_create(&init_net, NETLINK_KOBJECT_UEVENT,