From 918049ad53fb5136403b0a03e454d29edbcb0363 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Sat, 1 Dec 2018 18:21:20 +0530 Subject: [PATCH 1/2] networkd: Add support to configure ISATAP tunnel Let's just reuse the code of sit tunnel to create a ISATAP tunnel. Matter of turning a flag Please see https://elixir.bootlin.com/linux/v4.19.6/source/net/ipv6/sit.c#L208 --- man/systemd.netdev.xml | 7 +++++++ src/network/netdev/netdev-gperf.gperf | 1 + src/network/netdev/tunnel.c | 12 ++++++++++++ src/network/netdev/tunnel.h | 1 + test/fuzz/fuzz-netdev-parser/directives.netdev | 1 + 5 files changed, 22 insertions(+) diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml index f17a6a9619..67ccc66dd8 100644 --- a/man/systemd.netdev.xml +++ b/man/systemd.netdev.xml @@ -924,6 +924,13 @@ applicable to SIT tunnels. + + ISATAP= + + Takes a boolean. If set, configures the tunnel as Intra-Site Automatic Tunnel Addressing Protocol (ISATAP) tunnel. + Only applicable to SIT tunnels. When unset, the kernel's default will be used. + + SerializeTunneledPackets= diff --git a/src/network/netdev/netdev-gperf.gperf b/src/network/netdev/netdev-gperf.gperf index 49752c2d8a..fbc7a59e9e 100644 --- a/src/network/netdev/netdev-gperf.gperf +++ b/src/network/netdev/netdev-gperf.gperf @@ -73,6 +73,7 @@ Tunnel.Encapsulation, config_parse_fou_encap_type, 0, Tunnel.IPv6RapidDeploymentPrefix, config_parse_6rd_prefix, 0, 0 Tunnel.ERSPANIndex, config_parse_uint32, 0, offsetof(Tunnel, erspan_index) Tunnel.SerializeTunneledPackets, config_parse_tristate, 0, offsetof(Tunnel, erspan_sequence) +Tunnel.ISATAP, config_parse_tristate, 0, offsetof(Tunnel, isatap) FooOverUDP.Protocol, config_parse_uint8, 0, offsetof(FouTunnel, fou_protocol) FooOverUDP.Encapsulation, config_parse_fou_encap_type, 0, offsetof(FouTunnel, fou_encap_type) FooOverUDP.Port, config_parse_ip_port, 0, offsetof(FouTunnel, port) diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index 36f1fe7b03..684edddb5f 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -118,6 +118,7 @@ static int netdev_sit_fill_message_create(NetDev *netdev, Link *link, sd_netlink r = sd_netlink_message_append_in6_addr(m, IFLA_IPTUN_6RD_PREFIX, &t->sixrd_prefix); if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_6RD_PREFIX attribute: %m"); + /* u16 is deliberate here, even though we're passing a netmask that can never be >128. The kernel is * expecting to receive the prefixlen as a u16. */ @@ -126,6 +127,16 @@ static int netdev_sit_fill_message_create(NetDev *netdev, Link *link, sd_netlink return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_6RD_PREFIXLEN attribute: %m"); } + if (t->isatap >= 0) { + uint16_t flags = 0; + + SET_FLAG(flags, SIT_ISATAP, t->isatap); + + r = sd_netlink_message_append_u16(m, IFLA_IPTUN_FLAGS, flags); + if (r < 0) + return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_FLAGS attribute: %m"); + } + return r; } @@ -761,6 +772,7 @@ static void sit_init(NetDev *n) { assert(t); t->pmtudisc = true; + t->isatap = -1; } static void vti_init(NetDev *n) { diff --git a/src/network/netdev/tunnel.h b/src/network/netdev/tunnel.h index 51b61637ad..8f511dd1f6 100644 --- a/src/network/netdev/tunnel.h +++ b/src/network/netdev/tunnel.h @@ -30,6 +30,7 @@ typedef struct Tunnel { int ipv6_flowlabel; int allow_localremote; int erspan_sequence; + int isatap; unsigned ttl; unsigned tos; diff --git a/test/fuzz/fuzz-netdev-parser/directives.netdev b/test/fuzz/fuzz-netdev-parser/directives.netdev index 19226df806..5a8d41eb68 100644 --- a/test/fuzz/fuzz-netdev-parser/directives.netdev +++ b/test/fuzz/fuzz-netdev-parser/directives.netdev @@ -76,6 +76,7 @@ FOUSourcePort= IPv6RapidDeploymentPrefix= ERSPANIndex= SerializeTunneledPackets= +ISATAP= [VXLAN] UDP6ZeroChecksumRx= ARPProxy= From d0e728b6cdba9148e251c3fa7c29e067168c1535 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Sun, 2 Dec 2018 20:29:13 +0530 Subject: [PATCH 2/2] test-network: add test for ISATAP --- test/test-network/conf/25-isatap-tunnel.netdev | 8 ++++++++ test/test-network/conf/isatap.network | 5 +++++ test/test-network/systemd-networkd-tests.py | 14 ++++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 test/test-network/conf/25-isatap-tunnel.netdev create mode 100644 test/test-network/conf/isatap.network diff --git a/test/test-network/conf/25-isatap-tunnel.netdev b/test/test-network/conf/25-isatap-tunnel.netdev new file mode 100644 index 0000000000..3aa882a261 --- /dev/null +++ b/test/test-network/conf/25-isatap-tunnel.netdev @@ -0,0 +1,8 @@ +[NetDev] +Name=isataptun99 +Kind=sit + +[Tunnel] +Local=10.65.223.238 +Remote=10.65.223.239 +ISATAP=true diff --git a/test/test-network/conf/isatap.network b/test/test-network/conf/isatap.network new file mode 100644 index 0000000000..e8d03ed6bd --- /dev/null +++ b/test/test-network/conf/isatap.network @@ -0,0 +1,5 @@ +[Match] +Name=dummy98 + +[Network] +Tunnel=isataptun99 diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 806f4a496c..aeedb65507 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -166,7 +166,7 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities): 'macvlan99', 'ipvlan99', 'vxlan99', 'veth99', 'vrf99', 'tun99', 'tap99', 'vcan99', 'geneve99', 'dummy98', 'ipiptun99', 'sittun99', '6rdtun99', 'gretap99', 'vtitun99', 'vti6tun99','ip6tnl99', 'gretun99', 'ip6gretap99', - 'wg99', 'dropin-test', 'erspan-test'] + 'wg99', 'dropin-test', 'erspan-test', 'isataptun99'] units = ['25-bridge.netdev', '25-bond.netdev', '21-vlan.netdev', '11-dummy.netdev', '21-vlan.network', '21-macvtap.netdev', 'macvtap.network', '21-macvlan.netdev', 'macvlan.network', 'vxlan.network', @@ -176,7 +176,8 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities): '25-erspan-tunnel.netdev', '25-gre-tunnel.netdev', '25-gretap-tunnel.netdev', '25-vti-tunnel.netdev', '25-vti6-tunnel.netdev', '12-dummy.netdev', 'gre.network', 'ipip.network', 'ip6gretap.network', 'gretun.network', 'ip6tnl.network', '25-tap.netdev', 'vti6.network', 'vti.network', 'gretap.network', - 'sit.network', '25-ipip-tunnel-independent.netdev', '25-wireguard.netdev', '6rd.network', '10-dropin-test.netdev'] + 'sit.network', '25-ipip-tunnel-independent.netdev', '25-wireguard.netdev', '6rd.network', '10-dropin-test.netdev', + '25-isatap-tunnel.netdev', 'isatap.network'] def setUp(self): self.link_remove(self.links) @@ -389,6 +390,15 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities): self.assertTrue(self.link_exits('dummy98')) self.assertTrue(self.link_exits('sittun99')) + def test_isatap_tunnel(self): + self.copy_unit_to_networkd_unit_path('12-dummy.netdev', '25-isatap-tunnel.netdev', 'isatap.network') + self.start_networkd() + + self.assertTrue(self.link_exits('dummy98')) + self.assertTrue(self.link_exits('isataptun99')) + output = subprocess.check_output(['ip', '-d', 'link', 'show', 'isataptun99']).rstrip().decode('utf-8') + self.assertRegex(output, "isatap ") + def test_6rd_tunnel(self): self.copy_unit_to_networkd_unit_path('12-dummy.netdev', '25-6rd-tunnel.netdev', '6rd.network') self.start_networkd()