X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-manager.c;h=c93d598c6bbc4a664d0f72c2f9c5ed16d4319f58;hb=28aeb07f55ddf338c8705c002bde391cebbdc5a3;hp=c4a325de426c119b558caac00d965a25aabc9cf1;hpb=e375dcde7202d5df4e29f5258e0f8c2bcea4535c;p=elogind.git diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index c4a325de4..c93d598c6 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -21,7 +21,6 @@ #include #include -#include #include "conf-parser.h" #include "path-util.h" @@ -76,6 +75,33 @@ static int setup_signals(Manager *m) { return 0; } +static int setup_default_address_pool(Manager *m) { + AddressPool *p; + int r; + + assert(m); + + /* Add in the well-known private address ranges. */ + + r = address_pool_new_from_string(m, &p, AF_INET6, "fc00::", 7); + if (r < 0) + return r; + + r = address_pool_new_from_string(m, &p, AF_INET, "192.168.0.0", 16); + if (r < 0) + return r; + + r = address_pool_new_from_string(m, &p, AF_INET, "172.16.0.0", 12); + if (r < 0) + return r; + + r = address_pool_new_from_string(m, &p, AF_INET, "10.0.0.0", 8); + if (r < 0) + return r; + + return 0; +} + int manager_new(Manager **ret) { _cleanup_manager_free_ Manager *m = NULL; int r; @@ -84,7 +110,7 @@ int manager_new(Manager **ret) { if (!m) return -ENOMEM; - m->state_file = strdup("/run/systemd/network/state"); + m->state_file = strdup("/run/systemd/netif/state"); if (!m->state_file) return -ENOMEM; @@ -120,10 +146,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; @@ -134,6 +156,10 @@ int manager_new(Manager **ret) { LIST_HEAD_INIT(m->networks); + r = setup_default_address_pool(m); + if (r < 0) + return r; + *ret = m; m = NULL; @@ -144,13 +170,13 @@ void manager_free(Manager *m) { Network *network; NetDev *netdev; Link *link; + AddressPool *pool; if (!m) return; free(m->state_file); - kmod_unref(m->kmod_ctx); udev_monitor_unref(m->udev_monitor); udev_unref(m->udev); sd_bus_unref(m->bus); @@ -170,6 +196,9 @@ void manager_free(Manager *m) { netdev_unref(netdev); hashmap_free(m->netdevs); + while ((pool = m->address_pools)) + address_pool_free(pool); + sd_rtnl_unref(m->rtnl); free(m); @@ -381,6 +410,8 @@ int manager_udev_listen(Manager *m) { int manager_rtnl_listen(Manager *m) { int r; + assert(m); + r = sd_rtnl_attach_event(m->rtnl, m->event, 0); if (r < 0) return r; @@ -466,3 +497,23 @@ finish: return r; } + +int manager_address_pool_acquire(Manager *m, unsigned family, unsigned prefixlen, union in_addr_union *found) { + AddressPool *p; + int r; + + assert(m); + assert(prefixlen > 0); + assert(found); + + LIST_FOREACH(address_pools, p, m->address_pools) { + if (p->family != family) + continue; + + r = address_pool_acquire(p, prefixlen, found); + if (r != 0) + return r; + } + + return 0; +}