]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #20443 from yuwata/network-conf-parser-cleanups
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 16 Aug 2021 17:42:27 +0000 (02:42 +0900)
committerGitHub <noreply@github.com>
Mon, 16 Aug 2021 17:42:27 +0000 (02:42 +0900)
network: conf parser cleanups

1  2 
man/systemd.network.xml
src/network/networkd-dhcp4.c
src/network/networkd-network.c

diff --combined man/systemd.network.xml
index 3bd0e0487998d3b3aa7279dbaffc9a53f998b421,f34f3025cb70d91e3d5d715e2be193afb53cbb12..5e231d9a6307f02bb7583e93aec2ee395f214222
@@@ -1053,7 -1053,8 +1053,8 @@@ IPv6Token=prefixstable:2002:da8:1::</pr
          <varlistentry>
            <term><varname>Label=</varname></term>
            <listitem>
-             <para>An address label.</para>
+             <para>Specifies the label for the IPv4 address. The label must be a 7-bit ASCII string with
+             a length of 1…15 characters. Defaults to unset.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
  
          <!-- How to use the DHCP lease -->
  
 +        <varlistentry>
 +          <term><varname>Label=</varname></term>
 +          <listitem>
 +            <para>Specifies the label for the IPv4 address received from the DHCP server.
 +            The label must be a 7-bit ASCII string with a length of 1…15 characters.
 +            Defaults to unset.</para>
 +          </listitem>
 +        </varlistentry>
 +
          <varlistentry>
            <term><varname>UseDNS=</varname></term>
            <listitem>
            <term><varname>SamplePoint=</varname></term>
            <listitem>
              <para>Optional sample point in percent with one decimal (e.g. <literal>75%</literal>,
 -            <literal>87.5%</literal>) or permille (e.g. <literal>875‰</literal>).</para>
 +            <literal>87.5%</literal>) or permille (e.g. <literal>875‰</literal>). This will be ignored when
 +            <varname>BitRate=</varname> is unspecified.</para>
 +          </listitem>
 +        </varlistentry>
 +        <varlistentry>
 +          <term><varname>TimeQuantaNSec=</varname></term>
 +          <term><varname>PropagationSegment=</varname></term>
 +          <term><varname>PhaseBufferSegment1=</varname></term>
 +          <term><varname>PhaseBufferSegment2=</varname></term>
 +          <term><varname>SyncJumpWidth=</varname></term>
 +          <listitem>
 +            <para>Specifies the time quanta, propagation segment, phase buffer segment 1 and 2, and the
 +            synchronization jump width, which allow to define the CAN bit-timing in a hardware
 +            independent format as proposed by the Bosch CAN 2.0 Specification.
 +            <varname>TimeQuantaNSec=</varname> takes a timespan in nanoseconds.
 +            <varname>PropagationSegment=</varname>, <varname>PhaseBufferSegment1=</varname>,
 +            <varname>PhaseBufferSegment2=</varname>, and <varname>SyncJumpWidth=</varname> take number
 +            of time quantum specified in <varname>TimeQuantaNSec=</varname> and must be an unsigned
 +            integer in the range 0…4294967295. These settings except for
 +            <varname>SyncJumpWidth=</varname> will be ignored when <varname>BitRate=</varname> is
 +            specified.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
              analogous to the <varname>BitRate=</varname> and <varname>SamplePoint=</varname> keys.</para>
            </listitem>
          </varlistentry>
 +        <varlistentry>
 +          <term><varname>DataTimeQuantaNSec=</varname></term>
 +          <term><varname>DataPropagationSegment=</varname></term>
 +          <term><varname>DataPhaseBufferSegment1=</varname></term>
 +          <term><varname>DataPhaseBufferSegment2=</varname></term>
 +          <term><varname>DataSyncJumpWidth=</varname></term>
 +          <listitem>
 +            <para>Specifies the time quanta, propagation segment, phase buffer segment 1 and 2, and the
 +            synchronization jump width for the data phase, if CAN-FD is used. These settings are
 +            analogous to the <varname>TimeQuantaNSec=</varname> or related settings.</para>
 +          </listitem>
 +        </varlistentry>
          <varlistentry>
            <term><varname>FDMode=</varname></term>
            <listitem>
              <para>Takes a boolean. When <literal>yes</literal>, CAN-FD mode is enabled for the interface.
              Note, that a bitrate and optional sample point should also be set for the CAN-FD data phase using
 -            the <varname>DataBitRate=</varname> and <varname>DataSamplePoint=</varname> keys.</para>
 +            the <varname>DataBitRate=</varname> and <varname>DataSamplePoint=</varname> keys, or
 +            <varname>DataTimeQuanta=</varname> and related settings.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
          <varlistentry>
            <term><varname>Termination=</varname></term>
            <listitem>
 -            <para>Takes a boolean. When <literal>yes</literal>, the termination resistor will be selected for
 -            the bias network. When unset, the kernel's default will be used.</para>
 +            <para>Takes a boolean or a termination resistor value in ohm in the range 0–65535. When
 +            <literal>yes</literal>, the termination resistor is set to 120 ohm. When
 +            <literal>no</literal> or <literal>0</literal> is set, the termination resistor is disabled.
 +            When unset, the kernel's default will be used.</para>
            </listitem>
          </varlistentry>
          <varlistentry>
              </para>
            </listitem>
          </varlistentry>
 +        <varlistentry>
 +          <term><varname>Loopback=</varname></term>
 +          <listitem>
 +            <para>Takes a boolean. When <literal>yes</literal>, loopback mode is enabled. When the
 +            loopback mode is enabled, the interface treats messages transmitted by itself as received
 +            messages. The loopback mode is important to debug CAN networks. When unset, the kernel's
 +            default will be used.</para>
 +          </listitem>
 +        </varlistentry>
 +        <varlistentry>
 +          <term><varname>OneShot=</varname></term>
 +          <listitem>
 +            <para>Takes a boolean. When <literal>yes</literal>, one-shot mode is enabled. When unset,
 +            the kernel's default will be used.</para>
 +          </listitem>
 +        </varlistentry>
 +        <varlistentry>
 +          <term><varname>PresumeAck=</varname></term>
 +          <listitem>
 +            <para>Takes a boolean. When <literal>yes</literal>, the interface will ignore missing CAN
 +            ACKs. When unset, the kernel's default will be used.</para>
 +          </listitem>
 +        </varlistentry>
 +        <varlistentry>
 +          <term><varname>ClassicDataLengthCode=</varname></term>
 +          <listitem>
 +            <para>Takes a boolean. When <literal>yes</literal>, the interface will handle the 4bit data
 +            length code (DLC). When unset, the kernel's default will be used.</para>
 +          </listitem>
 +        </varlistentry>
        </variablelist>
    </refsect1>
  
