networkctl.c revision b5efdb8af40ea759a1ea584c1bc44ecc81dd00ce
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering This file is part of systemd.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering Copyright 2014 Lennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering systemd is free software; you can redistribute it and/or modify it
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering under the terms of the GNU Lesser General Public License as published by
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering (at your option) any later version.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering systemd is distributed in the hope that it will be useful, but
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering Lesser General Public License for more details.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering You should have received a copy of the GNU Lesser General Public License
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic bool arg_no_pager = false;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic bool arg_legend = true;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic bool arg_all = false;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic void pager_open_if_enabled(void) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic int link_get_type_string(int iftype, sd_device *d, char **ret) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering const char *t;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering /* WLANs have iftype ARPHRD_ETHER, but we want
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering * to show a more useful type string for
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering (void)sd_device_get_devtype(d, &devtype);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poetteringtypedef struct LinkInfo {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poetteringstatic int link_info_compare(const void *a, const void *b) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering const LinkInfo *x = a, *y = b;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poetteringstatic int decode_and_sort_links(sd_netlink_message *m, LinkInfo **ret) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering for (i = m; i; i = sd_netlink_message_next(i)) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r = sd_netlink_message_get_type(i, &type);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r = sd_rtnl_message_link_get_ifindex(i, &ifindex);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r = sd_netlink_message_read_string(i, IFLA_IFNAME, &name);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r = sd_rtnl_message_link_get_type(i, &iftype);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering qsort_safe(links, c, sizeof(LinkInfo), link_info_compare);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering return (int) c;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poetteringstatic void operational_state_to_color(const char *state, const char **on, const char **off) {
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering } else if (streq_ptr(state, "degraded")) {
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poetteringstatic void setup_state_to_color(const char *state, const char **on, const char **off) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering } else if (streq_ptr(state, "configuring")) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering } else if (streq_ptr(state, "failed") || streq_ptr(state, "linger")) {
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidtstatic int list_links(int argc, char *argv[], void *userdata) {
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL, *reply = NULL;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering _cleanup_netlink_unref_ sd_netlink *rtnl = NULL;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return log_error_errno(r, "Failed to connect to netlink: %m");
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, 0);
3e3db0ee860025ad663b13b0ace4e6d627611332Lennart Poettering r = sd_netlink_message_request_dump(req, true);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r = sd_netlink_call(rtnl, req, 0, &reply);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering return log_error_errno(r, "Failed to enumerate links: %m");
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering printf("%3s %-16s %-18s %-11s %-10s\n", "IDX", "LINK", "TYPE", "OPERATIONAL", "SETUP");
df3fb561b2df486a495a5f0bcc83168bd1860533Lennart Poettering c = decode_and_sort_links(reply, &links);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering for (i = 0; i < c; i++) {
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering _cleanup_free_ char *setup_state = NULL, *operational_state = NULL;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering _cleanup_device_unref_ sd_device *d = NULL;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering const char *on_color_operational, *off_color_operational,
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering sd_network_link_get_operational_state(links[i].ifindex, &operational_state);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering operational_state_to_color(operational_state, &on_color_operational, &off_color_operational);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering sd_network_link_get_setup_state(links[i].ifindex, &setup_state);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering setup_state_to_color(setup_state, &on_color_setup, &off_color_setup);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering (void)sd_device_new_from_device_id(&d, devid);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering link_get_type_string(links[i].iftype, d, &t);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering printf("%3i %-16s %-18s %s%-11s%s %s%-10s%s\n",
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering links[i].ifindex, links[i].name, strna(t),
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering on_color_operational, strna(operational_state), off_color_operational,
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen on_color_setup, strna(setup_state), off_color_setup);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen/* IEEE Organizationally Unique Identifier vendor string */
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersenstatic int ieee_oui(sd_hwdb *hwdb, struct ether_addr *mac, char **ret) {
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen char modalias[strlen("OUI:XXYYXXYYXXYY") + 1], *desc;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen /* skip commonly misused 00:00:00 (Xerox) prefix */
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen snprintf(modalias, sizeof(modalias), "OUI:" ETHER_ADDR_FORMAT_STR, ETHER_ADDR_FORMAT_VAL(*mac));
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering r = sd_hwdb_get(hwdb, modalias, "ID_OUI_FROM_DATABASE", &description);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL, *reply = NULL;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen assert(family == AF_INET || family == AF_INET6);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = sd_rtnl_message_new_neigh(rtnl, &req, RTM_GETNEIGH, ifindex, family);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = sd_netlink_message_request_dump(req, true);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen for (m = reply; m; m = sd_netlink_message_next(m)) {
144232a8e0ea77eed8c5a456832758681b5b3511Torstein Husebø r = sd_rtnl_message_neigh_get_family(m, &fam);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen log_error_errno(r, "could not get family: %m");
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = sd_rtnl_message_neigh_get_ifindex(m, &ifi);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen log_error_errno(r, "could not get ifindex: %m");
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = sd_netlink_message_read_in_addr(m, NDA_DST, &gw.in);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = sd_netlink_message_read_in6_addr(m, NDA_DST, &gw.in6);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = sd_netlink_message_read_ether_addr(m, NDA_LLADDR, &mac);
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering r = ieee_oui(hwdb, &mac, gateway_description);
b6a3ca6d876ab59b4f29ed67f54ef87005177906Tom Gundersen _cleanup_free_ struct local_address *local = NULL;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen n = local_gateways(rtnl, ifindex, AF_UNSPEC, &local);
1693a943ca581aca2beebb4c812ec6c9f17b8164Lennart Poettering for (i = 0; i < n; i++) {
1693a943ca581aca2beebb4c812ec6c9f17b8164Lennart Poettering _cleanup_free_ char *gateway = NULL, *description = NULL;
1693a943ca581aca2beebb4c812ec6c9f17b8164Lennart Poettering r = in_addr_to_string(local[i].family, &local[i].address, &gateway);
1693a943ca581aca2beebb4c812ec6c9f17b8164Lennart Poettering r = get_gateway_description(rtnl, hwdb, local[i].ifindex, local[i].family, &local[i].address, &description);
1693a943ca581aca2beebb4c812ec6c9f17b8164Lennart Poettering log_debug_errno(r, "Could not get description of gateway: %m");
1693a943ca581aca2beebb4c812ec6c9f17b8164Lennart Poettering /* Show interface name for the entry if we show
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen * entries for all interfaces */
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering _cleanup_free_ struct local_address *local = NULL;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering n = local_addresses(rtnl, ifindex, AF_UNSPEC, &local);
1693a943ca581aca2beebb4c812ec6c9f17b8164Lennart Poettering for (i = 0; i < n; i++) {
1693a943ca581aca2beebb4c812ec6c9f17b8164Lennart Poettering r = in_addr_to_string(local[i].family, &local[i].address, &pretty);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (if_indextoname(local[i].ifindex, name)) {
69fb1176c403e437c4fba763ba242b540c73898fLennart Poetteringstatic void dump_list(const char *prefix, char **l) {
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering const char *name) {
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering _cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **domains = NULL;
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering _cleanup_free_ char *setup_state = NULL, *operational_state = NULL, *tz = NULL;
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL, *reply = NULL;
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering _cleanup_device_unref_ sd_device *d = NULL;
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering _cleanup_free_ char *t = NULL, *network = NULL;
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL;
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering const char *on_color_operational, *off_color_operational,
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering _cleanup_strv_free_ char **carrier_bound_to = NULL;
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering _cleanup_strv_free_ char **carrier_bound_by = NULL;
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering if (safe_atoi(name, &ifindex) >= 0 && ifindex > 0)
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, ifindex);
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, 0);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering r = sd_netlink_message_append_string(req, IFLA_IFNAME, name);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering r = sd_netlink_call(rtnl, req, 0, &reply);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering return log_error_errno(r, "Failed to query link: %m");
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering r = sd_rtnl_message_link_get_ifindex(reply, &ifindex);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering r = sd_netlink_message_read_string(reply, IFLA_IFNAME, &name);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering r = sd_rtnl_message_link_get_type(reply, &iftype);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering have_mac = sd_netlink_message_read_ether_addr(reply, IFLA_ADDRESS, &e) >= 0;
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering for (p = (uint8_t*) &e; p < (uint8_t*) &e + sizeof(e); p++)
d6731e4c7964ee2860d4f5abdb0b52acd7a66960Tom Gundersen if (*p != 0) {
67272d157a35e5cda4e5c904eafdcc23d20541d1Tom Gundersen sd_netlink_message_read_u32(reply, IFLA_MTU, &mtu);
67272d157a35e5cda4e5c904eafdcc23d20541d1Tom Gundersen sd_network_link_get_operational_state(ifindex, &operational_state);
67272d157a35e5cda4e5c904eafdcc23d20541d1Tom Gundersen operational_state_to_color(operational_state, &on_color_operational, &off_color_operational);
1405434b6986d3c3d6ccaaa2e472bad843cbbfa1Lennart Poettering sd_network_link_get_setup_state(ifindex, &setup_state);
1405434b6986d3c3d6ccaaa2e472bad843cbbfa1Lennart Poettering setup_state_to_color(setup_state, &on_color_setup, &off_color_setup);
1405434b6986d3c3d6ccaaa2e472bad843cbbfa1Lennart Poettering sd_network_link_get_domains(ifindex, &domains);
67272d157a35e5cda4e5c904eafdcc23d20541d1Tom Gundersen r = sd_network_link_get_wildcard_domain(ifindex);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering if (strv_consume(&domains, wildcard) < 0)
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering (void)sd_device_new_from_device_id(&d, devid);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering (void)sd_device_get_property_value(d, "ID_NET_LINK_FILE", &link);
b1acce80cd60fe95f16df2f1ad23ff2ad82d08e5Lennart Poettering (void)sd_device_get_property_value(d, "ID_NET_DRIVER", &driver);
b1acce80cd60fe95f16df2f1ad23ff2ad82d08e5Lennart Poettering (void)sd_device_get_property_value(d, "ID_PATH", &path);
df3fb561b2df486a495a5f0bcc83168bd1860533Lennart Poettering r = sd_device_get_property_value(d, "ID_VENDOR_FROM_DATABASE", &vendor);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering (void)sd_device_get_property_value(d, "ID_VENDOR", &vendor);
af5effc4220dab6c4c87a130bae7be441f6967caTom Gundersen r = sd_device_get_property_value(d, "ID_MODEL_FROM_DATABASE", &model);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering (void)sd_device_get_property_value(d, "ID_MODEL", &model);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering sd_network_link_get_network_file(ifindex, &network);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering sd_network_link_get_carrier_bound_to(ifindex, &carrier_bound_to);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering sd_network_link_get_carrier_bound_by(ifindex, &carrier_bound_by);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering printf("%s%s%s %i: %s\n", on_color_operational, draw_special_char(DRAW_BLACK_CIRCLE), off_color_operational, ifindex, name);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering " Network File: %s\n"
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering " State: %s%s%s (%s%s%s)\n",
888943fc6246b2917168fff59380b58b678ba157Lennart Poettering on_color_operational, strna(operational_state), off_color_operational,
888943fc6246b2917168fff59380b58b678ba157Lennart Poettering on_color_setup, strna(setup_state), off_color_setup);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering printf(" HW Address: %s (%s)\n", ether_addr_to_string(&e, ea), description);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering printf(" HW Address: %s\n", ether_addr_to_string(&e, ea));
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering dump_addresses(rtnl, " Address: ", ifindex);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering dump_gateways(rtnl, hwdb, " Gateway: ", ifindex);
f7d68aa8c9430dfddee5f913f93b405a5d75723aLennart Poettering (void) sd_network_link_get_ntp(ifindex, &ntp);
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering dump_list("Carrier Bound To: ", carrier_bound_to);
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering dump_list("Carrier Bound By: ", carrier_bound_by);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering (void) sd_network_link_get_timezone(ifindex, &tz);
5323ead145304785121b72dcbc1c244303de7575Daniel Buchstatic int link_status(int argc, char *argv[], void *userdata) {
b1acce80cd60fe95f16df2f1ad23ff2ad82d08e5Lennart Poettering _cleanup_hwdb_unref_ sd_hwdb *hwdb = NULL;
b1acce80cd60fe95f16df2f1ad23ff2ad82d08e5Lennart Poettering _cleanup_netlink_unref_ sd_netlink *rtnl = NULL;
03cc0fd1431b82e59c11ae12a274c1f2df23169dLennart Poettering return log_error_errno(r, "Failed to connect to netlink: %m");
c627729fc49d59ffcecc09555a34d9dd139927ceLennart Poettering log_debug_errno(r, "Failed to open hardware database: %m");
c627729fc49d59ffcecc09555a34d9dd139927ceLennart Poettering _cleanup_free_ char *operational_state = NULL;
ddb7f7fc07a31937989afad53edb87b50e2cad72Zbigniew Jędrzejewski-Szmek _cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **domains = NULL;
03cc0fd1431b82e59c11ae12a274c1f2df23169dLennart Poettering const char *on_color_operational, *off_color_operational;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering sd_network_get_operational_state(&operational_state);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering operational_state_to_color(operational_state, &on_color_operational, &off_color_operational);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering on_color_operational, draw_special_char(DRAW_BLACK_CIRCLE), off_color_operational,
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering on_color_operational, strna(operational_state), off_color_operational);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering dump_gateways(rtnl, hwdb, " Gateway: ", 0);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL, *reply = NULL;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, 0);
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering r = sd_netlink_message_request_dump(req, true);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering r = sd_netlink_call(rtnl, req, 0, &reply);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return log_error_errno(r, "Failed to enumerate links: %m");
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering c = decode_and_sort_links(reply, &links);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering for (i = 0; i < c; i++) {
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering link_status_one(rtnl, hwdb, links[i].name);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringconst char *lldp_system_capability_to_string(LLDPSystemCapabilities d) _const_;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart PoetteringLLDPSystemCapabilities lldp_system_capability_from_string(const char *d) _pure_;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic const char* const lldp_system_capability_table[_LLDP_SYSTEM_CAPABILITIES_MAX + 1] = {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering [LLDP_SYSTEM_CAPABILITIES_REPEATER] = "P",
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering [LLDP_SYSTEM_CAPABILITIES_WLAN_AP] = "W",
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering [LLDP_SYSTEM_CAPABILITIES_STATION] = "A",
ee8c45689526ca973407cbb77bce7b96a062c40bLennart PoetteringDEFINE_STRING_TABLE_LOOKUP(lldp_system_capability, LLDPSystemCapabilities);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic char *lldp_system_caps(uint16_t cap) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering _cleanup_free_ char *s = NULL, *t = NULL;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_OTHER) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strjoin(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_OTHER), " ", NULL);
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_REPEATER) {
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering s = strjoin(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_REPEATER), " ", NULL);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_BRIDGE) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strjoin(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_BRIDGE), " ", NULL);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_WLAN_AP) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strjoin(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_WLAN_AP), " ", NULL);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_ROUTER) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strjoin(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_ROUTER), " ", NULL);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_PHONE) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strjoin(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_PHONE), " ", NULL);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_DOCSIS) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strjoin(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_DOCSIS), " ", NULL);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_STATION) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strjoin(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_STATION), " ", NULL);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_CVLAN) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strjoin(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_CVLAN), " ", NULL);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_SVLAN) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strjoin(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_SVLAN), " ", NULL);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (cap & LLDP_SYSTEM_CAPABILITIES_TPMR) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strappend(t, lldp_system_capability_to_string(LLDP_SYSTEM_CAPABILITIES_TPMR));
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering s = strappend(t, lldp_system_capability_to_string(_LLDP_SYSTEM_CAPABILITIES_MAX));
return capability;
return rtnl_log_create_error(r);
return rtnl_log_create_error(r);
return rtnl_log_parse_error(c);
if (arg_legend)
return -ENOMEM;
STRV_FOREACH(s, l) {
return -ENOMEM;
r = safe_atollu(b, &x);
if (r < 0 || (usec_t) x != x)
if (x < time)
if (ttl >= 0) {
if (arg_legend) {
static void help(void) {
help();
case ARG_VERSION:
return version();
case ARG_NO_PAGER:
arg_no_pager = true;
case ARG_NO_LEGEND:
arg_legend = false;
arg_all = true;
return -EINVAL;
log_open();
goto finish;
pager_close();