diff --git a/ansible_collections/arista/avd/examples/cv-pathfinder/documentation/devices/inet-cloud.md b/ansible_collections/arista/avd/examples/cv-pathfinder/documentation/devices/inet-cloud.md
index 5cf8a45f6d5..81d07555186 100644
--- a/ansible_collections/arista/avd/examples/cv-pathfinder/documentation/devices/inet-cloud.md
+++ b/ansible_collections/arista/avd/examples/cv-pathfinder/documentation/devices/inet-cloud.md
@@ -233,9 +233,9 @@ dhcp server
| Interface name | DHCP IPv4 | DHCP IPv6 |
| -------------- | --------- | --------- |
-| Ethernet5 | True | False |
-| Ethernet6 | True | False |
-| Ethernet8 | True | False |
+| Ethernet5 | True | - |
+| Ethernet6 | True | - |
+| Ethernet8 | True | - |
## Monitoring
diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/host1.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/host1.md
index 8f5d5d93dfb..0aeba97556f 100644
--- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/host1.md
+++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/host1.md
@@ -1794,6 +1794,7 @@ dhcp server vrf VRF01
| Interface name | DHCP IPv4 | DHCP IPv6 |
| -------------- | --------- | --------- |
| Ethernet64 | True | True |
+| Port-Channel112 | True | True |
## System Boot Settings
@@ -5494,6 +5495,8 @@ interface Port-Channel112
switchport
ip address dhcp
dhcp client accept default-route
+ dhcp server ipv4
+ dhcp server ipv6
port-channel lacp fallback individual
port-channel lacp fallback timeout 5
!
diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/host1.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/host1.cfg
index f0add4ca69a..020de4eade7 100644
--- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/host1.cfg
+++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/host1.cfg
@@ -2059,6 +2059,8 @@ interface Port-Channel112
switchport
ip address dhcp
dhcp client accept default-route
+ dhcp server ipv4
+ dhcp server ipv6
port-channel lacp fallback individual
port-channel lacp fallback timeout 5
!
diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/port-channel-interfaces.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/port-channel-interfaces.yml
index 18ec3400772..6b71974fc0f 100644
--- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/port-channel-interfaces.yml
+++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/host1/port-channel-interfaces.yml
@@ -721,6 +721,8 @@ port_channel_interfaces:
lacp_fallback_mode: individual
ip_address: dhcp
dhcp_client_accept_default_route: true
+ dhcp_server_ipv4: true
+ dhcp_server_ipv6: true
- name: Port-Channel113
description: interface_with_mpls_enabled
@@ -729,6 +731,8 @@ port_channel_interfaces:
ip_address: 172.31.128.9/31
# This won't be rendered because IP address is not DHCP
dhcp_client_accept_default_route: true
+ dhcp_server_ipv4: false
+ dhcp_server_ipv6: false
mpls:
ip: true
ldp:
diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md
index ff848c485c1..548206a2d78 100644
--- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md
+++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md
@@ -217,6 +217,8 @@
| [ mpass](## "port_channel_interfaces.[].ptp.mpass") | Boolean | | | | When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.
Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel.
Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. |
| [ ip_address](## "port_channel_interfaces.[].ip_address") | String | | | | IPv4 address/mask or "dhcp". |
| [ dhcp_client_accept_default_route](## "port_channel_interfaces.[].dhcp_client_accept_default_route") | Boolean | | | | Install default-route obtained via DHCP. |
+ | [ dhcp_server_ipv4](## "port_channel_interfaces.[].dhcp_server_ipv4") | Boolean | | | | Enable IPv4 DHCP server. |
+ | [ dhcp_server_ipv6](## "port_channel_interfaces.[].dhcp_server_ipv6") | Boolean | | | | Enable IPv6 DHCP server. |
| [ ip_verify_unicast_source_reachable_via](## "port_channel_interfaces.[].ip_verify_unicast_source_reachable_via") | String | | | Valid Values:
- any
- rx
| |
| [ ip_nat](## "port_channel_interfaces.[].ip_nat") | Dictionary | | | | |
| [ destination](## "port_channel_interfaces.[].ip_nat.destination") | Dictionary | | | | |
@@ -926,6 +928,12 @@
# Install default-route obtained via DHCP.
dhcp_client_accept_default_route:
+
+ # Enable IPv4 DHCP server.
+ dhcp_server_ipv4:
+
+ # Enable IPv6 DHCP server.
+ dhcp_server_ipv6:
ip_verify_unicast_source_reachable_via:
ip_nat:
destination:
diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-servers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-servers.j2
index 59a8aa2f936..57122cfbd44 100644
--- a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-servers.j2
+++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-servers.j2
@@ -5,12 +5,18 @@
#}
{# doc - dhcp server #}
{% set ethernet_interfaces_dhcp_server = [] %}
+{% set port_channel_interfaces_dhcp_server = [] %}
{% for ethernet_interface in ethernet_interfaces | arista.avd.natural_sort('name') %}
-{% if ethernet_interface.dhcp_server_ipv4 is arista.avd.defined(true) or ethernet_interface.dhcp_server_ipv4 is arista.avd.defined(true) %}
+{% if ethernet_interface.dhcp_server_ipv4 is arista.avd.defined(true) or ethernet_interface.dhcp_server_ipv6 is arista.avd.defined(true) %}
{% do ethernet_interfaces_dhcp_server.append(ethernet_interface) %}
{% endif %}
{% endfor %}
-{% if (ethernet_interfaces_dhcp_server | length > 0 or dhcp_servers is arista.avd.defined) %}
+{% for port_channel_interface in port_channel_interfaces | arista.avd.natural_sort('name') %}
+{% if port_channel_interface.dhcp_server_ipv4 is arista.avd.defined(true) or port_channel_interfaces.dhcp_server_ipv6 is arista.avd.defined(true) %}
+{% do port_channel_interfaces_dhcp_server.append(port_channel_interface) %}
+{% endif %}
+{% endfor %}
+{% if (ethernet_interfaces_dhcp_server | length > 0 or port_channel_interfaces_dhcp_server | length > 0 or dhcp_servers is arista.avd.defined) %}
## DHCP Server
{% if dhcp_servers is arista.avd.defined %}
@@ -123,14 +129,21 @@
{% include 'eos/dhcp-servers.j2' %}
```
{% endif %}
-{% if ethernet_interfaces_dhcp_server | length > 0 %}
+{% if ethernet_interfaces_dhcp_server | length > 0 or port_channel_interfaces_dhcp_server | length > 0 %}
### DHCP Server Interfaces
| Interface name | DHCP IPv4 | DHCP IPv6 |
| -------------- | --------- | --------- |
-{% for ethernet_interface in ethernet_interfaces_dhcp_server | arista.avd.natural_sort %}
-| {{ ethernet_interface.name }} | {{ ethernet_interface.dhcp_server_ipv4 | arista.avd.default(false) }} | {{ ethernet_interface.dhcp_server_ipv6 | arista.avd.default(false) }} |
-{% endfor %}
+{% if ethernet_interfaces_dhcp_server | length > 0 %}
+{% for ethernet_interface in ethernet_interfaces_dhcp_server | arista.avd.natural_sort %}
+| {{ ethernet_interface.name }} | {{ ethernet_interface.dhcp_server_ipv4 | arista.avd.default("-") }} | {{ ethernet_interface.dhcp_server_ipv6 | arista.avd.default("-") }} |
+{% endfor %}
+{% endif %}
+{% if port_channel_interfaces_dhcp_server | length > 0 %}
+{% for port_channel_interface in port_channel_interfaces_dhcp_server | arista.avd.natural_sort %}
+| {{ port_channel_interface.name }} | {{ port_channel_interface.dhcp_server_ipv4 | arista.avd.default("-") }} | {{ port_channel_interface.dhcp_server_ipv6 | arista.avd.default("-") }} |
+{% endfor %}
+{% endif %}
{% endif %}
{% endif %}
diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2
index 92a538f7106..c5ed42541d7 100644
--- a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2
+++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2
@@ -356,6 +356,12 @@ interface {{ port_channel_interface.name }}
bfd per-link
{% endif %}
{% endif %}
+{% if port_channel_interface.dhcp_server_ipv4 is arista.avd.defined(true) %}
+ dhcp server ipv4
+{% endif %}
+{% if port_channel_interface.dhcp_server_ipv6 is arista.avd.defined(true) %}
+ dhcp server ipv6
+{% endif %}
{% if port_channel_interface.ip_igmp_host_proxy.enabled is arista.avd.defined(true) %}
{% set host_proxy_cli = "ip igmp host-proxy" %}
{{ host_proxy_cli }}
diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/__init__.py b/python-avd/pyavd/_eos_cli_config_gen/schema/__init__.py
index 59a3ba27572..9673536c334 100644
--- a/python-avd/pyavd/_eos_cli_config_gen/schema/__init__.py
+++ b/python-avd/pyavd/_eos_cli_config_gen/schema/__init__.py
@@ -33102,6 +33102,8 @@ def __init__(
"ptp": {"type": Ptp},
"ip_address": {"type": str},
"dhcp_client_accept_default_route": {"type": bool},
+ "dhcp_server_ipv4": {"type": bool},
+ "dhcp_server_ipv6": {"type": bool},
"ip_verify_unicast_source_reachable_via": {"type": str},
"ip_nat": {"type": IpNat},
"ipv6_enable": {"type": bool},
@@ -33267,6 +33269,10 @@ def __init__(
"""IPv4 address/mask or "dhcp"."""
dhcp_client_accept_default_route: bool | None
"""Install default-route obtained via DHCP."""
+ dhcp_server_ipv4: bool | None
+ """Enable IPv4 DHCP server."""
+ dhcp_server_ipv6: bool | None
+ """Enable IPv6 DHCP server."""
ip_verify_unicast_source_reachable_via: Literal["any", "rx"] | None
ip_nat: IpNat
"""Subclass of AvdModel."""
@@ -33396,6 +33402,8 @@ def __init__(
ptp: Ptp | UndefinedType = Undefined,
ip_address: str | None | UndefinedType = Undefined,
dhcp_client_accept_default_route: bool | None | UndefinedType = Undefined,
+ dhcp_server_ipv4: bool | None | UndefinedType = Undefined,
+ dhcp_server_ipv6: bool | None | UndefinedType = Undefined,
ip_verify_unicast_source_reachable_via: Literal["any", "rx"] | None | UndefinedType = Undefined,
ip_nat: IpNat | UndefinedType = Undefined,
ipv6_enable: bool | None | UndefinedType = Undefined,
@@ -33522,6 +33530,8 @@ def __init__(
ptp: Subclass of AvdModel.
ip_address: IPv4 address/mask or "dhcp".
dhcp_client_accept_default_route: Install default-route obtained via DHCP.
+ dhcp_server_ipv4: Enable IPv4 DHCP server.
+ dhcp_server_ipv6: Enable IPv6 DHCP server.
ip_verify_unicast_source_reachable_via: ip_verify_unicast_source_reachable_via
ip_nat: Subclass of AvdModel.
ipv6_enable: ipv6_enable
diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml
index 5a9c4cf3c4b..48a3e4c529e 100644
--- a/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml
+++ b/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml
@@ -10745,6 +10745,12 @@ keys:
dhcp_client_accept_default_route:
type: bool
description: Install default-route obtained via DHCP.
+ dhcp_server_ipv4:
+ type: bool
+ description: Enable IPv4 DHCP server.
+ dhcp_server_ipv6:
+ type: bool
+ description: Enable IPv6 DHCP server.
ip_verify_unicast_source_reachable_via:
type: str
valid_values:
diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml
index 6fffebb2833..e835d6e781e 100644
--- a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml
+++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml
@@ -814,6 +814,12 @@ keys:
dhcp_client_accept_default_route:
type: bool
description: Install default-route obtained via DHCP.
+ dhcp_server_ipv4:
+ type: bool
+ description: Enable IPv4 DHCP server.
+ dhcp_server_ipv6:
+ type: bool
+ description: Enable IPv6 DHCP server.
ip_verify_unicast_source_reachable_via:
type: str
valid_values: