Skip to content

Commit 0a61967

Browse files
authored
Merge pull request #4942 from natali-rs1985/T8125
vpp: T8125: Enable ip4-dhcp-client-detect feature if interface address is configured as DHCP
2 parents 41aa42f + f8a6812 commit 0a61967

File tree

4 files changed

+62
-10
lines changed

4 files changed

+62
-10
lines changed

data/templates/vpp/startup.conf.j2

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ plugins {
114114
# plugin wireguard_plugin.so { enable }
115115
# ACL
116116
plugin acl_plugin.so { enable }
117+
# DHCP plugin
118+
plugin dhcp_plugin.so { enable }
117119
}
118120

119121

python/vyos/vpp/control_vpp.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,3 +494,34 @@ def map_pppoe_interface(self, ifname: str, is_add: bool) -> None:
494494
cp_sw_if_index=self.get_sw_if_index(vpp_pair_name),
495495
is_add=is_add,
496496
)
497+
498+
@_Decorators.api_call
499+
def enable_dhcp_client(self, ifname: str) -> None:
500+
"""Enable DHCP client detection on a given interface
501+
502+
Args:
503+
ifname (str): name of an interface in kernel
504+
"""
505+
iface_index = self.get_sw_if_index(ifname)
506+
feature_is_enabled = self.__vpp_api_client.api.feature_is_enabled(
507+
sw_if_index=iface_index,
508+
feature_name='ip4-dhcp-client-detect',
509+
arc_name='ip4-unicast',
510+
)
511+
if not feature_is_enabled.is_enabled:
512+
self.__vpp_api_client.api.dhcp_client_detect_enable_disable(
513+
sw_if_index=iface_index,
514+
enable=True,
515+
)
516+
517+
@_Decorators.api_call
518+
def disable_dhcp_client(self, ifname: str) -> None:
519+
"""Disable DHCP client detection on a given interface
520+
521+
Args:
522+
ifname (str): name of an interface in kernel
523+
"""
524+
self.__vpp_api_client.api.dhcp_client_detect_enable_disable(
525+
sw_if_index=self.get_sw_if_index(ifname),
526+
enable=False,
527+
)

smoketest/scripts/cli/test_vpp.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ def test_01_vpp_basic(self):
140140
'plugin default { disable }',
141141
'plugin dpdk_plugin.so { enable }',
142142
'plugin linux_cp_plugin.so { enable }',
143+
'plugin dhcp_plugin.so { enable }',
143144
'dev 0000:00:00.0',
144145
'uio-bind-force',
145146
)
@@ -176,6 +177,14 @@ def test_01_vpp_basic(self):
176177
self.cli_delete(['interfaces', 'ethernet', interface, 'mtu'])
177178
self.cli_commit()
178179

180+
# set interface address as dhcp
181+
self.cli_set(['interfaces', 'ethernet', interface, 'address', 'dhcp'])
182+
self.cli_commit()
183+
184+
# check 'ip4-dhcp-client-detect' feature is enabled on interface
185+
_, out = rc_cmd(f'sudo vppctl show interface features {interface}')
186+
self.assertIn(f'ip4-dhcp-client-detect', out)
187+
179188
def test_02_vpp_vxlan(self):
180189
vni = '23'
181190
interface_vxlan = f'vxlan{vni}'

src/conf_mode/interfaces_ethernet.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -447,17 +447,27 @@ def apply(ethernet):
447447
if 'static_arp' in ethernet:
448448
call_dependents()
449449

450-
# If the interface is managed by the VPP DPDK driver, synchronize runtime
451-
# parameters between Linux and the corresponding VPP LCP interface
452-
if dict_search(f'vpp.settings.interface.{ifname}.driver', ethernet) == 'dpdk':
450+
vpp_iface_config = dict_search(f'vpp.settings.interface.{ifname}', ethernet)
451+
if vpp_iface_config and is_systemd_service_running('vpp.service'):
453452
vpp_api = VPPControl()
454-
# Find LCP pair
455-
lcp_pair = vpp_api.lcp_pair_find(vpp_name_hw=ifname)
456-
lcp_name = lcp_pair.get('vpp_name_kernel')
457-
# Sync MTU to VPP LCP pair interface
458-
if lcp_name:
459-
mtu = e.get_mtu()
460-
vpp_api.set_iface_mtu(lcp_name, mtu)
453+
454+
# Enable ip4-dhcp-client-detect feature for DHCP-configured interfaces.
455+
# This feature is required for VPP to process DHCP packets and assign addresses.
456+
if 'dhcp' in ethernet.get('address', []):
457+
vpp_api.enable_dhcp_client(ifname)
458+
else:
459+
vpp_api.disable_dhcp_client(ifname)
460+
461+
# If the interface is managed by the VPP DPDK driver, synchronize runtime
462+
# parameters between Linux and the corresponding VPP LCP interface
463+
if vpp_iface_config.get('driver') == 'dpdk':
464+
# Find LCP pair
465+
lcp_pair = vpp_api.lcp_pair_find(vpp_name_hw=ifname)
466+
lcp_name = lcp_pair.get('vpp_name_kernel')
467+
# Sync MTU to VPP LCP pair interface
468+
if lcp_name:
469+
mtu = e.get_mtu()
470+
vpp_api.set_iface_mtu(lcp_name, mtu)
461471

462472
return None
463473

0 commit comments

Comments
 (0)