Update buildroot

Update buildroot (branch cesnet/2023-06-12). This also contains a patch
to fix libcurl build[1] which I had on my local dev machine.

New buildroot also builds systemd 252.4 so necessary patch update added.

Also added perl-English package to our CI machines to silence the
following build error:

  2023-06-12 12:42:55.964693 | w | Your Perl installation is not complete enough; at least the following
  2023-06-12 12:42:55.964825 | w | modules are missing:
  2023-06-12 12:42:55.964844 | w |
  2023-06-12 12:42:55.964856 | w | 	 English
  2023-06-12 12:42:55.964866 | w |

Systemd 252 added naming scheme for net links with devicetree
aliases[2]. This renames our eth{0,1} to end{1,2} which is undesirable
because the boxes physical ports are labelled eth{0,1,2}. Oh and I forgot:
The network does not start after the boot because we expect the names
to be eth{0,1}. So let's make sure our names stay eth{0,1,2}.

[1] https://bugs.buildroot.org/show_bug.cgi?id=15181
[2] https://www.freedesktop.org/software/systemd/man/systemd.net-naming-scheme.html

Change-Id: I6a59388216fde516b58b080f8aafdfb5136981d2
diff --git a/board/czechlight/common/patches/systemd/0005-networkctl-lldp-now-uses-varlink-call.patch b/board/czechlight/common/patches/systemd/0005-networkctl-lldp-now-uses-varlink-call.patch
new file mode 100644
index 0000000..3511700
--- /dev/null
+++ b/board/czechlight/common/patches/systemd/0005-networkctl-lldp-now-uses-varlink-call.patch
@@ -0,0 +1,251 @@
+From ed72d91efb80888846267f72e9214470eaca4ce6 Mon Sep 17 00:00:00 2001
+From: Tomas Pecka <peckato1@users.noreply.github.com>
+Date: Wed, 15 Sep 2021 14:42:34 +0200
+Subject: [PATCH 5/7] networkctl: lldp now uses varlink call
+
+`networkctl lldp` now uses varlink call to the networkd to query LLDP
+neighbor data.
+---
+ src/network/networkctl.c | 183 ++++++++++++++++++++++++++-------------
+ 1 file changed, 123 insertions(+), 60 deletions(-)
+
+diff --git a/src/network/networkctl.c b/src/network/networkctl.c
+index a2e216e779..bab6cf5433 100644
+--- a/src/network/networkctl.c
++++ b/src/network/networkctl.c
+@@ -36,6 +36,7 @@
+ #include "glob-util.h"
+ #include "hwdb-util.h"
+ #include "ipvlan-util.h"
++#include "json.h"
+ #include "local-addresses.h"
+ #include "locale-util.h"
+ #include "logs-show.h"
+@@ -62,6 +63,7 @@
+ #include "strxcpyx.h"
+ #include "terminal-util.h"
+ #include "unit-def.h"
++#include "varlink.h"
+ #include "verbs.h"
+ #include "wifi-util.h"
+ 
+@@ -2439,14 +2441,103 @@ static void lldp_capabilities_legend(uint16_t x) {
+         puts("");
+ }
+ 
++typedef struct LLDPNeighborEntry {
++        uint32_t capabilities;
++        char *chassis_id;
++        char *port_id;
++        char *system_name;
++        char *port_description;
++} LLDPNeighborEntry;
++
++static void lldp_neighbor_entry_free(LLDPNeighborEntry *e) {
++        if (!e)
++                return;
++
++        free(e->chassis_id);
++        free(e->port_id);
++        free(e->system_name);
++        free(e->port_description);
++}
++
++typedef struct LLDPUserdata {
++        int neighbors_count;
++        uint16_t capabilities_all;
++
++        Table *table;
++
++        char *link_name;
++} LLDPUserdata;
++
++static void lldp_userdata_freep(LLDPUserdata* p) {
++        table_unref(p->table);
++}
++
++static int lldp_neighbors_varlink_reply(Varlink *link, JsonVariant *parameters, const char *error_id, VarlinkReplyFlags flags, void *userdata) {
++        int r;
++        _cleanup_free_ char *capabilities = NULL;
++        LLDPUserdata *udata;
++        _cleanup_(lldp_neighbor_entry_free) LLDPNeighborEntry entry = {};
++
++        static const JsonDispatch dispatch_table[] = {
++                { "chassisId",           JSON_VARIANT_STRING,   json_dispatch_string, offsetof(LLDPNeighborEntry, chassis_id),       0 },
++                { "portId",              JSON_VARIANT_STRING,   json_dispatch_string, offsetof(LLDPNeighborEntry, port_id),          0 },
++                { "systemName",          JSON_VARIANT_STRING,   json_dispatch_string, offsetof(LLDPNeighborEntry, system_name),      0 },
++                { "enabledCapabilities", JSON_VARIANT_UNSIGNED, json_dispatch_uint32, offsetof(LLDPNeighborEntry, capabilities),     0 },
++                { "portDescription",     JSON_VARIANT_STRING,   json_dispatch_string, offsetof(LLDPNeighborEntry, port_description), 0 },
++                {}
++        };
++
++        udata = userdata;
++
++        assert(udata);
++        assert(udata->link_name);
++
++        r = json_dispatch(json_variant_by_key(parameters, "neighbor"), dispatch_table, NULL, 0, &entry);
++        if (r < 0)
++                return r;
++
++        if (udata->table) {
++                capabilities = lldp_capabilities_to_string(entry.capabilities);
++
++                r = table_add_many(udata->table,
++                                TABLE_STRING, udata->link_name,
++                                TABLE_STRING, entry.chassis_id,
++                                TABLE_STRING, entry.system_name,
++                                TABLE_STRING, capabilities,
++                                TABLE_STRING, entry.port_id,
++                                TABLE_STRING, entry.port_description);
++                if (r < 0)
++                        return table_log_add_error(r);
++        }
++
++        udata->neighbors_count += 1;
++        udata->capabilities_all |= entry.capabilities;
++
++        return 0;
++}
++
+ static int link_lldp_status(int argc, char *argv[], void *userdata) {
++        static const char *address = "/run/systemd/netif/io.systemd.Network";
++        static const char *method = "io.systemd.Network.LLDPNeighbors";
++
++        int r, c;
++        _cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL;
+         _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
+         _cleanup_(link_info_array_freep) LinkInfo *links = NULL;
+-        _cleanup_(table_unrefp) Table *table = NULL;
+-        int r, c, m = 0;
+-        uint16_t all = 0;
++        _cleanup_(lldp_userdata_freep) LLDPUserdata udata = {};
+         TableCell *cell;
+ 
++        r = varlink_connect_address(&link, address);
++        if (r < 0)
++                return log_error_errno(r, "Failed to connect to %s: %m", address);
++
++        (void) varlink_set_description(link, "network");
++        (void) varlink_set_relative_timeout(link, USEC_INFINITY);
++
++        r = varlink_bind_reply(link, lldp_neighbors_varlink_reply);
++        if (r < 0)
++                return log_error_errno(r, "Failed to bind reply callback: %m");
++
+         r = sd_netlink_open(&rtnl);
+         if (r < 0)
+                 return log_error_errno(r, "Failed to connect to netlink: %m");
+@@ -2457,80 +2548,52 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) {
+ 
+         pager_open(arg_pager_flags);
+ 
+-        table = table_new("link",
+-                          "chassis-id",
+-                          "system-name",
+-                          "caps",
+-                          "port-id",
+-                          "port-description");
+-        if (!table)
++        udata.table = table_new("link",
++                                "chassis-id",
++                                "system-name",
++                                "caps",
++                                "port-id",
++                                "port-description");
++        if (!udata.table)
+                 return log_oom();
+ 
+         if (arg_full)
+-                table_set_width(table, 0);
++                table_set_width(udata.table, 0);
+ 
+-        table_set_header(table, arg_legend);
+-
+-        assert_se(cell = table_get_cell(table, 0, 3));
+-        table_set_minimum_width(table, cell, 11);
+-        table_set_ersatz_string(table, TABLE_ERSATZ_DASH);
++        table_set_header(udata.table, arg_legend);
+ 
+-        for (int i = 0; i < c; i++) {
+-                _cleanup_fclose_ FILE *f = NULL;
+-
+-                r = open_lldp_neighbors(links[i].ifindex, &f);
+-                if (r == -ENOENT)
+-                        continue;
+-                if (r < 0) {
+-                        log_warning_errno(r, "Failed to open LLDP data for %i, ignoring: %m", links[i].ifindex);
+-                        continue;
+-                }
++        assert_se(cell = table_get_cell(udata.table, 0, 3));
++        table_set_minimum_width(udata.table, cell, 11);
++        table_set_ersatz_string(udata.table, TABLE_ERSATZ_DASH);
+ 
+-                for (;;) {
+-                        const char *chassis_id = NULL, *port_id = NULL, *system_name = NULL, *port_description = NULL;
+-                        _cleanup_(sd_lldp_neighbor_unrefp) sd_lldp_neighbor *n = NULL;
+-                        _cleanup_free_ char *capabilities = NULL;
+-                        uint16_t cc;
++        varlink_set_userdata(link, &udata);
+ 
+-                        r = next_lldp_neighbor(f, &n);
+-                        if (r < 0) {
+-                                log_warning_errno(r, "Failed to read neighbor data: %m");
+-                                break;
+-                        }
+-                        if (r == 0)
+-                                break;
++        for (int i = 0; i < c; i++) {
++                _cleanup_(json_variant_unrefp) JsonVariant *cparams = NULL;
+ 
+-                        (void) sd_lldp_neighbor_get_chassis_id_as_string(n, &chassis_id);
+-                        (void) sd_lldp_neighbor_get_port_id_as_string(n, &port_id);
+-                        (void) sd_lldp_neighbor_get_system_name(n, &system_name);
+-                        (void) sd_lldp_neighbor_get_port_description(n, &port_description);
++                udata.link_name = links[i].name;
+ 
+-                        if (sd_lldp_neighbor_get_enabled_capabilities(n, &cc) >= 0) {
+-                                capabilities = lldp_capabilities_to_string(cc);
+-                                all |= cc;
+-                        }
++                r = json_build(&cparams, JSON_BUILD_OBJECT(
++                                        JSON_BUILD_PAIR("ifindex", JSON_BUILD_UNSIGNED(links[i].ifindex))));
++                if (r < 0)
++                        return r;
+ 
+-                        r = table_add_many(table,
+-                                           TABLE_STRING, links[i].name,
+-                                           TABLE_STRING, chassis_id,
+-                                           TABLE_STRING, system_name,
+-                                           TABLE_STRING, capabilities,
+-                                           TABLE_STRING, port_id,
+-                                           TABLE_STRING, port_description);
+-                        if (r < 0)
+-                                return table_log_add_error(r);
++                r = varlink_observe(link, method, cparams);
++                if (r < 0)
++                        return log_error_errno(r, "Failed to execute varlink call: %m");
+ 
+-                        m++;
+-                }
++                r = varlink_observe_complete(link);
++                if (r < 0)
++                        return r;
+         }
+ 
+-        r = table_print(table, NULL);
++        r = table_print(udata.table, NULL);
+         if (r < 0)
+                 return table_log_print_error(r);
+ 
+         if (arg_legend) {
+-                lldp_capabilities_legend(all);
+-                printf("\n%i neighbors listed.\n", m);
++                lldp_capabilities_legend(udata.capabilities_all);
++                printf("\n%i neighbors listed.\n", udata.neighbors_count);
+         }
+ 
+         return 0;
+-- 
+2.41.0
+