link-config.c revision d2df0d0ed3a88e491405b403e6022e6619750130
3802a3d3d7af51ddff31943d5514382f01265770Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek This file is part of systemd.
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek Copyright (C) 2013 Tom Gundersen <teg@jklm.no>
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek systemd is free software; you can redistribute it and/or modify it
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek under the terms of the GNU Lesser General Public License as published by
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek the Free Software Foundation; either version 2.1 of the License, or
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek (at your option) any later version.
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek systemd is distributed in the hope that it will be useful, but
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek WITHOUT ANY WARRANTY; without even the implied warranty of
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek Lesser General Public License for more details.
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek You should have received a copy of the GNU Lesser General Public License
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek along with systemd; If not, see <http://www.gnu.org/licenses/>.
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-SzmekDEFINE_TRIVIAL_CLEANUP_FUNC(link_config_ctx*, link_config_ctx_free);
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek#define _cleanup_link_config_ctx_free_ _cleanup_(link_config_ctx_freep)
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek _cleanup_link_config_ctx_free_ link_config_ctx *ctx = NULL;
fbce11397f4d19821a9dfe66ee3ebe11cad90057Jan Engelhardt ctx->link_dirs = strv_new("/etc/systemd/network",
847ae0ae7f29e7bfb245d692409fc2948eab7d1dLennart Poettering log_error("failed to build link config directory array");
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek if (!path_strv_canonicalize_uniq(ctx->link_dirs)) {
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek log_error("failed to canonicalize link config directories\n");
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmekstatic int link_config_ctx_connect(link_config_ctx *ctx) {
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek if (ctx->ethtool_fd >= 0 && ctx->rtnl)
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek r = ethtool_connect(&ctx->ethtool_fd);
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek r = sd_rtnl_open(0, &ctx->rtnl);
847ae0ae7f29e7bfb245d692409fc2948eab7d1dLennart Poetteringstatic void link_configs_free(link_config_ctx *ctx) {
d868475ad62547f0a034dfaf038aff31b3d05372Zbigniew Jędrzejewski-Szmek LIST_FOREACH_SAFE(links, link, link_next, ctx->links) {
if (!ctx)
if (!file) {
return errno;
if (!link) {
r = log_oom();
goto failure;
goto failure;
static bool enable_name_policy(void) {
char *w, *state;
size_t l;
char **files, **f;
if (!enable_name_policy()) {
NULL)) {
return -ENOENT;
unsigned type;
unsigned type;
return type == 0;
unsigned int seed;
if (want_random)
const char *name;
const char *seed_str;
if (!name) {
if (!name) {
if (!name)
return -ENOENT;
for(i = 0; i < ETH_ALEN; i++) {
int link_config_apply(link_config_ctx *ctx, link_config *config, struct udev_device *device, const char **name) {
const char *old_name;
int r, ifindex;
if (!old_name)
return -EINVAL;
if (ifindex <= 0) {
return -ENODEV;
switch (*policy) {
case NAMEPOLICY_ONBOARD:
case NAMEPOLICY_SLOT:
case NAMEPOLICY_PATH:
case NAMEPOLICY_MAC:
if (new_name)
case MACPOLICY_PERSISTENT:
case MACPOLICY_RANDOM:
static const char* const mac_policy_table[] = {
DEFINE_CONFIG_PARSE_ENUM(config_parse_mac_policy, mac_policy, MACPolicy, "Failed to parse MAC address policy");
static const char* const name_policy_table[] = {
DEFINE_CONFIG_PARSE_ENUMV(config_parse_name_policy, name_policy, NamePolicy, _NAMEPOLICY_INVALID, "Failed to parse interface name policy");