]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: Introduce UseCaptivePortal DHCPv4 option
authorRonan Pigott <ronan@rjp.ie>
Thu, 29 Jun 2023 23:30:31 +0000 (16:30 -0700)
committerRonan Pigott <ronan@rjp.ie>
Sun, 2 Jul 2023 08:13:43 +0000 (01:13 -0700)
Accepts a boolean. When enabled, UseCaptivePortal will request and
retain the captive portal configuration from the DHCP server.

man/systemd.network.xml
src/libsystemd/sd-network/sd-network.c
src/network/networkd-dhcp4.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
src/network/networkd-state-file.c
src/systemd/sd-network.h

index 1b3400005245502602d1ea507166e0492c5d028a..452d2835b00f3de69ec6f496b71e36052d8c40cf 100644 (file)
@@ -1969,6 +1969,14 @@ allow my_server_t localnet_peer_t:peer recv;</programlisting>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>UseCaptivePortal=</varname></term>
+        <listitem>
+          <para>When true (the default), the captive portal advertised by the DHCP server will be recorded
+          and made available to client programs and displayed in the networkctl status output per-link.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>UseMTU=</varname></term>
         <listitem>
index dd440a5d17d924feaa9e0db4753988ebafe542cf..cf3c400dbc4dfda21f7046e09ce201d1fb310ed4 100644 (file)
@@ -258,6 +258,10 @@ int sd_network_link_get_sip(int ifindex, char ***ret) {
         return network_link_get_strv(ifindex, "SIP", ret);
 }
 
+int sd_network_link_get_captive_portal(int ifindex, char **ret) {
+        return network_link_get_string(ifindex, "CAPTIVE_PORTAL", ret);
+}
+
 int sd_network_link_get_search_domains(int ifindex, char ***ret) {
         return network_link_get_strv(ifindex, "DOMAINS", ret);
 }
index d4b49421738da87f7f0fc73757488dd56403159e..ce6ce230bc30b3f5bc6e6083b265ebe675c05483 100644 (file)
@@ -1426,6 +1426,11 @@ static int dhcp4_configure(Link *link) {
                         if (r < 0)
                                 return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set request flag for SIP server: %m");
                 }
+                if (link->network->dhcp_use_captive_portal) {
+                        r = sd_dhcp_client_set_request_option(link->dhcp_client, SD_DHCP_OPTION_DHCP_CAPTIVE_PORTAL);
+                        if (r < 0)
+                                return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set request flag for captive portal: %m");
+                }
 
                 if (link->network->dhcp_use_timezone) {
                         r = sd_dhcp_client_set_request_option(link->dhcp_client, SD_DHCP_OPTION_TZDB_TIMEZONE);
index 716904cc3446afed1c12e4416e64fa70bf65afc7..92ea9eaeefc6961656a269571435aba548efb712 100644 (file)
@@ -216,6 +216,7 @@ DHCPv4.RoutesToDNS,                          config_parse_bool,
 DHCPv4.UseNTP,                               config_parse_dhcp_use_ntp,                                AF_INET,                       0
 DHCPv4.RoutesToNTP,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_routes_to_ntp)
 DHCPv4.UseSIP,                               config_parse_bool,                                        0,                             offsetof(Network, dhcp_use_sip)
+DHCPv4.UseCaptivePortal,                     config_parse_bool,                                        0,                             offsetof(Network, dhcp_use_captive_portal)
 DHCPv4.UseMTU,                               config_parse_bool,                                        0,                             offsetof(Network, dhcp_use_mtu)
 DHCPv4.UseHostname,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_use_hostname)
 DHCPv4.UseDomains,                           config_parse_dhcp_use_domains,                            AF_INET,                       0
index 2423d891d3bf68a8c8a80f249f32fdc5fa41fd9c..b2a2d8052c3812ecaec42ad94e9333ac34cb77b4 100644 (file)
@@ -395,6 +395,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                 .dhcp_use_ntp = true,
                 .dhcp_routes_to_ntp = true,
                 .dhcp_use_sip = true,
+                .dhcp_use_captive_portal = true,
                 .dhcp_use_dns = true,
                 .dhcp_routes_to_dns = true,
                 .dhcp_use_hostname = true,
index c692fad991be68fff3d2e70fc864601651390d0c..b4666f1d63c8b6f108a5bc74551205ee8f3ff25b 100644 (file)
@@ -143,6 +143,7 @@ struct Network {
         bool dhcp_use_ntp_set;
         bool dhcp_routes_to_ntp;
         bool dhcp_use_sip;
+        bool dhcp_use_captive_portal;
         bool dhcp_use_mtu;
         bool dhcp_use_routes;
         int dhcp_use_gateway;
index 6e962c03f64eb8d045a252b38957ba806437c129..e313d9e9182d56c00a47c3ff4c63feffd978606b 100644 (file)
@@ -464,7 +464,8 @@ static void link_save_domains(Link *link, FILE *f, OrderedSet *static_domains, D
 }
 
 int link_save(Link *link) {
-        const char *admin_state, *oper_state, *carrier_state, *address_state, *ipv4_address_state, *ipv6_address_state;
+        const char *admin_state, *oper_state, *carrier_state, *address_state, *ipv4_address_state, *ipv6_address_state,
+              *dhcp_captive_portal = NULL;
         _cleanup_(unlink_and_freep) char *temp_path = NULL;
         _cleanup_fclose_ FILE *f = NULL;
         int r;
@@ -606,6 +607,17 @@ int link_save(Link *link) {
 
                 /************************************************************/
 
+                if (link->dhcp_lease && link->network->dhcp_use_captive_portal) {
+                        r = sd_dhcp_lease_get_captive_portal(link->dhcp_lease, &dhcp_captive_portal);
+                        if (r < 0 && r != -ENODATA)
+                                return r;
+                }
+
+                if (dhcp_captive_portal)
+                        fprintf(f, "CAPTIVE_PORTAL=%s\n", dhcp_captive_portal);
+
+                /************************************************************/
+
                 fputs("DOMAINS=", f);
                 if (link->search_domains)
                         link_save_domains(link, f, link->search_domains, DHCP_USE_DOMAINS_NO);
index 9cc2cbaa6ec0ba125f52eeeabc43dcfd6fd82696..d292719a3e5ffccb5feaef0de4537259610d1a70 100644 (file)
@@ -134,6 +134,9 @@ int sd_network_link_get_ntp(int ifindex, char ***ret);
  * representations of IP addresses */
 int sd_network_link_get_sip(int ifindex, char ***ret);
 
+/* Get the captive portal address for a given link. */
+int sd_network_link_get_captive_portal(int ifindex, char **ret);
+
 /* Indicates whether or not LLMNR should be enabled for the link
  * Possible levels of support: yes, no, resolve
  * Possible return codes: