mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +03:00
networkd: Add support to configure proxy arp support to interfaces (#3020)
Fixes: #2889
This commit is contained in:
parent
d29030e593
commit
23d8b221c0
@ -548,6 +548,15 @@
|
||||
Defaults to unset.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><varname>ProxyARP=</varname></term>
|
||||
<listitem><para>A boolean. Configures proxy ARP. Proxy ARP is the technique in which one host,
|
||||
usually a router, answers ARP requests intended for another machine. By "faking" its identity,
|
||||
the router accepts responsibility for routing packets to the "real" destination. (see <ulink
|
||||
url="https://tools.ietf.org/html/rfc1027">RFC 1027</ulink>.
|
||||
Defaults to unset.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><varname>Bridge=</varname></term>
|
||||
<listitem>
|
||||
|
@ -165,6 +165,21 @@ static bool link_ipv6_forward_enabled(Link *link) {
|
||||
return link->network->ip_forward & ADDRESS_FAMILY_IPV6;
|
||||
}
|
||||
|
||||
static bool link_proxy_arp_enabled(Link *link) {
|
||||
assert(link);
|
||||
|
||||
if (link->flags & IFF_LOOPBACK)
|
||||
return false;
|
||||
|
||||
if (!link->network)
|
||||
return false;
|
||||
|
||||
if (link->network->proxy_arp < 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool link_ipv6_accept_ra_enabled(Link *link) {
|
||||
assert(link);
|
||||
|
||||
@ -1039,6 +1054,22 @@ static int link_set_bridge_fdb(Link *const link) {
|
||||
return r;
|
||||
}
|
||||
|
||||
static int link_set_proxy_arp(Link *const link) {
|
||||
const char *p = NULL;
|
||||
int r;
|
||||
|
||||
if (!link_proxy_arp_enabled(link))
|
||||
return 0;
|
||||
|
||||
p = strjoina("/proc/sys/net/ipv4/conf/", link->ifname, "/proxy_arp");
|
||||
|
||||
r = write_string_file(p, one_zero(link->network->proxy_arp), WRITE_STRING_FILE_VERIFY_ON_FAILURE);
|
||||
if (r < 0)
|
||||
log_link_warning_errno(link, r, "Cannot configure proxy ARP for interface: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int link_set_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
|
||||
_cleanup_link_unref_ Link *link = userdata;
|
||||
int r;
|
||||
@ -2167,6 +2198,10 @@ static int link_configure(Link *link) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = link_set_proxy_arp(link);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = link_set_ipv4_forward(link);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
@ -61,6 +61,7 @@ Network.IPv6PrivacyExtensions, config_parse_ipv6_privacy_extensions,
|
||||
Network.IPv6AcceptRouterAdvertisements, config_parse_tristate, 0, offsetof(Network, ipv6_accept_ra)
|
||||
Network.IPv6DuplicateAddressDetection, config_parse_int, 0, offsetof(Network, ipv6_dad_transmits)
|
||||
Network.IPv6HopLimit, config_parse_int, 0, offsetof(Network, ipv6_hop_limit)
|
||||
Network.ProxyARP, config_parse_tristate, 0, offsetof(Network, proxy_arp)
|
||||
Network.BindCarrier, config_parse_strv, 0, offsetof(Network, bind_carrier)
|
||||
Address.Address, config_parse_address, 0, 0
|
||||
Address.Peer, config_parse_address, 0, 0
|
||||
|
@ -132,6 +132,7 @@ static int network_load_one(Manager *manager, const char *filename) {
|
||||
network->ipv6_dad_transmits = -1;
|
||||
network->ipv6_hop_limit = -1;
|
||||
network->duid_type = _DUID_TYPE_INVALID;
|
||||
network->proxy_arp = -1;
|
||||
|
||||
r = config_parse(NULL, filename, file,
|
||||
"Match\0"
|
||||
|
@ -139,6 +139,7 @@ struct Network {
|
||||
int ipv6_accept_ra;
|
||||
int ipv6_dad_transmits;
|
||||
int ipv6_hop_limit;
|
||||
int proxy_arp;
|
||||
|
||||
union in_addr_union ipv6_token;
|
||||
IPv6PrivacyExtensions ipv6_privacy_extensions;
|
||||
|
Loading…
Reference in New Issue
Block a user