[PATCH openbmc 1/2] Move systemd patches from yocto-poky tree.
OpenBMC Patches
openbmc-patches at stwcx.xyz
Tue Mar 8 05:50:24 AEDT 2016
From: Patrick Williams <patrick at stwcx.xyz>
Signed-off-by: Patrick Williams <patrick at stwcx.xyz>
---
.../0100-systemd_networkd_dbus_setaddress.patch | 1209 ++++++++++++++++++++
.../common/recipes-core/systemd/systemd_%.bbappend | 1 +
.../0100-systemd_networkd_dbus_setaddress.patch | 1209 --------------------
.../meta/recipes-core/systemd/systemd_225.bb | 1 -
4 files changed, 1210 insertions(+), 1210 deletions(-)
create mode 100644 meta-phosphor/common/recipes-core/systemd/systemd/0100-systemd_networkd_dbus_setaddress.patch
delete mode 100644 yocto-poky/meta/recipes-core/systemd/systemd/0100-systemd_networkd_dbus_setaddress.patch
diff --git a/meta-phosphor/common/recipes-core/systemd/systemd/0100-systemd_networkd_dbus_setaddress.patch b/meta-phosphor/common/recipes-core/systemd/systemd/0100-systemd_networkd_dbus_setaddress.patch
new file mode 100644
index 0000000..e105ddd
--- /dev/null
+++ b/meta-phosphor/common/recipes-core/systemd/systemd/0100-systemd_networkd_dbus_setaddress.patch
@@ -0,0 +1,1209 @@
+From 4bdb01553409269f992cd3ae76f06aeebf498ade Mon Sep 17 00:00:00 2001
+From: Hariharasubramanian R <hramasub at in.ibm.com>
+Date: Thu, 4 Feb 2016 09:52:48 -0600
+Subject: [PATCH] Sprint 5 : DBus API for network address configuration
+
+---
+ src/network/networkd-link-bus.c | 375 +++++++++++++++++++
+ src/network/networkd-network-bus.c | 601 ++++++++++++++++++++++++++++++
+ src/network/networkd-network.c | 108 ++++++
+ src/network/org.freedesktop.network1.conf | 20 +
+ 4 files changed, 1104 insertions(+)
+
+diff --git a/src/network/networkd-link-bus.c b/src/network/networkd-link-bus.c
+index 1a1524d..5af57e1 100644
+--- a/src/network/networkd-link-bus.c
++++ b/src/network/networkd-link-bus.c
+@@ -25,15 +25,69 @@
+ #include "networkd.h"
+ #include "networkd-link.h"
+
++#define SYSTEMD_NETWORKD_DBUS 1
++#define SYSTEMD_NETWORKD_DBUS_SETMAC_NETLINK 1
++
++#ifdef SYSTEMD_NETWORKD_DBUS
++/*
++#include "hostname-util.h"
++#include "network-internal.h"
++#include "networkd-link.h"
++#include "bus-util.h"
++*/
++#include <stdio.h>
++#include <linux/filter.h>
++#include <netinet/if_ether.h>
++
++#include <linux/sockios.h>
++#include <sys/socket.h>
++#include <net/if.h>
++#include <sys/types.h>
++#include <sys/wait.h>
++
++#if 0
++#include "util.h" /* bus/util.h */
++#include "sparse-endian.h" /* bus/util.h */
++#endif
++
++#include "sd-network.h"
++#include "sd-netlink.h"
++#include "socket-util.h"
++#include "ether-addr-util.h"
++#include "netlink-internal.h"
++/*
++#include "local-addresses.h"
++*/
++#endif
++
+ static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state, link_operstate, LinkOperationalState);
+ static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_administrative_state, link_state, LinkState);
+
++#ifdef SYSTEMD_NETWORKD_DBUS
++static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error);
++static int method_set_address (sd_bus_message *m, void* userdata, sd_bus_error *error);
++#endif
++
++#if defined (SYSTEMD_NETWORKD_DBUS_SETMAC_IPV4LL)
++static int link_arp_network_bind_raw_socket(int index, union sockaddr_union *link);
++static int link_arp_network_send_raw_socket(int fd, const union sockaddr_union *link, const struct ether_arp *arp);
++#elif defined (SYSTEMD_NETWORKD_DBUS_SETMAC_NETLINK)
++static int link_if_updown(sd_netlink* rtnl, sd_netlink_message** req, sd_netlink_message** rep, int ifindex, int cmd);
++static int link_if_setaddr(sd_netlink* rtnl, sd_netlink_message** req, sd_netlink_message** rep, int ifindex, const char* ea);
++#endif
++
+ const sd_bus_vtable link_vtable[] = {
+ SD_BUS_VTABLE_START(0),
+
+ SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state, offsetof(Link, operstate), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+ SD_BUS_PROPERTY("AdministrativeState", "s", property_get_administrative_state, offsetof(Link, state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+
++#ifdef SYSTEMD_NETWORKD_DBUS
++ /* device name */
++ SD_BUS_METHOD("GetAddress", "s", "s", method_get_address, SD_BUS_VTABLE_UNPRIVILEGED),
++ /* device name, mac addr */
++ SD_BUS_METHOD("SetAddress", "ss", "s", method_set_address, SD_BUS_VTABLE_UNPRIVILEGED),
++#endif
+ SD_BUS_VTABLE_END
+ };
+
+@@ -136,3 +190,324 @@ int link_send_changed(Link *link, const char *property, ...) {
+ "org.freedesktop.network1.Link",
+ l);
+ }
++
++static int method_set_address (sd_bus_message *m, void* userdata, sd_bus_error *error)
++{
++ _cleanup_netlink_unref_ sd_netlink *rtnl = NULL;
++ _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL;
++ _cleanup_netlink_message_unref_ sd_netlink_message *reply = NULL;
++ _cleanup_bus_message_unref_ sd_bus_message *resp = NULL;
++ Manager *mgr = userdata;
++
++ struct udev* udev = NULL;
++ struct udev_device* udev_eth = NULL;
++ const char* device = NULL;
++ const char* ea = NULL;
++ char devpath [32] = "/sys/class/net/";
++
++ int r;
++ int pid=0;
++ unsigned char ifindex;
++
++#if defined(SYSTEMD_NETWORKD_DBUS_SETMAC_IPV4LL)
++ bool have_mac;
++ struct ether_addr e;
++ struct ether_addr* ep = NULL;
++ union sockaddr_union link;
++ uint8_t seed[8];
++ uint8_t i=0;
++
++ struct ifreq dev;
++ int sock;
++#endif
++
++
++ assert(m);
++ assert(mgr);
++
++ r = sd_bus_message_read (m, "ss", &device, &ea);
++ if (r < 0)
++ return r;
++
++/*
++ if (isempty (device))
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");
++
++ if (isempty (ea))
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid MAC Address.");
++*/
++
++ udev = udev_new();
++ udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));
++ if (!udev_eth)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");
++
++ ifindex = udev_device_get_ifindex(udev_eth);
++
++#if defined (SYSTEMD_NETWORKD_DBUS_SETMAC_IPV4LL)
++ r = link_arp_network_bind_raw_socket(ifindex, &link);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unable to bind ARP Raw socket.");
++#elif defined (SYSTEMD_NETWORKD_DBUS_SETMAC_IOCTL)
++ sock = socket (AF_INET, SOCK_DGRAM, 0);
++ if (sock < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unable to bind socket.");
++
++ strcpy (dev.ifr_name, device);
++ if (ioctl(sock, SIOCGIFHWADDR, &dev) < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unable to bind socket.");
++#elif defined (SYSTEMD_NETWORKD_DBUS_SETMAC_NETLINK)
++ r = link_if_updown (rtnl, &req, &reply, ifindex, 0); /* i/f down */
++ if (r < 0)
++ /*return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error shutting down interface");*/
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error shutting down interface");
++
++ r = link_if_setaddr(rtnl, &req, &reply, ifindex, ea);
++ if (r < 0)
++ /*return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error setting MAC addr on interface");*/
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error setting MAC addr on interface");
++
++ r = link_if_updown (rtnl, &req, &reply, ifindex, 1); /* i/f up */
++ if (r < 0)
++ /*return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error starting up interface");*/
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error starting up interface");
++
++ /* Set U-Boot environment variable.*/
++ pid = fork ();
++ if (!pid)
++ {
++ char* argv [] = {"/sbin/fw_setenv", "ethaddr", ea, NULL};
++ execv (argv[0], argv);
++ exit (1);
++ }
++ else
++ {
++ int childerror = 0;
++
++ waitpid (pid, &childerror, 0);
++ if (childerror)
++ {
++ sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error setting u-boot env");
++ }
++ }
++#endif
++
++ r = sd_bus_message_new_method_return(m, &resp);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");
++
++ r = sd_bus_message_append(resp, "s", ea);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++
++ r = sd_bus_send(mgr->bus, resp, NULL);
++
++ /*return sd_bus_reply_method_return(m, "s", "Setting IFLA address ...");*/
++ return sd_bus_reply_method_return(m, "s", ea);
++
++}
++
++static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error)
++{
++ _cleanup_netlink_unref_ sd_netlink *rtnl = NULL;
++ _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL;
++ _cleanup_netlink_message_unref_ sd_netlink_message *reply = NULL;
++ _cleanup_bus_message_unref_ sd_bus_message *resp = NULL;
++ Manager *mgr = userdata;
++
++ struct udev* udev = NULL;
++ struct udev_device* udev_eth = NULL;
++ const char* device = NULL;
++ char devpath [32] = "/sys/class/net/";
++
++ int r;
++ unsigned char ifindex;
++ bool have_mac;
++ struct ether_addr e;
++ char ea[ETHER_ADDR_TO_STRING_MAX];
++
++ assert(m);
++ assert(mgr);
++
++ r = sd_bus_message_read (m, "s", &device);
++ if (r < 0)
++ return r;
++
++ if (isempty (device))
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");
++
++ udev = udev_new();
++ udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));
++ if (!udev_eth)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");
++
++ ifindex = udev_device_get_ifindex(udev_eth);
++
++ r = sd_netlink_open(&rtnl);
++ if (r < 0)
++ return log_error_errno(r, "Failed to connect to netlink:"); /* fixme */
++
++ r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, ifindex);
++ if (r < 0)
++ return r;
++
++ r = sd_netlink_call(rtnl, req, 0, &reply); /* fixme */
++ if (r < 0)
++ return r;
++
++ have_mac = sd_netlink_message_read_ether_addr(reply, IFLA_ADDRESS, &e) >= 0;
++ if (!have_mac)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error reading IFLA address");
++
++ ether_addr_to_string(&e, ea);
++
++ r = sd_bus_message_new_method_return(m, &resp);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");
++
++ r = sd_bus_message_append(resp, "s", ea);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++
++ r = sd_bus_send(mgr->bus, resp, NULL);
++
++ /*return sd_bus_reply_method_return(m, "s", "Getting IFLA address ...");*/
++ return sd_bus_reply_method_return(m, "s", ea);
++}
++
++#if defined (SYSTEMD_NETWORKD_DBUS_SETMAC_IPV4LL)
++/*----------------------------------------------------------------------------*/
++/* ARP helper routines copied from ipv4ll-network.c */
++/*----------------------------------------------------------------------------*/
++static int link_arp_network_bind_raw_socket(int ifindex, union sockaddr_union *link) {
++
++ static const struct sock_filter filter[] = {
++ BPF_STMT(BPF_LD + BPF_W + BPF_LEN, 0), /* A <- packet length */
++ BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, sizeof(struct ether_arp), 1, 0), /* packet >= arp packet ? */
++ BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
++ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct ether_arp, ea_hdr.ar_hrd)), /* A <- header */
++ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ARPHRD_ETHER, 1, 0), /* header == ethernet ? */
++ BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
++ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct ether_arp, ea_hdr.ar_pro)), /* A <- protocol */
++ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 1, 0), /* protocol == IP ? */
++ BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
++ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct ether_arp, ea_hdr.ar_op)), /* A <- operation */
++ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ARPOP_REQUEST, 0, 1), /* protocol == request ? */
++ BPF_STMT(BPF_RET + BPF_K, 65535), /* return all */
++ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ARPOP_REPLY, 0, 1), /* protocol == reply ? */
++ BPF_STMT(BPF_RET + BPF_K, 65535), /* return all */
++ BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
++ };
++ struct sock_fprog fprog = {
++ .len = ELEMENTSOF(filter),
++ .filter = (struct sock_filter*) filter
++ };
++ _cleanup_close_ int s = -1;
++ int r;
++
++ assert(ifindex > 0);
++ assert(link);
++
++ s = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
++ if (s < 0)
++ return -errno;
++
++ r = setsockopt(s, SOL_SOCKET, SO_ATTACH_FILTER, &fprog, sizeof(fprog));
++ if (r < 0)
++ return -errno;
++
++ link->ll.sll_family = AF_PACKET;
++ link->ll.sll_protocol = htons(ETH_P_ARP);
++ link->ll.sll_ifindex = ifindex;
++ link->ll.sll_halen = ETH_ALEN;
++ memset(link->ll.sll_addr, 0xff, ETH_ALEN);
++
++ r = bind(s, &link->sa, sizeof(link->ll));
++ if (r < 0)
++ return -errno;
++
++ r = s;
++ s = -1;
++
++ return r;
++}
++static int arp_network_send_raw_socket(int fd, const union sockaddr_union *link,
++ const struct ether_arp *arp) {
++ int r;
++
++ assert(arp);
++ assert(link);
++ assert(fd >= 0);
++
++ r = sendto(fd, arp, sizeof(struct ether_arp), 0, &link->sa, sizeof(link->ll));
++ if (r < 0)
++ return -errno;
++
++ return 0;
++}
++#endif
++
++#if defined (SYSTEMD_NETWORKD_DBUS_SETMAC_NETLINK)
++/* */
++/* Bring interface up/down */
++int link_if_updown(sd_netlink* rtnl, sd_netlink_message** req, sd_netlink_message** rep, int ifindex, int cmd)
++{
++ int r=0;
++ struct ifinfomsg *ifi;
++
++ r = message_new(rtnl, req, RTM_NEWLINK);
++ if (r < 0)
++ return r;
++
++ (*req)->hdr->nlmsg_len = NLMSG_LENGTH(sizeof (struct ifinfomsg));
++ (*req)->hdr->nlmsg_flags = NLM_F_REQUEST;
++ (*req)->hdr->nlmsg_type = RTM_NEWLINK;
++
++ ifi = NLMSG_DATA((*req)->hdr);
++
++ ifi->ifi_family = AF_UNSPEC;
++ ifi->ifi_change |= IFF_UP;
++ ifi->ifi_index = index;
++
++ /* when IFF_UP flag is set i/f will be active, otherwise i/f is shut down */
++ if (cmd)
++ ifi->ifi_flags |= IFF_UP;
++
++ return sd_netlink_call(rtnl, *req, 0, rep);
++}
++
++/* Set interface MAC address */
++int link_if_setaddr(sd_netlink* rtnl, sd_netlink_message** req, sd_netlink_message** rep, int ifindex, const char* ea)
++{
++ int r=0;
++ int i=0;
++
++ struct ifinfomsg *ifi;
++ struct ether_addr e;
++ struct ether_addr* ep;
++
++ r = message_new(rtnl, req, RTM_NEWLINK);
++ if (r < 0)
++ return r;
++
++ (*req)->hdr->nlmsg_len = NLMSG_LENGTH(sizeof (struct ifinfomsg));
++ (*req)->hdr->nlmsg_flags = NLM_F_REQUEST;
++ (*req)->hdr->nlmsg_type = RTM_NEWLINK;
++
++ ifi = NLMSG_DATA((*req)->hdr);
++
++ ifi->ifi_family = AF_UNSPEC;
++ ifi->ifi_index = ifindex;
++
++ ep = ether_aton (ea);
++ if (!ep)
++ return -1;
++
++ for (i=0; i<6; i++)
++ e.ether_addr_octet[i] = ep->ether_addr_octet[i];
++
++ r = sd_netlink_message_append_ether_addr(*req, IFLA_ADDRESS, &e);
++
++ return sd_netlink_call(rtnl, *req, 0, rep);
++}
++#endif
+diff --git a/src/network/networkd-network-bus.c b/src/network/networkd-network-bus.c
+index 5717a15..0a4cdd6 100644
+--- a/src/network/networkd-network-bus.c
++++ b/src/network/networkd-network-bus.c
+@@ -19,10 +19,39 @@
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+ ***/
+
++#define SYSTEMD_NETWORKD_DBUS 1
++
++#ifdef SYSTEMD_NETWORKD_DBUS
++#include <stdio.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <string.h>
++#include <netinet/ether.h>
++#include <linux/if.h>
++#endif
++
+ #include "strv.h"
+
+ #include "networkd.h"
+
++#ifdef SYSTEMD_NETWORKD_DBUS
++#include "hostname-util.h"
++#include "network-internal.h"
++#include "networkd-link.h"
++#include "bus-util.h"
++
++#include "sd-network.h"
++#include "sd-netlink.h"
++#include "local-addresses.h"
++#endif
++
++#ifdef SYSTEMD_NETWORKD_DBUS
++int network_address_added_handler (sd_netlink* rtnl, sd_netlink_message* m, void* userdata);
++int network_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message, void *userdata, Address* address); /* fixme */
++static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error); /* fixme */
++int network_save_static (int cmd, const char* device, const char* ipaddr, int prefixlen, const char* gwaddr);
++#endif
++
+ static int property_get_ether_addrs(
+ sd_bus *bus,
+ const char *path,
+@@ -56,6 +85,11 @@ static int property_get_ether_addrs(
+ return sd_bus_message_close_container(reply);
+ }
+
++#ifdef SYSTEMD_NETWORKD_DBUS
++static int method_add_address (sd_bus_message *m, void* userdata, sd_bus_error *error);
++static int method_del_address (sd_bus_message *m, void* userdata, sd_bus_error *error);
++#endif
++
+ const sd_bus_vtable network_vtable[] = {
+ SD_BUS_VTABLE_START(0),
+
+@@ -67,6 +101,13 @@ const sd_bus_vtable network_vtable[] = {
+ SD_BUS_PROPERTY("MatchType", "as", NULL, offsetof(Network, match_type), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("MatchName", "as", NULL, offsetof(Network, match_name), SD_BUS_VTABLE_PROPERTY_CONST),
+
++#ifdef SYSTEMD_NETWORKD_DBUS
++ /* device, IP, netmask, family, flags, scope, gateway */
++ SD_BUS_METHOD("AddAddress", "sssyyys", "x", method_add_address, SD_BUS_VTABLE_UNPRIVILEGED),
++ SD_BUS_METHOD("DelAddress", "sssyyys", "x", method_del_address, SD_BUS_VTABLE_UNPRIVILEGED),
++ /* (family, prefixlen, flags, scope, IP)+ gateway */
++ SD_BUS_METHOD("GetAddress", "s", "a(iyyus)s", method_get_address, SD_BUS_VTABLE_UNPRIVILEGED),
++#endif
+ SD_BUS_VTABLE_END
+ };
+
+@@ -152,3 +193,563 @@ int network_object_find(sd_bus *bus, const char *path, const char *interface, vo
+
+ return 1;
+ }
++
++#ifdef SYSTEMD_NETWORKD_DBUS
++
++static int method_add_address (sd_bus_message *m, void* userdata, sd_bus_error *error)
++{
++ _cleanup_bus_message_unref_ sd_bus_message* resp = NULL;
++ _cleanup_netlink_unref_ sd_netlink* rtnl = NULL;
++ _cleanup_netlink_message_unref_ sd_netlink_message* req = NULL;
++ _cleanup_netlink_message_unref_ sd_netlink_message* reply = NULL;
++ _cleanup_address_free_ Address *addr = NULL;
++ _cleanup_route_free_ Route *rt = NULL;
++ Manager *mgr = userdata;
++ Link* link = NULL;
++ struct udev* udev = NULL;
++ struct udev_device* udev_eth = NULL;
++
++ const char* device = NULL;
++ const char* ipaddr = NULL;
++ const char* netmask = NULL;
++ const char* gateway = NULL;
++ char devpath [32] = "/sys/class/net/";
++
++ unsigned char family;
++ unsigned char prefixlen;
++ unsigned char flags;
++ unsigned char scope;
++ unsigned char ifindex;
++
++ struct in_addr nm;
++ struct in_addr ip;
++ struct in_addr gw;
++ int r;
++
++ assert(m);
++ assert(mgr);
++
++ r = sd_bus_message_read (m, "sssyyys", &device, &ipaddr, &netmask, &family, &flags, &scope, &gateway);
++ if (r < 0)
++ return r;
++
++ if (isempty (device))
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");
++
++ if (isempty (ipaddr))
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Address.");
++
++ if (isempty (netmask))
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Netmask.");
++
++ assert(family == AF_INET || family == AF_INET6);
++
++ udev = udev_new();
++ udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));
++ if (!udev_eth)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");
++
++ ifindex = udev_device_get_ifindex(udev_eth);
++
++ inet_aton (netmask, &nm);
++ inet_aton (ipaddr, &ip);
++ if (!isempty (gateway)) inet_aton (gateway, &gw);
++
++ prefixlen = in_addr_netmask_to_prefixlen(&nm);
++ assert(prefixlen > 0);
++
++#if 0
++ r = network_save_static (1, device, ipaddr, prefixlen, gateway); /* persist config - add */
++ if (r)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, strerror(r));
++#endif
++
++ r = address_new_dynamic(&addr);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating new address");
++
++ r = sd_netlink_open(&rtnl);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_IO_ERROR, "Failed to connect to netlink");
++
++ link = new0(Link, 1);
++ if (!link)
++ return -ENOMEM;
++
++ link->network = new0(Network, 1);
++ if (!link->network)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Could not alloc memory for Network");
++
++ link->n_ref = 1;
++ link->manager = mgr;
++ link->manager->rtnl = rtnl;
++ link->state = LINK_STATE_PENDING;
++ link->rtnl_extended_attrs = true;
++ link->ifindex = ifindex;
++ link->ifname = strdup(device); /*FIXME:*/
++ if (!link->ifname)
++ return -ENOMEM;
++
++ addr->family = family;
++ addr->in_addr.in.s_addr = ip.s_addr;
++ addr->prefixlen = prefixlen;
++ addr->broadcast.s_addr = ip.s_addr | ~nm.s_addr;
++
++ LIST_PREPEND(addresses, link->network->static_addresses, addr);
++
++ if (!isempty (gateway))
++ {
++ r = route_new_dynamic(&rt, RTPROT_STATIC);
++ if (r < 0)
++ return r;
++
++ rt->protocol = RTPROT_STATIC;
++ rt->network = link->network;
++ rt->family = family;
++ rt->scope = RT_SCOPE_LINK; /* FIXME: */
++ rt->dst_prefixlen = prefixlen; /* FIXME: AF_INET assumed */
++/*
++ rt->dst_addr.in = gw;
++ rt->in_addr.in = ip.s_addr & nm.s_addr;
++*/
++ rt->dst_addr.in.s_addr = ip.s_addr & nm.s_addr;
++ rt->in_addr.in = gw;
++
++ LIST_PREPEND(routes, link->network->static_routes, rt);
++ }
++
++ /* send an nlmsg (RTM_NEWADDR) and append address to link address list */
++ r = address_update (addr, link, network_address_added_handler);
++ if (r < 0)
++ return r;
++
++ r = sd_bus_message_new_method_return(m, &resp);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");
++
++ r = sd_bus_message_append(resp, "x", 0);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++
++ /*r = sd_bus_send(mgr->bus, resp, NULL);*/
++ r = sd_bus_send(NULL, resp, NULL);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error sending reply messgage");
++
++
++ return sd_bus_reply_method_return(m, "s", "Adding IP address...");
++}
++
++static int method_del_address (sd_bus_message *m, void* userdata, sd_bus_error *error)
++{
++ _cleanup_bus_message_unref_ sd_bus_message* resp = NULL;
++ _cleanup_netlink_unref_ sd_netlink* rtnl = NULL;
++ _cleanup_netlink_message_unref_ sd_netlink_message* req = NULL;
++ _cleanup_netlink_message_unref_ sd_netlink_message* reply = NULL;
++ _cleanup_address_free_ Address *addr = NULL;
++ _cleanup_route_free_ Route *rt = NULL;
++ Manager *mgr = userdata;
++ Link* link = NULL;
++ struct udev* udev = NULL;
++ struct udev_device* udev_eth = NULL;
++
++ const char* device = NULL;
++ const char* ipaddr = NULL;
++ const char* netmask = NULL;
++ const char* gateway = NULL;
++ char devpath [32] = "/sys/class/net/";
++
++ unsigned char family;
++ unsigned char prefixlen;
++ unsigned char flags;
++ unsigned char scope;
++ unsigned char ifindex;
++
++ struct in_addr nm;
++ struct in_addr ip;
++ struct in_addr gw;
++ int r;
++
++ assert(m);
++ assert(mgr);
++
++ r = sd_bus_message_read (m, "sssyyys", &device, &ipaddr, &netmask, &family, &flags, &scope, &gateway);
++ if (r < 0)
++ return r;
++
++ if (isempty (device))
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");
++
++ if (isempty (ipaddr))
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Address.");
++
++ if (isempty (netmask))
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Netmask.");
++
++ assert(family == AF_INET || family == AF_INET6);
++
++ udev = udev_new();
++ udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));
++ if (!udev_eth)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");
++
++ ifindex = udev_device_get_ifindex(udev_eth);
++
++ inet_aton (netmask, &nm);
++ inet_aton (ipaddr, &ip);
++ if (!isempty (gateway)) inet_aton (gateway, &gw);
++
++ prefixlen = in_addr_netmask_to_prefixlen(&nm);
++ assert(prefixlen > 0);
++
++ r = address_new_dynamic(&addr);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating new address");
++
++ r = sd_netlink_open(&rtnl);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_IO_ERROR, "Failed to connect to netlink");
++
++ link = new0(Link, 1);
++ if (!link)
++ return -ENOMEM;
++
++ link->network = new0(Network, 1);
++ if (!link->network)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Could not alloc memory for Network");
++
++ link->n_ref = 1;
++ link->manager = mgr;
++ link->manager->rtnl = rtnl;
++ link->state = LINK_STATE_PENDING;
++ link->rtnl_extended_attrs = true;
++ link->ifindex = ifindex;
++ link->ifname = strdup(device);
++ if (!link->ifname)
++ return -ENOMEM;
++
++ addr->family = family;
++ addr->in_addr.in.s_addr = ip.s_addr;
++ addr->prefixlen = prefixlen;
++ addr->broadcast.s_addr = ip.s_addr | ~nm.s_addr;
++
++ if (!isempty (gateway))
++ {
++ r = route_new_dynamic(&rt, RTPROT_STATIC);
++ if (r < 0)
++ return r;
++
++ rt->network = link->network;
++ rt->family = family;
++ rt->scope = RT_SCOPE_LINK; /* FIXME: */
++ rt->dst_prefixlen = 32; /* FIXME: AF_INET assumed */
++ rt->dst_addr.in = gw;
++
++ /*LIST_PREPEND(routes, link->network->static_routes, rt);*/
++ /* Drop the Gateway */
++ route_drop (rt, link, link_route_drop_handler);
++ }
++
++ /* send an nlmsg to delete address from address list */
++ r = address_drop(addr, link, link_address_drop_handler);
++ if (r < 0)
++ return r;
++
++ r = sd_bus_message_new_method_return(m, &resp);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");
++
++ r = sd_bus_message_append(resp, "x", 0);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++
++ /*r = sd_bus_send(mgr->bus, resp, NULL);*/
++ r = sd_bus_send(NULL, resp, NULL);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error sending reply messgage");
++
++#if 0
++ r = network_save_static (0, device, ipaddr, prefixlen, gateway); /* persist config - del */
++ if (r)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, strerror(r));
++#endif
++
++ return sd_bus_reply_method_return(m, "s", "Deleted IP address...");
++}
++
++static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error)
++{
++ _cleanup_netlink_unref_ sd_netlink *rtnl = NULL;
++ _cleanup_address_free_ Address *addr = NULL;
++ _cleanup_route_free_ Route *rt = NULL;
++ Manager *mgr = userdata;
++ struct udev* udev = NULL;
++ struct udev_device* udev_eth = NULL;
++ const char* device = NULL;
++ char devpath [32] = "/sys/class/net/";
++ unsigned char ifindex;
++ int r;
++
++ sd_netlink_message* maddr;
++
++ _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL;
++ _cleanup_netlink_message_unref_ sd_netlink_message *reply = NULL;
++ _cleanup_bus_message_unref_ sd_bus_message *resp = NULL;
++ _cleanup_address_free_ Address *address = NULL;
++ _cleanup_free_ struct local_address *local = NULL;
++ _cleanup_free_ char *ipr = NULL;
++ _cleanup_free_ char *gwr = NULL;
++ int n;
++ int i;
++
++ assert(m);
++ assert(mgr);
++
++ r = sd_bus_message_read (m, "s", &device);
++ if (r < 0)
++ return r;
++
++ if (isempty (device))
++ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");
++
++ udev = udev_new();
++ udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));
++ if (!udev_eth)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");
++
++ ifindex = udev_device_get_ifindex(udev_eth);
++
++ r = sd_netlink_open(&rtnl);
++ if (r < 0)
++ return log_error_errno(r, "Failed to connect to netlink:"); /* fixme */
++
++ r = sd_rtnl_message_new_addr(rtnl, &req, RTM_GETADDR, 0, 0);
++ if (r < 0)
++ return r;
++
++ r = sd_netlink_message_request_dump(req, true);
++ if (r < 0)
++ return r;
++
++ r = sd_netlink_call(rtnl, req, 0, &reply); /* fixme */
++ if (r < 0)
++ return r;
++
++ r = sd_bus_message_new_method_return(m, &resp);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");
++
++ r = sd_bus_message_open_container(resp, 'a', "(iyyus)"); /*family,prefixlen,scope,flags,addr*/
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error opening a container for reply message");
++
++ for (maddr = reply; maddr; maddr = sd_netlink_message_next(maddr)) {
++ int k;
++
++ r = address_new_dynamic(&address);
++ if (r < 0)
++ return r;
++
++ k = network_rtnl_process_address(rtnl, maddr, mgr, address);
++ if (k) {
++ r = in_addr_to_string(address->family, &address->in_addr, &ipr); /* fixme */
++ if (r < 0)
++ return r;
++
++ r = sd_bus_message_append (resp, "(iyyus)",
++ address->family,
++ address->prefixlen,
++ address->scope,
++ address->flags,
++ ipr);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++#if 0
++ r = sd_bus_message_open_container(resp, 'r', "iyyus");
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error opening struct in reply messgage");
++
++ r = sd_bus_message_append(resp, "i", address->family);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++
++ r = sd_bus_message_append(resp, "y", address->prefixlen);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++
++ r = sd_bus_message_append(resp, "y", address->scope);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++
++ r = sd_bus_message_append(resp, "u", address->flags);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++
++ r = in_addr_to_string(address->family, &address->in_addr, &ipr); /* fixme */
++ if (r < 0)
++ return r;
++
++ r = sd_bus_message_append(resp, "s", ipr);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++
++ r = sd_bus_message_close_container(resp);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error closing struct in reply messgage");
++#endif
++ }
++ }
++
++ r = sd_bus_message_close_container(resp);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error closing reply container");
++
++ n = local_gateways(rtnl, ifindex, AF_UNSPEC, &local);
++ if (n < 0)
++ return n;
++
++ for (i = 0; i < n; i++) {
++
++ r = in_addr_to_string(local[i].family, &local[i].address, &gwr);
++ if (r < 0)
++ return r;
++ }
++
++ r = sd_bus_message_append(resp, "s", gwr);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
++
++ /*r = sd_bus_send(mgr->bus, resp, NULL);*/
++ r = sd_bus_send(NULL, resp, NULL);
++ if (r < 0)
++ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error sending reply messgage");
++
++ return sd_bus_reply_method_return(m, "s", "Getting IP configuration...");
++}
++
++
++int network_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message, void *userdata, Address* address) {
++ Manager* m = (Manager*) userdata; /* fixme */
++ uint16_t type;
++ unsigned char flags;
++ char buf[INET6_ADDRSTRLEN];
++ int ifindex;
++ int r;
++ sd_bus_error err = SD_BUS_ERROR_NULL; /* fixme */
++ sd_bus_error* error = &err; /* fixme */
++
++ assert(rtnl);
++ assert(message);
++ assert(m);
++ assert(address);
++
++ if (sd_netlink_message_is_error(message)) {
++ r = sd_netlink_message_get_errno(message);
++ if (r < 0)
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: failed to receive address: ");
++
++ return 0;
++ }
++
++ r = sd_netlink_message_get_type(message, &type);
++ if (r < 0) {
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: could not get message type: ");
++ return 0;
++ } else if (type != RTM_NEWADDR && type != RTM_DELADDR) {
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received unexpected message type when processing address");
++ return 0;
++ }
++
++ r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
++ if (r < 0) {
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: could not get ifindex from address: %m");
++ return 0;
++ } else if (ifindex <= 0) {
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address message with invalid ifindex: %d", ifindex);
++ return 0;
++ }
++
++ r = sd_rtnl_message_addr_get_family(message, &address->family); /* int : i*/
++ if (r < 0 || !IN_SET(address->family, AF_INET, AF_INET6)) {
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid family, ignoring.");
++ return 0;
++ }
++
++ r = sd_rtnl_message_addr_get_prefixlen(message, &address->prefixlen); /* uchar : byte : y */
++ if (r < 0) {
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid prefixlen, ignoring: ");
++ return 0;
++ }
++
++ r = sd_rtnl_message_addr_get_scope(message, &address->scope); /* uchar : byte : y*/
++ if (r < 0) {
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid scope, ignoring: ");
++ return 0;
++ }
++
++ r = sd_rtnl_message_addr_get_flags(message, &flags); /* uint32 : u*/
++ if (r < 0) {
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid flags, ignoring: ");
++ return 0;
++ }
++ address->flags = flags;
++
++ switch (address->family) {
++ case AF_INET:
++ r = sd_netlink_message_read_in_addr(message, IFA_LOCAL, &address->in_addr.in); /* ulong : uint64 : t */
++ if (r < 0) {
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address without valid address, ignoring: ");
++ return 0;
++ }
++
++ break;
++
++ case AF_INET6:
++ r = sd_netlink_message_read_in6_addr(message, IFA_ADDRESS, &address->in_addr.in6); /* ulong : uint64 : t */
++ if (r < 0) {
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address without valid address, ignoring: ");
++ return 0;
++ }
++
++ break;
++
++ default:
++ assert_not_reached("invalid address family");
++ }
++
++ if (!inet_ntop(address->family, &address->in_addr, buf, INET6_ADDRSTRLEN)) { /* string : s */
++ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not print address");
++ return 0;
++ }
++
++ return 1;
++}
++
++int network_save_static (int cmd, const char* device, const char* ipaddr, int prefixlen, const char* gwaddr)
++{
++#define NETWORKD_CONFIG_FILE_NAME_LEN_MAX 64
++ char ncfn [NETWORKD_CONFIG_FILE_NAME_LEN_MAX];
++ FILE* ncfp = NULL;
++ int r=0;
++
++ /* /usr/lib/systemd/network/10-bmc-ethx-192.168.255.255.32.network */
++ snprintf (ncfn, NETWORKD_CONFIG_FILE_NAME_LEN_MAX, "/usr/lib/systemd/network/10-bmc-%s-%s.%d.network", device, ipaddr, prefixlen);
++
++ if (cmd) /* add */
++ {
++ ncfp = fopen (ncfn, "w+");
++ if (!ncfp) {
++ r = errno;
++ }
++
++ fprintf (ncfp, "[Match]\nName=%s\n\n[Network]\nAddress=%s/%d\nGateway=%s\n", device, ipaddr, prefixlen, gwaddr);
++ fclose (ncfp);
++ }
++ else /* del */
++ {
++ r = remove (ncfn);
++ }
++
++ return r;
++}
++#endif
+diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
+index 6587ea9..f773936 100644
+--- a/src/network/networkd-network.c
++++ b/src/network/networkd-network.c
+@@ -20,6 +20,9 @@
+ ***/
+
+ #include <ctype.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
+ #include <net/if.h>
+
+ #include "conf-files.h"
+@@ -32,6 +35,15 @@
+ #include "network-internal.h"
+ #include "dns-domain.h"
+
++#define SYSTEMD_NETWORKD_DBUS 1
++
++#ifdef SYSTEMD_NETWORKD_DBUS
++int network_address_added_handler (sd_netlink* rtnl, sd_netlink_message* m, void* userdata);
++int network_set_gateway (Link* link);
++static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
++int network_save_static (int cmd, const char* device, const char* ipaddr, int prefixlen, const char* gwaddr);
++#endif
++
+ static int network_load_one(Manager *manager, const char *filename) {
+ _cleanup_network_free_ Network *network = NULL;
+ _cleanup_fclose_ FILE *file = NULL;
+@@ -850,3 +862,99 @@ int config_parse_hostname(const char *unit,
+
+ return 0;
+ }
++
++#ifdef SYSTEMD_NETWORKD_DBUS
++int network_address_added_handler (sd_netlink* rtnl, sd_netlink_message* m, void* userdata)
++{
++ _cleanup_link_unref_ Link *link = userdata;
++ int r;
++
++ assert(link);
++
++ r = sd_netlink_message_get_errno(m);
++ if (r < 0 && r != -EEXIST) {
++ log_debug("Error in set IP address!");
++ link_enter_failed(link);
++ return r;
++ } else if (r >= 0)
++ link_rtnl_process_address(rtnl, m, link->manager);
++
++ network_set_gateway (link);
++
++ return 0;
++}
++
++/* link_enter_set_routes */
++int network_set_gateway (Link* link)
++{
++ _cleanup_address_free_ Address* addr = NULL;
++ const char* device = NULL;
++ const char* ipaddr = NULL;
++ const char* gwaddr = NULL;
++ Route* rt;
++ unsigned char prefixlen;
++ int r=0;
++
++ assert(link);
++ assert(link->network);
++ assert(link->state == LINK_STATE_SETTING_ADDRESSES);
++
++ link->state = LINK_STATE_SETTING_ROUTES;
++
++ LIST_FOREACH(routes, rt, link->network->static_routes) {
++ gwaddr = inet_ntoa (rt->dst_addr.in);
++ r = route_configure(rt, link, &route_handler);
++ if (r < 0) {
++ log_debug ("Could not set Gateway!");
++ link_enter_failed(link);
++ return r;
++ }
++
++ link->link_messages ++;
++ }
++
++ if (link->link_messages == 0) {
++ link->static_configured = true;
++
++ /*link_enter_configured (link);*/
++ log_link_info(link, "Configured");
++ link->state = LINK_STATE_CONFIGURED;
++ link_save(link);
++ }
++ else
++ {
++ log_debug("Setting Gateway");
++ }
++
++ LIST_FOREACH(addresses, addr, link->network->static_addresses) {
++ device = strdup (link->ifname);
++ ipaddr = inet_ntoa (addr->in_addr.in);
++ prefixlen = addr->prefixlen;
++#if 1
++ r = network_save_static (1, device, ipaddr, prefixlen, gwaddr); /* persist config - add */
++ if (r)
++ {
++ log_debug(strerror(r));
++ }
++#endif
++ }
++
++ return r;
++}
++
++static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
++ _cleanup_link_unref_ Link *link = userdata;
++ int r;
++
++ assert(link);
++
++ r = sd_netlink_message_get_errno(m);
++ if (r < 0 && r != -EEXIST) {
++ log_debug ("Could not set route! ");
++ link_enter_failed(link);
++ }
++
++ return 1;
++}
++
++#endif
+diff --git a/src/network/org.freedesktop.network1.conf b/src/network/org.freedesktop.network1.conf
+index 52dad33..3db7a90 100644
+--- a/src/network/org.freedesktop.network1.conf
++++ b/src/network/org.freedesktop.network1.conf
+@@ -36,6 +36,26 @@
+ send_interface="org.freedesktop.DBus.Properties"
+ send_member="GetAll"/>
+
++ <allow send_destination="org.freedesktop.network1"
++ send_interface="org.freedesktop.network1.Network"
++ send_member="AddAddress"/>
++
++ <allow send_destination="org.freedesktop.network1"
++ send_interface="org.freedesktop.network1.Network"
++ send_member="DelAddress"/>
++
++ <allow send_destination="org.freedesktop.network1"
++ send_interface="org.freedesktop.network1.Network"
++ send_member="GetAddress"/>
++
++ <allow send_destination="org.freedesktop.network1"
++ send_interface="org.freedesktop.network1.Link"
++ send_member="GetAddress"/>
++
++ <allow send_destination="org.freedesktop.network1"
++ send_interface="org.freedesktop.network1.Link"
++ send_member="SetAddress"/>
++
+ <allow receive_sender="org.freedesktop.network1"/>
+ </policy>
+
+--
+1.8.2.2
+
diff --git a/meta-phosphor/common/recipes-core/systemd/systemd_%.bbappend b/meta-phosphor/common/recipes-core/systemd/systemd_%.bbappend
index 8b3b25d..222be49 100644
--- a/meta-phosphor/common/recipes-core/systemd/systemd_%.bbappend
+++ b/meta-phosphor/common/recipes-core/systemd/systemd_%.bbappend
@@ -1,6 +1,7 @@
PACKAGECONFIG += "networkd"
FILESEXTRAPATHS_append := "${THISDIR}/${PN}:"
SRC_URI += "file://default.network"
+SRC_URI += "file://0100-systemd_networkd_dbus_setaddress.patch"
FILES_${PN} += "${libdir}/systemd/network/default.network"
diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0100-systemd_networkd_dbus_setaddress.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0100-systemd_networkd_dbus_setaddress.patch
deleted file mode 100644
index e105ddd..0000000
--- a/yocto-poky/meta/recipes-core/systemd/systemd/0100-systemd_networkd_dbus_setaddress.patch
+++ /dev/null
@@ -1,1209 +0,0 @@
-From 4bdb01553409269f992cd3ae76f06aeebf498ade Mon Sep 17 00:00:00 2001
-From: Hariharasubramanian R <hramasub at in.ibm.com>
-Date: Thu, 4 Feb 2016 09:52:48 -0600
-Subject: [PATCH] Sprint 5 : DBus API for network address configuration
-
----
- src/network/networkd-link-bus.c | 375 +++++++++++++++++++
- src/network/networkd-network-bus.c | 601 ++++++++++++++++++++++++++++++
- src/network/networkd-network.c | 108 ++++++
- src/network/org.freedesktop.network1.conf | 20 +
- 4 files changed, 1104 insertions(+)
-
-diff --git a/src/network/networkd-link-bus.c b/src/network/networkd-link-bus.c
-index 1a1524d..5af57e1 100644
---- a/src/network/networkd-link-bus.c
-+++ b/src/network/networkd-link-bus.c
-@@ -25,15 +25,69 @@
- #include "networkd.h"
- #include "networkd-link.h"
-
-+#define SYSTEMD_NETWORKD_DBUS 1
-+#define SYSTEMD_NETWORKD_DBUS_SETMAC_NETLINK 1
-+
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+/*
-+#include "hostname-util.h"
-+#include "network-internal.h"
-+#include "networkd-link.h"
-+#include "bus-util.h"
-+*/
-+#include <stdio.h>
-+#include <linux/filter.h>
-+#include <netinet/if_ether.h>
-+
-+#include <linux/sockios.h>
-+#include <sys/socket.h>
-+#include <net/if.h>
-+#include <sys/types.h>
-+#include <sys/wait.h>
-+
-+#if 0
-+#include "util.h" /* bus/util.h */
-+#include "sparse-endian.h" /* bus/util.h */
-+#endif
-+
-+#include "sd-network.h"
-+#include "sd-netlink.h"
-+#include "socket-util.h"
-+#include "ether-addr-util.h"
-+#include "netlink-internal.h"
-+/*
-+#include "local-addresses.h"
-+*/
-+#endif
-+
- static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state, link_operstate, LinkOperationalState);
- static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_administrative_state, link_state, LinkState);
-
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error);
-+static int method_set_address (sd_bus_message *m, void* userdata, sd_bus_error *error);
-+#endif
-+
-+#if defined (SYSTEMD_NETWORKD_DBUS_SETMAC_IPV4LL)
-+static int link_arp_network_bind_raw_socket(int index, union sockaddr_union *link);
-+static int link_arp_network_send_raw_socket(int fd, const union sockaddr_union *link, const struct ether_arp *arp);
-+#elif defined (SYSTEMD_NETWORKD_DBUS_SETMAC_NETLINK)
-+static int link_if_updown(sd_netlink* rtnl, sd_netlink_message** req, sd_netlink_message** rep, int ifindex, int cmd);
-+static int link_if_setaddr(sd_netlink* rtnl, sd_netlink_message** req, sd_netlink_message** rep, int ifindex, const char* ea);
-+#endif
-+
- const sd_bus_vtable link_vtable[] = {
- SD_BUS_VTABLE_START(0),
-
- SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state, offsetof(Link, operstate), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
- SD_BUS_PROPERTY("AdministrativeState", "s", property_get_administrative_state, offsetof(Link, state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
-
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+ /* device name */
-+ SD_BUS_METHOD("GetAddress", "s", "s", method_get_address, SD_BUS_VTABLE_UNPRIVILEGED),
-+ /* device name, mac addr */
-+ SD_BUS_METHOD("SetAddress", "ss", "s", method_set_address, SD_BUS_VTABLE_UNPRIVILEGED),
-+#endif
- SD_BUS_VTABLE_END
- };
-
-@@ -136,3 +190,324 @@ int link_send_changed(Link *link, const char *property, ...) {
- "org.freedesktop.network1.Link",
- l);
- }
-+
-+static int method_set_address (sd_bus_message *m, void* userdata, sd_bus_error *error)
-+{
-+ _cleanup_netlink_unref_ sd_netlink *rtnl = NULL;
-+ _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL;
-+ _cleanup_netlink_message_unref_ sd_netlink_message *reply = NULL;
-+ _cleanup_bus_message_unref_ sd_bus_message *resp = NULL;
-+ Manager *mgr = userdata;
-+
-+ struct udev* udev = NULL;
-+ struct udev_device* udev_eth = NULL;
-+ const char* device = NULL;
-+ const char* ea = NULL;
-+ char devpath [32] = "/sys/class/net/";
-+
-+ int r;
-+ int pid=0;
-+ unsigned char ifindex;
-+
-+#if defined(SYSTEMD_NETWORKD_DBUS_SETMAC_IPV4LL)
-+ bool have_mac;
-+ struct ether_addr e;
-+ struct ether_addr* ep = NULL;
-+ union sockaddr_union link;
-+ uint8_t seed[8];
-+ uint8_t i=0;
-+
-+ struct ifreq dev;
-+ int sock;
-+#endif
-+
-+
-+ assert(m);
-+ assert(mgr);
-+
-+ r = sd_bus_message_read (m, "ss", &device, &ea);
-+ if (r < 0)
-+ return r;
-+
-+/*
-+ if (isempty (device))
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");
-+
-+ if (isempty (ea))
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid MAC Address.");
-+*/
-+
-+ udev = udev_new();
-+ udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));
-+ if (!udev_eth)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");
-+
-+ ifindex = udev_device_get_ifindex(udev_eth);
-+
-+#if defined (SYSTEMD_NETWORKD_DBUS_SETMAC_IPV4LL)
-+ r = link_arp_network_bind_raw_socket(ifindex, &link);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unable to bind ARP Raw socket.");
-+#elif defined (SYSTEMD_NETWORKD_DBUS_SETMAC_IOCTL)
-+ sock = socket (AF_INET, SOCK_DGRAM, 0);
-+ if (sock < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unable to bind socket.");
-+
-+ strcpy (dev.ifr_name, device);
-+ if (ioctl(sock, SIOCGIFHWADDR, &dev) < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unable to bind socket.");
-+#elif defined (SYSTEMD_NETWORKD_DBUS_SETMAC_NETLINK)
-+ r = link_if_updown (rtnl, &req, &reply, ifindex, 0); /* i/f down */
-+ if (r < 0)
-+ /*return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error shutting down interface");*/
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error shutting down interface");
-+
-+ r = link_if_setaddr(rtnl, &req, &reply, ifindex, ea);
-+ if (r < 0)
-+ /*return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error setting MAC addr on interface");*/
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error setting MAC addr on interface");
-+
-+ r = link_if_updown (rtnl, &req, &reply, ifindex, 1); /* i/f up */
-+ if (r < 0)
-+ /*return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error starting up interface");*/
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error starting up interface");
-+
-+ /* Set U-Boot environment variable.*/
-+ pid = fork ();
-+ if (!pid)
-+ {
-+ char* argv [] = {"/sbin/fw_setenv", "ethaddr", ea, NULL};
-+ execv (argv[0], argv);
-+ exit (1);
-+ }
-+ else
-+ {
-+ int childerror = 0;
-+
-+ waitpid (pid, &childerror, 0);
-+ if (childerror)
-+ {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error setting u-boot env");
-+ }
-+ }
-+#endif
-+
-+ r = sd_bus_message_new_method_return(m, &resp);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");
-+
-+ r = sd_bus_message_append(resp, "s", ea);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+
-+ r = sd_bus_send(mgr->bus, resp, NULL);
-+
-+ /*return sd_bus_reply_method_return(m, "s", "Setting IFLA address ...");*/
-+ return sd_bus_reply_method_return(m, "s", ea);
-+
-+}
-+
-+static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error)
-+{
-+ _cleanup_netlink_unref_ sd_netlink *rtnl = NULL;
-+ _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL;
-+ _cleanup_netlink_message_unref_ sd_netlink_message *reply = NULL;
-+ _cleanup_bus_message_unref_ sd_bus_message *resp = NULL;
-+ Manager *mgr = userdata;
-+
-+ struct udev* udev = NULL;
-+ struct udev_device* udev_eth = NULL;
-+ const char* device = NULL;
-+ char devpath [32] = "/sys/class/net/";
-+
-+ int r;
-+ unsigned char ifindex;
-+ bool have_mac;
-+ struct ether_addr e;
-+ char ea[ETHER_ADDR_TO_STRING_MAX];
-+
-+ assert(m);
-+ assert(mgr);
-+
-+ r = sd_bus_message_read (m, "s", &device);
-+ if (r < 0)
-+ return r;
-+
-+ if (isempty (device))
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");
-+
-+ udev = udev_new();
-+ udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));
-+ if (!udev_eth)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");
-+
-+ ifindex = udev_device_get_ifindex(udev_eth);
-+
-+ r = sd_netlink_open(&rtnl);
-+ if (r < 0)
-+ return log_error_errno(r, "Failed to connect to netlink:"); /* fixme */
-+
-+ r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, ifindex);
-+ if (r < 0)
-+ return r;
-+
-+ r = sd_netlink_call(rtnl, req, 0, &reply); /* fixme */
-+ if (r < 0)
-+ return r;
-+
-+ have_mac = sd_netlink_message_read_ether_addr(reply, IFLA_ADDRESS, &e) >= 0;
-+ if (!have_mac)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error reading IFLA address");
-+
-+ ether_addr_to_string(&e, ea);
-+
-+ r = sd_bus_message_new_method_return(m, &resp);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");
-+
-+ r = sd_bus_message_append(resp, "s", ea);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+
-+ r = sd_bus_send(mgr->bus, resp, NULL);
-+
-+ /*return sd_bus_reply_method_return(m, "s", "Getting IFLA address ...");*/
-+ return sd_bus_reply_method_return(m, "s", ea);
-+}
-+
-+#if defined (SYSTEMD_NETWORKD_DBUS_SETMAC_IPV4LL)
-+/*----------------------------------------------------------------------------*/
-+/* ARP helper routines copied from ipv4ll-network.c */
-+/*----------------------------------------------------------------------------*/
-+static int link_arp_network_bind_raw_socket(int ifindex, union sockaddr_union *link) {
-+
-+ static const struct sock_filter filter[] = {
-+ BPF_STMT(BPF_LD + BPF_W + BPF_LEN, 0), /* A <- packet length */
-+ BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, sizeof(struct ether_arp), 1, 0), /* packet >= arp packet ? */
-+ BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
-+ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct ether_arp, ea_hdr.ar_hrd)), /* A <- header */
-+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ARPHRD_ETHER, 1, 0), /* header == ethernet ? */
-+ BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
-+ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct ether_arp, ea_hdr.ar_pro)), /* A <- protocol */
-+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 1, 0), /* protocol == IP ? */
-+ BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
-+ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct ether_arp, ea_hdr.ar_op)), /* A <- operation */
-+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ARPOP_REQUEST, 0, 1), /* protocol == request ? */
-+ BPF_STMT(BPF_RET + BPF_K, 65535), /* return all */
-+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ARPOP_REPLY, 0, 1), /* protocol == reply ? */
-+ BPF_STMT(BPF_RET + BPF_K, 65535), /* return all */
-+ BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
-+ };
-+ struct sock_fprog fprog = {
-+ .len = ELEMENTSOF(filter),
-+ .filter = (struct sock_filter*) filter
-+ };
-+ _cleanup_close_ int s = -1;
-+ int r;
-+
-+ assert(ifindex > 0);
-+ assert(link);
-+
-+ s = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
-+ if (s < 0)
-+ return -errno;
-+
-+ r = setsockopt(s, SOL_SOCKET, SO_ATTACH_FILTER, &fprog, sizeof(fprog));
-+ if (r < 0)
-+ return -errno;
-+
-+ link->ll.sll_family = AF_PACKET;
-+ link->ll.sll_protocol = htons(ETH_P_ARP);
-+ link->ll.sll_ifindex = ifindex;
-+ link->ll.sll_halen = ETH_ALEN;
-+ memset(link->ll.sll_addr, 0xff, ETH_ALEN);
-+
-+ r = bind(s, &link->sa, sizeof(link->ll));
-+ if (r < 0)
-+ return -errno;
-+
-+ r = s;
-+ s = -1;
-+
-+ return r;
-+}
-+static int arp_network_send_raw_socket(int fd, const union sockaddr_union *link,
-+ const struct ether_arp *arp) {
-+ int r;
-+
-+ assert(arp);
-+ assert(link);
-+ assert(fd >= 0);
-+
-+ r = sendto(fd, arp, sizeof(struct ether_arp), 0, &link->sa, sizeof(link->ll));
-+ if (r < 0)
-+ return -errno;
-+
-+ return 0;
-+}
-+#endif
-+
-+#if defined (SYSTEMD_NETWORKD_DBUS_SETMAC_NETLINK)
-+/* */
-+/* Bring interface up/down */
-+int link_if_updown(sd_netlink* rtnl, sd_netlink_message** req, sd_netlink_message** rep, int ifindex, int cmd)
-+{
-+ int r=0;
-+ struct ifinfomsg *ifi;
-+
-+ r = message_new(rtnl, req, RTM_NEWLINK);
-+ if (r < 0)
-+ return r;
-+
-+ (*req)->hdr->nlmsg_len = NLMSG_LENGTH(sizeof (struct ifinfomsg));
-+ (*req)->hdr->nlmsg_flags = NLM_F_REQUEST;
-+ (*req)->hdr->nlmsg_type = RTM_NEWLINK;
-+
-+ ifi = NLMSG_DATA((*req)->hdr);
-+
-+ ifi->ifi_family = AF_UNSPEC;
-+ ifi->ifi_change |= IFF_UP;
-+ ifi->ifi_index = index;
-+
-+ /* when IFF_UP flag is set i/f will be active, otherwise i/f is shut down */
-+ if (cmd)
-+ ifi->ifi_flags |= IFF_UP;
-+
-+ return sd_netlink_call(rtnl, *req, 0, rep);
-+}
-+
-+/* Set interface MAC address */
-+int link_if_setaddr(sd_netlink* rtnl, sd_netlink_message** req, sd_netlink_message** rep, int ifindex, const char* ea)
-+{
-+ int r=0;
-+ int i=0;
-+
-+ struct ifinfomsg *ifi;
-+ struct ether_addr e;
-+ struct ether_addr* ep;
-+
-+ r = message_new(rtnl, req, RTM_NEWLINK);
-+ if (r < 0)
-+ return r;
-+
-+ (*req)->hdr->nlmsg_len = NLMSG_LENGTH(sizeof (struct ifinfomsg));
-+ (*req)->hdr->nlmsg_flags = NLM_F_REQUEST;
-+ (*req)->hdr->nlmsg_type = RTM_NEWLINK;
-+
-+ ifi = NLMSG_DATA((*req)->hdr);
-+
-+ ifi->ifi_family = AF_UNSPEC;
-+ ifi->ifi_index = ifindex;
-+
-+ ep = ether_aton (ea);
-+ if (!ep)
-+ return -1;
-+
-+ for (i=0; i<6; i++)
-+ e.ether_addr_octet[i] = ep->ether_addr_octet[i];
-+
-+ r = sd_netlink_message_append_ether_addr(*req, IFLA_ADDRESS, &e);
-+
-+ return sd_netlink_call(rtnl, *req, 0, rep);
-+}
-+#endif
-diff --git a/src/network/networkd-network-bus.c b/src/network/networkd-network-bus.c
-index 5717a15..0a4cdd6 100644
---- a/src/network/networkd-network-bus.c
-+++ b/src/network/networkd-network-bus.c
-@@ -19,10 +19,39 @@
- along with systemd; If not, see <http://www.gnu.org/licenses/>.
- ***/
-
-+#define SYSTEMD_NETWORKD_DBUS 1
-+
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <errno.h>
-+#include <string.h>
-+#include <netinet/ether.h>
-+#include <linux/if.h>
-+#endif
-+
- #include "strv.h"
-
- #include "networkd.h"
-
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+#include "hostname-util.h"
-+#include "network-internal.h"
-+#include "networkd-link.h"
-+#include "bus-util.h"
-+
-+#include "sd-network.h"
-+#include "sd-netlink.h"
-+#include "local-addresses.h"
-+#endif
-+
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+int network_address_added_handler (sd_netlink* rtnl, sd_netlink_message* m, void* userdata);
-+int network_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message, void *userdata, Address* address); /* fixme */
-+static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error); /* fixme */
-+int network_save_static (int cmd, const char* device, const char* ipaddr, int prefixlen, const char* gwaddr);
-+#endif
-+
- static int property_get_ether_addrs(
- sd_bus *bus,
- const char *path,
-@@ -56,6 +85,11 @@ static int property_get_ether_addrs(
- return sd_bus_message_close_container(reply);
- }
-
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+static int method_add_address (sd_bus_message *m, void* userdata, sd_bus_error *error);
-+static int method_del_address (sd_bus_message *m, void* userdata, sd_bus_error *error);
-+#endif
-+
- const sd_bus_vtable network_vtable[] = {
- SD_BUS_VTABLE_START(0),
-
-@@ -67,6 +101,13 @@ const sd_bus_vtable network_vtable[] = {
- SD_BUS_PROPERTY("MatchType", "as", NULL, offsetof(Network, match_type), SD_BUS_VTABLE_PROPERTY_CONST),
- SD_BUS_PROPERTY("MatchName", "as", NULL, offsetof(Network, match_name), SD_BUS_VTABLE_PROPERTY_CONST),
-
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+ /* device, IP, netmask, family, flags, scope, gateway */
-+ SD_BUS_METHOD("AddAddress", "sssyyys", "x", method_add_address, SD_BUS_VTABLE_UNPRIVILEGED),
-+ SD_BUS_METHOD("DelAddress", "sssyyys", "x", method_del_address, SD_BUS_VTABLE_UNPRIVILEGED),
-+ /* (family, prefixlen, flags, scope, IP)+ gateway */
-+ SD_BUS_METHOD("GetAddress", "s", "a(iyyus)s", method_get_address, SD_BUS_VTABLE_UNPRIVILEGED),
-+#endif
- SD_BUS_VTABLE_END
- };
-
-@@ -152,3 +193,563 @@ int network_object_find(sd_bus *bus, const char *path, const char *interface, vo
-
- return 1;
- }
-+
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+
-+static int method_add_address (sd_bus_message *m, void* userdata, sd_bus_error *error)
-+{
-+ _cleanup_bus_message_unref_ sd_bus_message* resp = NULL;
-+ _cleanup_netlink_unref_ sd_netlink* rtnl = NULL;
-+ _cleanup_netlink_message_unref_ sd_netlink_message* req = NULL;
-+ _cleanup_netlink_message_unref_ sd_netlink_message* reply = NULL;
-+ _cleanup_address_free_ Address *addr = NULL;
-+ _cleanup_route_free_ Route *rt = NULL;
-+ Manager *mgr = userdata;
-+ Link* link = NULL;
-+ struct udev* udev = NULL;
-+ struct udev_device* udev_eth = NULL;
-+
-+ const char* device = NULL;
-+ const char* ipaddr = NULL;
-+ const char* netmask = NULL;
-+ const char* gateway = NULL;
-+ char devpath [32] = "/sys/class/net/";
-+
-+ unsigned char family;
-+ unsigned char prefixlen;
-+ unsigned char flags;
-+ unsigned char scope;
-+ unsigned char ifindex;
-+
-+ struct in_addr nm;
-+ struct in_addr ip;
-+ struct in_addr gw;
-+ int r;
-+
-+ assert(m);
-+ assert(mgr);
-+
-+ r = sd_bus_message_read (m, "sssyyys", &device, &ipaddr, &netmask, &family, &flags, &scope, &gateway);
-+ if (r < 0)
-+ return r;
-+
-+ if (isempty (device))
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");
-+
-+ if (isempty (ipaddr))
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Address.");
-+
-+ if (isempty (netmask))
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Netmask.");
-+
-+ assert(family == AF_INET || family == AF_INET6);
-+
-+ udev = udev_new();
-+ udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));
-+ if (!udev_eth)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");
-+
-+ ifindex = udev_device_get_ifindex(udev_eth);
-+
-+ inet_aton (netmask, &nm);
-+ inet_aton (ipaddr, &ip);
-+ if (!isempty (gateway)) inet_aton (gateway, &gw);
-+
-+ prefixlen = in_addr_netmask_to_prefixlen(&nm);
-+ assert(prefixlen > 0);
-+
-+#if 0
-+ r = network_save_static (1, device, ipaddr, prefixlen, gateway); /* persist config - add */
-+ if (r)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, strerror(r));
-+#endif
-+
-+ r = address_new_dynamic(&addr);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating new address");
-+
-+ r = sd_netlink_open(&rtnl);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_IO_ERROR, "Failed to connect to netlink");
-+
-+ link = new0(Link, 1);
-+ if (!link)
-+ return -ENOMEM;
-+
-+ link->network = new0(Network, 1);
-+ if (!link->network)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Could not alloc memory for Network");
-+
-+ link->n_ref = 1;
-+ link->manager = mgr;
-+ link->manager->rtnl = rtnl;
-+ link->state = LINK_STATE_PENDING;
-+ link->rtnl_extended_attrs = true;
-+ link->ifindex = ifindex;
-+ link->ifname = strdup(device); /*FIXME:*/
-+ if (!link->ifname)
-+ return -ENOMEM;
-+
-+ addr->family = family;
-+ addr->in_addr.in.s_addr = ip.s_addr;
-+ addr->prefixlen = prefixlen;
-+ addr->broadcast.s_addr = ip.s_addr | ~nm.s_addr;
-+
-+ LIST_PREPEND(addresses, link->network->static_addresses, addr);
-+
-+ if (!isempty (gateway))
-+ {
-+ r = route_new_dynamic(&rt, RTPROT_STATIC);
-+ if (r < 0)
-+ return r;
-+
-+ rt->protocol = RTPROT_STATIC;
-+ rt->network = link->network;
-+ rt->family = family;
-+ rt->scope = RT_SCOPE_LINK; /* FIXME: */
-+ rt->dst_prefixlen = prefixlen; /* FIXME: AF_INET assumed */
-+/*
-+ rt->dst_addr.in = gw;
-+ rt->in_addr.in = ip.s_addr & nm.s_addr;
-+*/
-+ rt->dst_addr.in.s_addr = ip.s_addr & nm.s_addr;
-+ rt->in_addr.in = gw;
-+
-+ LIST_PREPEND(routes, link->network->static_routes, rt);
-+ }
-+
-+ /* send an nlmsg (RTM_NEWADDR) and append address to link address list */
-+ r = address_update (addr, link, network_address_added_handler);
-+ if (r < 0)
-+ return r;
-+
-+ r = sd_bus_message_new_method_return(m, &resp);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");
-+
-+ r = sd_bus_message_append(resp, "x", 0);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+
-+ /*r = sd_bus_send(mgr->bus, resp, NULL);*/
-+ r = sd_bus_send(NULL, resp, NULL);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error sending reply messgage");
-+
-+
-+ return sd_bus_reply_method_return(m, "s", "Adding IP address...");
-+}
-+
-+static int method_del_address (sd_bus_message *m, void* userdata, sd_bus_error *error)
-+{
-+ _cleanup_bus_message_unref_ sd_bus_message* resp = NULL;
-+ _cleanup_netlink_unref_ sd_netlink* rtnl = NULL;
-+ _cleanup_netlink_message_unref_ sd_netlink_message* req = NULL;
-+ _cleanup_netlink_message_unref_ sd_netlink_message* reply = NULL;
-+ _cleanup_address_free_ Address *addr = NULL;
-+ _cleanup_route_free_ Route *rt = NULL;
-+ Manager *mgr = userdata;
-+ Link* link = NULL;
-+ struct udev* udev = NULL;
-+ struct udev_device* udev_eth = NULL;
-+
-+ const char* device = NULL;
-+ const char* ipaddr = NULL;
-+ const char* netmask = NULL;
-+ const char* gateway = NULL;
-+ char devpath [32] = "/sys/class/net/";
-+
-+ unsigned char family;
-+ unsigned char prefixlen;
-+ unsigned char flags;
-+ unsigned char scope;
-+ unsigned char ifindex;
-+
-+ struct in_addr nm;
-+ struct in_addr ip;
-+ struct in_addr gw;
-+ int r;
-+
-+ assert(m);
-+ assert(mgr);
-+
-+ r = sd_bus_message_read (m, "sssyyys", &device, &ipaddr, &netmask, &family, &flags, &scope, &gateway);
-+ if (r < 0)
-+ return r;
-+
-+ if (isempty (device))
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");
-+
-+ if (isempty (ipaddr))
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Address.");
-+
-+ if (isempty (netmask))
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Netmask.");
-+
-+ assert(family == AF_INET || family == AF_INET6);
-+
-+ udev = udev_new();
-+ udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));
-+ if (!udev_eth)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");
-+
-+ ifindex = udev_device_get_ifindex(udev_eth);
-+
-+ inet_aton (netmask, &nm);
-+ inet_aton (ipaddr, &ip);
-+ if (!isempty (gateway)) inet_aton (gateway, &gw);
-+
-+ prefixlen = in_addr_netmask_to_prefixlen(&nm);
-+ assert(prefixlen > 0);
-+
-+ r = address_new_dynamic(&addr);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating new address");
-+
-+ r = sd_netlink_open(&rtnl);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_IO_ERROR, "Failed to connect to netlink");
-+
-+ link = new0(Link, 1);
-+ if (!link)
-+ return -ENOMEM;
-+
-+ link->network = new0(Network, 1);
-+ if (!link->network)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Could not alloc memory for Network");
-+
-+ link->n_ref = 1;
-+ link->manager = mgr;
-+ link->manager->rtnl = rtnl;
-+ link->state = LINK_STATE_PENDING;
-+ link->rtnl_extended_attrs = true;
-+ link->ifindex = ifindex;
-+ link->ifname = strdup(device);
-+ if (!link->ifname)
-+ return -ENOMEM;
-+
-+ addr->family = family;
-+ addr->in_addr.in.s_addr = ip.s_addr;
-+ addr->prefixlen = prefixlen;
-+ addr->broadcast.s_addr = ip.s_addr | ~nm.s_addr;
-+
-+ if (!isempty (gateway))
-+ {
-+ r = route_new_dynamic(&rt, RTPROT_STATIC);
-+ if (r < 0)
-+ return r;
-+
-+ rt->network = link->network;
-+ rt->family = family;
-+ rt->scope = RT_SCOPE_LINK; /* FIXME: */
-+ rt->dst_prefixlen = 32; /* FIXME: AF_INET assumed */
-+ rt->dst_addr.in = gw;
-+
-+ /*LIST_PREPEND(routes, link->network->static_routes, rt);*/
-+ /* Drop the Gateway */
-+ route_drop (rt, link, link_route_drop_handler);
-+ }
-+
-+ /* send an nlmsg to delete address from address list */
-+ r = address_drop(addr, link, link_address_drop_handler);
-+ if (r < 0)
-+ return r;
-+
-+ r = sd_bus_message_new_method_return(m, &resp);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");
-+
-+ r = sd_bus_message_append(resp, "x", 0);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+
-+ /*r = sd_bus_send(mgr->bus, resp, NULL);*/
-+ r = sd_bus_send(NULL, resp, NULL);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error sending reply messgage");
-+
-+#if 0
-+ r = network_save_static (0, device, ipaddr, prefixlen, gateway); /* persist config - del */
-+ if (r)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, strerror(r));
-+#endif
-+
-+ return sd_bus_reply_method_return(m, "s", "Deleted IP address...");
-+}
-+
-+static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error)
-+{
-+ _cleanup_netlink_unref_ sd_netlink *rtnl = NULL;
-+ _cleanup_address_free_ Address *addr = NULL;
-+ _cleanup_route_free_ Route *rt = NULL;
-+ Manager *mgr = userdata;
-+ struct udev* udev = NULL;
-+ struct udev_device* udev_eth = NULL;
-+ const char* device = NULL;
-+ char devpath [32] = "/sys/class/net/";
-+ unsigned char ifindex;
-+ int r;
-+
-+ sd_netlink_message* maddr;
-+
-+ _cleanup_netlink_message_unref_ sd_netlink_message *req = NULL;
-+ _cleanup_netlink_message_unref_ sd_netlink_message *reply = NULL;
-+ _cleanup_bus_message_unref_ sd_bus_message *resp = NULL;
-+ _cleanup_address_free_ Address *address = NULL;
-+ _cleanup_free_ struct local_address *local = NULL;
-+ _cleanup_free_ char *ipr = NULL;
-+ _cleanup_free_ char *gwr = NULL;
-+ int n;
-+ int i;
-+
-+ assert(m);
-+ assert(mgr);
-+
-+ r = sd_bus_message_read (m, "s", &device);
-+ if (r < 0)
-+ return r;
-+
-+ if (isempty (device))
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");
-+
-+ udev = udev_new();
-+ udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));
-+ if (!udev_eth)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");
-+
-+ ifindex = udev_device_get_ifindex(udev_eth);
-+
-+ r = sd_netlink_open(&rtnl);
-+ if (r < 0)
-+ return log_error_errno(r, "Failed to connect to netlink:"); /* fixme */
-+
-+ r = sd_rtnl_message_new_addr(rtnl, &req, RTM_GETADDR, 0, 0);
-+ if (r < 0)
-+ return r;
-+
-+ r = sd_netlink_message_request_dump(req, true);
-+ if (r < 0)
-+ return r;
-+
-+ r = sd_netlink_call(rtnl, req, 0, &reply); /* fixme */
-+ if (r < 0)
-+ return r;
-+
-+ r = sd_bus_message_new_method_return(m, &resp);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");
-+
-+ r = sd_bus_message_open_container(resp, 'a', "(iyyus)"); /*family,prefixlen,scope,flags,addr*/
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error opening a container for reply message");
-+
-+ for (maddr = reply; maddr; maddr = sd_netlink_message_next(maddr)) {
-+ int k;
-+
-+ r = address_new_dynamic(&address);
-+ if (r < 0)
-+ return r;
-+
-+ k = network_rtnl_process_address(rtnl, maddr, mgr, address);
-+ if (k) {
-+ r = in_addr_to_string(address->family, &address->in_addr, &ipr); /* fixme */
-+ if (r < 0)
-+ return r;
-+
-+ r = sd_bus_message_append (resp, "(iyyus)",
-+ address->family,
-+ address->prefixlen,
-+ address->scope,
-+ address->flags,
-+ ipr);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+#if 0
-+ r = sd_bus_message_open_container(resp, 'r', "iyyus");
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error opening struct in reply messgage");
-+
-+ r = sd_bus_message_append(resp, "i", address->family);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+
-+ r = sd_bus_message_append(resp, "y", address->prefixlen);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+
-+ r = sd_bus_message_append(resp, "y", address->scope);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+
-+ r = sd_bus_message_append(resp, "u", address->flags);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+
-+ r = in_addr_to_string(address->family, &address->in_addr, &ipr); /* fixme */
-+ if (r < 0)
-+ return r;
-+
-+ r = sd_bus_message_append(resp, "s", ipr);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+
-+ r = sd_bus_message_close_container(resp);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error closing struct in reply messgage");
-+#endif
-+ }
-+ }
-+
-+ r = sd_bus_message_close_container(resp);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error closing reply container");
-+
-+ n = local_gateways(rtnl, ifindex, AF_UNSPEC, &local);
-+ if (n < 0)
-+ return n;
-+
-+ for (i = 0; i < n; i++) {
-+
-+ r = in_addr_to_string(local[i].family, &local[i].address, &gwr);
-+ if (r < 0)
-+ return r;
-+ }
-+
-+ r = sd_bus_message_append(resp, "s", gwr);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");
-+
-+ /*r = sd_bus_send(mgr->bus, resp, NULL);*/
-+ r = sd_bus_send(NULL, resp, NULL);
-+ if (r < 0)
-+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error sending reply messgage");
-+
-+ return sd_bus_reply_method_return(m, "s", "Getting IP configuration...");
-+}
-+
-+
-+int network_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message, void *userdata, Address* address) {
-+ Manager* m = (Manager*) userdata; /* fixme */
-+ uint16_t type;
-+ unsigned char flags;
-+ char buf[INET6_ADDRSTRLEN];
-+ int ifindex;
-+ int r;
-+ sd_bus_error err = SD_BUS_ERROR_NULL; /* fixme */
-+ sd_bus_error* error = &err; /* fixme */
-+
-+ assert(rtnl);
-+ assert(message);
-+ assert(m);
-+ assert(address);
-+
-+ if (sd_netlink_message_is_error(message)) {
-+ r = sd_netlink_message_get_errno(message);
-+ if (r < 0)
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: failed to receive address: ");
-+
-+ return 0;
-+ }
-+
-+ r = sd_netlink_message_get_type(message, &type);
-+ if (r < 0) {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: could not get message type: ");
-+ return 0;
-+ } else if (type != RTM_NEWADDR && type != RTM_DELADDR) {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received unexpected message type when processing address");
-+ return 0;
-+ }
-+
-+ r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
-+ if (r < 0) {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: could not get ifindex from address: %m");
-+ return 0;
-+ } else if (ifindex <= 0) {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address message with invalid ifindex: %d", ifindex);
-+ return 0;
-+ }
-+
-+ r = sd_rtnl_message_addr_get_family(message, &address->family); /* int : i*/
-+ if (r < 0 || !IN_SET(address->family, AF_INET, AF_INET6)) {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid family, ignoring.");
-+ return 0;
-+ }
-+
-+ r = sd_rtnl_message_addr_get_prefixlen(message, &address->prefixlen); /* uchar : byte : y */
-+ if (r < 0) {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid prefixlen, ignoring: ");
-+ return 0;
-+ }
-+
-+ r = sd_rtnl_message_addr_get_scope(message, &address->scope); /* uchar : byte : y*/
-+ if (r < 0) {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid scope, ignoring: ");
-+ return 0;
-+ }
-+
-+ r = sd_rtnl_message_addr_get_flags(message, &flags); /* uint32 : u*/
-+ if (r < 0) {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid flags, ignoring: ");
-+ return 0;
-+ }
-+ address->flags = flags;
-+
-+ switch (address->family) {
-+ case AF_INET:
-+ r = sd_netlink_message_read_in_addr(message, IFA_LOCAL, &address->in_addr.in); /* ulong : uint64 : t */
-+ if (r < 0) {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address without valid address, ignoring: ");
-+ return 0;
-+ }
-+
-+ break;
-+
-+ case AF_INET6:
-+ r = sd_netlink_message_read_in6_addr(message, IFA_ADDRESS, &address->in_addr.in6); /* ulong : uint64 : t */
-+ if (r < 0) {
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address without valid address, ignoring: ");
-+ return 0;
-+ }
-+
-+ break;
-+
-+ default:
-+ assert_not_reached("invalid address family");
-+ }
-+
-+ if (!inet_ntop(address->family, &address->in_addr, buf, INET6_ADDRSTRLEN)) { /* string : s */
-+ sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not print address");
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+int network_save_static (int cmd, const char* device, const char* ipaddr, int prefixlen, const char* gwaddr)
-+{
-+#define NETWORKD_CONFIG_FILE_NAME_LEN_MAX 64
-+ char ncfn [NETWORKD_CONFIG_FILE_NAME_LEN_MAX];
-+ FILE* ncfp = NULL;
-+ int r=0;
-+
-+ /* /usr/lib/systemd/network/10-bmc-ethx-192.168.255.255.32.network */
-+ snprintf (ncfn, NETWORKD_CONFIG_FILE_NAME_LEN_MAX, "/usr/lib/systemd/network/10-bmc-%s-%s.%d.network", device, ipaddr, prefixlen);
-+
-+ if (cmd) /* add */
-+ {
-+ ncfp = fopen (ncfn, "w+");
-+ if (!ncfp) {
-+ r = errno;
-+ }
-+
-+ fprintf (ncfp, "[Match]\nName=%s\n\n[Network]\nAddress=%s/%d\nGateway=%s\n", device, ipaddr, prefixlen, gwaddr);
-+ fclose (ncfp);
-+ }
-+ else /* del */
-+ {
-+ r = remove (ncfn);
-+ }
-+
-+ return r;
-+}
-+#endif
-diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
-index 6587ea9..f773936 100644
---- a/src/network/networkd-network.c
-+++ b/src/network/networkd-network.c
-@@ -20,6 +20,9 @@
- ***/
-
- #include <ctype.h>
-+#include <sys/socket.h>
-+#include <netinet/in.h>
-+#include <arpa/inet.h>
- #include <net/if.h>
-
- #include "conf-files.h"
-@@ -32,6 +35,15 @@
- #include "network-internal.h"
- #include "dns-domain.h"
-
-+#define SYSTEMD_NETWORKD_DBUS 1
-+
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+int network_address_added_handler (sd_netlink* rtnl, sd_netlink_message* m, void* userdata);
-+int network_set_gateway (Link* link);
-+static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
-+int network_save_static (int cmd, const char* device, const char* ipaddr, int prefixlen, const char* gwaddr);
-+#endif
-+
- static int network_load_one(Manager *manager, const char *filename) {
- _cleanup_network_free_ Network *network = NULL;
- _cleanup_fclose_ FILE *file = NULL;
-@@ -850,3 +862,99 @@ int config_parse_hostname(const char *unit,
-
- return 0;
- }
-+
-+#ifdef SYSTEMD_NETWORKD_DBUS
-+int network_address_added_handler (sd_netlink* rtnl, sd_netlink_message* m, void* userdata)
-+{
-+ _cleanup_link_unref_ Link *link = userdata;
-+ int r;
-+
-+ assert(link);
-+
-+ r = sd_netlink_message_get_errno(m);
-+ if (r < 0 && r != -EEXIST) {
-+ log_debug("Error in set IP address!");
-+ link_enter_failed(link);
-+ return r;
-+ } else if (r >= 0)
-+ link_rtnl_process_address(rtnl, m, link->manager);
-+
-+ network_set_gateway (link);
-+
-+ return 0;
-+}
-+
-+/* link_enter_set_routes */
-+int network_set_gateway (Link* link)
-+{
-+ _cleanup_address_free_ Address* addr = NULL;
-+ const char* device = NULL;
-+ const char* ipaddr = NULL;
-+ const char* gwaddr = NULL;
-+ Route* rt;
-+ unsigned char prefixlen;
-+ int r=0;
-+
-+ assert(link);
-+ assert(link->network);
-+ assert(link->state == LINK_STATE_SETTING_ADDRESSES);
-+
-+ link->state = LINK_STATE_SETTING_ROUTES;
-+
-+ LIST_FOREACH(routes, rt, link->network->static_routes) {
-+ gwaddr = inet_ntoa (rt->dst_addr.in);
-+ r = route_configure(rt, link, &route_handler);
-+ if (r < 0) {
-+ log_debug ("Could not set Gateway!");
-+ link_enter_failed(link);
-+ return r;
-+ }
-+
-+ link->link_messages ++;
-+ }
-+
-+ if (link->link_messages == 0) {
-+ link->static_configured = true;
-+
-+ /*link_enter_configured (link);*/
-+ log_link_info(link, "Configured");
-+ link->state = LINK_STATE_CONFIGURED;
-+ link_save(link);
-+ }
-+ else
-+ {
-+ log_debug("Setting Gateway");
-+ }
-+
-+ LIST_FOREACH(addresses, addr, link->network->static_addresses) {
-+ device = strdup (link->ifname);
-+ ipaddr = inet_ntoa (addr->in_addr.in);
-+ prefixlen = addr->prefixlen;
-+#if 1
-+ r = network_save_static (1, device, ipaddr, prefixlen, gwaddr); /* persist config - add */
-+ if (r)
-+ {
-+ log_debug(strerror(r));
-+ }
-+#endif
-+ }
-+
-+ return r;
-+}
-+
-+static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
-+ _cleanup_link_unref_ Link *link = userdata;
-+ int r;
-+
-+ assert(link);
-+
-+ r = sd_netlink_message_get_errno(m);
-+ if (r < 0 && r != -EEXIST) {
-+ log_debug ("Could not set route! ");
-+ link_enter_failed(link);
-+ }
-+
-+ return 1;
-+}
-+
-+#endif
-diff --git a/src/network/org.freedesktop.network1.conf b/src/network/org.freedesktop.network1.conf
-index 52dad33..3db7a90 100644
---- a/src/network/org.freedesktop.network1.conf
-+++ b/src/network/org.freedesktop.network1.conf
-@@ -36,6 +36,26 @@
- send_interface="org.freedesktop.DBus.Properties"
- send_member="GetAll"/>
-
-+ <allow send_destination="org.freedesktop.network1"
-+ send_interface="org.freedesktop.network1.Network"
-+ send_member="AddAddress"/>
-+
-+ <allow send_destination="org.freedesktop.network1"
-+ send_interface="org.freedesktop.network1.Network"
-+ send_member="DelAddress"/>
-+
-+ <allow send_destination="org.freedesktop.network1"
-+ send_interface="org.freedesktop.network1.Network"
-+ send_member="GetAddress"/>
-+
-+ <allow send_destination="org.freedesktop.network1"
-+ send_interface="org.freedesktop.network1.Link"
-+ send_member="GetAddress"/>
-+
-+ <allow send_destination="org.freedesktop.network1"
-+ send_interface="org.freedesktop.network1.Link"
-+ send_member="SetAddress"/>
-+
- <allow receive_sender="org.freedesktop.network1"/>
- </policy>
-
---
-1.8.2.2
-
diff --git a/yocto-poky/meta/recipes-core/systemd/systemd_225.bb b/yocto-poky/meta/recipes-core/systemd/systemd_225.bb
index e3d55ec..f7d4c7d 100644
--- a/yocto-poky/meta/recipes-core/systemd/systemd_225.bb
+++ b/yocto-poky/meta/recipes-core/systemd/systemd_225.bb
@@ -41,7 +41,6 @@ SRC_URI = "git://github.com/systemd/systemd.git;protocol=git \
file://0012-implment-systemd-sysv-install-for-OE.patch \
file://0014-Revert-rules-remove-firmware-loading-rules.patch \
file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \
- file://0100-systemd_networkd_dbus_setaddress.patch \
file://touchscreen.rules \
file://00-create-volatile.conf \
file://init \
--
2.7.1
More information about the openbmc
mailing list