diff options
author | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-08-31 20:06:25 +0000 |
---|---|---|
committer | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-08-31 20:06:25 +0000 |
commit | c78a8045277660482e922fc8677095c5d5a60946 (patch) | |
tree | a8e9b5c4c035fa62d7696b51bb8f5ae04d8bd1f9 | |
parent | a9266bc68248641535d5548c0e9d33a7d6eafa44 (diff) |
generic: introduce broadcast_uevent function
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@22858 3c298f89-4303-0410-b956-a3cf2f4a3e73
5 files changed, 377 insertions, 0 deletions
diff --git a/target/linux/generic/patches-2.6.32/223-kobject-add-broadcast_uevent.patch b/target/linux/generic/patches-2.6.32/223-kobject-add-broadcast_uevent.patch new file mode 100644 index 0000000000..393668b8af --- /dev/null +++ b/target/linux/generic/patches-2.6.32/223-kobject-add-broadcast_uevent.patch @@ -0,0 +1,69 @@ +--- 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, diff --git a/target/linux/generic/patches-2.6.33/223-kobject-add-broadcast_uevent.patch b/target/linux/generic/patches-2.6.33/223-kobject-add-broadcast_uevent.patch new file mode 100644 index 0000000000..f1b6a8fce8 --- /dev/null +++ b/target/linux/generic/patches-2.6.33/223-kobject-add-broadcast_uevent.patch @@ -0,0 +1,69 @@ +--- 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, ++ int 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, ++ int 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, ++ int 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, ++ int 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, diff --git a/target/linux/generic/patches-2.6.34/223-kobject-add-broadcast_uevent.patch b/target/linux/generic/patches-2.6.34/223-kobject-add-broadcast_uevent.patch new file mode 100644 index 0000000000..d851d313ee --- /dev/null +++ b/target/linux/generic/patches-2.6.34/223-kobject-add-broadcast_uevent.patch @@ -0,0 +1,69 @@ +--- 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, ++ int 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, ++ int allocation) ++{ ++ kfree_skb(skb); ++ return 0; ++} ++ + #endif + + #endif /* _KOBJECT_H_ */ +--- a/lib/kobject_uevent.c ++++ b/lib/kobject_uevent.c +@@ -331,6 +331,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, ++ int 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, ++ int 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, diff --git a/target/linux/generic/patches-2.6.35/223-kobject-add-broadcast_uevent.patch b/target/linux/generic/patches-2.6.35/223-kobject-add-broadcast_uevent.patch new file mode 100644 index 0000000000..c09e13e11c --- /dev/null +++ b/target/linux/generic/patches-2.6.35/223-kobject-add-broadcast_uevent.patch @@ -0,0 +1,85 @@ +--- 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[]; + +@@ -246,6 +248,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) +@@ -262,6 +268,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 +@@ -377,6 +377,43 @@ 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) ++{ ++ 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_init(struct net *net) + { + struct uevent_sock *ue_sk; diff --git a/target/linux/generic/patches-2.6.36/223-kobject-add-broadcast_uevent.patch b/target/linux/generic/patches-2.6.36/223-kobject-add-broadcast_uevent.patch new file mode 100644 index 0000000000..7f50a199d4 --- /dev/null +++ b/target/linux/generic/patches-2.6.36/223-kobject-add-broadcast_uevent.patch @@ -0,0 +1,85 @@ +--- a/include/linux/kobject.h ++++ b/include/linux/kobject.h +@@ -31,6 +31,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[]; + +@@ -213,6 +215,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) +@@ -229,6 +235,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 +@@ -377,6 +377,43 @@ 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) ++{ ++ 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_init(struct net *net) + { + struct uevent_sock *ue_sk; |