[NET_SCHED]: ematch: module autoloading

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Patrick McHardy 2007-07-11 19:46:26 -07:00 committed by David S. Miller
parent 662ad4f8ef
commit db3d99c090
8 changed files with 31 additions and 10 deletions

View file

@ -403,16 +403,13 @@ enum
* 1..32767 Reserved for ematches inside kernel tree * 1..32767 Reserved for ematches inside kernel tree
* 32768..65535 Free to use, not reliable * 32768..65535 Free to use, not reliable
*/ */
enum #define TCF_EM_CONTAINER 0
{ #define TCF_EM_CMP 1
TCF_EM_CONTAINER, #define TCF_EM_NBYTE 2
TCF_EM_CMP, #define TCF_EM_U32 3
TCF_EM_NBYTE, #define TCF_EM_META 4
TCF_EM_U32, #define TCF_EM_TEXT 5
TCF_EM_META, #define TCF_EM_MAX 5
TCF_EM_TEXT,
__TCF_EM_MAX
};
enum enum
{ {

View file

@ -306,6 +306,8 @@ static inline int tcf_em_tree_match(struct sk_buff *skb,
return 1; return 1;
} }
#define MODULE_ALIAS_TCF_EMATCH(kind) MODULE_ALIAS("ematch-kind-" __stringify(kind))
#else /* CONFIG_NET_EMATCH */ #else /* CONFIG_NET_EMATCH */
struct tcf_ematch_tree struct tcf_ematch_tree

View file

@ -98,3 +98,4 @@ MODULE_LICENSE("GPL");
module_init(init_em_cmp); module_init(init_em_cmp);
module_exit(exit_em_cmp); module_exit(exit_em_cmp);
MODULE_ALIAS_TCF_EMATCH(TCF_EM_CMP);

View file

@ -848,3 +848,5 @@ MODULE_LICENSE("GPL");
module_init(init_em_meta); module_init(init_em_meta);
module_exit(exit_em_meta); module_exit(exit_em_meta);
MODULE_ALIAS_TCF_EMATCH(TCF_EM_META);

View file

@ -76,3 +76,5 @@ MODULE_LICENSE("GPL");
module_init(init_em_nbyte); module_init(init_em_nbyte);
module_exit(exit_em_nbyte); module_exit(exit_em_nbyte);
MODULE_ALIAS_TCF_EMATCH(TCF_EM_NBYTE);

View file

@ -150,3 +150,5 @@ MODULE_LICENSE("GPL");
module_init(init_em_text); module_init(init_em_text);
module_exit(exit_em_text); module_exit(exit_em_text);
MODULE_ALIAS_TCF_EMATCH(TCF_EM_TEXT);

View file

@ -60,3 +60,5 @@ MODULE_LICENSE("GPL");
module_init(init_em_u32); module_init(init_em_u32);
module_exit(exit_em_u32); module_exit(exit_em_u32);
MODULE_ALIAS_TCF_EMATCH(TCF_EM_U32);

View file

@ -222,6 +222,19 @@ static int tcf_em_validate(struct tcf_proto *tp,
if (em->ops == NULL) { if (em->ops == NULL) {
err = -ENOENT; err = -ENOENT;
#ifdef CONFIG_KMOD
__rtnl_unlock();
request_module("ematch-kind-%u", em_hdr->kind);
rtnl_lock();
em->ops = tcf_em_lookup(em_hdr->kind);
if (em->ops) {
/* We dropped the RTNL mutex in order to
* perform the module load. Tell the caller
* to replay the request. */
module_put(em->ops->owner);
err = -EAGAIN;
}
#endif
goto errout; goto errout;
} }