networkd-wait-online-link.c revision b5efdb8af40ea759a1ea584c1bc44ecc81dd00ce
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen/***
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen This file is part of systemd.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen Copyright 2014 Lennart Poettering
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen Copyright 2014 Tom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen systemd is free software; you can redistribute it and/or modify it
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen under the terms of the GNU Lesser General Public License as published by
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen the Free Software Foundation; either version 2.1 of the License, or
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen (at your option) any later version.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen systemd is distributed in the hope that it will be useful, but
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen WITHOUT ANY WARRANTY; without even the implied warranty of
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen Lesser General Public License for more details.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen You should have received a copy of the GNU Lesser General Public License
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen along with systemd; If not, see <http://www.gnu.org/licenses/>.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen***/
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen#include "sd-network.h"
f2dacc96b25528ca1b0caca6364a69d656cf1569Josh Triplett
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#include "alloc-util.h"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#include "networkd-wait-online-link.h"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#include "string-util.h"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekint link_new(Manager *m, Link **ret, int ifindex, const char *ifname) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek _cleanup_(link_freep) Link *l = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek int r;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek assert(m);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek assert(ifindex > 0);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = hashmap_ensure_allocated(&m->links, NULL);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (r < 0)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return r;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = hashmap_ensure_allocated(&m->links_by_name, &string_hash_ops);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (r < 0)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return r;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek l = new0(Link, 1);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!l)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return -ENOMEM;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek l->manager = m;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek l->ifname = strdup(ifname);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!l->ifname)
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen return -ENOMEM;
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = hashmap_put(m->links_by_name, l->ifname, l);
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen if (r < 0)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return r;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek l->ifindex = ifindex;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = hashmap_put(m->links, INT_TO_PTR(ifindex), l);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (r < 0)
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt return r;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (ret)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek *ret = l;
e93549ef29c4123d9ee45acb5815048390201e49Zbigniew Jędrzejewski-Szmek l = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return 0;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek}
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
dbc7bede4a96d9a4d2fa75b6fb2a51076756b051Lennart PoetteringLink *link_free(Link *l) {
dbc7bede4a96d9a4d2fa75b6fb2a51076756b051Lennart Poettering
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!l)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (l->manager) {
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering hashmap_remove(l->manager->links, INT_TO_PTR(l->ifindex));
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering hashmap_remove(l->manager->links_by_name, l->ifname);
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering }
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering free(l->ifname);
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering free(l);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek }
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekint link_update_rtnl(Link *l, sd_netlink_message *m) {
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering const char *ifname;
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering int r;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering assert(l);
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering assert(l->manager);
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering assert(m);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = sd_rtnl_message_link_get_flags(m, &l->flags);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering if (r < 0)
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering return r;
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering r = sd_netlink_message_read_string(m, IFLA_IFNAME, &ifname);
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering if (r < 0)
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering return r;
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering if (!streq(l->ifname, ifname)) {
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering char *new_ifname;
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering new_ifname = strdup(ifname);
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering if (!new_ifname)
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering return -ENOMEM;
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering hashmap_remove(l->manager->links_by_name, l->ifname);
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering free(l->ifname);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering l->ifname = new_ifname;
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = hashmap_put(l->manager->links_by_name, l->ifname, l);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (r < 0)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return r;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek }
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return 0;
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt}
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardtint link_update_monitor(Link *l) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek assert(l);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering l->operational_state = mfree(l->operational_state);
adc800a6e0bf5483585e4210cf7125a7477ad85eLennart Poettering
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sd_network_link_get_operational_state(l->ifindex, &l->operational_state);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek l->state = mfree(l->state);
519d39deeeec7121649f28e7287b7790e50d2979Lennart Poettering
519d39deeeec7121649f28e7287b7790e50d2979Lennart Poettering sd_network_link_get_setup_state(l->ifindex, &l->state);
519d39deeeec7121649f28e7287b7790e50d2979Lennart Poettering
1ed8c0fbb4cc51413f3a6025233f41c19f154bc1Lennart Poettering return 0;
b83d91c02947585df06207c604534d25d87b611fLennart Poettering}
c542f805ddc3ae28007c15827ef2e8a8247452bcZbigniew Jędrzejewski-Szmek