index c35b5514a58e976c7bbd38faeade69167dd161a6,0d0097f0d03dcdb601ddc54f2414a150b9a01e19..6b4f6aaabd46d4ba42822a68bd0b7d441f996e17
@@@ -992,12 -992,6 +992,12 @@@ static int dhcp4_request_address(Link *
          addr->route_metric = link->network->dhcp_route_metric;
          addr->duplicate_address_detection = link->network->dhcp_send_decline ? ADDRESS_FAMILY_IPV4 : ADDRESS_FAMILY_NO;
  
 +        if (link->network->dhcp_label) {
 +                addr->label = strdup(link->network->dhcp_label);
 +                if (!addr->label)
 +                        return log_oom();
 +        }
 +
          if (address_get(link, addr, NULL) < 0)
                  link->dhcp4_configured = false;
  
@@@ -1844,7 -1838,8 +1844,8 @@@ int config_parse_dhcp_ip_service_type
          return 0;
  }
  
- int config_parse_dhcp_fallback_lease_lifetime(const char *unit,
+ int config_parse_dhcp_fallback_lease_lifetime(
+                 const char *unit,
                  const char *filename,
                  unsigned line,
                  const char *section,
                  const char *rvalue,
                  void *data,
                  void *userdata) {
          Network *network = userdata;
          uint32_t k;
  
          return 0;
  }
  
 +int config_parse_dhcp_label(
 +                const char *unit,
 +                const char *filename,
 +                unsigned line,
 +                const char *section,
 +                unsigned section_line,
 +                const char *lvalue,
 +                int ltype,
 +                const char *rvalue,
 +                void *data,
 +                void *userdata) {
 +
 +        char **label = data;
 +
 +        assert(filename);
 +        assert(lvalue);
 +        assert(rvalue);
 +        assert(data);
 +
 +        if (isempty(rvalue)) {
 +                *label = mfree(*label);
 +                return 0;
 +        }
 +
 +        if (!address_label_valid(rvalue)) {
 +                log_syntax(unit, LOG_WARNING, filename, line, 0,
 +                           "Address label is too long or invalid, ignoring assignment: %s", rvalue);
 +                return 0;
 +        }
 +
 +        return free_and_strdup_warn(label, rvalue);
 +}
 +
  static const char* const dhcp_client_identifier_table[_DHCP_CLIENT_ID_MAX] = {
          [DHCP_CLIENT_ID_MAC] = "mac",
          [DHCP_CLIENT_ID_DUID] = "duid",
index daf34a7225f19ab9e1985cd792dc62aa8416a15a,5d287f7751a10be052b44c7654dd0b8ffecaa722..bb09ba9e8933802fd5f73985606f6748e69a5638
@@@ -413,7 -413,12 +413,7 @@@ int network_load_one(Manager *manager, 
                  .ipv6_accept_ra_route_metric = DHCP_ROUTE_METRIC,
                  .ipv6_accept_ra_start_dhcp6_client = IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES,
  
 -                .can_triple_sampling = -1,
 -                .can_berr_reporting = -1,
                  .can_termination = -1,
 -                .can_listen_only = -1,
 -                .can_fd_mode = -1,
 -                .can_non_iso = -1,
          };
  
          r = config_parse_many(
@@@ -580,7 -585,6 +580,7 @@@ static Network *network_free(Network *n
          free(network->dhcp_mudurl);
          strv_free(network->dhcp_user_class);
          free(network->dhcp_hostname);
 +        free(network->dhcp_label);
          set_free(network->dhcp_deny_listed_ip);
          set_free(network->dhcp_allow_listed_ip);
          set_free(network->dhcp_request_options);
@@@ -715,7 -719,8 +715,8 @@@ bool network_has_static_ipv6_configurat
          return false;
  }
  
- int config_parse_stacked_netdev(const char *unit,
+ int config_parse_stacked_netdev(
+                 const char *unit,
                  const char *filename,
                  unsigned line,
                  const char *section,
                  const char *rvalue,
                  void *data,
                  void *userdata) {
          _cleanup_free_ char *name = NULL;
          NetDevKind kind = ltype;
          Hashmap **h = data;
@@@ -855,26 -861,26 +857,26 @@@ int config_parse_hostname
                  void *data,
                  void *userdata) {
  
-         _cleanup_free_ char *hn = NULL;
          char **hostname = data;
          int r;
  
          assert(filename);
          assert(lvalue);
          assert(rvalue);
-         assert(hostname);
+         assert(data);
  
-         r = config_parse_string(unit, filename, line, section, section_line, lvalue, ltype, rvalue, &hn, userdata);
-         if (r < 0)
-                 return r;
+         if (isempty(rvalue)) {
+                 *hostname = mfree(*hostname);
+                 return 0;
+         }
  
-         if (!hostname_is_valid(hn, 0)) {
+         if (!hostname_is_valid(rvalue, 0)) {
                  log_syntax(unit, LOG_WARNING, filename, line, 0,
                             "Hostname is not valid, ignoring assignment: %s", rvalue);
                  return 0;
          }
  
-         r = dns_name_is_valid(hn);
+         r = dns_name_is_valid(rvalue);
          if (r < 0) {
                  log_syntax(unit, LOG_WARNING, filename, line, r,
                             "Failed to check validity of hostname '%s', ignoring assignment: %m", rvalue);
                  return 0;
          }
  
-         return free_and_replace(*hostname, hn);
+         return free_and_strdup_warn(hostname, rvalue);
  }
  
  int config_parse_timezone(
                  void *data,
                  void *userdata) {
  
-         _cleanup_free_ char *tz = NULL;
-         char **datap = data;
+         char **tz = data;
          int r;
  
          assert(filename);
          assert(lvalue);
          assert(rvalue);
-         assert(datap);
+         assert(data);
  
-         r = config_parse_string(unit, filename, line, section, section_line, lvalue, ltype, rvalue, &tz, userdata);
-         if (r < 0)
-                 return r;
+         if (isempty(rvalue)) {
+                 *tz = mfree(*tz);
+                 return 0;
+         }
  
-         if (!timezone_is_valid(tz, LOG_WARNING)) {
-                 log_syntax(unit, LOG_WARNING, filename, line, 0,
+         r = verify_timezone(rvalue, LOG_WARNING);
+         if (r < 0) {
+                 log_syntax(unit, LOG_WARNING, filename, line, r,
                             "Timezone is not valid, ignoring assignment: %s", rvalue);
                  return 0;
          }
  
-         return free_and_replace(*datap, tz);
+         return free_and_strdup_warn(tz, rvalue);
  }
  
  int config_parse_dns(