1
0
mirror of https://github.com/systemd/systemd synced 2026-03-19 03:24:45 +01:00

Compare commits

..

7 Commits

Author SHA1 Message Date
Luca Boccassi
798d7d0a8a
Merge pull request #19948 from keszybz/set-driver-refactoring
A minor refactoring to sd-device internals
2021-06-16 13:48:18 +01:00
Luca Boccassi
aeffa4c3ed
Merge pull request #19947 from yuwata/network-dad-tiny-fixes
network: tiny fixes about IPv4ACD
2021-06-16 09:45:42 +01:00
Zbigniew Jędrzejewski-Szmek
ca0176fa6b sd-device: let device_set_driver() accept NULL too
Like previous commit, but for driver not subsystem.
2021-06-16 08:54:16 +02:00
Zbigniew Jędrzejewski-Szmek
df49a7323a sd-device: let device_set_subsystem() accept NULL
This makes device_shallow_clone() simpler.

Follow-up for 2255e8adee37c490bf8cf2daab791b6f746bb0a0.
2021-06-16 08:54:16 +02:00
Yu Watanabe
1cf4ed142d network: always enable IPv4 ACD for statically configured IPv4LL address 2021-06-16 13:19:26 +09:00
Yu Watanabe
f4c48492fe man: fix RFC number and its title 2021-06-16 10:32:28 +09:00
Yu Watanabe
bd5146c67e network: IFA_F_NODAD flag is only for IPv6 addresses 2021-06-16 08:33:54 +09:00
5 changed files with 46 additions and 39 deletions

View File

@ -1098,8 +1098,8 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
<listitem> <listitem>
<para>Takes one of <literal>ipv4</literal>, <literal>ipv6</literal>, <para>Takes one of <literal>ipv4</literal>, <literal>ipv6</literal>,
<literal>both</literal>, <literal>none</literal>. When <literal>ipv4</literal>, <literal>both</literal>, <literal>none</literal>. When <literal>ipv4</literal>,
performs IPv4 Duplicate Address Detection. See performs IPv4 Address Conflict Detection. See
<ulink url="https://tools.ietf.org/html/rfc5227">RFC 5224</ulink>. <ulink url="https://tools.ietf.org/html/rfc5227">RFC 5227</ulink>.
When <literal>ipv6</literal>, performs IPv6 Duplicate Address Detection. See When <literal>ipv6</literal>, performs IPv6 Duplicate Address Detection. See
<ulink url="https://tools.ietf.org/html/rfc4862">RFC 4862</ulink>. <ulink url="https://tools.ietf.org/html/rfc4862">RFC 4862</ulink>.
Defaults to <literal>ipv6</literal>.</para> Defaults to <literal>ipv6</literal>.</para>

View File

@ -107,7 +107,7 @@ int device_set_devmode(sd_device *device, const char *devmode);
int device_set_devname(sd_device *device, const char *devname); int device_set_devname(sd_device *device, const char *devname);
int device_set_devtype(sd_device *device, const char *devtype); int device_set_devtype(sd_device *device, const char *devtype);
int device_set_devnum(sd_device *device, const char *major, const char *minor); int device_set_devnum(sd_device *device, const char *major, const char *minor);
int device_set_subsystem(sd_device *device, const char *_subsystem); int device_set_subsystem(sd_device *device, const char *subsystem);
int device_set_drivers_subsystem(sd_device *device); int device_set_drivers_subsystem(sd_device *device);
int device_set_driver(sd_device *device, const char *_driver); int device_set_driver(sd_device *device, const char *driver);
int device_set_usec_initialized(sd_device *device, usec_t when); int device_set_usec_initialized(sd_device *device, usec_t when);

View File

