]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: support setting dhcp server port
authorMartin Ivicic <martin.ivicic@pan-net.eu>
Wed, 21 Feb 2024 01:07:26 +0000 (02:07 +0100)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 21 Feb 2024 10:33:27 +0000 (19:33 +0900)
man/systemd.network.xml
src/libsystemd-network/sd-dhcp-client.c
src/network/networkd-dhcp4.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.h
src/systemd/sd-dhcp-client.h

index 32de0ce8446dadbedb17c911aed3f2dd46eb5bf5..adff23d1fedfa19ec6bb3adb6bcabf9dbb2c32f4 100644 (file)
@@ -2736,6 +2736,15 @@ NFTSet=prefix:netdev:filter:eth_ipv4_prefix</programlisting>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>ServerPort=</varname></term>
+        <listitem>
+          <para>Set the port on which the DHCP server is listening.</para>
+
+        <xi:include href="version-info.xml" xpointer="v256"/>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>DenyList=</varname></term>
         <listitem>
index 395f7ce4d045ba9d8dcdd3c148185158b9e967bd..1eb8509f0f6a906e5eaedd09b313bcbf66a9ed11 100644 (file)
@@ -62,6 +62,7 @@ struct sd_dhcp_client {
 
         int fd;
         uint16_t port;
+        uint16_t server_port;
         union sockaddr_union link;
         sd_event_source *receive_message;
         bool request_broadcast;
@@ -516,6 +517,18 @@ int sd_dhcp_client_set_client_port(
         return 0;
 }
 
+int sd_dhcp_client_set_port(
+                sd_dhcp_client *client,
+                uint16_t port) {
+
+        assert_return(client, -EINVAL);
+        assert_return(!sd_dhcp_client_is_running(client), -EBUSY);
+
+        client->server_port = port;
+
+        return 0;
+}
+
 int sd_dhcp_client_set_mtu(sd_dhcp_client *client, uint32_t mtu) {
         assert_return(client, -EINVAL);
         assert_return(mtu >= DHCP_MIN_PACKET_SIZE, -ERANGE);
@@ -891,7 +904,7 @@ static int dhcp_client_send_raw(
                 size_t len) {
 
         dhcp_packet_append_ip_headers(packet, INADDR_ANY, client->port,
-                                      INADDR_BROADCAST, DHCP_PORT_SERVER, len, client->ip_service_type);
+                                      INADDR_BROADCAST, client->server_port, len, client->ip_service_type);
 
         return dhcp_network_send_raw_socket(client->fd, &client->link,
                                             packet, len);
@@ -1113,7 +1126,7 @@ static int client_send_request(sd_dhcp_client *client) {
         if (client->state == DHCP_STATE_RENEWING)
                 r = dhcp_network_send_udp_socket(client->fd,
                                                  client->lease->server_address,
-                                                 DHCP_PORT_SERVER,
+                                                 client->server_port,
                                                  &request->dhcp,
                                                  sizeof(DHCPMessage) + optoffset);
         else
@@ -2203,7 +2216,7 @@ int sd_dhcp_client_send_release(sd_dhcp_client *client) {
 
         r = dhcp_network_send_udp_socket(client->fd,
                                          client->lease->server_address,
-                                         DHCP_PORT_SERVER,
+                                         client->server_port,
                                          &release->dhcp,
                                          sizeof(DHCPMessage) + optoffset);
         if (r < 0)
@@ -2237,7 +2250,7 @@ int sd_dhcp_client_send_decline(sd_dhcp_client *client) {
 
         r = dhcp_network_send_udp_socket(client->fd,
                                          client->lease->server_address,
-                                         DHCP_PORT_SERVER,
+                                         client->server_port,
                                          &release->dhcp,
                                          sizeof(DHCPMessage) + optoffset);
         if (r < 0)
@@ -2382,6 +2395,7 @@ int sd_dhcp_client_new(sd_dhcp_client **ret, int anonymize) {
                 .fd = -EBADF,
                 .mtu = DHCP_MIN_PACKET_SIZE,
                 .port = DHCP_PORT_CLIENT,
+                .server_port = DHCP_PORT_SERVER,
                 .anonymize = !!anonymize,
                 .max_discover_attempts = UINT64_MAX,
                 .max_request_attempts = 5,
index b34120f9970b5005313295e2d3cc7b0143bfaea0..71b132f94f5070817ba6dc400c32929b87e38845 100644 (file)
@@ -1634,6 +1634,11 @@ static int dhcp4_configure(Link *link) {
                 if (r < 0)
                         return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set listen port: %m");
         }
+        if (link->network->dhcp_port > 0) {
+                r = sd_dhcp_client_set_port(link->dhcp_client, link->network->dhcp_port);
+                if (r < 0)
+                        return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set server port: %m");
+        }
 
         if (link->network->dhcp_max_attempts > 0) {
                 r = sd_dhcp_client_set_max_attempts(link->dhcp_client, link->network->dhcp_max_attempts);
index a196da7f0f91ea7e8918e043e434a303eb8593a1..236bac7aa674d7b6fdcfdc5132955dc2c412ee70 100644 (file)
@@ -248,6 +248,7 @@ DHCPv4.RouteMetric,                          config_parse_dhcp_route_metric,
 DHCPv4.RouteTable,                           config_parse_dhcp_or_ra_route_table,                      AF_INET,                       0
 DHCPv4.UseTimezone,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_use_timezone)
 DHCPv4.ListenPort,                           config_parse_uint16,                                      0,                             offsetof(Network, dhcp_client_port)
+DHCPv4.ServerPort,                           config_parse_uint16,                                      0,                             offsetof(Network, dhcp_port)
 DHCPv4.SendRelease,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_send_release)
 DHCPv4.SendDecline,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_send_decline)
 DHCPv4.DenyList,                             config_parse_in_addr_prefixes,                            AF_INET,                       offsetof(Network, dhcp_deny_listed_ip)
index 270ffd87a3a4e087e27a2fbdd18bcccf5739e066..e9ee556312b09f6bf7a1d25df4ba3a20d065f6c3 100644 (file)
@@ -132,6 +132,7 @@ struct Network {
         usec_t dhcp_fallback_lease_lifetime_usec;
         uint32_t dhcp_route_mtu;
         uint16_t dhcp_client_port;
+        uint16_t dhcp_port;
         int dhcp_critical;
         int dhcp_ip_service_type;
         int dhcp_socket_priority;
index dcbd79e6b4ddb4515face15b10e639da13c7a2d3..1483afa220322284dc02b18d7ccaf3a1ba0147ec 100644 (file)
@@ -120,6 +120,9 @@ int sd_dhcp_client_set_max_attempts(
 int sd_dhcp_client_set_client_port(
                 sd_dhcp_client *client,
                 uint16_t port);
+int sd_dhcp_client_set_port(
+                sd_dhcp_client *client,
+                uint16_t port);
 int sd_dhcp_client_set_hostname(
                 sd_dhcp_client *client,
                 const char *hostname);