|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From a61bb41c29c370a7e64285525ec35baac8944149 Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From: Tom Gundersen <teg@jklm.no>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Date: Thu, 4 Sep 2014 14:05:54 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Subject: [PATCH] networkd: move carrier gained/lost handling from
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
link_update_flags() to link_update()
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
This allows us also to simplify link_has_carrier() a bit.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/network/networkd-link.c | 74 ++++++++++++++++++++++-----------------------
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/network/networkd-link.h | 2 +-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
2 files changed, 38 insertions(+), 38 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index dff3270f2a..57e719478a 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/network/networkd-link.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/network/networkd-link.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -863,15 +863,15 @@ static int link_acquire_conf(Link *link) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-bool link_has_carrier(unsigned flags, uint8_t operstate) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+bool link_has_carrier(Link *link) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/* see Documentation/networking/operstates.txt in the kernel sources */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (operstate == IF_OPER_UP)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (link->kernel_operstate == IF_OPER_UP)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (operstate == IF_OPER_UNKNOWN)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (link->kernel_operstate == IF_OPER_UNKNOWN)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/* operstate may not be implemented, so fall back to flags */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if ((flags & IFF_LOWER_UP) && !(flags & IFF_DORMANT))
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if ((link->flags & IFF_LOWER_UP) && !(link->flags & IFF_DORMANT))
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -885,7 +885,6 @@ bool link_has_carrier(unsigned flags, uint8_t operstate) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
static int link_update_flags(Link *link, sd_rtnl_message *m) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
unsigned flags, unknown_flags_added, unknown_flags_removed, unknown_flags;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
uint8_t operstate;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- bool carrier_gained = false, carrier_lost = false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -949,40 +948,11 @@ static int link_update_flags(Link *link, sd_rtnl_message *m) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
unknown_flags_removed);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- carrier_gained = !link_has_carrier(link->flags, link->kernel_operstate) &&
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- link_has_carrier(flags, operstate);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- carrier_lost = link_has_carrier(link->flags, link->kernel_operstate) &&
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- !link_has_carrier(flags, operstate);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
link->flags = flags;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
link->kernel_operstate = operstate;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
link_save(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (link->state == LINK_STATE_FAILED ||
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- link->state == LINK_STATE_UNMANAGED)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (carrier_gained) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- log_info_link(link, "gained carrier");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (link->network) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- r = link_acquire_conf(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- link_enter_failed(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- } else if (carrier_lost) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- log_info_link(link, "lost carrier");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- r = link_stop_clients(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- link_enter_failed(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -1244,7 +1214,7 @@ static int link_configure(Link *link) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (link_has_carrier(link->flags, link->kernel_operstate)) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (link_has_carrier(link)) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
r = link_acquire_conf(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -1554,6 +1524,7 @@ int link_update(Link *link, sd_rtnl_message *m) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
struct ether_addr mac;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
const char *ifname;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
uint32_t mtu;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ bool had_carrier, carrier_gained, carrier_lost;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -1650,7 +1621,36 @@ int link_update(Link *link, sd_rtnl_message *m) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- return link_update_flags(link, m);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ had_carrier = link_has_carrier(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = link_update_flags(link, m);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ carrier_gained = !had_carrier && link_has_carrier(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ carrier_lost = had_carrier && !link_has_carrier(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (carrier_gained) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_info_link(link, "gained carrier");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (link->network) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = link_acquire_conf(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ link_enter_failed(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ } else if (carrier_lost) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_info_link(link, "lost carrier");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = link_stop_clients(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ link_enter_failed(link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
static void link_update_operstate(Link *link) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -1659,7 +1659,7 @@ static void link_update_operstate(Link *link) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (link->kernel_operstate == IF_OPER_DORMANT)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
link->operstate = LINK_OPERSTATE_DORMANT;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- else if (link_has_carrier(link->flags, link->kernel_operstate)) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ else if (link_has_carrier(link)) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Address *address;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
uint8_t scope = RT_SCOPE_NOWHERE;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 0f73ec7f9b..7acf404f87 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/network/networkd-link.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/network/networkd-link.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -113,7 +113,7 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *use
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int link_save(Link *link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-bool link_has_carrier(unsigned flags, uint8_t operstate);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+bool link_has_carrier(Link *link);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int link_set_mtu(Link *link, uint32_t mtu);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int link_set_hostname(Link *link, const char *hostname);
|