@ -765,18 +765,15 @@ int device_shallow_clone(sd_device *old_device, sd_device **new_device) {
if (r < 0) if (r < 0)
return r; return r;
if (sd_device_get_subsystem(old_device, &val) >= 0) { (void) sd_device_get_subsystem(old_device, &val);
r = device_set_subsystem(ret, val); r = device_set_subsystem(ret, val);
if (r < 0)
return r;
if (streq_ptr(val, "drivers")) {
r = free_and_strdup(&ret->driver_subsystem, old_device->driver_subsystem);
if (r < 0) if (r < 0)
return r; return r;
}
if (streq(val, "drivers")) {
ret->driver_subsystem = strdup(old_device->driver_subsystem);
if (!ret->driver_subsystem)
return -ENOMEM;
}
} else
ret->subsystem_set = true;
/* The device may be already removed. Let's copy minimal set of information to make /* The device may be already removed. Let's copy minimal set of information to make
* device_get_device_id() work without uevent file. */ * device_get_device_id() work without uevent file. */

View File

@ -779,23 +779,24 @@ _public_ int sd_device_get_parent(sd_device *child, sd_device **ret) {
return 0; return 0;
} }
int device_set_subsystem(sd_device *device, const char *_subsystem) { int device_set_subsystem(sd_device *device, const char *subsystem) {
_cleanup_free_ char *subsystem = NULL; _cleanup_free_ char *s = NULL;
int r; int r;
assert(device); assert(device);
assert(_subsystem);
subsystem = strdup(_subsystem); if (subsystem) {
if (!subsystem) s = strdup(subsystem);
return -ENOMEM; if (!s)
return -ENOMEM;
}
r = device_add_property_internal(device, "SUBSYSTEM", subsystem); r = device_add_property_internal(device, "SUBSYSTEM", s);
if (r < 0) if (r < 0)
return r; return r;
device->subsystem_set = true; device->subsystem_set = true;
return free_and_replace(device->subsystem, subsystem); return free_and_replace(device->subsystem, s);
} }
int device_set_drivers_subsystem(sd_device *device) { int device_set_drivers_subsystem(sd_device *device) {
@ -956,23 +957,24 @@ _public_ int sd_device_get_devnum(sd_device *device, dev_t *devnum) {
return 0; return 0;
} }
int device_set_driver(sd_device *device, const char *_driver) { int device_set_driver(sd_device *device, const char *driver) {
_cleanup_free_ char *driver = NULL; _cleanup_free_ char *d = NULL;
int r; int r;
assert(device); assert(device);
assert(_driver);
driver = strdup(_driver); if (driver) {
if (!driver) d = strdup(driver);
return -ENOMEM; if (!d)
return -ENOMEM;
}
r = device_add_property_internal(device, "DRIVER", driver); r = device_add_property_internal(device, "DRIVER", d);
if (r < 0) if (r < 0)
return r; return r;
device->driver_set = true; device->driver_set = true;
return free_and_replace(device->driver, driver); return free_and_replace(device->driver, d);
} }
_public_ int sd_device_get_driver(sd_device *device, const char **ret) { _public_ int sd_device_get_driver(sd_device *device, const char **ret) {
@ -990,14 +992,14 @@ _public_ int sd_device_get_driver(sd_device *device, const char **ret) {
path = strjoina(syspath, "/driver"); path = strjoina(syspath, "/driver");
r = readlink_value(path, &driver); r = readlink_value(path, &driver);
if (r >= 0) { if (r < 0 && r != -ENOENT)
r = device_set_driver(device, driver); return log_device_debug_errno(device, r,
if (r < 0) "sd-device: readlink(\"%s\") failed: %m", path);
return log_device_debug_errno(device, r, "sd-device: Failed to set driver for %s: %m", device->devpath);
} else if (r == -ENOENT) r = device_set_driver(device, driver);
device->driver_set = true; if (r < 0)
else return log_device_debug_errno(device, r,
return log_device_debug_errno(device, r, "sd-device: Failed to set driver for %s: %m", device->devpath); "sd-device: Failed to set driver \"%s\": %m", driver);
} }
if (!device->driver) if (!device->driver)

View File

@ -2111,9 +2111,17 @@ static int address_section_verify(Address *address) {
address->scope = RT_SCOPE_HOST; address->scope = RT_SCOPE_HOST;
} }
if (!FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV6)) if (address->family == AF_INET6 &&
!FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV6))
address->flags |= IFA_F_NODAD; address->flags |= IFA_F_NODAD;
if (address->family == AF_INET && in4_addr_is_link_local(&address->in_addr.in) &&
!FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV4)) {
log_debug("%s: An IPv4 link-local address is specified, enabling IPv4 Address Conflict Detection (ACD).",
address->section->filename);
address->duplicate_address_detection |= ADDRESS_FAMILY_IPV4;
}
return 0; return 0;
} }