diff options
author | Tom Gundersen <teg@jklm.no> | 2014-06-02 21:50:50 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2014-06-03 00:40:23 +0200 |
commit | bddfc8afd329ac68a23f66a3512d4e249af25191 (patch) | |
tree | ebd7a09270848e57e4664cd664e17e81e8cf9135 /src | |
parent | a613382bbf4357ce13f17c988713b80172e091fb (diff) |
networkd: drop CAP_SYS_MODULE
Rely on modules being built-in or autoloaded on-demand.
As networkd is a network facing service, we want to limits its capabilities,
as much as possible. Also, we may not have CAP_SYS_MODULE in a container,
and we want networkd to work the same there.
Module autoloading does not always work, but should be fixed by the kernel
patch f98f89a0104454f35a: 'net: tunnels - enable module autoloading', which
is currently in net-next and which people may consider backporting if they
want tunneling support without compiling in the modules.
Early adopters may also use a module-load.d snippet and order
systemd-modules-load.service before networkd to force the module
loading of tunneling modules.
This sholud fix the various build issues people have reported.
Diffstat (limited to 'src')
-rw-r--r-- | src/libsystemd-network/network-internal.c | 35 | ||||
-rw-r--r-- | src/libsystemd-network/network-internal.h | 3 | ||||
-rw-r--r-- | src/network/networkd-manager.c | 6 | ||||
-rw-r--r-- | src/network/networkd-tunnel.c | 22 | ||||
-rw-r--r-- | src/network/networkd.c | 3 | ||||
-rw-r--r-- | src/network/networkd.h | 1 |
6 files changed, 1 insertions, 69 deletions
diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c index 261603f841..e9146d0e54 100644 --- a/src/libsystemd-network/network-internal.c +++ b/src/libsystemd-network/network-internal.c @@ -327,41 +327,6 @@ int net_parse_inaddr(const char *address, unsigned char *family, void *dst) { return 0; } -int load_module(struct kmod_ctx *ctx, const char *mod_name) { - struct kmod_list *modlist = NULL, *l; - int r; - - assert(ctx); - assert(mod_name); - - r = kmod_module_new_from_lookup(ctx, mod_name, &modlist); - if (r < 0) - return r; - - if (!modlist) { - log_error("Failed to find module '%s'", mod_name); - return -ENOENT; - } - - kmod_list_foreach(l, modlist) { - struct kmod_module *mod = kmod_module_get_module(l); - - r = kmod_module_probe_insert_module(mod, 0, NULL, NULL, NULL, NULL); - if (r == 0) - log_info("Inserted module '%s'", kmod_module_get_name(mod)); - else { - log_error("Failed to insert '%s': %s", kmod_module_get_name(mod), - strerror(-r)); - } - - kmod_module_unref(mod); - } - - kmod_module_unref_list(modlist); - - return r; -} - void serialize_in_addrs(FILE *f, const char *key, struct in_addr *addresses, size_t size) { unsigned i; diff --git a/src/libsystemd-network/network-internal.h b/src/libsystemd-network/network-internal.h index c08cddd799..2aeecf0ce2 100644 --- a/src/libsystemd-network/network-internal.h +++ b/src/libsystemd-network/network-internal.h @@ -24,7 +24,6 @@ #include <netinet/ether.h> #include <netinet/in.h> #include <stdbool.h> -#include <libkmod.h> #include "udev.h" #include "condition-util.h" @@ -67,8 +66,6 @@ int net_parse_inaddr(const char *address, unsigned char *family, void *dst); int net_get_unique_predictable_data(struct udev_device *device, uint8_t result[8]); -int load_module(struct kmod_ctx *ctx, const char *mod_name); - void serialize_in_addrs(FILE *f, const char *key, struct in_addr *addresses, size_t size); int deserialize_in_addrs(struct in_addr **addresses, size_t *size, const char *string); int deserialize_in6_addrs(struct in6_addr **addresses, size_t *size, const char *string); diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index c4a325de42..4b35ea0d29 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -21,7 +21,6 @@ #include <sys/socket.h> #include <linux/if.h> -#include <libkmod.h> #include "conf-parser.h" #include "path-util.h" @@ -120,10 +119,6 @@ int manager_new(Manager **ret) { return -ENOMEM; } - m->kmod_ctx = kmod_new(NULL, NULL); - if (!m->kmod_ctx) - return -ENOMEM; - m->links = hashmap_new(uint64_hash_func, uint64_compare_func); if (!m->links) return -ENOMEM; @@ -150,7 +145,6 @@ void manager_free(Manager *m) { free(m->state_file); - kmod_unref(m->kmod_ctx); udev_monitor_unref(m->udev_monitor); udev_unref(m->udev); sd_bus_unref(m->bus); diff --git a/src/network/networkd-tunnel.c b/src/network/networkd-tunnel.c index e3ceb8b52b..60b16ba849 100644 --- a/src/network/networkd-tunnel.c +++ b/src/network/networkd-tunnel.c @@ -24,7 +24,6 @@ #include <net/if.h> #include <linux/ip.h> #include <linux/if_tunnel.h> -#include <libkmod.h> #include "sd-rtnl.h" #include "networkd.h" @@ -443,27 +442,6 @@ int netdev_create_tunnel(Link *link, sd_rtnl_message_handler_t callback) { assert(netdev->ifname); assert(netdev->manager); assert(netdev->manager->rtnl); - assert(netdev->manager->kmod_ctx); - - /* Load kernel module first */ - switch(netdev->kind) { - case NETDEV_KIND_IPIP: - case NETDEV_KIND_GRE: - case NETDEV_KIND_SIT: - r = load_module(netdev->manager->kmod_ctx, - netdev_kind_to_string(netdev->kind)); - if (r < 0) { - log_error_netdev(netdev, - "Could not load Kernel module: %s . Ignoring", - netdev_kind_to_string(netdev->kind)); - return r; - } - break; - case NETDEV_KIND_VTI: - break; - default: - return -ENOTSUP; - } r = sd_rtnl_message_new_link(netdev->manager->rtnl, &m, RTM_NEWLINK, 0); if (r < 0) { diff --git a/src/network/networkd.c b/src/network/networkd.c index cd7dd3ca0f..d8f31a490d 100644 --- a/src/network/networkd.c +++ b/src/network/networkd.c @@ -71,8 +71,7 @@ int main(int argc, char *argv[]) { (1ULL << CAP_NET_ADMIN) | (1ULL << CAP_NET_BIND_SERVICE) | (1ULL << CAP_NET_BROADCAST) | - (1ULL << CAP_NET_RAW) | - (1ULL << CAP_SYS_MODULE)); + (1ULL << CAP_NET_RAW)); if (r < 0) goto out; diff --git a/src/network/networkd.h b/src/network/networkd.h index 82d8d706b5..6f77c7785f 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -275,7 +275,6 @@ struct Manager { LIST_HEAD(Network, networks); usec_t network_dirs_ts_usec; - struct kmod_ctx *kmod_ctx; }; extern const char* const network_dirs[]; |