summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2019-06-10 05:22:25 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2019-06-16 23:17:28 +0900
commit7f3c07ada6fce33e8cac141da40f2f5bd5ff2170 (patch)
tree948ed5298974f4a9707bbedf2d4123dd3b813d14
parent35c5a9cae40b4edb47c66bd7b743499f23e6c347 (diff)
downloadsystemd-7f3c07ada6fce33e8cac141da40f2f5bd5ff2170.tar.gz
network: also introduce two new manager states
-rw-r--r--src/network/networkd-manager-bus.c5
-rw-r--r--src/network/networkd-manager.c33
-rw-r--r--src/network/networkd-manager.h2
3 files changed, 36 insertions, 4 deletions
diff --git a/src/network/networkd-manager-bus.c b/src/network/networkd-manager-bus.c
index e339c9ce8f..622bfa01d2 100644
--- a/src/network/networkd-manager-bus.c
+++ b/src/network/networkd-manager-bus.c
@@ -2,15 +2,16 @@
#include "alloc-util.h"
#include "bus-util.h"
+#include "networkd-link-bus.h"
#include "networkd-manager.h"
#include "strv.h"
-static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state, link_operstate, LinkOperationalState);
-
const sd_bus_vtable manager_vtable[] = {
SD_BUS_VTABLE_START(0),
SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state, offsetof(Manager, operational_state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+ SD_BUS_PROPERTY("CarrierState", "s", property_get_carrier_state, offsetof(Manager, carrier_state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+ SD_BUS_PROPERTY("AddressState", "s", property_get_address_state, offsetof(Manager, address_state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_VTABLE_END
};
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
index d2e5b5de59..39a6b17c10 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -1078,8 +1078,11 @@ static int manager_save(Manager *m) {
Link *link;
Iterator i;
_cleanup_free_ char *temp_path = NULL;
+ _cleanup_strv_free_ char **p = NULL;
_cleanup_fclose_ FILE *f = NULL;
LinkOperationalState operstate = LINK_OPERSTATE_OFF;
+ LinkCarrierState carrier_state = LINK_CARRIER_STATE_OFF;
+ LinkAddressState address_state = LINK_ADDRESS_STATE_OFF;
const char *operstate_str;
int r;
@@ -1110,6 +1113,12 @@ static int manager_save(Manager *m) {
if (link->operstate > operstate)
operstate = link->operstate;
+ if (link->carrier_state > carrier_state)
+ carrier_state = link->carrier_state;
+
+ if (link->address_state > address_state)
+ address_state = link->address_state;
+
if (!link->network)
continue;
@@ -1181,6 +1190,9 @@ static int manager_save(Manager *m) {
}
}
+ if (carrier_state >= LINK_CARRIER_STATE_ENSLAVED)
+ carrier_state = LINK_CARRIER_STATE_CARRIER;
+
operstate_str = link_operstate_to_string(operstate);
assert(operstate_str);
@@ -1214,9 +1226,26 @@ static int manager_save(Manager *m) {
if (m->operational_state != operstate) {
m->operational_state = operstate;
- r = manager_send_changed(m, "OperationalState", NULL);
+ if (strv_extend(&p, "OperationalState") < 0)
+ log_oom();
+ }
+
+ if (m->carrier_state != carrier_state) {
+ m->carrier_state = carrier_state;
+ if (strv_extend(&p, "CarrierState") < 0)
+ log_oom();
+ }
+
+ if (m->address_state != address_state) {
+ m->address_state = address_state;
+ if (strv_extend(&p, "AddressState") < 0)
+ log_oom();
+ }
+
+ if (p) {
+ r = manager_send_changed_strv(m, p);
if (r < 0)
- log_error_errno(r, "Could not emit changed OperationalState: %m");
+ log_error_errno(r, "Could not emit changed properties: %m");
}
m->dirty = false;
diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h
index 60d3bed34f..9685da07e3 100644
--- a/src/network/networkd-manager.h
+++ b/src/network/networkd-manager.h
@@ -33,6 +33,8 @@ struct Manager {
char *state_file;
LinkOperationalState operational_state;
+ LinkCarrierState carrier_state;
+ LinkAddressState address_state;
Hashmap *links;
Hashmap *netdevs;