[PATCH] NetConfigDeviceVxlan: Allow to specify extra ip flags for vxlan device
by Roi Dayan
This is sometimes and the flags cannot be changed after the device
is created. for example we need to allow zero ipv6 checksum when working
with OVS vxlan interface against native vxlan interface.
We need to set udp6zerocsumrx udp6zerocsumtx.
Signed-off-by: Roi Dayan <roid(a)mellanox.com>
---
lnst/Slave/NetConfigDevice.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/lnst/Slave/NetConfigDevice.py b/lnst/Slave/NetConfigDevice.py
index cadce06..a94fd71 100644
--- a/lnst/Slave/NetConfigDevice.py
+++ b/lnst/Slave/NetConfigDevice.py
@@ -333,6 +333,7 @@ class NetConfigDeviceVxlan(NetConfigDeviceGeneric):
vxlan_id = int(get_option(config, "id"))
group_ip = get_option(config, "group_ip")
remote_ip = get_option(config, "remote_ip")
+ extra = get_option(config, "extra") or ''
if group_ip:
group_or_remote = "group %s" % group_ip
@@ -347,12 +348,13 @@ class NetConfigDeviceVxlan(NetConfigDeviceGeneric):
else:
dstport = int(dstport)
- exec_cmd("ip link add %s type vxlan id %d %s %s dstport %d"
+ exec_cmd("ip link add %s type vxlan id %d %s %s dstport %d %s"
% (dev_name,
vxlan_id,
dev_param,
group_or_remote,
- dstport))
+ dstport,
+ extra))
def destroy(self):
dev_name = self._dev_config["name"]
--
2.7.0
6 years, 2 months
[PATCH LNST 00/11] L2 MC tests
by Nogah Frankel
This patchset adds some basic test for L2 MC behaviours.
The first three patches add a MC related commands to LNST.
The 4th patch adds the ability to count CPU traffic, so it will be possible
to check if the traffic were really offloaded and hadn't gone via slowpath.
Patches 5 & 6 update the current MDB test to be more generic and to check
that the traffic is offloaded.
Patch 7 adds a test to check that the MDB is ignored when MC is disabled.
Patches 8-10 add tests for mrouter bridge config option (as in IGMP
configuration, not to be confused with any L3 property).
Patch 11 adds a test for unregistered MC packets.
This patchset does not address:
* LAG in MC.
* static MDB,
Nogah Frankel (11):
common: add a consts file for mrouter port related consts
Interface: add mcast flood and mrouter set functions
Bridge: add set mcast bridge functions
Interface: Add cpu ifstat function
recipes: switchdev: TestLib: Change iperf_mc to be more generic
recipes: switchdev: TestLib: Check whether packets goes in slowpath
recipes: switchdev: Add the mdb mcast disabled test
recipes: switchdev: Add basic mrouter test
recipes: switchdev: Add mrouter learning test
recipes: switchdev: Add a test for many floods with mrouters
recipes: switchdev: Add a test for unregistered MC traffic
lnst/Common/Consts.py | 16 +++
lnst/Controller/Machine.py | 20 +++
lnst/Controller/Task.py | 15 +++
lnst/Slave/BridgeTool.py | 10 ++
lnst/Slave/InterfaceManager.py | 42 ++++++
lnst/Slave/NetTestSlave.py | 43 +++++++
recipes/switchdev/TestLib.py | 94 +++++++-------
recipes/switchdev/l2-020-bridge_mdb.py | 38 ++++--
.../switchdev/l2-022-bridge_mdb_mcast_disabled.py | 85 ++++++++++++
.../switchdev/l2-022-bridge_mdb_mcast_disabled.xml | 70 ++++++++++
.../l2-023-bridge_mdb_mc_router_port_basic.py | 108 ++++++++++++++++
.../l2-023-bridge_mdb_mc_router_port_basic.xml | 70 ++++++++++
.../l2-024-bridge_mdb_mc_router_port_learning.py | 91 +++++++++++++
.../l2-024-bridge_mdb_mc_router_port_learning.xml | 70 ++++++++++
.../l2-025-bridge_mdb_flood_with_mc_router.py | 142 +++++++++++++++++++++
.../l2-025-bridge_mdb_flood_with_mc_router.xml | 70 ++++++++++
recipes/switchdev/l2-026-bridge_mdb_unreg_flood.py | 92 +++++++++++++
.../switchdev/l2-026-bridge_mdb_unreg_flood.xml | 70 ++++++++++
18 files changed, 1093 insertions(+), 53 deletions(-)
create mode 100644 lnst/Common/Consts.py
create mode 100644 recipes/switchdev/l2-022-bridge_mdb_mcast_disabled.py
create mode 100644 recipes/switchdev/l2-022-bridge_mdb_mcast_disabled.xml
create mode 100644 recipes/switchdev/l2-023-bridge_mdb_mc_router_port_basic.py
create mode 100644 recipes/switchdev/l2-023-bridge_mdb_mc_router_port_basic.xml
create mode 100644 recipes/switchdev/l2-024-bridge_mdb_mc_router_port_learning.py
create mode 100644 recipes/switchdev/l2-024-bridge_mdb_mc_router_port_learning.xml
create mode 100644 recipes/switchdev/l2-025-bridge_mdb_flood_with_mc_router.py
create mode 100644 recipes/switchdev/l2-025-bridge_mdb_flood_with_mc_router.xml
create mode 100644 recipes/switchdev/l2-026-bridge_mdb_unreg_flood.py
create mode 100644 recipes/switchdev/l2-026-bridge_mdb_unreg_flood.xml
--
2.4.3
6 years, 2 months
[PATCH] recipes: remove pin_dev_irqs from vxlan tests with virtual
guests
by Jan Tluka
There's no reason to pin guest's interfaces to a CPU. Only host's interfaces
should be pinned.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
recipes/regression_tests/phase3/2_virt_ovs_vxlan.py | 2 +-
recipes/regression_tests/phase3/vxlan_multicast.py | 1 -
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/recipes/regression_tests/phase3/2_virt_ovs_vxlan.py b/recipes/regression_tests/phase3/2_virt_ovs_vxlan.py
index 1899711..ad3bccf 100644
--- a/recipes/regression_tests/phase3/2_virt_ovs_vxlan.py
+++ b/recipes/regression_tests/phase3/2_virt_ovs_vxlan.py
@@ -73,7 +73,7 @@ if nperf_cpupin:
h2_if = host2.get_interface("if1")
#this will pin devices irqs to cpu #0
- for m, d in [(host1, h1_if), (host2, h2_if), (guest1, g1_nic), (guest2, g2_nic), (guest3, g3_nic), (guest4, g4_nic)]:
+ for m, d in [(host1, h1_if), (host2, h2_if)]:
pin_dev_irqs(m, d, 0)
nperf_opts = ""
diff --git a/recipes/regression_tests/phase3/vxlan_multicast.py b/recipes/regression_tests/phase3/vxlan_multicast.py
index 31596fc..f9bff44 100644
--- a/recipes/regression_tests/phase3/vxlan_multicast.py
+++ b/recipes/regression_tests/phase3/vxlan_multicast.py
@@ -56,7 +56,6 @@ test_if3.set_mtu(mtu)
if nperf_cpupin:
m1.run("service irqbalance stop")
m2.run("service irqbalance stop")
- g1.run("service irqbalance stop")
m1_phy1 = m1.get_interface("eth1")
m2_phy1 = m2.get_interface("eth1")
--
2.9.5
6 years, 2 months
[PATCH] IRQ: parse msi_irqs directory if /proc/interrupts does not
contain device name
by Jan Tluka
For some NICs, e.g. Mellanox ones, the /proc/interrupts file does not contain
device name that we use to identify NIC IRQs. Based on Mellanox script
get_irq_list I added parsing of msi_irqs under /sys/class/net directory if the
former method returned empty list.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
lnst/RecipeCommon/IRQ.py | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/lnst/RecipeCommon/IRQ.py b/lnst/RecipeCommon/IRQ.py
index 825a2b3..88d673b 100644
--- a/lnst/RecipeCommon/IRQ.py
+++ b/lnst/RecipeCommon/IRQ.py
@@ -24,6 +24,15 @@ def pin_dev_irqs(machine, device, cpu):
% device.get_devname())
res = pi.get_result()
intrs = res["res_data"]["stdout"]
+ split = intrs.split('\n')
+ if len(split) == 1 and split[0] == '':
+ # try to get interrupts from msi_irqs directory
+ pi = machine.run("dev_irqs=/sys/class/net/%s/device/msi_irqs; "
+ "[ -d $dev_irqs ] && ls -1 $dev_irqs"
+ % device.get_devname())
+ res = pi.get_result()
+ intrs = res["res_data"]["stdout"]
+
for intr in intrs.split('\n'):
try:
int(intr)
--
2.9.5
6 years, 2 months
[patch lnst-next 1/2] fix ipr.link arguments
by Jiri Pirko
From: Jiri Pirko <jiri(a)mellanox.com>
Would be nice to have some helper for this, also most of the changes are
untested.
Signed-off-by: Jiri Pirko <jiri(a)mellanox.com>
---
lnst/Devices/Device.py | 8 ++++----
lnst/Devices/MacvlanDevice.py | 11 ++++++-----
lnst/Devices/SoftDevice.py | 3 +--
lnst/Devices/VethDevice.py | 8 +++++---
lnst/Devices/VlanDevice.py | 9 +++++----
lnst/Devices/VxlanDevice.py | 18 +++++++++++++-----
6 files changed, 34 insertions(+), 23 deletions(-)
diff --git a/lnst/Devices/Device.py b/lnst/Devices/Device.py
index bd750a9..f71cb9d 100644
--- a/lnst/Devices/Device.py
+++ b/lnst/Devices/Device.py
@@ -251,7 +251,7 @@ class Device(object):
"""
with pyroute2.IPRoute() as ipr:
try:
- ipr.link("set", index=self.ifindex, IFLA_IFNAME=new_name)
+ ipr.link("set", index=self.ifindex, ifname=new_name)
self._if_manager.handle_netlink_msgs()
except pyroute2.netlink.NetlinkError:
log_exc_traceback()
@@ -278,7 +278,7 @@ class Device(object):
addr = hwaddress(addr)
with pyroute2.IPRoute() as ipr:
try:
- ipr.link("set", index=self.ifindex, IFLA_ADDRESS=str(addr))
+ ipr.link("set", index=self.ifindex, address=str(addr))
self._if_manager.handle_netlink_msgs()
except pyroute2.netlink.NetlinkError:
log_exc_traceback()
@@ -321,7 +321,7 @@ class Device(object):
value -- the new MTU."""
with pyroute2.IPRoute() as ipr:
try:
- ipr.link("set", index=self.ifindex, IFLA_MTU=value)
+ ipr.link("set", index=self.ifindex, mtu=value)
self._if_manager.handle_netlink_msgs()
except pyroute2.netlink.NetlinkError:
log_exc_traceback()
@@ -355,7 +355,7 @@ class Device(object):
raise DeviceError("Invalid dev argument.")
with pyroute2.IPRoute() as ipr:
try:
- ipr.link("set", index=self.ifindex, IFLA_MASTER=master_idx)
+ ipr.link("set", index=self.ifindex, master=master_idx)
self._if_manager.handle_netlink_msgs()
except pyroute2.netlink.NetlinkError:
log_exc_traceback()
diff --git a/lnst/Devices/MacvlanDevice.py b/lnst/Devices/MacvlanDevice.py
index 4a62844..cd731f9 100644
--- a/lnst/Devices/MacvlanDevice.py
+++ b/lnst/Devices/MacvlanDevice.py
@@ -29,11 +29,12 @@ class MacvlanDevice(SoftDevice):
def _create(self):
with pyroute2.IPRoute() as ipr:
try:
- ipr.link("add", IFLA_IFNAME=self.name,
- IFLA_INFO_KIND=self._link_type,
- IFLA_INFO_LINK=self._real_dev.ifindex,
- IFLA_MACVLAN_MODE=self._mode,
- IFLA_MACVLAN_MACADDR=self._hwaddr)
+ data = {"attrs": [["IFLA_MACVLAN_MODE", self._mode],
+ ["IFLA_MACVLAN_MACADDR", self._hwaddr]]}
+ linkinfo = {"attrs": [["IFLA_INFO_KIND", self._link_type],
+ ["IFLA_INFO_DATA", data]]}
+ ipr.link("add", ifname=self.name, link=self._real_dev.ifindex,
+ IFLA_LINKINFO=linkinfo)
self._if_manager.handle_netlink_msgs()
except pyroute2.netlink.NetlinkError:
log_exc_traceback()
diff --git a/lnst/Devices/SoftDevice.py b/lnst/Devices/SoftDevice.py
index 5b903e3..753ca62 100644
--- a/lnst/Devices/SoftDevice.py
+++ b/lnst/Devices/SoftDevice.py
@@ -36,8 +36,7 @@ class SoftDevice(Device):
def _create(self):
with pyroute2.IPRoute() as ipr:
try:
- ipr.link("add", IFLA_IFNAME=self.name,
- IFLA_INFO_KIND=self._link_type)
+ ipr.link("add", ifname=self.name, kind=self._link_type)
self._if_manager.handle_netlink_msgs()
except pyroute2.netlink.NetlinkError:
log_exc_traceback()
diff --git a/lnst/Devices/VethDevice.py b/lnst/Devices/VethDevice.py
index 2ada039..38bcce3 100644
--- a/lnst/Devices/VethDevice.py
+++ b/lnst/Devices/VethDevice.py
@@ -36,9 +36,11 @@ class VethDevice(SoftDevice):
def _create(self):
with pyroute2.IPRoute() as ipr:
try:
- ipr.link("add", IFLA_IFNAME=self.name,
- IFLA_INFO_KIND=self._link_type,
- VETH_INFO_PEER=self._peer_name)
+ data = {"attrs": [["VETH_INFO_PEER", self._peer_name]]}
+ linkinfo = {"attrs": [["IFLA_INFO_KIND", self._link_type],
+ ["IFLA_INFO_DATA", data]]}
+ ipr.link("add", ifname=self.name, link=self._real_dev.ifindex,
+ IFLA_LINKINFO=linkinfo)
self._if_manager.handle_netlink_msgs()
except pyroute2.netlink.NetlinkError:
log_exc_traceback()
diff --git a/lnst/Devices/VlanDevice.py b/lnst/Devices/VlanDevice.py
index 49290ff..bf1fa83 100644
--- a/lnst/Devices/VlanDevice.py
+++ b/lnst/Devices/VlanDevice.py
@@ -36,10 +36,11 @@ class VlanDevice(SoftDevice):
def _create(self):
with pyroute2.IPRoute() as ipr:
try:
- ipr.link("add", IFLA_IFNAME=self.name,
- IFLA_INFO_KIND=self._link_type,
- IFLA_INFO_LINK=self.real_dev.ifindex,
- IFLA_VLAN_ID=self.vlan_id)
+ data = {"attrs": [["IFLA_VLAN_ID", self._vlan_id]]}
+ linkinfo = {"attrs": [["IFLA_INFO_KIND", self._link_type],
+ ["IFLA_INFO_DATA", data]]}
+ ipr.link("add", ifname=self.name, link=self._real_dev.ifindex,
+ IFLA_LINKINFO=linkinfo)
self._if_manager.handle_netlink_msgs()
except pyroute2.netlink.NetlinkError:
log_exc_traceback()
diff --git a/lnst/Devices/VxlanDevice.py b/lnst/Devices/VxlanDevice.py
index 4cb23b6..050ff54 100644
--- a/lnst/Devices/VxlanDevice.py
+++ b/lnst/Devices/VxlanDevice.py
@@ -57,20 +57,28 @@ class VxlanDevice(SoftDevice):
def _create(self):
with pyroute2.IPRoute() as ipr:
try:
- kwargs = {"IFLA_VXLAN_ID": self.vxlan_id,
- "IFLA_VXLAN_PORT": self.dst_port}
+ data = {"attrs": [["IFLA_VXLAN_ID", self.vxlan_id],
+ ["IFLA_VXLAN_PORT", self.dst_port]]}
if self.real_dev:
- kwargs["IFLA_VXLAN_LINK"] = self._real_dev.ifindex
+ data["attrs"].append(["IFLA_VXLAN_LINK",
+ self._real_dev.ifindex])
if self.group_ip:
- kwargs["IFLA_VXLAN_GROUP"] = self.group_ip
+ data["attrs"].append(["IFLA_VXLAN_GROUP", self.group_ip])
+
elif self.remote_ip:
- kwargs["IFLA_VXLAN_GROUP"] = self.remote_ip
+ data["attrs"].append(["IFLA_VXLAN_GROUP", self.remote_ip])
ipr.link("add", IFLA_IFNAME=self.name,
IFLA_INFO_KIND=self._link_type, **kwargs)
+ data = {"attrs": [["IFLA_MACVLAN_MODE", self._mode],
+ ["IFLA_MACVLAN_MACADDR", self._hwaddr]]}
+ linkinfo = {"attrs": [["IFLA_INFO_KIND", self._link_type],
+ ["IFLA_INFO_DATA", data]]}
+ ipr.link("add", ifname=self.name, IFLA_LINKINFO=linkinfo)
+
self._if_manager.handle_netlink_msgs()
except pyroute2.netlink.NetlinkError:
log_exc_traceback()
--
2.9.5
6 years, 2 months
[patch lnst-next] Device: add support for IP address bulk addition and removal
by Jiri Pirko
From: Jiri Pirko <jiri(a)mellanox.com>
Extend ip_add and ip_del methods to accept lists.
Example:
self.matched.m1.if1.ip_add([ipaddress("192.168.101.10/24"), ipaddress("2002::1/64")])
Signed-off-by: Jiri Pirko <jiri(a)mellanox.com>
---
lnst/Devices/Device.py | 36 +++++++++++++++++++++++++++---------
1 file changed, 27 insertions(+), 9 deletions(-)
diff --git a/lnst/Devices/Device.py b/lnst/Devices/Device.py
index 6b2e35f..bd750a9 100644
--- a/lnst/Devices/Device.py
+++ b/lnst/Devices/Device.py
@@ -402,12 +402,7 @@ class Device(object):
def _clear_ips(self):
self._ip_addrs = []
- def ip_add(self, addr):
- """add an ip address
-
- Args:
- addr -- an address accepted by the ipaddress factory method
- """
+ def _ip_add_one(self, addr):
ip = ipaddress(addr)
if ip not in self.ips:
with pyroute2.IPRoute() as ipr:
@@ -418,14 +413,23 @@ class Device(object):
except pyroute2.netlink.NetlinkError:
log_exc_traceback()
raise DeviceConfigValueError("Invalid IP address")
- return ip
- def ip_del(self, addr):
- """remove an ip address
+ def ip_add(self, addr):
+ """add an ip address or a list of ip addresses
Args:
addr -- an address accepted by the ipaddress factory method
+ or a list of addresses accepted by the ipaddress
+ factory method
"""
+
+ if isinstance(addr, list):
+ for oneaddr in addr:
+ self._ip_add_one(oneaddr)
+ else:
+ self._ip_add_one(addr)
+
+ def _ip_del_one(self, addr):
ip = ipaddress(addr)
if ip in self.ips:
with pyroute2.IPRoute() as ipr:
@@ -437,6 +441,20 @@ class Device(object):
log_exc_traceback()
raise DeviceConfigValueError("Invalid IP address")
+ def ip_del(self, addr):
+ """remove an ip address or a list of ip addresses
+
+ Args:
+ addr -- an address accepted by the ipaddress factory method
+ or a list of addresses accepted by the ipaddress
+ factory method
+ """
+ if isinstance(addr, list):
+ for oneaddr in addr:
+ self._ip_del_one(oneaddr)
+ else:
+ self._ip_del_one(addr)
+
def ip_flush(self):
"""flush all ip addresses of the device"""
with pyroute2.IPRoute() as ipr:
--
2.9.5
6 years, 2 months
[PATCH] regression_tests: ipsec_esp_ah_comp add missing gap in netperf ipv6 options
by Kamil Jerabek
This patch adds missing gap before ipv6 option in netperf options.
Signed-off-by: Kamil Jerabek <kjerabek(a)redhat.com>
---
recipes/regression_tests/phase3/ipsec_esp_ah_comp.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/recipes/regression_tests/phase3/ipsec_esp_ah_comp.py b/recipes/regression_tests/phase3/ipsec_esp_ah_comp.py
index fada91e..40ee0c7 100644
--- a/recipes/regression_tests/phase3/ipsec_esp_ah_comp.py
+++ b/recipes/regression_tests/phase3/ipsec_esp_ah_comp.py
@@ -496,7 +496,7 @@ for ciph_alg, ciph_len in ciphers:
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"msg_size" : nperf_msg_size,
- "netperf_opts" : nperf_opts + "-6"},
+ "netperf_opts" : nperf_opts + " -6"},
baseline = baseline,
timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
@@ -535,7 +535,7 @@ for ciph_alg, ciph_len in ciphers:
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"msg_size" : nperf_msg_size,
- "netperf_opts" : nperf_opts + "-6"},
+ "netperf_opts" : nperf_opts + " -6"},
baseline = baseline,
timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
--
2.5.5
6 years, 2 months
[PATCH] regression_tests: ipsec_esp_ah_comp add netperf result parameter ipsec_mode
by Kamil Jerabek
This commit assigns ipsec_mode parameter to each netperf result.
Signed-off-by: Kamil Jerabek <kjerabek(a)redhat.com>
---
recipes/regression_tests/phase3/ipsec_esp_ah_comp.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/recipes/regression_tests/phase3/ipsec_esp_ah_comp.py b/recipes/regression_tests/phase3/ipsec_esp_ah_comp.py
index 2d1e969..8b6a944 100644
--- a/recipes/regression_tests/phase3/ipsec_esp_ah_comp.py
+++ b/recipes/regression_tests/phase3/ipsec_esp_ah_comp.py
@@ -332,6 +332,7 @@ for ciph_alg, ciph_len in ciphers:
result_tcp.set_parameter('cipher_len', ciph_len)
result_tcp.set_parameter('hash_alg', hash_alg)
result_tcp.set_parameter('msg_size', nperf_msg_size)
+ result_tcp.set_parameter('ipsec_mode', ipsec_mode)
baseline = perf_api.get_baseline_of_result(result_tcp)
baseline = perfrepo_baseline_to_dict(baseline)
@@ -372,6 +373,7 @@ for ciph_alg, ciph_len in ciphers:
result_udp.set_parameter('cipher_len', ciph_len)
result_udp.set_parameter('hash_alg', hash_alg)
result_udp.set_parameter('msg_size', nperf_msg_size)
+ result_udp.set_parameter('ipsec_mode', ipsec_mode)
baseline = perf_api.get_baseline_of_result(result_udp)
baseline = perfrepo_baseline_to_dict(baseline)
@@ -482,6 +484,7 @@ for ciph_alg, ciph_len in ciphers:
result_tcp.set_parameter('cipher_len', ciph_len)
result_tcp.set_parameter('hash_alg', hash_alg)
result_tcp.set_parameter('msg_size', nperf_msg_size)
+ result_tcp.set_parameter('ipsec_mode', ipsec_mode)
baseline = perf_api.get_baseline_of_result(result_tcp)
baseline = perfrepo_baseline_to_dict(baseline)
@@ -522,6 +525,7 @@ for ciph_alg, ciph_len in ciphers:
result_udp.set_parameter('cipher_len', ciph_len)
result_udp.set_parameter('hash_alg', hash_alg)
result_udp.set_parameter('msg_size', nperf_msg_size)
+ result_udp.set_parameter('ipsec_mode', ipsec_mode)
baseline = perf_api.get_baseline_of_result(result_udp)
baseline = perfrepo_baseline_to_dict(baseline)
--
2.5.5
6 years, 2 months
next branch updated
by Ondrej Lichtner
Hello everyone,
I just pushed all my local changes to the next branch. This includes
updates to the Device API that we've discussed and some other minor
stuff.
At this point it should be possible to start porting some basic recipes.
Keep in mind that this will include some additional work in porting old
test modules to equivalent test classes - such as IcmpPing or Netperf.
As this is our first attempt at porting recipes, one of it's purposes is
to also test out the new Device API to see if any changes need to be
made, so be prepared for bugs or for things not working exactly as you'd
like.
Feel free to post any bugfix of feature patches to the mailing list,
I'll be watching and reviewing. For anything more complicated I've
created a 'next' label in the github issue tracker [1] where you can
report bugs.
-Ondrej
[1] https://github.com/jpirko/lnst/labels/next
6 years, 3 months