Use new, daemon-less sysrepo for YANG management

Updating all dependencies so that we're using the new sysrepo. The easiest way
there was via bringing in the new buildroot as well, which meant:

- new RAUC, hence no patch needed anymore,
- newer systemd, hence an updated patch,
- New spdlog and fmt, which means that the version we ship in
  submodules/dependencies no longer works. Fix that by just relying on
  systemwide spdlog.
- uboot-tools needed a patch because there's no /var/lock,
- OpenSSH was previously started autmagically, now we're explicitly
  adding that to the list of packages (I really like SSH, don't you?).

New sysrepo means that there's no `sysrepod` anymore, which required
changing a bunch of other units so that they are not marked as
`PartOf=sysrepod.service` anymore. Also, the command-line options for
`sysrepocfg` and `sysrepoctl` changed.

I had to patch buildroot so that it doesn't create SSH keys for the
NETCONF server at build time, and that all required modules are actually
installed. It turns out that new sysrepo doesn't really install
anything, and the fun only starts with Netopeer2. Their install scripts
a wee bit picky, but hey, we have bash, we can make it work.

On the other hand, installation of *our* YANG modules is a bit hairy.
There's just too much parallel activities going on, and therefore I have
no idea how robust our callout to `sysrepoctl --apply` really is. As a
cherry on top, `sysrepocfg` is particularly inconsistent when it comes
to how the **** one is supposed to provision the initial config, etc
etc. In the end, I ended up with a big hammer.

Installation of all non-netopeer2 YANG modules now happens from just a
single script, the previous way was very fragile and failed quite often
-- probably because that "wonderful" new way of installing a module and
possibly enabling a feature and also importing some data which might or
might not be the required initial data, so *THAT* thing, depended on
whether there already was or was not another SW connection. Wonderful.
If only there was a oneliner for that, then we could have avoided all
this stupid boilerplate. Oh well.

On the other hand, the `cla-sysrepod` is now properly signalling its
"up-and-running" status to systemd, *and* this up-and-running state is
only reached once the configuration has been propagated to the optical
HW. As a result, the HW watchdog will recover from an upload of a broken
FW (or, alternatively, it will keep rebooting if the optical HW is
FUBAR -- pick your poison, sir).

Change-Id: I4b65a8fb345bfe7907a331d0de16294af1c36a78
diff --git a/board/czechlight/common/patches/rauc/0001-curl-Enable-decoding-from-server-s-Content-Encoding.patch b/board/czechlight/common/patches/rauc/0001-curl-Enable-decoding-from-server-s-Content-Encoding.patch
deleted file mode 100644
index 83a0498..0000000
--- a/board/czechlight/common/patches/rauc/0001-curl-Enable-decoding-from-server-s-Content-Encoding.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 256274e4ca5786b4e68011fcb1b31272e278141d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
-Date: Thu, 5 Dec 2019 17:03:06 +0100
-Subject: [PATCH] curl: Enable decoding from server's Content-Encoding
-
-I would like to consume RAUC bundles straight from our CI environment
-which uses OpenStack Swift as a backend for artifact storage, and
-OpenDev's Zuul as the CI runner. As it happens, our CI jobs sends file
-content to Swift with a Content-Encoding: gzip [1], and Swift appears to
-always send the file with that Content-Encoding no matter what
-Accept-Encoding the HTTP client sends in their request.
-
-This patch simply uses curl's list of default supported Content-Encoding
-decoders (that's the special magic "" value of this header). The end
-result is that our boxes can now fetch stuff from our CI environment
-without any problems.
-
-[1] https://review.opendev.org/688154
----
- src/network.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/network.c b/src/network.c
-index ade9f21..5793093 100644
---- a/src/network.c
-+++ b/src/network.c
-@@ -93,6 +93,7 @@ static gboolean transfer(RaucTransfer *xfer, GError **error)
- 	curl_easy_setopt(curl, CURLOPT_XFERINFODATA, xfer);
- 	curl_easy_setopt(curl, CURLOPT_FAILONERROR, xfer);
- 	curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
-+	curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, ""); /* decode all supported Accept-Encoding headers */
- 
- 	/* set error buffer empty before perorming a request */
- 	errbuf[0] = 0;
--- 
-2.21.0
-
diff --git a/board/czechlight/common/patches/systemd/sd_lldp.patch b/board/czechlight/common/patches/systemd/sd_lldp.patch
index ca32358..d858e12 100644
--- a/board/czechlight/common/patches/systemd/sd_lldp.patch
+++ b/board/czechlight/common/patches/systemd/sd_lldp.patch
@@ -1,33 +1,32 @@
-From 9b8b7ba40accbd303a3378d75022d6d92a2b7771 Mon Sep 17 00:00:00 2001
+From 1cdab502f703bdca754d7d55b9017d25c492c0c9 Mon Sep 17 00:00:00 2001
 From: Tomas Pecka <peckato1@fit.cvut.cz>
 Date: Mon, 7 Sep 2020 18:26:47 +0200
 Subject: [PATCH] Move sd_lldp to libsystemd
 
-Make sd_lldp public in libsystemd. Clients can therefore operate
+This makes sd_lldp public in libsystemd. Clients can therefore operate
 with LLDP structures and files (e.g. parse LLDP neighbours).
 ---
  meson.build                            |   1 +
- src/fuzz/meson.build                   |   9 +-
  src/libsystemd-network/lldp-internal.h |  39 --
- src/libsystemd-network/lldp-neighbor.c | 769 -------------------------
- src/libsystemd-network/lldp-neighbor.h |  91 ---
+ src/libsystemd-network/lldp-neighbor.c | 792 -------------------------
+ src/libsystemd-network/lldp-neighbor.h |  92 ---
  src/libsystemd-network/lldp-network.c  |  78 ---
  src/libsystemd-network/lldp-network.h  |   6 -
  src/libsystemd-network/meson.build     |   6 -
  src/libsystemd-network/sd-lldp.c       | 498 ----------------
- src/libsystemd-network/test-lldp.c     | 379 ------------
- src/libsystemd/libsystemd.sym          |  41 ++
+ src/libsystemd-network/test-lldp.c     | 378 ------------
+ src/libsystemd/libsystemd.sym          |  39 ++
  src/libsystemd/meson.build             |   6 +
  src/libsystemd/sd-lldp/lldp-internal.h |  39 ++
- src/libsystemd/sd-lldp/lldp-neighbor.c | 769 +++++++++++++++++++++++++
- src/libsystemd/sd-lldp/lldp-neighbor.h |  91 +++
+ src/libsystemd/sd-lldp/lldp-neighbor.c | 792 +++++++++++++++++++++++++
+ src/libsystemd/sd-lldp/lldp-neighbor.h |  92 +++
  src/libsystemd/sd-lldp/lldp-network.c  |  78 +++
  src/libsystemd/sd-lldp/lldp-network.h  |   6 +
  src/libsystemd/sd-lldp/sd-lldp.c       | 498 ++++++++++++++++
- src/libsystemd/sd-lldp/test-lldp.c     | 379 ++++++++++++
+ src/libsystemd/sd-lldp/test-lldp.c     | 378 ++++++++++++
  src/systemd/meson.build                |   2 +-
  src/test/meson.build                   |  10 +-
- 21 files changed, 1919 insertions(+), 1876 deletions(-)
+ 20 files changed, 1935 insertions(+), 1895 deletions(-)
  delete mode 100644 src/libsystemd-network/lldp-internal.h
  delete mode 100644 src/libsystemd-network/lldp-neighbor.c
  delete mode 100644 src/libsystemd-network/lldp-neighbor.h
@@ -44,10 +43,10 @@
  create mode 100644 src/libsystemd/sd-lldp/test-lldp.c
 
 diff --git a/meson.build b/meson.build
-index 8ccc947e37..1c2099d093 100644
+index a5d1ed3d4d..45cc47f604 100644
 --- a/meson.build
 +++ b/meson.build
-@@ -1398,6 +1398,7 @@ includes = include_directories('src/basic',
+@@ -1552,6 +1552,7 @@ includes = include_directories('src/basic',
                                 'src/libsystemd/sd-event',
                                 'src/libsystemd/sd-hwdb',
                                 'src/libsystemd/sd-id128',
@@ -55,33 +54,6 @@
                                 'src/libsystemd/sd-netlink',
                                 'src/libsystemd/sd-network',
                                 'src/libsystemd/sd-resolve',
-diff --git a/src/fuzz/meson.build b/src/fuzz/meson.build
-index c88812d1de..8171bf58c1 100644
---- a/src/fuzz/meson.build
-+++ b/src/fuzz/meson.build
-@@ -33,8 +33,8 @@ fuzzers += [
-          []],
- 
-         [['src/fuzz/fuzz-lldp.c'],
--         [libshared,
--          libsystemd_network],
-+         [libbasic,libshared_static,libsystemd_static
-+          ],
-          []],
- 
-         [['src/fuzz/fuzz-ndisc-rs.c',
-@@ -43,8 +43,9 @@ fuzzers += [
-           'src/libsystemd-network/icmp6-util.h',
-           'src/systemd/sd-dhcp6-client.h',
-           'src/systemd/sd-ndisc.h'],
--         [libshared,
--          libsystemd_network],
-+         [libsystemd_network,
-+          libshared
-+          ],
-          []],
- 
-         [['src/fuzz/fuzz-json.c'],
 diff --git a/src/libsystemd-network/lldp-internal.h b/src/libsystemd-network/lldp-internal.h
 deleted file mode 100644
 index 9598438dba..0000000000
@@ -129,10 +101,10 @@
 -sd_lldp_event lldp_event_from_string(const char *s) _pure_;
 diff --git a/src/libsystemd-network/lldp-neighbor.c b/src/libsystemd-network/lldp-neighbor.c
 deleted file mode 100644
-index 9bae4a3c6e..0000000000
+index 02645b2bcd..0000000000
 --- a/src/libsystemd-network/lldp-neighbor.c
 +++ /dev/null
-@@ -1,769 +0,0 @@
+@@ -1,792 +0,0 @@
 -/* SPDX-License-Identifier: LGPL-2.1+ */
 -
 -#include "alloc-util.h"
@@ -143,7 +115,7 @@
 -#include "lldp-internal.h"
 -#include "lldp-neighbor.h"
 -#include "memory-util.h"
--#include "missing.h"
+-#include "missing_network.h"
 -#include "unaligned.h"
 -
 -static void lldp_neighbor_id_hash_func(const LLDPNeighborID *id, struct siphash *state) {
@@ -185,6 +157,7 @@
 -        free(n->port_description);
 -        free(n->system_name);
 -        free(n->system_description);
+-        free(n->mud_url);
 -        free(n->chassis_id_as_string);
 -        free(n->port_id_as_string);
 -        free(n);
@@ -427,9 +400,20 @@
 -
 -                        break;
 -
--                case SD_LLDP_TYPE_PRIVATE:
+-                case SD_LLDP_TYPE_PRIVATE: {
 -                        if (length < 4)
 -                                log_lldp("Found private TLV that is too short, ignoring.");
+-                        else {
+-                                /* RFC 8520: MUD URL */
+-                                if (memcmp(p, SD_LLDP_OUI_MUD, sizeof(SD_LLDP_OUI_MUD)) == 0 &&
+-                                    p[sizeof(SD_LLDP_OUI_MUD)] == SD_LLDP_OUI_SUBTYPE_MUD_USAGE_DESCRIPTION) {
+-                                        r = parse_string(&n->mud_url, p + sizeof(SD_LLDP_OUI_MUD) + 1,
+-                                                         length - 1 - sizeof(SD_LLDP_OUI_MUD));
+-                                        if (r < 0)
+-                                                return r;
+-                                }
+-                        }
+-                }
 -
 -                        break;
 -                }
@@ -728,6 +712,17 @@
 -        return 0;
 -}
 -
+-_public_ int sd_lldp_neighbor_get_mud_url(sd_lldp_neighbor *n, const char **ret) {
+-        assert_return(n, -EINVAL);
+-        assert_return(ret, -EINVAL);
+-
+-        if (!n->mud_url)
+-                return -ENODATA;
+-
+-        *ret = n->mud_url;
+-        return 0;
+-}
+-
 -_public_ int sd_lldp_neighbor_get_system_capabilities(sd_lldp_neighbor *n, uint16_t *ret) {
 -        assert_return(n, -EINVAL);
 -        assert_return(ret, -EINVAL);
@@ -904,10 +899,10 @@
 -}
 diff --git a/src/libsystemd-network/lldp-neighbor.h b/src/libsystemd-network/lldp-neighbor.h
 deleted file mode 100644
-index 62dbff42ca..0000000000
+index 74175edf54..0000000000
 --- a/src/libsystemd-network/lldp-neighbor.h
 +++ /dev/null
-@@ -1,91 +0,0 @@
+@@ -1,92 +0,0 @@
 -/* SPDX-License-Identifier: LGPL-2.1+ */
 -#pragma once
 -
@@ -964,6 +959,7 @@
 -        char *port_description;
 -        char *system_name;
 -        char *system_description;
+-        char *mud_url;
 -
 -        uint16_t port_vlan_id;
 -
@@ -1001,7 +997,7 @@
 -bool lldp_neighbor_equal(const sd_lldp_neighbor *a, const sd_lldp_neighbor *b);
 diff --git a/src/libsystemd-network/lldp-network.c b/src/libsystemd-network/lldp-network.c
 deleted file mode 100644
-index 870584c0db..0000000000
+index 53e329734b..0000000000
 --- a/src/libsystemd-network/lldp-network.c
 +++ /dev/null
 @@ -1,78 +0,0 @@
@@ -1012,7 +1008,7 @@
 -
 -#include "fd-util.h"
 -#include "lldp-network.h"
--#include "missing.h"
+-#include "missing_network.h"
 -#include "socket-util.h"
 -
 -int lldp_network_bind_raw_socket(int ifindex) {
@@ -1096,10 +1092,10 @@
 -
 -int lldp_network_bind_raw_socket(int ifindex);
 diff --git a/src/libsystemd-network/meson.build b/src/libsystemd-network/meson.build
-index 56d470ff68..88a72aa900 100644
+index 7fa0c67956..517ffd1471 100644
 --- a/src/libsystemd-network/meson.build
 +++ b/src/libsystemd-network/meson.build
-@@ -33,12 +33,6 @@ sources = files('''
+@@ -34,12 +34,6 @@ sources = files('''
          sd-dhcp6-lease.c
          dhcp-identifier.h
          dhcp-identifier.c
@@ -1114,7 +1110,7 @@
  network_internal_h = files('network-internal.h')
 diff --git a/src/libsystemd-network/sd-lldp.c b/src/libsystemd-network/sd-lldp.c
 deleted file mode 100644
-index 1f28c5731f..0000000000
+index d3606cf501..0000000000
 --- a/src/libsystemd-network/sd-lldp.c
 +++ /dev/null
 @@ -1,498 +0,0 @@
@@ -1586,7 +1582,7 @@
 -
 -_public_ int sd_lldp_set_neighbors_max(sd_lldp *lldp, uint64_t m) {
 -        assert_return(lldp, -EINVAL);
--        assert_return(m <= 0, -EINVAL);
+-        assert_return(m > 0, -EINVAL);
 -
 -        lldp->neighbors_max = m;
 -        lldp_make_space(lldp, 0);
@@ -1618,17 +1614,16 @@
 -}
 diff --git a/src/libsystemd-network/test-lldp.c b/src/libsystemd-network/test-lldp.c
 deleted file mode 100644
-index 7406f94ce0..0000000000
+index a2ac65095f..0000000000
 --- a/src/libsystemd-network/test-lldp.c
 +++ /dev/null
-@@ -1,379 +0,0 @@
+@@ -1,378 +0,0 @@
 -/* SPDX-License-Identifier: LGPL-2.1+ */
 -
 -#include <arpa/inet.h>
 -#include <errno.h>
 -#include <net/ethernet.h>
 -#include <stdio.h>
--#include <string.h>
 -#include <unistd.h>
 -
 -#include "sd-event.h"
@@ -2002,34 +1997,19 @@
 -        return 0;
 -}
 diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym
-index 5ec42e0f1f..48021b86d3 100644
+index 1e654b49ea..d584ac2faf 100644
 --- a/src/libsystemd/libsystemd.sym
 +++ b/src/libsystemd/libsystemd.sym
-@@ -681,4 +681,45 @@ LIBSYSTEMD_243 {
- global:
-         sd_bus_object_vtable_format;
-         sd_event_source_disable_unref;
+@@ -720,4 +720,43 @@ global:
+ 
+         sd_journal_enumerate_available_data;
+         sd_journal_enumerate_available_unique;
 +
-+        sd_lldp_new;
-+        sd_lldp_ref;
-+        sd_lldp_unref;
 +        sd_lldp_start;
-+        sd_lldp_stop;
-+        sd_lldp_attach_event;
-+        sd_lldp_detach_event;
-+        sd_lldp_get_event;
-+        sd_lldp_set_callback;
-+        sd_lldp_set_ifindex;
-+        sd_lldp_set_neighbors_max;
-+        sd_lldp_match_capabilities;
-+        sd_lldp_set_filter_address;
-+        sd_lldp_get_neighbors;
-+        sd_lldp_neighbor_from_raw;
-+        sd_lldp_neighbor_ref;
++		sd_lldp_neighbor_ref;
 +        sd_lldp_neighbor_unref;
 +        sd_lldp_neighbor_get_source_address;
 +        sd_lldp_neighbor_get_destination_address;
-+        sd_lldp_neighbor_get_timestamp;
 +        sd_lldp_neighbor_get_raw;
 +        sd_lldp_neighbor_get_chassis_id;
 +        sd_lldp_neighbor_get_chassis_id_as_string;
@@ -2042,6 +2022,7 @@
 +        sd_lldp_neighbor_get_mud_url;
 +        sd_lldp_neighbor_get_system_capabilities;
 +        sd_lldp_neighbor_get_enabled_capabilities;
++        sd_lldp_neighbor_from_raw;
 +        sd_lldp_neighbor_tlv_rewind;
 +        sd_lldp_neighbor_tlv_next;
 +        sd_lldp_neighbor_tlv_get_type;
@@ -2049,10 +2030,22 @@
 +        sd_lldp_neighbor_tlv_get_oui;
 +        sd_lldp_neighbor_tlv_is_oui;
 +        sd_lldp_neighbor_tlv_get_raw;
-+
- } LIBSYSTEMD_241;
++        sd_lldp_neighbor_get_timestamp;
++        sd_lldp_start;
++        sd_lldp_stop;
++        sd_lldp_attach_event;
++        sd_lldp_detach_event;
++        sd_lldp_get_event;
++        sd_lldp_set_callback;
++        sd_lldp_set_ifindex;
++        sd_lldp_new;
++        sd_lldp_get_neighbors;
++        sd_lldp_set_neighbors_max;
++        sd_lldp_match_capabilities;
++        sd_lldp_set_filter_address;
+ } LIBSYSTEMD_245;
 diff --git a/src/libsystemd/meson.build b/src/libsystemd/meson.build
-index 77fe6e780f..e60853959f 100644
+index aa1ed9b7dd..db28fbcf37 100644
 --- a/src/libsystemd/meson.build
 +++ b/src/libsystemd/meson.build
 @@ -70,6 +70,12 @@ libsystemd_sources = files('''
@@ -2066,8 +2059,8 @@
 +        sd-lldp/lldp-network.c
 +        sd-lldp/lldp-network.h
          sd-netlink/generic-netlink.c
+         sd-netlink/generic-netlink.h
          sd-netlink/netlink-internal.h
-         sd-netlink/netlink-message.c
 diff --git a/src/libsystemd/sd-lldp/lldp-internal.h b/src/libsystemd/sd-lldp/lldp-internal.h
 new file mode 100644
 index 0000000000..9598438dba
@@ -2115,10 +2108,10 @@
 +sd_lldp_event lldp_event_from_string(const char *s) _pure_;
 diff --git a/src/libsystemd/sd-lldp/lldp-neighbor.c b/src/libsystemd/sd-lldp/lldp-neighbor.c
 new file mode 100644
-index 0000000000..9bae4a3c6e
+index 0000000000..02645b2bcd
 --- /dev/null
 +++ b/src/libsystemd/sd-lldp/lldp-neighbor.c
-@@ -0,0 +1,769 @@
+@@ -0,0 +1,792 @@
 +/* SPDX-License-Identifier: LGPL-2.1+ */
 +
 +#include "alloc-util.h"
@@ -2129,7 +2122,7 @@
 +#include "lldp-internal.h"
 +#include "lldp-neighbor.h"
 +#include "memory-util.h"
-+#include "missing.h"
++#include "missing_network.h"
 +#include "unaligned.h"
 +
 +static void lldp_neighbor_id_hash_func(const LLDPNeighborID *id, struct siphash *state) {
@@ -2171,6 +2164,7 @@
 +        free(n->port_description);
 +        free(n->system_name);
 +        free(n->system_description);
++        free(n->mud_url);
 +        free(n->chassis_id_as_string);
 +        free(n->port_id_as_string);
 +        free(n);
@@ -2413,9 +2407,20 @@
 +
 +                        break;
 +
-+                case SD_LLDP_TYPE_PRIVATE:
++                case SD_LLDP_TYPE_PRIVATE: {
 +                        if (length < 4)
 +                                log_lldp("Found private TLV that is too short, ignoring.");
++                        else {
++                                /* RFC 8520: MUD URL */
++                                if (memcmp(p, SD_LLDP_OUI_MUD, sizeof(SD_LLDP_OUI_MUD)) == 0 &&
++                                    p[sizeof(SD_LLDP_OUI_MUD)] == SD_LLDP_OUI_SUBTYPE_MUD_USAGE_DESCRIPTION) {
++                                        r = parse_string(&n->mud_url, p + sizeof(SD_LLDP_OUI_MUD) + 1,
++                                                         length - 1 - sizeof(SD_LLDP_OUI_MUD));
++                                        if (r < 0)
++                                                return r;
++                                }
++                        }
++                }
 +
 +                        break;
 +                }
@@ -2714,6 +2719,17 @@
 +        return 0;
 +}
 +
++_public_ int sd_lldp_neighbor_get_mud_url(sd_lldp_neighbor *n, const char **ret) {
++        assert_return(n, -EINVAL);
++        assert_return(ret, -EINVAL);
++
++        if (!n->mud_url)
++                return -ENODATA;
++
++        *ret = n->mud_url;
++        return 0;
++}
++
 +_public_ int sd_lldp_neighbor_get_system_capabilities(sd_lldp_neighbor *n, uint16_t *ret) {
 +        assert_return(n, -EINVAL);
 +        assert_return(ret, -EINVAL);
@@ -2890,10 +2906,10 @@
 +}
 diff --git a/src/libsystemd/sd-lldp/lldp-neighbor.h b/src/libsystemd/sd-lldp/lldp-neighbor.h
 new file mode 100644
-index 0000000000..62dbff42ca
+index 0000000000..74175edf54
 --- /dev/null
 +++ b/src/libsystemd/sd-lldp/lldp-neighbor.h
-@@ -0,0 +1,91 @@
+@@ -0,0 +1,92 @@
 +/* SPDX-License-Identifier: LGPL-2.1+ */
 +#pragma once
 +
@@ -2950,6 +2966,7 @@
 +        char *port_description;
 +        char *system_name;
 +        char *system_description;
++        char *mud_url;
 +
 +        uint16_t port_vlan_id;
 +
@@ -2987,7 +3004,7 @@
 +bool lldp_neighbor_equal(const sd_lldp_neighbor *a, const sd_lldp_neighbor *b);
 diff --git a/src/libsystemd/sd-lldp/lldp-network.c b/src/libsystemd/sd-lldp/lldp-network.c
 new file mode 100644
-index 0000000000..870584c0db
+index 0000000000..53e329734b
 --- /dev/null
 +++ b/src/libsystemd/sd-lldp/lldp-network.c
 @@ -0,0 +1,78 @@
@@ -2998,7 +3015,7 @@
 +
 +#include "fd-util.h"
 +#include "lldp-network.h"
-+#include "missing.h"
++#include "missing_network.h"
 +#include "socket-util.h"
 +
 +int lldp_network_bind_raw_socket(int ifindex) {
@@ -3083,7 +3100,7 @@
 +int lldp_network_bind_raw_socket(int ifindex);
 diff --git a/src/libsystemd/sd-lldp/sd-lldp.c b/src/libsystemd/sd-lldp/sd-lldp.c
 new file mode 100644
-index 0000000000..1f28c5731f
+index 0000000000..d3606cf501
 --- /dev/null
 +++ b/src/libsystemd/sd-lldp/sd-lldp.c
 @@ -0,0 +1,498 @@
@@ -3555,7 +3572,7 @@
 +
 +_public_ int sd_lldp_set_neighbors_max(sd_lldp *lldp, uint64_t m) {
 +        assert_return(lldp, -EINVAL);
-+        assert_return(m <= 0, -EINVAL);
++        assert_return(m > 0, -EINVAL);
 +
 +        lldp->neighbors_max = m;
 +        lldp_make_space(lldp, 0);
@@ -3587,17 +3604,16 @@
 +}
 diff --git a/src/libsystemd/sd-lldp/test-lldp.c b/src/libsystemd/sd-lldp/test-lldp.c
 new file mode 100644
-index 0000000000..7406f94ce0
+index 0000000000..a2ac65095f
 --- /dev/null
 +++ b/src/libsystemd/sd-lldp/test-lldp.c
-@@ -0,0 +1,379 @@
+@@ -0,0 +1,378 @@
 +/* SPDX-License-Identifier: LGPL-2.1+ */
 +
 +#include <arpa/inet.h>
 +#include <errno.h>
 +#include <net/ethernet.h>
 +#include <stdio.h>
-+#include <string.h>
 +#include <unistd.h>
 +
 +#include "sd-event.h"
@@ -3971,18 +3987,18 @@
 +        return 0;
 +}
 diff --git a/src/systemd/meson.build b/src/systemd/meson.build
-index 75c48b07a5..887421bee0 100644
+index 62baf7784e..090f06087b 100644
 --- a/src/systemd/meson.build
 +++ b/src/systemd/meson.build
-@@ -12,6 +12,7 @@ _systemd_headers = '''
-         sd-journal.h
+@@ -13,6 +13,7 @@ _systemd_headers = '''
          sd-login.h
          sd-messages.h
+         sd-path.h
 +        sd-lldp.h
  '''.split()
  
  # https://github.com/mesonbuild/meson/issues/1633
-@@ -25,7 +26,6 @@ _not_installed_headers = '''
+@@ -28,7 +29,6 @@ _not_installed_headers = '''
          sd-dhcp-server.h
          sd-ipv4acd.h
          sd-ipv4ll.h
@@ -3991,22 +4007,22 @@
          sd-netlink.h
          sd-network.h
 diff --git a/src/test/meson.build b/src/test/meson.build
-index de31e977bc..680d1dec6b 100644
+index 132989f197..1b7d2d6e6d 100644
 --- a/src/test/meson.build
 +++ b/src/test/meson.build
-@@ -1010,6 +1010,11 @@ tests += [
+@@ -1037,6 +1037,11 @@ tests += [
           [],
           []],
  
 +        [['src/libsystemd/sd-lldp/test-lldp.c'],
-+         [libbasic,libshared_static,libsystemd_static
-+          ],
++         [libsystemd_static,
++          libshared],
 +         []],
 +
  ]
  
- # test-bus-vtable-cc.cc is a symlink and symlinks get lost in containers on FuzzBuzz.
-@@ -1098,11 +1103,6 @@ tests += [
+ if cxx_cmd != ''
+@@ -1122,11 +1127,6 @@ tests += [
           [libshared,
            libsystemd_network],
           []],
diff --git a/board/czechlight/common/patches/uboot-tools/0001-fw_-env-do-not-rely-on-var-lock.patch b/board/czechlight/common/patches/uboot-tools/0001-fw_-env-do-not-rely-on-var-lock.patch
new file mode 100644
index 0000000..b9bddab
--- /dev/null
+++ b/board/czechlight/common/patches/uboot-tools/0001-fw_-env-do-not-rely-on-var-lock.patch
@@ -0,0 +1,61 @@
+From e09ad9a33840ed83b91dd3901492ecf99ab89076 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
+Date: Wed, 21 Oct 2020 23:06:21 +0200
+Subject: [PATCH] fw_*env: do not rely on /var/lock
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+...because these are not available under the new Buildroot.
+
+Signed-off-by: Jan Kundrát <jan.kundrat@cesnet.cz>
+---
+ tools/env/README        | 2 +-
+ tools/env/fw_env_main.c | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/tools/env/README b/tools/env/README
+index 709251383c..480a893202 100644
+--- a/tools/env/README
++++ b/tools/env/README
+@@ -59,5 +59,5 @@ this environment instance. On NAND this is used to limit the range
+ within which bad blocks are skipped, on NOR it is not used.
+ 
+ To prevent losing changes to the environment and to prevent confusing the MTD
+-drivers, a lock file at /var/lock/fw_printenv.lock is used to serialize access
++drivers, a lock file at /run/fw_printenv.lock is used to serialize access
+ to the environment.
+diff --git a/tools/env/fw_env_main.c b/tools/env/fw_env_main.c
+index 26ba6624cd..4c84b13cfc 100644
+--- a/tools/env/fw_env_main.c
++++ b/tools/env/fw_env_main.c
+@@ -72,7 +72,7 @@ void usage_printenv(void)
+ 		" -c, --config         configuration file, default:" CONFIG_FILE "\n"
+ #endif
+ 		" -n, --noheader       do not repeat variable name in output\n"
+-		" -l, --lock           lock node, default:/var/lock\n"
++		" -l, --lock           lock node, default:/run\n"
+ 		"\n");
+ }
+ 
+@@ -87,7 +87,7 @@ void usage_env_set(void)
+ #ifdef CONFIG_FILE
+ 		" -c, --config         configuration file, default:" CONFIG_FILE "\n"
+ #endif
+-		" -l, --lock           lock node, default:/var/lock\n"
++		" -l, --lock           lock node, default:/run\n"
+ 		" -s, --script         batch mode to minimize writes\n"
+ 		"\n"
+ 		"Examples:\n"
+@@ -205,7 +205,7 @@ int parse_setenv_args(int argc, char *argv[])
+ 
+ int main(int argc, char *argv[])
+ {
+-	char *lockname = "/var/lock/" CMD_PRINTENV ".lock";
++	char *lockname = "/run/" CMD_PRINTENV ".lock";
+ 	int lockfd = -1;
+ 	int retval = EXIT_SUCCESS;
+ 	char *_cmdname;
+-- 
+2.28.0
+