networkd-ipv4ll.c revision d0d6a4cd70477970812bff0a37e70f66208d7c14
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering This file is part of systemd.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering Copyright 2013-2014 Tom Gundersen <teg@jklm.no>
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering systemd is free software; you can redistribute it and/or modify it
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering under the terms of the GNU Lesser General Public License as published by
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering (at your option) any later version.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering systemd is distributed in the hope that it will be useful, but
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering Lesser General Public License for more details.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering You should have received a copy of the GNU Lesser General Public License
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering _cleanup_address_free_ Address *address = NULL;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering _cleanup_route_free_ Route *route = NULL;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
266b538958932e6fc27dfce4917336e70e17e29eTom Gundersen log_link_debug(link, "IPv4 link-local release %u.%u.%u.%u", ADDRESS_FMT_VAL(addr));
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering log_link_error(link, "Could not allocate address: %s", strerror(-r));
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering address_drop(address, link, &link_address_drop_handler);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering r = route_new_dynamic(&route, RTPROT_UNSPEC);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering log_link_error(link, "Could not allocate route: %s",
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering route_drop(route, link, &link_route_drop_handler);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic int ipv4ll_route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering _cleanup_link_unref_ Link *link = userdata;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (r < 0 && r != -EEXIST) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering log_link_error(link, "could not set ipv4ll route: %s", strerror(-r));
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic int ipv4ll_address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering _cleanup_link_unref_ Link *link = userdata;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (r < 0 && r != -EEXIST) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering log_link_error(link, "could not set ipv4ll address: %s", strerror(-r));
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering } else if (r >= 0)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering link_rtnl_process_address(rtnl, m, link->manager);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poetteringstatic int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering _cleanup_address_free_ Address *ll_addr = NULL;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering _cleanup_route_free_ Route *route = NULL;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering else if (r < 0)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering log_link_debug(link, "IPv4 link-local claim %u.%u.%u.%u",
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering ll_addr->broadcast.s_addr = ll_addr->in_addr.in.s_addr | htonl(0xfffffffflu >> ll_addr->prefixlen);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r = address_configure(ll_addr, link, ipv4ll_address_handler);
a6a4f528899b1dab47408733b4a423c66ea40f7aThomas Hindoe Paaboel Andersen link->ipv4ll_address = false;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r = route_new_dynamic(&route, RTPROT_STATIC);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering r = route_configure(route, link, ipv4ll_route_handler);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poetteringstatic void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata){
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering log_link_warning(link, "IPv4 link-local error: %s", strerror(-event));
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt log_link_warning(link, "IPv4 link-local unknown event: %d", event);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering assert(IN_SET(link->network->link_local, ADDRESS_FAMILY_IPV4, ADDRESS_FAMILY_YES));
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering r = net_get_unique_predictable_data(link->udev_device, seed);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering r = sd_ipv4ll_set_address_seed(link->ipv4ll, seed);
ab1525bc2d92780b4dc64bc5b9cdb52594e2df7dLennart Poettering r = sd_ipv4ll_attach_event(link->ipv4ll, NULL, 0);
df3fb561b2df486a495a5f0bcc83168bd1860533Lennart Poettering r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering r = sd_ipv4ll_set_index(link->ipv4ll, link->ifindex);