Commit bb97d31f authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by David S. Miller

[INET]: Make inet_create try to load protocol modules

Syntax is net-pf-PROTOCOL_FAMILY-PROTOCOL-SOCK_TYPE and if this
fails net-pf-PROTOCOL_FAMILY-PROTOCOL.
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 087fe256
...@@ -811,8 +811,13 @@ static void __exit dccp_fini(void) ...@@ -811,8 +811,13 @@ static void __exit dccp_fini(void)
module_init(dccp_init); module_init(dccp_init);
module_exit(dccp_fini); module_exit(dccp_fini);
/* __stringify doesn't likes enums, so use SOCK_DCCP (6) value directly */ /*
MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-6"); * __stringify doesn't likes enums, so use SOCK_DCCP (6) and IPPROTO_DCCP (33)
* values directly, Also cover the case where the protocol is not specified,
* i.e. net-pf-PF_INET-proto-0-type-SOCK_DCCP
*/
MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-33-type-6");
MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-0-type-6");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@conectiva.com.br>"); MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@conectiva.com.br>");
MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol"); MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol");
...@@ -228,12 +228,14 @@ static int inet_create(struct socket *sock, int protocol) ...@@ -228,12 +228,14 @@ static int inet_create(struct socket *sock, int protocol)
struct proto *answer_prot; struct proto *answer_prot;
unsigned char answer_flags; unsigned char answer_flags;
char answer_no_check; char answer_no_check;
int err; int try_loading_module = 0;
int err = -ESOCKTNOSUPPORT;
sock->state = SS_UNCONNECTED; sock->state = SS_UNCONNECTED;
/* Look for the requested type/protocol pair. */ /* Look for the requested type/protocol pair. */
answer = NULL; answer = NULL;
lookup_protocol:
rcu_read_lock(); rcu_read_lock();
list_for_each_rcu(p, &inetsw[sock->type]) { list_for_each_rcu(p, &inetsw[sock->type]) {
answer = list_entry(p, struct inet_protosw, list); answer = list_entry(p, struct inet_protosw, list);
...@@ -254,9 +256,28 @@ static int inet_create(struct socket *sock, int protocol) ...@@ -254,9 +256,28 @@ static int inet_create(struct socket *sock, int protocol)
answer = NULL; answer = NULL;
} }
err = -ESOCKTNOSUPPORT; if (unlikely(answer == NULL)) {
if (!answer) if (try_loading_module < 2) {
rcu_read_unlock();
/*
* Be more specific, e.g. net-pf-2-proto-132-type-1
* (net-pf-PF_INET-proto-IPPROTO_SCTP-type-SOCK_STREAM)
*/
if (++try_loading_module == 1)
request_module("net-pf-%d-proto-%d-type-%d",
PF_INET, protocol, sock->type);
/*
* Fall back to generic, e.g. net-pf-2-proto-132
* (net-pf-PF_INET-proto-IPPROTO_SCTP)
*/
else
request_module("net-pf-%d-proto-%d",
PF_INET, protocol);
goto lookup_protocol;
} else
goto out_rcu_unlock; goto out_rcu_unlock;
}
err = -EPERM; err = -EPERM;
if (answer->capability > 0 && !capable(answer->capability)) if (answer->capability > 0 && !capable(answer->capability))
goto out_rcu_unlock; goto out_rcu_unlock;
......
...@@ -1242,6 +1242,10 @@ SCTP_STATIC __exit void sctp_exit(void) ...@@ -1242,6 +1242,10 @@ SCTP_STATIC __exit void sctp_exit(void)
module_init(sctp_init); module_init(sctp_init);
module_exit(sctp_exit); module_exit(sctp_exit);
/*
* __stringify doesn't likes enums, so use IPPROTO_SCTP value (132) directly.
*/
MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-132");
MODULE_AUTHOR("Linux Kernel SCTP developers <lksctp-developers@lists.sourceforge.net>"); MODULE_AUTHOR("Linux Kernel SCTP developers <lksctp-developers@lists.sourceforge.net>");
MODULE_DESCRIPTION("Support for the SCTP protocol (RFC2960)"); MODULE_DESCRIPTION("Support for the SCTP protocol (RFC2960)");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment