network: add io.systemd.Network.Link.Describe() Varlink method

The handler returns the JSON produced by link_build_json().

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
noxiouz
2026-03-18 22:55:52 +00:00
parent 54e8ea6552
commit e90ea94392
6 changed files with 109 additions and 25 deletions
+22
View File
@@ -6,6 +6,7 @@
#include "bus-polkit.h"
#include "json-util.h"
#include "networkd-dhcp4.h"
#include "networkd-json.h"
#include "networkd-link.h"
#include "networkd-link-varlink.h"
#include "networkd-manager.h"
@@ -67,6 +68,27 @@ int dispatch_link(sd_varlink *vlink, sd_json_variant *parameters, Manager *manag
return 0;
}
int vl_method_link_describe(sd_varlink *vlink, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
_cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL;
Manager *manager = ASSERT_PTR(userdata);
Link *link;
int r;
assert(vlink);
r = dispatch_link(vlink, parameters, manager, DISPATCH_LINK_MANDATORY, &link);
if (r != 0)
return r;
r = link_build_json(link, &v);
if (r < 0)
return log_link_error_errno(link, r, "Failed to format JSON data: %m");
return sd_varlink_replybo(
vlink,
SD_JSON_BUILD_PAIR_VARIANT("Interface", v));
}
static int vl_method_link_up_or_down(sd_varlink *vlink, sd_json_variant *parameters, Manager *manager, bool up) {
Link *link;
int r;
+1
View File
@@ -10,6 +10,7 @@ typedef enum DispatchLinkFlag {
int dispatch_link(sd_varlink *vlink, sd_json_variant *parameters, Manager *manager, DispatchLinkFlag flags, Link **ret);
int vl_method_link_describe(sd_varlink *vlink, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_link_up(sd_varlink *vlink, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_link_down(sd_varlink *vlink, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_link_renew(sd_varlink *vlink, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
+1
View File
@@ -303,6 +303,7 @@ int manager_varlink_init(Manager *m, int fd) {
"io.systemd.Network.GetNamespaceId", vl_method_get_namespace_id,
"io.systemd.Network.GetLLDPNeighbors", vl_method_get_lldp_neighbors,
"io.systemd.Network.SetPersistentStorage", vl_method_set_persistent_storage,
"io.systemd.Network.Link.Describe", vl_method_link_describe,
"io.systemd.Network.Link.Up", vl_method_link_up,
"io.systemd.Network.Link.Down", vl_method_link_down,
"io.systemd.Network.Link.Renew", vl_method_link_renew,
+37 -1
View File
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "bus-polkit.h"
#include "varlink-io.systemd.Network.h"
#include "varlink-io.systemd.Network.Link.h"
#define VARLINK_NETWORK_INTERFACE_INPUTS \
@@ -9,6 +10,12 @@
SD_VARLINK_FIELD_COMMENT("Name of the interface. If specified together with InterfaceIndex, both must reference the same link."), \
SD_VARLINK_DEFINE_INPUT(InterfaceName, SD_VARLINK_STRING, SD_VARLINK_NULLABLE)
static SD_VARLINK_DEFINE_METHOD(
Describe,
VARLINK_NETWORK_INTERFACE_INPUTS,
SD_VARLINK_FIELD_COMMENT("Interface description"),
SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(Interface, Interface, 0));
static SD_VARLINK_DEFINE_METHOD(
Up,
VARLINK_NETWORK_INTERFACE_INPUTS,
@@ -46,4 +53,33 @@ SD_VARLINK_DEFINE_INTERFACE(
SD_VARLINK_SYMBOL_COMMENT("Force-renew DHCP server leases on the specified link."),
&vl_method_ForceRenew,
SD_VARLINK_SYMBOL_COMMENT("Unconditionally reconfigure the specified link."),
&vl_method_Reconfigure);
&vl_method_Reconfigure,
SD_VARLINK_SYMBOL_COMMENT("Describe the specified link by index or name."),
&vl_method_Describe,
&vl_type_Address,
&vl_type_BitRates,
&vl_type_DHCPLease,
&vl_type_DHCPServer,
&vl_type_DHCPServerLease,
&vl_type_DHCPv6Client,
&vl_type_DHCPv6ClientPD,
&vl_type_DHCPv6ClientVendorOption,
&vl_type_DNS,
&vl_type_DNSSECNegativeTrustAnchor,
&vl_type_DNSSetting,
&vl_type_Domain,
&vl_type_Interface,
&vl_type_LinkState,
&vl_type_LinkAddressState,
&vl_type_LinkOnlineState,
&vl_type_LinkRequiredAddressFamily,
&vl_type_LLDPNeighbor,
&vl_type_NDisc,
&vl_type_Neighbor,
&vl_type_NextHop,
&vl_type_NextHopGroup,
&vl_type_NTP,
&vl_type_Pref64,
&vl_type_PrivateOption,
&vl_type_Route,
&vl_type_SIP);
+24 -24
View File
@@ -9,7 +9,7 @@
SD_VARLINK_FIELD_COMMENT(comment " (human-readable format)"), \
SD_VARLINK_DEFINE_FIELD(field_name##String, SD_VARLINK_STRING, (flags))
static SD_VARLINK_DEFINE_ENUM_TYPE(
SD_VARLINK_DEFINE_ENUM_TYPE(
LinkState,
SD_VARLINK_DEFINE_ENUM_VALUE(pending),
SD_VARLINK_DEFINE_ENUM_VALUE(initialized),
@@ -93,7 +93,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("Configuration state of this rule"),
SD_VARLINK_DEFINE_FIELD(ConfigState, SD_VARLINK_STRING, 0));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
Route,
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6)"),
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, 0),
@@ -149,14 +149,14 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("TCP congestion control algorithm for this route"),
SD_VARLINK_DEFINE_FIELD(TCPCongestionControlAlgorithm, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
NextHopGroup,
SD_VARLINK_FIELD_COMMENT("Next hop identifier in the multipath group"),
SD_VARLINK_DEFINE_FIELD(ID, SD_VARLINK_INT, 0),
SD_VARLINK_FIELD_COMMENT("Weight for load balancing (higher means more traffic)"),
SD_VARLINK_DEFINE_FIELD(Weight, SD_VARLINK_INT, 0));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
NextHop,
SD_VARLINK_FIELD_COMMENT("Next hop identifier"),
SD_VARLINK_DEFINE_FIELD(ID, SD_VARLINK_INT, 0),
@@ -181,7 +181,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("Configuration state of this next hop"),
SD_VARLINK_DEFINE_FIELD(ConfigState, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
LLDPNeighbor,
SD_VARLINK_FIELD_COMMENT("Chassis identifier in human-readable format"),
SD_VARLINK_DEFINE_FIELD(ChassisID, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
@@ -204,7 +204,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("VLAN identifier"),
SD_VARLINK_DEFINE_FIELD(VlanID, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
DNS,
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6)"),
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, 0),
@@ -219,7 +219,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
VARLINK_DEFINE_IN_ADDR_WITH_STRING_FIELD(ConfigProvider, "Address of the configuration provider", SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
NTP,
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6) for address-based servers"),
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
@@ -230,7 +230,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
VARLINK_DEFINE_IN_ADDR_WITH_STRING_FIELD(ConfigProvider, "Address of the configuration provider", SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
SIP,
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6) for address-based servers"),
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
@@ -241,7 +241,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
VARLINK_DEFINE_IN_ADDR_WITH_STRING_FIELD(ConfigProvider, "Address of the configuration provider", SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
Domain,
SD_VARLINK_FIELD_COMMENT("DNS search or route domain name"),
SD_VARLINK_DEFINE_FIELD(Domain, SD_VARLINK_STRING, 0),
@@ -249,14 +249,14 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0),
VARLINK_DEFINE_IN_ADDR_WITH_STRING_FIELD(ConfigProvider, "Address of the configuration provider", SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
DNSSECNegativeTrustAnchor,
SD_VARLINK_FIELD_COMMENT("Domain name for which DNSSEC validation is disabled"),
SD_VARLINK_DEFINE_FIELD(DNSSECNegativeTrustAnchor, SD_VARLINK_STRING, 0),
SD_VARLINK_FIELD_COMMENT("Configuration source for this negative trust anchor"),
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
DNSSetting,
SD_VARLINK_FIELD_COMMENT("Link-Local Multicast Name Resolution setting"),
SD_VARLINK_DEFINE_FIELD(LLMNR, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
@@ -269,7 +269,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("Configuration source for this DNS setting"),
SD_VARLINK_DEFINE_FIELD(ConfigSource, SD_VARLINK_STRING, 0));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
Pref64,
SD_VARLINK_FIELD_COMMENT("IPv6 prefix for NAT64/DNS64"),
SD_VARLINK_DEFINE_FIELD(Prefix, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
@@ -281,12 +281,12 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_FIELD(LifetimeUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
VARLINK_DEFINE_IN_ADDR_WITH_STRING_FIELD(ConfigProvider, "Address of router that provided this prefix", SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
NDisc,
SD_VARLINK_FIELD_COMMENT("PREF64 (RFC8781) prefixes advertised via IPv6 Router Advertisements"),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(PREF64, Pref64, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
Address,
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6)"),
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, 0),
@@ -319,7 +319,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("Configuration state of this address"),
SD_VARLINK_DEFINE_FIELD(ConfigState, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
Neighbor,
SD_VARLINK_FIELD_COMMENT("Address family (AF_INET or AF_INET6)"),
SD_VARLINK_DEFINE_FIELD(Family, SD_VARLINK_INT, 0),
@@ -331,7 +331,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("Configuration state of this neighbor entry"),
SD_VARLINK_DEFINE_FIELD(ConfigState, SD_VARLINK_STRING, 0));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
DHCPLease,
SD_VARLINK_FIELD_COMMENT("Timestamp when the lease was acquired in microseconds"),
SD_VARLINK_DEFINE_FIELD(LeaseTimestampUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
@@ -342,14 +342,14 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("Hostname received from DHCP server"),
SD_VARLINK_DEFINE_FIELD(Hostname, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
PrivateOption,
SD_VARLINK_FIELD_COMMENT("DHCP option number"),
SD_VARLINK_DEFINE_FIELD(Option, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
SD_VARLINK_FIELD_COMMENT("Raw data of the private DHCP option"),
SD_VARLINK_DEFINE_FIELD(PrivateOptionData, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
DHCPv6ClientPD,
SD_VARLINK_FIELD_COMMENT("Delegated IPv6 prefix"),
SD_VARLINK_DEFINE_FIELD(Prefix, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
@@ -362,7 +362,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("Valid lifetime of the prefix in microseconds"),
SD_VARLINK_DEFINE_FIELD(ValidLifetimeUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
DHCPv6ClientVendorOption,
SD_VARLINK_FIELD_COMMENT("IANA enterprise number identifying the vendor"),
SD_VARLINK_DEFINE_FIELD(EnterpriseId, SD_VARLINK_INT, 0),
@@ -371,7 +371,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("Raw data of the vendor-specific sub-option"),
SD_VARLINK_DEFINE_FIELD(SubOptionData, SD_VARLINK_STRING, 0));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
DHCPv6Client,
SD_VARLINK_FIELD_COMMENT("DHCPv6 lease information including timestamps and timeouts"),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(Lease, DHCPLease, SD_VARLINK_NULLABLE),
@@ -382,7 +382,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("DHCP Unique Identifier (DUID) of the client"),
SD_VARLINK_DEFINE_FIELD(DUID, SD_VARLINK_INT, SD_VARLINK_ARRAY));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
DHCPServerLease,
SD_VARLINK_FIELD_COMMENT("DHCP client identifier"),
SD_VARLINK_DEFINE_FIELD(ClientId, SD_VARLINK_INT, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
@@ -400,7 +400,7 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("Lease expiration time in realtime microseconds"),
SD_VARLINK_DEFINE_FIELD(ExpirationRealtimeUSec, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
DHCPServer,
SD_VARLINK_FIELD_COMMENT("Offset from the network address for the DHCP address pool"),
SD_VARLINK_DEFINE_FIELD(PoolOffset, SD_VARLINK_INT, 0),
@@ -411,14 +411,14 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_FIELD_COMMENT("Static DHCP leases configured for specific clients"),
SD_VARLINK_DEFINE_FIELD_BY_TYPE(StaticLeases, DHCPServerLease, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
BitRates,
SD_VARLINK_FIELD_COMMENT("Transmit bitrate in bits per second"),
SD_VARLINK_DEFINE_FIELD(TxBitRate, SD_VARLINK_INT, 0),
SD_VARLINK_FIELD_COMMENT("Receive bitrate in bits per second"),
SD_VARLINK_DEFINE_FIELD(RxBitRate, SD_VARLINK_INT, 0));
static SD_VARLINK_DEFINE_STRUCT_TYPE(
SD_VARLINK_DEFINE_STRUCT_TYPE(
Interface,
SD_VARLINK_FIELD_COMMENT("Network interface index"),
SD_VARLINK_DEFINE_FIELD(Index, SD_VARLINK_INT, 0),
+24
View File
@@ -7,3 +7,27 @@ extern const sd_varlink_interface vl_interface_io_systemd_Network;
extern const sd_varlink_symbol vl_type_LinkAddressState;
extern const sd_varlink_symbol vl_type_LinkOnlineState;
extern const sd_varlink_symbol vl_type_LinkRequiredAddressFamily;
extern const sd_varlink_symbol vl_type_LinkState;
extern const sd_varlink_symbol vl_type_Route;
extern const sd_varlink_symbol vl_type_NextHopGroup;
extern const sd_varlink_symbol vl_type_NextHop;
extern const sd_varlink_symbol vl_type_LLDPNeighbor;
extern const sd_varlink_symbol vl_type_DNS;
extern const sd_varlink_symbol vl_type_NTP;
extern const sd_varlink_symbol vl_type_SIP;
extern const sd_varlink_symbol vl_type_Domain;
extern const sd_varlink_symbol vl_type_DNSSECNegativeTrustAnchor;
extern const sd_varlink_symbol vl_type_DNSSetting;
extern const sd_varlink_symbol vl_type_Pref64;
extern const sd_varlink_symbol vl_type_NDisc;
extern const sd_varlink_symbol vl_type_Address;
extern const sd_varlink_symbol vl_type_Neighbor;
extern const sd_varlink_symbol vl_type_DHCPLease;
extern const sd_varlink_symbol vl_type_PrivateOption;
extern const sd_varlink_symbol vl_type_DHCPv6ClientPD;
extern const sd_varlink_symbol vl_type_DHCPv6ClientVendorOption;
extern const sd_varlink_symbol vl_type_DHCPv6Client;
extern const sd_varlink_symbol vl_type_DHCPServerLease;
extern const sd_varlink_symbol vl_type_DHCPServer;
extern const sd_varlink_symbol vl_type_BitRates;
extern const sd_varlink_symbol vl_type_Interface;