Signed-off-by: Petr Machata <petrm(a)mellanox.com>
Reviewed-by: Yotam Gigi <yotamg(a)mellanox.com>
---
lnst/Controller/RecipeParser.py | 8 ++++----
lnst/Controller/Task.py | 30 ++++++++++++++++++++++++++++++
lnst/Slave/NetConfigDevice.py | 35 +++++++++++++++++++++++++++++++++++
schema-recipe.rng | 8 ++++++++
4 files changed, 77 insertions(+), 4 deletions(-)
diff --git a/lnst/Controller/RecipeParser.py b/lnst/Controller/RecipeParser.py
index 09233a7..7ecf100 100644
--- a/lnst/Controller/RecipeParser.py
+++ b/lnst/Controller/RecipeParser.py
@@ -188,12 +188,12 @@ class RecipeParser(XmlParser):
opts = self._process_options(opts_tag)
if len(opts) > 0:
iface["options"] = opts
- elif iface["type"] in ["vxlan"]:
- # real_dev of the VXLAN interface
+ elif iface["type"] in ["vxlan", "gre"]:
+ # real_dev of the interface
slaves_tag = iface_tag.find("slaves")
if slaves_tag is not None and len(slaves_tag) > 1:
- msg = "VXLAN '%s' needs one or no slave definition."\
- % iface["id"]
+ msg = "%s '%s' needs one or no slave definition."\
+ % (iface["type"], iface["id"])
raise RecipeError(msg, iface_tag)
if slaves_tag:
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index 1b18779..023e75d 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -495,6 +495,36 @@ class HostAPI(object):
return self._add_iface("vxlan", if_id, netns, ip, options, slaves)
+ def create_gre(self, ttl=None, tos=None,
+ key=None, ikey=None, okey=None,
+ seq=None, iseq=None, oseq=None,
+ csum=None, icsum=None, ocsum=None,
+ ul_iface=None,
+ local_ip=None, remote_ip=None,
+ if_id=None, netns=None, ip=None, options={}):
+
+ for v, itag, iv, otag, ov in [(key, "ikey", ikey, "okey",
okey),
+ (seq, "iseq", iseq, "oseq",
oseq),
+ (csum, "icsum", icsum, "ocsum",
ocsum)]:
+ if v is not None:
+ if iv is not None and iv != v:
+ raise TaskError("%s is overspecified" % itag)
+ if ov is not None and ov != v:
+ raise TaskError("%s is overspecified" % otag)
+
+ options.update({"ttl": ttl, "tos": tos,
+ "key": key, "ikey": ikey, "okey":
okey,
+ "seq": seq, "iseq": iseq, "oseq":
oseq,
+ "csum": csum, "icsum": icsum,
"ocsum": ocsum,
+ "local_ip": local_ip, "remote_ip":
remote_ip})
+
+ if ul_iface is not None:
+ slaves = [ul_iface]
+ else:
+ slaves = []
+
+ return self._add_iface("gre", 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 e47d80a..90e5126 100644
--- a/lnst/Slave/NetConfigDevice.py
+++ b/lnst/Slave/NetConfigDevice.py
@@ -124,6 +124,40 @@ class NetConfigDeviceEth(NetConfigDeviceGeneric):
exec_cmd("lldptool -i %s -V PFC -T enabled=none" %
config["name"])
exec_cmd("lldptool -i %s -L adminStatus=disabled" %
config["name"])
+class NetConfigDeviceGre(NetConfigDeviceGeneric):
+ _modulename = "gre"
+
+ 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)
+
+ for k in ("ttl", "tos", "key", "ikey",
"okey",
+ "local_ip", "remote_ip"):
+ v = get_option(config, k)
+ if v is not None:
+ flag = {"local_ip": "local",
+ "remote_ip": "remote"}.get(k, k)
+ params.append(" %s %s" % (flag, v))
+
+ for k in ("seq", "iseq", "oseq",
+ "csum", "icsum", "ocsum"):
+ v = get_option(config, k)
+ if v is not None and bool_it(v):
+ params.append(" " + k)
+
+ exec_cmd("ip tunnel add name %s mode gre%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):
@@ -787,6 +821,7 @@ type_class_mapping = {
"lo": NetConfigDeviceLoopback,
"vxlan": NetConfigDeviceVxlan,
"dummy": NetConfigDeviceDummy,
+ "gre": NetConfigDeviceGre,
}
def NetConfigDevice(dev_config, if_manager):
diff --git a/schema-recipe.rng b/schema-recipe.rng
index 1e845bf..7b856aa 100644
--- a/schema-recipe.rng
+++ b/schema-recipe.rng
@@ -141,6 +141,7 @@
<ref name="lo"/>
<ref name="vxlan"/>
<ref name="dummy"/>
+ <ref name="gre"/>
</choice>
</zeroOrMore>
</element>
@@ -361,6 +362,13 @@
</element>
</define>
+ <define name="gre">
+ <element name="gre">
+ <attribute name="id"/>
+ <ref name="softdevice"/>
+ </element>
+ </define>
+
<define name="softdevice">
<optional>
<attribute name="netns"/>
--
2.4.11