summaryrefslogtreecommitdiff
path: root/src/network/netdev
diff options
context:
space:
mode:
authorSusant Sahani <ssahani@gmail.com>2019-05-11 08:08:57 +0530
committerYu Watanabe <watanabe.yu+github@gmail.com>2019-05-12 00:39:13 +0200
commitd70c9bbd6ca598365b14c2004ea3ab6a5c3b3aad (patch)
tree3eb05cc9695c188c5cee84f45506012d4a82482c /src/network/netdev
parentcb367b17853d215ebcf2816118c1f53d003e5088 (diff)
downloadsystemd-d70c9bbd6ca598365b14c2004ea3ab6a5c3b3aad.tar.gz
networkd: Geneve add support for inherit for TTL
Diffstat (limited to 'src/network/netdev')
-rw-r--r--src/network/netdev/geneve.c47
-rw-r--r--src/network/netdev/geneve.h2
-rw-r--r--src/network/netdev/netdev-gperf.gperf2
3 files changed, 49 insertions, 2 deletions
diff --git a/src/network/netdev/geneve.c b/src/network/netdev/geneve.c
index 1b1cd2fc9e..3dc8f083cc 100644
--- a/src/network/netdev/geneve.c
+++ b/src/network/netdev/geneve.c
@@ -102,7 +102,11 @@ static int netdev_geneve_create(NetDev *netdev) {
return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_REMOTE/IFLA_GENEVE_REMOTE6 attribute: %m");
}
- if (v->ttl > 0) {
+ if (v->inherit) {
+ r = sd_netlink_message_append_u8(m, IFLA_GENEVE_TTL_INHERIT, 1);
+ if (r < 0)
+ return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_TTL_INHERIT attribute: %m");
+ } else {
r = sd_netlink_message_append_u8(m, IFLA_GENEVE_TTL, v->ttl);
if (r < 0)
return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_TTL attribute: %m");
@@ -271,6 +275,47 @@ int config_parse_geneve_flow_label(const char *unit,
return 0;
}
+int config_parse_geneve_ttl(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) {
+ Geneve *v = userdata;
+ unsigned f;
+ int r;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ if (streq(rvalue, "inherit"))
+ v->inherit = true;
+ else {
+ r = safe_atou(rvalue, &f);
+ if (r < 0) {
+ log_syntax(unit, LOG_ERR, filename, line, r,
+ "Failed to parse Geneve TTL '%s', ignoring assignment: %m", rvalue);
+ return 0;
+ }
+
+ if (f > 255) {
+ log_syntax(unit, LOG_ERR, filename, line, 0,
+ "Invalid Geneve TTL '%s'. TTL must be <= 255. Ignoring assignment.", rvalue);
+ return 0;
+ }
+
+ v->ttl = f;
+ }
+
+ return 0;
+}
+
static int netdev_geneve_verify(NetDev *netdev, const char *filename) {
Geneve *v = GENEVE(netdev);
diff --git a/src/network/netdev/geneve.h b/src/network/netdev/geneve.h
index 5f2f27c9bb..32f7f038ba 100644
--- a/src/network/netdev/geneve.h
+++ b/src/network/netdev/geneve.h
@@ -34,6 +34,7 @@ struct Geneve {
bool udpcsum;
bool udp6zerocsumtx;
bool udp6zerocsumrx;
+ bool inherit;
GeneveDF geneve_df;
union in_addr_union remote;
@@ -49,3 +50,4 @@ CONFIG_PARSER_PROTOTYPE(config_parse_geneve_vni);
CONFIG_PARSER_PROTOTYPE(config_parse_geneve_address);
CONFIG_PARSER_PROTOTYPE(config_parse_geneve_flow_label);
CONFIG_PARSER_PROTOTYPE(config_parse_geneve_df);
+CONFIG_PARSER_PROTOTYPE(config_parse_geneve_ttl);
diff --git a/src/network/netdev/netdev-gperf.gperf b/src/network/netdev/netdev-gperf.gperf
index 8f43088f13..e18d746bef 100644
--- a/src/network/netdev/netdev-gperf.gperf
+++ b/src/network/netdev/netdev-gperf.gperf
@@ -128,7 +128,7 @@ VXLAN.IPDoNotFragment, config_parse_df,
GENEVE.Id, config_parse_geneve_vni, 0, offsetof(Geneve, id)
GENEVE.Remote, config_parse_geneve_address, 0, offsetof(Geneve, remote)
GENEVE.TOS, config_parse_uint8, 0, offsetof(Geneve, tos)
-GENEVE.TTL, config_parse_uint8, 0, offsetof(Geneve, ttl)
+GENEVE.TTL, config_parse_geneve_ttl, 0, offsetof(Geneve, ttl)
GENEVE.UDPChecksum, config_parse_bool, 0, offsetof(Geneve, udpcsum)
GENEVE.UDP6ZeroCheckSumRx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumrx)
GENEVE.UDP6ZeroChecksumRx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumrx)