]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/wait-online/link.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright 2014 Lennart Poettering
4 Copyright 2014 Tom Gundersen
7 #include "sd-network.h"
9 #include "alloc-util.h"
13 #include "string-util.h"
15 int link_new(Manager
*m
, Link
**ret
, int ifindex
, const char *ifname
) {
16 _cleanup_(link_freep
) Link
*l
= NULL
;
22 r
= hashmap_ensure_allocated(&m
->links
, NULL
);
26 r
= hashmap_ensure_allocated(&m
->links_by_name
, &string_hash_ops
);
36 l
->ifname
= strdup(ifname
);
40 r
= hashmap_put(m
->links_by_name
, l
->ifname
, l
);
46 r
= hashmap_put(m
->links
, INT_TO_PTR(ifindex
), l
);
57 Link
*link_free(Link
*l
) {
63 hashmap_remove(l
->manager
->links
, INT_TO_PTR(l
->ifindex
));
64 hashmap_remove(l
->manager
->links_by_name
, l
->ifname
);
71 int link_update_rtnl(Link
*l
, sd_netlink_message
*m
) {
79 r
= sd_rtnl_message_link_get_flags(m
, &l
->flags
);
83 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
87 if (!streq(l
->ifname
, ifname
)) {
90 new_ifname
= strdup(ifname
);
94 hashmap_remove(l
->manager
->links_by_name
, l
->ifname
);
96 l
->ifname
= new_ifname
;
98 r
= hashmap_put(l
->manager
->links_by_name
, l
->ifname
, l
);
106 int link_update_monitor(Link
*l
) {
109 l
->required_for_online
= sd_network_link_get_required_for_online(l
->ifindex
) != 0;
111 l
->operational_state
= mfree(l
->operational_state
);
113 sd_network_link_get_operational_state(l
->ifindex
, &l
->operational_state
);
115 l
->state
= mfree(l
->state
);
117 sd_network_link_get_setup_state(l
->ifindex
, &l
->state
);