mirror of
https://github.com/systemd/systemd
synced 2024-09-06 16:56:43 +00:00
networkd: add support for tunnel encap limit
The Tunnel Encapsulation Limit option specifies how many additional levels of encapsulation are permitted to be prepended to the packet
This commit is contained in:
parent
933f08ad7f
commit
b48288868a
|
@ -39,6 +39,7 @@ Tunnel.DiscoverPathMTU, config_parse_bool, 0,
|
|||
Tunnel.Mode, config_parse_ip6tnl_mode, 0, offsetof(Tunnel, ip6tnl_mode)
|
||||
Tunnel.IPv6FlowLabel, config_parse_ipv6_flowlabel, 0, offsetof(Tunnel, ipv6_flowlabel)
|
||||
Tunnel.CopyDSCP, config_parse_bool, 0, offsetof(Tunnel, copy_dscp)
|
||||
Tunnel.EncapsulationLimit, config_parse_encap_limit, 0, offsetof(Tunnel, encap_limit)
|
||||
Peer.Name, config_parse_ifname, 0, offsetof(Veth, ifname_peer)
|
||||
Peer.MACAddress, config_parse_hwaddr, 0, offsetof(Veth, mac_peer)
|
||||
VXLAN.Id, config_parse_uint64, 0, offsetof(VxLan, id)
|
||||
|
|
|
@ -284,6 +284,12 @@ static int netdev_ip6tnl_fill_message_create(NetDev *netdev, Link *link, sd_netl
|
|||
if (t->copy_dscp)
|
||||
t->flags |= IP6_TNL_F_RCV_DSCP_COPY;
|
||||
|
||||
if (t->encap_limit != IPV6_DEFAULT_TNL_ENCAP_LIMIT) {
|
||||
r = sd_netlink_message_append_u8(m, IFLA_IPTUN_ENCAP_LIMIT, t->encap_limit);
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_ENCAP_LIMIT attribute: %m");
|
||||
}
|
||||
|
||||
r = sd_netlink_message_append_u32(m, IFLA_IPTUN_FLAGS, t->flags);
|
||||
if (r < 0)
|
||||
return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_FLAGS attribute: %m");
|
||||
|
@ -442,6 +448,45 @@ int config_parse_ipv6_flowlabel(const char* unit,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_encap_limit(const char* unit,
|
||||
const char *filename,
|
||||
unsigned line,
|
||||
const char *section,
|
||||
unsigned section_line,
|
||||
const char *lvalue,
|
||||
int ltype,
|
||||
const char *rvalue,
|
||||
void *data,
|
||||
void *userdata) {
|
||||
Tunnel *t = userdata;
|
||||
int k = 0;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
|
||||
if (streq(rvalue, "none"))
|
||||
t->flags |= IP6_TNL_F_IGN_ENCAP_LIMIT;
|
||||
else {
|
||||
r = safe_atoi(rvalue, &k);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to parse Tunnel Encapsulation Limit option, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (k > 255 || k < 0)
|
||||
log_syntax(unit, LOG_ERR, filename, line, k, "Invalid Tunnel Encapsulation value, ignoring: %d", k);
|
||||
else {
|
||||
t->encap_limit = k;
|
||||
t->flags &= ~IP6_TNL_F_IGN_ENCAP_LIMIT;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ipip_init(NetDev *n) {
|
||||
Tunnel *t = IPIP(n);
|
||||
|
||||
|
|
|
@ -95,3 +95,9 @@ int config_parse_ipv6_flowlabel(const char *unit, const char *filename,
|
|||
unsigned section_line, const char *lvalue,
|
||||
int ltype, const char *rvalue, void *data,
|
||||
void *userdata);
|
||||
|
||||
int config_parse_encap_limit(const char *unit, const char *filename,
|
||||
unsigned line, const char *section,
|
||||
unsigned section_line, const char *lvalue,
|
||||
int ltype, const char *rvalue, void *data,
|
||||
void *userdata);
|
||||
|
|
Loading…
Reference in a new issue