diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index f24bf40159..44354f8bf2 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -1893,6 +1893,21 @@
When unset, the kernel's default will be used.
+
+ ProxyARP=
+
+ Takes a boolean. Configures whether proxy ARP to be enabled on this port.
+ When unset, the kernel's default will be used.
+
+
+
+ ProxyARPWiFi=
+
+ Takes a boolean. Configures whether proxy ARP to be enabled on this port
+ which meets extended requirements by IEEE 802.11 and Hotspot 2.0 specifications.
+ When unset, the kernel's default will be used.
+
+
Cost=
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 3c8b5c5cb4..ea4576b6ab 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -1592,7 +1592,6 @@ static int link_set_bridge(Link *link) {
r = sd_netlink_message_append_u8(req, IFLA_BRPORT_PROTECT, link->network->allow_port_to_be_root);
if (r < 0)
return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
-
}
if (link->network->unicast_flood >= 0) {
@@ -1625,6 +1624,18 @@ static int link_set_bridge(Link *link) {
return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_LEARNING attribute: %m");
}
+ if (link->network->bridge_proxy_arp >= 0) {
+ r = sd_netlink_message_append_u8(req, IFLA_BRPORT_PROXYARP, link->network->bridge_proxy_arp);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_PROXYARP attribute: %m");
+ }
+
+ if (link->network->bridge_proxy_arp_wifi >= 0) {
+ r = sd_netlink_message_append_u8(req, IFLA_BRPORT_PROXYARP_WIFI, link->network->bridge_proxy_arp_wifi);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_PROXYARP_WIFI attribute: %m");
+ }
+
if (link->network->cost != 0) {
r = sd_netlink_message_append_u32(req, IFLA_BRPORT_COST, link->network->cost);
if (r < 0)
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index 98c2241fca..dded4c701c 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -177,6 +177,8 @@ Bridge.MulticastFlood, config_parse_tristate,
Bridge.MulticastToUnicast, config_parse_tristate, 0, offsetof(Network, multicast_to_unicast)
Bridge.NeighborSuppression, config_parse_tristate, 0, offsetof(Network, neighbor_suppression)
Bridge.Learning, config_parse_tristate, 0, offsetof(Network, learning)
+Bridge.ProxyARP, config_parse_tristate, 0, offsetof(Network, bridge_proxy_arp)
+Bridge.ProxyARPWiFi, config_parse_tristate, 0, offsetof(Network, bridge_proxy_arp_wifi)
Bridge.Priority, config_parse_bridge_port_priority, 0, offsetof(Network, priority)
BridgeFDB.MACAddress, config_parse_fdb_hwaddr, 0, 0
BridgeFDB.VLANId, config_parse_fdb_vlan_id, 0, 0
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index 6e0e1eae08..255aeed3a6 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -386,6 +386,8 @@ int network_load_one(Manager *manager, const char *filename) {
.multicast_to_unicast = -1,
.neighbor_suppression = -1,
.learning = -1,
+ .bridge_proxy_arp = -1,
+ .bridge_proxy_arp_wifi = -1,
.priority = LINK_BRIDGE_PORT_PRIORITY_INVALID,
.lldp_mode = LLDP_MODE_ROUTERS_ONLY,
diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h
index 9ee8fb72b8..3886d629a4 100644
--- a/src/network/networkd-network.h
+++ b/src/network/networkd-network.h
@@ -181,6 +181,8 @@ struct Network {
int multicast_to_unicast;
int neighbor_suppression;
int learning;
+ int bridge_proxy_arp;
+ int bridge_proxy_arp_wifi;
uint32_t cost;
uint16_t priority;
diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network
index 9296c16c49..0c468f579f 100644
--- a/test/fuzz/fuzz-network-parser/directives.network
+++ b/test/fuzz/fuzz-network-parser/directives.network
@@ -10,6 +10,8 @@ MulticastToUnicast=
MulticastFlood=
NeighborSuppression=
Learning=
+ProxyARP=
+ProxyARPWiFi=
[Match]
KernelVersion=
Type=