systemd: Add support for static neighbors

These are backports of changes I contributed to systemd v240. We need
these until we get v240 from oe core.

Tested:
    Ran a romulus image and provisioned static neighbors with systemd
    networkd.

(From meta-phosphor rev: 8b84385e3c40d1827b06d0612def2275d3ad4faf)

Change-Id: I5720a3b1626e15d4e4cfc630ce24f5818b294d8a
Signed-off-by: William A. Kennington III <wak@google.com>
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/meta-phosphor/recipes-core/systemd/systemd/0002-networkd-Use-only-a-generic-CONFIGURING-state.patch b/meta-phosphor/recipes-core/systemd/systemd/0002-networkd-Use-only-a-generic-CONFIGURING-state.patch
new file mode 100644
index 0000000..49c4cc3
--- /dev/null
+++ b/meta-phosphor/recipes-core/systemd/systemd/0002-networkd-Use-only-a-generic-CONFIGURING-state.patch
@@ -0,0 +1,176 @@
+From 3283d15fe33da392b7174eb4b82a5ad1ce03a6e4 Mon Sep 17 00:00:00 2001
+From: "William A. Kennington III" <william@wkennington.com>
+Date: Fri, 30 Nov 2018 15:36:33 -0800
+Subject: [PATCH 2/3] networkd: Use only a generic CONFIGURING state
+
+This allows us to convey that we are performing multiple link
+configuration changes in parallel. This is needed to support configuring
+neighbors while simultaneously configuring addresses and routes.
+
+(cherry picked from commit 289e6774d0daefe86771171b8f4f97b63354683e)
+
+Upstream-Status: Backport
+---
+ src/network/networkd-link.c | 37 +++++++++++++++++--------------------
+ src/network/networkd-link.h |  4 +---
+ 2 files changed, 18 insertions(+), 23 deletions(-)
+
+diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
+index 0faf337069..71b92185cd 100644
+--- a/src/network/networkd-link.c
++++ b/src/network/networkd-link.c
+@@ -706,7 +706,7 @@ static void link_enter_configured(Link *link) {
+         assert(link);
+         assert(link->network);
+ 
+-        if (link->state != LINK_STATE_SETTING_ROUTES)
++        if (link->state != LINK_STATE_CONFIGURING)
+                 return;
+ 
+         log_link_info(link, "Configured");
+@@ -810,9 +810,8 @@ static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata
+         int r;
+ 
+         assert(link->route_messages > 0);
+-        assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
+-                      LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
+-                      LINK_STATE_LINGER));
++        assert(IN_SET(link->state, LINK_STATE_CONFIGURING,
++                      LINK_STATE_FAILED, LINK_STATE_LINGER));
+ 
+         link->route_messages--;
+ 
+@@ -832,7 +831,7 @@ static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata
+         return 1;
+ }
+ 
+-static int link_enter_set_routes(Link *link) {
++static int link_request_set_routes(Link *link) {
+         Route *rt;
+         int r;
+ 
+@@ -840,11 +839,11 @@ static int link_enter_set_routes(Link *link) {
+         assert(link->network);
+         assert(link->addresses_configured);
+         assert(link->address_messages == 0);
+-        assert(link->state == LINK_STATE_SETTING_ADDRESSES);
++        assert(link->state != _LINK_STATE_INVALID);
+ 
+-        (void) link_set_routing_policy_rule(link);
++        link_set_state(link, LINK_STATE_CONFIGURING);
+ 
+-        link_set_state(link, LINK_STATE_SETTING_ROUTES);
++        (void) link_set_routing_policy_rule(link);
+ 
+         LIST_FOREACH(routes, rt, link->network->static_routes) {
+                 r = route_configure(rt, link, route_handler);
+@@ -893,7 +892,7 @@ static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userda
+         assert(link);
+         assert(link->ifname);
+         assert(link->address_messages > 0);
+-        assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
++        assert(IN_SET(link->state, LINK_STATE_CONFIGURING,
+                LINK_STATE_FAILED, LINK_STATE_LINGER));
+ 
+         link->address_messages--;
+@@ -910,7 +909,7 @@ static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userda
+         if (link->address_messages == 0) {
+                 log_link_debug(link, "Addresses set");
+                 link->addresses_configured = true;
+-                link_enter_set_routes(link);
++                link_request_set_routes(link);
+         }
+ 
+         return 1;
+@@ -1054,7 +1053,7 @@ static int link_set_bridge_fdb(Link *link) {
+         return 0;
+ }
+ 
+-static int link_enter_set_addresses(Link *link) {
++static int link_request_set_addresses(Link *link) {
+         AddressLabel *label;
+         Address *ad;
+         int r;
+@@ -1067,7 +1066,7 @@ static int link_enter_set_addresses(Link *link) {
+         if (r < 0)
+                 return r;
+ 
+-        link_set_state(link, LINK_STATE_SETTING_ADDRESSES);
++        link_set_state(link, LINK_STATE_CONFIGURING);
+ 
+         LIST_FOREACH(addresses, ad, link->network->static_addresses) {
+                 r = address_configure(ad, link, address_handler, false);
+@@ -1212,7 +1211,7 @@ static int link_enter_set_addresses(Link *link) {
+ 
+         if (link->address_messages == 0) {
+                 link->addresses_configured = true;
+-                link_enter_set_routes(link);
++                link_request_set_routes(link);
+         } else
+                 log_link_debug(link, "Setting addresses");
+ 
+@@ -2313,7 +2312,7 @@ static int link_joined(Link *link) {
+         if (!link_has_carrier(link) && !link->network->configure_without_carrier)
+                 return 0;
+ 
+-        return link_enter_set_addresses(link);
++        return link_request_set_addresses(link);
+ }
+ 
+ static int netdev_join_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
+@@ -2351,7 +2350,7 @@ static int link_enter_join_netdev(Link *link) {
+         assert(link->network);
+         assert(link->state == LINK_STATE_PENDING);
+ 
+-        link_set_state(link, LINK_STATE_ENSLAVING);
++        link_set_state(link, LINK_STATE_CONFIGURING);
+ 
+         link_dirty(link);
+ 
+@@ -3264,7 +3263,7 @@ static int link_carrier_gained(Link *link) {
+                         return r;
+                 }
+ 
+-                r = link_enter_set_addresses(link);
++                r = link_request_set_addresses(link);
+                 if (r < 0)
+                         return r;
+         }
+@@ -3348,7 +3347,7 @@ int link_update(Link *link, sd_netlink_message *m) {
+         if (link->state == LINK_STATE_LINGER) {
+                 link_ref(link);
+                 log_link_info(link, "Link readded");
+-                link_set_state(link, LINK_STATE_ENSLAVING);
++                link_set_state(link, LINK_STATE_CONFIGURING);
+ 
+                 r = link_new_carrier_maps(link);
+                 if (r < 0)
+@@ -3911,9 +3910,7 @@ void link_clean(Link *link) {
+ 
+ static const char* const link_state_table[_LINK_STATE_MAX] = {
+         [LINK_STATE_PENDING] = "pending",
+-        [LINK_STATE_ENSLAVING] = "configuring",
+-        [LINK_STATE_SETTING_ADDRESSES] = "configuring",
+-        [LINK_STATE_SETTING_ROUTES] = "configuring",
++        [LINK_STATE_CONFIGURING] = "configuring",
+         [LINK_STATE_CONFIGURED] = "configured",
+         [LINK_STATE_UNMANAGED] = "unmanaged",
+         [LINK_STATE_FAILED] = "failed",
+diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h
+index 2f37cc1598..5fd81be5a5 100644
+--- a/src/network/networkd-link.h
++++ b/src/network/networkd-link.h
+@@ -19,9 +19,7 @@
+ 
+ typedef enum LinkState {
+         LINK_STATE_PENDING,
+-        LINK_STATE_ENSLAVING,
+-        LINK_STATE_SETTING_ADDRESSES,
+-        LINK_STATE_SETTING_ROUTES,
++        LINK_STATE_CONFIGURING,
+         LINK_STATE_CONFIGURED,
+         LINK_STATE_UNMANAGED,
+         LINK_STATE_FAILED,
+-- 
+2.20.1.97.g81188d93c3-goog
+