Signed-off-by: Petr Machata <petrm(a)mellanox.com>
Reviewed-by: Yotam Gigi <yotamg(a)mellanox.com>
---
lnst/Controller/RecipeParser.py | 2 +-
lnst/Controller/Task.py | 14 ++++++++++++++
lnst/Slave/NetConfigDevice.py | 30 ++++++++++++++++++++++++++++++
schema-recipe.rng | 8 ++++++++
4 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/lnst/Controller/RecipeParser.py b/lnst/Controller/RecipeParser.py
index 7ecf100..742c144 100644
--- a/lnst/Controller/RecipeParser.py
+++ b/lnst/Controller/RecipeParser.py
@@ -188,7 +188,7 @@ class RecipeParser(XmlParser):
opts = self._process_options(opts_tag)
if len(opts) > 0:
iface["options"] = opts
- elif iface["type"] in ["vxlan", "gre"]:
+ elif iface["type"] in ["vxlan", "gre",
"ipip"]:
# real_dev of the interface
slaves_tag = iface_tag.find("slaves")
if slaves_tag is not None and len(slaves_tag) > 1:
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index 023e75d..14bc059 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -525,6 +525,20 @@ class HostAPI(object):
return self._add_iface("gre", if_id, netns, ip, options, slaves)
+ def create_ipip(self, ttl=None, tos=None, ul_iface=None,
+ local_ip=None, remote_ip=None,
+ if_id=None, netns=None, ip=None, options={}):
+
+ options.update({"ttl": ttl, "tos": tos,
+ "local_ip": local_ip, "remote_ip":
remote_ip})
+
+ if ul_iface is not None:
+ slaves = [ul_iface]
+ else:
+ slaves = []
+
+ return self._add_iface("ipip", if_id, netns, ip, options, slaves)
+
def create_dummy(self, if_id=None, netns=None, ip=None):
return self._add_iface("dummy", if_id, netns, ip, {}, [])
diff --git a/lnst/Slave/NetConfigDevice.py b/lnst/Slave/NetConfigDevice.py
index 90e5126..a3376a7 100644
--- a/lnst/Slave/NetConfigDevice.py
+++ b/lnst/Slave/NetConfigDevice.py
@@ -159,6 +159,35 @@ class NetConfigDeviceGre(NetConfigDeviceGeneric):
dev_name = self._dev_config["name"]
exec_cmd("ip link del %s" % dev_name)
+class NetConfigDeviceIpIp(NetConfigDeviceGeneric):
+ _modulename = "ipip"
+
+ def create(self):
+ config = self._dev_config
+ dev_name = config["name"]
+ params = []
+
+ slaves = get_slaves(config)
+ if len(slaves) == 1:
+ ul_id = slaves[0]
+ ul_name = self._if_manager.get_mapped_device(ul_id).get_name()
+ params.append(" dev %s" % ul_name)
+
+ v = get_option(config, "local_ip")
+ if v is not None:
+ params.append(" local %s" % v)
+
+ v = get_option(config, "remote_ip")
+ if v is not None:
+ params.append(" remote %s" % v)
+
+ exec_cmd("ip tunnel add name %s mode ipip%s"
+ % (dev_name, "".join(params)))
+
+ def destroy(self):
+ dev_name = self._dev_config["name"]
+ exec_cmd("ip link del %s" % dev_name)
+
class NetConfigDeviceLoopback(NetConfigDeviceGeneric):
def configure(self):
config = self._dev_config
@@ -822,6 +851,7 @@ type_class_mapping = {
"vxlan": NetConfigDeviceVxlan,
"dummy": NetConfigDeviceDummy,
"gre": NetConfigDeviceGre,
+ "ipip": NetConfigDeviceIpIp,
}
def NetConfigDevice(dev_config, if_manager):
diff --git a/schema-recipe.rng b/schema-recipe.rng
index 7b856aa..6114437 100644
--- a/schema-recipe.rng
+++ b/schema-recipe.rng
@@ -142,6 +142,7 @@
<ref name="vxlan"/>
<ref name="dummy"/>
<ref name="gre"/>
+ <ref name="ipip"/>
</choice>
</zeroOrMore>
</element>
@@ -369,6 +370,13 @@
</element>
</define>
+ <define name="ipip">
+ <element name="ipip">
+ <attribute name="id"/>
+ <ref name="softdevice"/>
+ </element>
+ </define>
+
<define name="softdevice">
<optional>
<attribute name="netns"/>
--
2.4.11