<html><body><p>Hi Cyril,<br><br>systemted-networkd did *not* support *dbus-api* to configure the network interface. The way to configure network with networkd would be to edit a corresponding *.link/*.network/*.service files.<br><br>This patch adds the dbus-api. If you introspected the /org/freedesktop/network1/network/default object of the org.freedesktop.network1 application, you would get the following. The AddAddress, DelAddress and GetAddress are the new dbus methods enabled by this patch.<br><br>--------<br>method return sender=:1.2 -> dest=:1.24 reply_serial=2<br>   string "<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"<br>"<a href="http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd</a>"><br><node><br> <interface name="org.freedesktop.DBus.Peer"><br>  <method name="Ping"/><br>  <method name="GetMachineId"><br>   <arg type="s" name="machine_uuid" direction="out"/><br>  </method><br> </interface><br> <interface name="org.freedesktop.DBus.Introspectable"><br>  <method name="Introspect"><br>   <arg name="data" type="s" direction="out"/><br>  </method><br> </interface><br> <interface name="org.freedesktop.DBus.Properties"><br>  <method name="Get"><br>   <arg name="interface" direction="in" type="s"/><br>   <arg name="property" direction="in" type="s"/><br>   <arg name="value" direction="out" type="v"/><br>  </method><br>  <method name="GetAll"><br>   <arg name="interface" direction="in" type="s"/><br>   <arg name="properties" direction="out" type="a{sv}"/><br>  </method><br>  <method name="Set"><br>   <arg name="interface" direction="in" type="s"/><br>   <arg name="property" direction="in" type="s"/><br>   <arg name="value" direction="in" type="v"/><br>  </method><br>  <signal name="PropertiesChanged"><br>   <arg type="s" name="interface"/><br>   <arg type="a{sv}" name="changed_properties"/><br>   <arg type="as" name="invalidated_properties"/><br>  </signal><br> </interface><br> <interface name="org.freedesktop.network1.Network"><br>  <property name="Description" type="s" access="read"><br>   <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/><br>  </property><br>  <property name="SourcePath" type="s" access="read"><br>   <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/><br>  </property><br>  <property name="MatchMAC" type="as" access="read"><br>   <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/><br>  </property><br>  <property name="MatchPath" type="as" access="read"><br>   <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/><br>  </property><br>  <property name="MatchDriver" type="as" access="read"><br>   <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/><br>  </property><br>  <property name="MatchType" type="as" access="read"><br>   <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/><br>  </property><br>  <property name="MatchName" type="as" access="read"><br>   <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/><br>  </property><br><b>  <method name="AddAddress"></b><br>   <arg type="s" direction="in"/><br>   <arg type="s" direction="in"/><br>   <arg type="s" direction="in"/><br>   <arg type="y" direction="in"/><br>   <arg type="y" direction="in"/><br>   <arg type="y" direction="in"/><br>   <arg type="s" direction="in"/><br>   <arg type="x" direction="out"/><br>  </method><br><b>  <method name="DelAddress"></b><br>   <arg type="s" direction="in"/><br>   <arg type="s" direction="in"/><br>   <arg type="s" direction="in"/><br>   <arg type="y" direction="in"/><br>   <arg type="y" direction="in"/><br>   <arg type="y" direction="in"/><br>   <arg type="s" direction="in"/><br>   <arg type="x" direction="out"/><br>  </method><br>  <b><method name="GetAddress"></b><br>   <arg type="s" direction="in"/><br>   <arg type="a(iyyus)" direction="out"/><br>   <arg type="s" direction="out"/><br>  </method><br> </interface><br></node><br>"<br>--------<br><br>regards,<br>rhari !<br><br>Hariharasubramanian R.<br>Power Firmware Development<br>IBM India Systems & Technology Lab, Bangalore, India<br>Phone:  +91 80 4025 6950   <br><br><img width="16" height="16" src="cid:2__=8FBBF5D2DFB5EC288f9e8a93df938690918c8FB@" border="0" alt="Inactive hide details for Cyril Bur ---01/21/2016 10:53:40 AM---From: Cyril Bur <cyrilbur@gmail.com> To: OpenBMC Patches <openb"><font color="#424282">Cyril Bur ---01/21/2016 10:53:40 AM---From: Cyril Bur <cyrilbur@gmail.com> To: OpenBMC Patches <openbmc-patches@stwcx.xyz></font><br><br><font size="2" color="#5F5F5F">From:        </font><font size="2">Cyril Bur <cyrilbur@gmail.com></font><br><font size="2" color="#5F5F5F">To:        </font><font size="2">OpenBMC Patches <openbmc-patches@stwcx.xyz></font><br><font size="2" color="#5F5F5F">Cc:        </font><font size="2">openbmc@lists.ozlabs.org</font><br><font size="2" color="#5F5F5F">Date:        </font><font size="2">01/21/2016 10:53 AM</font><br><font size="2" color="#5F5F5F">Subject:        </font><font size="2">Re: [PATCH openbmc] Dbus API for systemd/networkd for network configuration.</font><br><font size="2" color="#5F5F5F">Sent by:        </font><font size="2">"openbmc" <openbmc-bounces+hramasub=in.ibm.com@lists.ozlabs.org></font><br><hr width="100%" size="2" align="left" noshade style="color:#8091A5; "><br><br><br><tt>On Wed, 20 Jan 2016 09:10:22 -0600<br>OpenBMC Patches <openbmc-patches@stwcx.xyz> wrote:<br><br>> From: Hariharasubramanian R <hramasub@in.ibm.com><br>> <br><br>Hi Hariharasubramanian,<br><br>Just to be sure I've got this right, we're patching systemd now? Does systemd<br>not already do this? I thought the one good thing with systemd is that it<br>provides all this kind of stuff out of the box?<br><br>> ---<br>>  .../0100-systemd_networkd_dbus_setaddress.patch    | 845 +++++++++++++++++++++<br>>  .../meta/recipes-core/systemd/systemd_225.bb       |   1 +<br>>  2 files changed, 846 insertions(+)<br>>  create mode 100644 yocto-poky/meta/recipes-core/systemd/systemd/0100-systemd_networkd_dbus_setaddress.patch<br>> <br>> 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<br>> new file mode 100644<br>> index 0000000..6727c1e<br>> --- /dev/null<br>> +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0100-systemd_networkd_dbus_setaddress.patch<br>> @@ -0,0 +1,845 @@<br>> +From 35efeac7a1b1f6b737348f649d58d1c7eb5ecb8d Mon Sep 17 00:00:00 2001<br>> +From: Hariharasubramanian R <hramasub@in.ibm.com><br>> +Date: Tue, 19 Jan 2016 05:04:40 -0600<br>> +Subject: [PATCH] Test<br>> +<br>> +---<br>> + src/network/networkd-link-bus.c           |  93 +++++<br>> + src/network/networkd-network-bus.c        | 556 ++++++++++++++++++++++++++++++<br>> + src/network/networkd-network.c            |  81 +++++<br>> + src/network/org.freedesktop.network1.conf |  17 +<br>> + 4 files changed, 747 insertions(+)<br>> +<br>> +diff --git a/src/network/networkd-link-bus.c b/src/network/networkd-link-bus.c<br>> +index 1a1524d..103d513 100644<br>> +--- a/src/network/networkd-link-bus.c<br>> ++++ b/src/network/networkd-link-bus.c<br>> +@@ -25,15 +25,41 @@<br>> + #include "networkd.h"<br>> + #include "networkd-link.h"<br>> + <br>> ++#define SYSTEMD_NETWORKD_DBUS 1<br>> ++<br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++/*<br>> ++#include "hostname-util.h"<br>> ++#include "network-internal.h"<br>> ++#include "networkd-link.h"<br>> ++#include "bus-util.h"<br>> ++*/<br>> ++#include "sd-network.h"<br>> ++#include "sd-netlink.h"<br>> ++#include "socket-util.h"<br>> ++#include "ether-addr-util.h"<br>> ++/*<br>> ++#include "local-addresses.h"<br>> ++*/<br>> ++#endif<br>> ++<br>> + static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state, link_operstate, LinkOperationalState);<br>> + static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_administrative_state, link_state, LinkState);<br>> + <br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error);<br>> ++#endif<br>> ++<br>> + const sd_bus_vtable link_vtable[] = {<br>> +         SD_BUS_VTABLE_START(0),<br>> + <br>> +         SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state, offsetof(Link, operstate), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),<br>> +         SD_BUS_PROPERTY("AdministrativeState", "s", property_get_administrative_state, offsetof(Link, state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),<br>> + <br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++                     /* device name */<br>> ++                     SD_BUS_METHOD("GetAddress", "s", "s", method_get_address, SD_BUS_VTABLE_UNPRIVILEGED),<br>> ++#endif<br>> +         SD_BUS_VTABLE_END<br>> + };<br>> + <br>> +@@ -136,3 +162,70 @@ int link_send_changed(Link *link, const char *property, ...) {<br>> +                         "org.freedesktop.network1.Link",<br>> +                         l);<br>> + }<br>> ++<br>> ++static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error)<br>> ++{<br>> ++    _cleanup_netlink_unref_ sd_netlink                  *rtnl   = NULL;<br>> ++    _cleanup_netlink_message_unref_ sd_netlink_message  *req    = NULL;<br>> ++    _cleanup_netlink_message_unref_ sd_netlink_message  *reply  = NULL;<br>> ++    _cleanup_bus_message_unref_ sd_bus_message          *resp   = NULL;<br>> ++    Manager                                             *mgr    = userdata;<br>> ++<br>> ++    struct udev*        udev               = NULL;<br>> ++    struct udev_device* udev_eth           = NULL;<br>> ++    const char*         device             = NULL;<br>> ++    char                devpath [32]       = "/sys/class/net/"; <br>> ++<br>> ++    int                 r;<br>> ++    unsigned char       ifindex;<br>> ++    bool                have_mac;<br>> ++    struct ether_addr   e;<br>> ++    char                ea[ETHER_ADDR_TO_STRING_MAX];<br>> ++<br>> ++    assert(m);<br>> ++    assert(mgr);<br>> ++<br>> ++    r = sd_bus_message_read (m, "s", &device);<br>> ++    if (r < 0)<br>> ++        return r;<br>> ++<br>> ++    if (isempty (device))<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");<br>> ++<br>> ++    udev = udev_new();<br>> ++    udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));<br>> ++    if (!udev_eth)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");<br>> ++<br>> ++    ifindex = udev_device_get_ifindex(udev_eth);<br>> ++<br>> ++    r = sd_netlink_open(&rtnl);<br>> ++    if (r < 0)<br>> ++            return log_error_errno(r, "Failed to connect to netlink:"); /* fixme */<br>> ++<br>> ++    r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, ifindex);<br>> ++    if (r < 0)<br>> ++            return r;<br>> ++<br>> ++    r = sd_netlink_call(rtnl, req, 0, &reply); /* fixme */<br>> ++    if (r < 0)<br>> ++            return r;<br>> ++<br>> ++    have_mac = sd_netlink_message_read_ether_addr(reply, IFLA_ADDRESS, &e) >= 0;<br>> ++    if (!have_mac)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error reading IFLA address");<br>> ++<br>> ++    ether_addr_to_string(&e, ea);<br>> ++<br>> ++    r = sd_bus_message_new_method_return(m, &resp);<br>> ++    if (r < 0)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");<br>> ++<br>> ++    r = sd_bus_message_append(resp, "s", ea);<br>> ++    if (r < 0)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");<br>> ++<br>> ++    r = sd_bus_send(mgr->bus, resp, NULL);<br>> ++<br>> ++    return sd_bus_reply_method_return(m, "s", "Getting IFLA address ...");<br>> ++}<br>> +diff --git a/src/network/networkd-network-bus.c b/src/network/networkd-network-bus.c<br>> +index 5717a15..6f0d1e5 100644<br>> +--- a/src/network/networkd-network-bus.c<br>> ++++ b/src/network/networkd-network-bus.c<br>> +@@ -19,10 +19,34 @@<br>> +   along with systemd; If not, see <</tt><tt><a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a></tt><tt>>.<br>> + ***/<br>> + <br>> ++#define SYSTEMD_NETWORKD_DBUS 1<br>> ++<br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++#include <netinet/ether.h><br>> ++#include <linux/if.h><br>> ++#endif<br>> ++<br>> + #include "strv.h"<br>> + <br>> + #include "networkd.h"<br>> + <br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++#include "hostname-util.h"<br>> ++#include "network-internal.h"<br>> ++#include "networkd-link.h"<br>> ++#include "bus-util.h"<br>> ++<br>> ++#include "sd-network.h"<br>> ++#include "sd-netlink.h"<br>> ++#include "local-addresses.h"<br>> ++#endif<br>> ++<br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++int network_address_added_handler (sd_netlink* rtnl, sd_netlink_message* m, void* userdata);<br>> ++int network_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message, void *userdata, Address* address); /* fixme */<br>> ++static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error); /* fixme */<br>> ++#endif<br>> ++<br>> + static int property_get_ether_addrs(<br>> +                 sd_bus *bus,<br>> +                 const char *path,<br>> +@@ -56,6 +80,11 @@ static int property_get_ether_addrs(<br>> +         return sd_bus_message_close_container(reply);<br>> + }<br>> + <br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++static int method_add_address (sd_bus_message *m, void* userdata, sd_bus_error *error);<br>> ++static int method_del_address (sd_bus_message *m, void* userdata, sd_bus_error *error);<br>> ++#endif<br>> ++<br>> + const sd_bus_vtable network_vtable[] = {<br>> +         SD_BUS_VTABLE_START(0),<br>> + <br>> +@@ -67,6 +96,13 @@ const sd_bus_vtable network_vtable[] = {<br>> +         SD_BUS_PROPERTY("MatchType", "as", NULL, offsetof(Network, match_type), SD_BUS_VTABLE_PROPERTY_CONST),<br>> +         SD_BUS_PROPERTY("MatchName", "as", NULL, offsetof(Network, match_name), SD_BUS_VTABLE_PROPERTY_CONST),<br>> + <br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++                     /* device, IP, netmask, family, flags, scope, gateway */<br>> ++                     SD_BUS_METHOD("AddAddress", "sssyyys", "x", method_add_address, SD_BUS_VTABLE_UNPRIVILEGED),<br>> ++                     SD_BUS_METHOD("DelAddress", "sssyyys", "x", method_del_address, SD_BUS_VTABLE_UNPRIVILEGED),<br>> ++                     /* (family, prefixlen, flags, scope, IP)+ gateway */<br>> ++                     SD_BUS_METHOD("GetAddress", "s", "a(iyyus)s", method_get_address, SD_BUS_VTABLE_UNPRIVILEGED),<br>> ++#endif<br>> +         SD_BUS_VTABLE_END<br>> + };<br>> + <br>> +@@ -152,3 +188,523 @@ int network_object_find(sd_bus *bus, const char *path, const char *interface, vo<br>> + <br>> +         return 1;<br>> + }<br>> ++<br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++<br>> ++static int method_add_address (sd_bus_message *m, void* userdata, sd_bus_error *error)<br>> ++{<br>> ++    _cleanup_bus_message_unref_ sd_bus_message*         resp    = NULL;<br>> ++    _cleanup_netlink_unref_ sd_netlink*                 rtnl    = NULL;<br>> ++    _cleanup_netlink_message_unref_ sd_netlink_message* req     = NULL;<br>> ++    _cleanup_netlink_message_unref_ sd_netlink_message* reply   = NULL;<br>> ++    _cleanup_address_free_ Address *addr                        = NULL;<br>> ++    _cleanup_route_free_ Route *rt                              = NULL;<br>> ++    Manager *mgr                                                = userdata;<br>> ++    Link*               link               = NULL;<br>> ++    struct udev*        udev               = NULL;<br>> ++    struct udev_device* udev_eth           = NULL;<br>> ++<br>> ++    const char*         device             = NULL;<br>> ++    const char*         ipaddr             = NULL;<br>> ++    const char*         netmask            = NULL;<br>> ++    const char*         gateway            = NULL;<br>> ++    char                devpath [32]       = "/sys/class/net/"; <br>> ++<br>> ++    unsigned char       family;<br>> ++    unsigned char       prefixlen;<br>> ++    unsigned char       flags;<br>> ++    unsigned char       scope;<br>> ++    unsigned char       ifindex;<br>> ++<br>> ++    struct in_addr      nm;<br>> ++    struct in_addr      ip;<br>> ++    struct in_addr      gw;<br>> ++    int r;<br>> ++<br>> ++    assert(m);<br>> ++    assert(mgr);<br>> ++<br>> ++    r = sd_bus_message_read (m, "sssyyys", &device, &ipaddr, &netmask, &family, &flags, &scope, &gateway);<br>> ++    if (r < 0)<br>> ++        return r;<br>> ++<br>> ++    if (isempty (device))<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");<br>> ++<br>> ++    if (isempty (ipaddr))<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Address.");<br>> ++<br>> ++    if (isempty (netmask))<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Netmask.");<br>> ++<br>> ++    assert(family == AF_INET || family == AF_INET6);<br>> ++<br>> ++    udev = udev_new();<br>> ++    udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));<br>> ++    if (!udev_eth)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");<br>> ++<br>> ++    ifindex = udev_device_get_ifindex(udev_eth);<br>> ++<br>> ++    inet_aton (netmask, &nm);<br>> ++    inet_aton (ipaddr, &ip);<br>> ++    if (!isempty (gateway)) inet_aton (gateway, &gw);<br>> ++<br>> ++    prefixlen = in_addr_netmask_to_prefixlen(&nm);<br>> ++    assert(prefixlen > 0);<br>> ++<br>> ++    r = address_new_dynamic(&addr);<br>> ++    if (r < 0)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating new address");<br>> ++<br>> ++    r = sd_netlink_open(&rtnl);<br>> ++    if (r < 0)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_IO_ERROR, "Failed to connect to netlink");<br>> ++<br>> ++    link = new0(Link, 1);<br>> ++    if (!link)<br>> ++            return -ENOMEM;<br>> ++<br>> ++    link->network = new0(Network, 1);<br>> ++    if (!link->network)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Could not alloc memory for Network");<br>> ++<br>> ++    link->n_ref                 = 1;<br>> ++    link->manager               = mgr;<br>> ++    link->manager->rtnl         = rtnl;<br>> ++    link->state                 = LINK_STATE_PENDING;<br>> ++    link->rtnl_extended_attrs   = true;<br>> ++    link->ifindex               = ifindex;<br>> ++    link->ifname                = strdup(device); /*FIXME:*/<br>> ++    if (!link->ifname)<br>> ++            return -ENOMEM;<br>> ++<br>> ++    addr->family                = family;<br>> ++    addr->in_addr.in.s_addr     = ip.s_addr;<br>> ++    addr->prefixlen             = prefixlen;<br>> ++    addr->broadcast.s_addr      = ip.s_addr | ~nm.s_addr;<br>> ++<br>> ++    if (!isempty (gateway))<br>> ++    {<br>> ++        r = route_new_dynamic(&rt, RTPROT_STATIC);<br>> ++        if (r < 0)<br>> ++            return r;<br>> ++<br>> ++        rt->protocol        = RTPROT_STATIC;<br>> ++        rt->network         = link->network;<br>> ++        rt->family          = family;<br>> ++        rt->scope           = RT_SCOPE_LINK;            /* FIXME: */<br>> ++        rt->dst_prefixlen   = 32;                       /* FIXME: AF_INET assumed */<br>> ++        rt->dst_addr.in     = gw;<br>> ++<br>> ++        LIST_PREPEND(routes, link->network->static_routes, rt);<br>> ++    }<br>> ++<br>> ++    /* send an nlmsg (RTM_NEWADDR) and append address to link address list */<br>> ++    r = address_update (addr, link, network_address_added_handler);<br>> ++    if (r < 0)<br>> ++        return r;<br>> ++<br>> ++    r = sd_bus_message_new_method_return(m, &resp);<br>> ++    if (r < 0)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");<br>> ++<br>> ++    r = sd_bus_message_append(resp, "x", 0);<br>> ++    if (r < 0)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");<br>> ++<br>> ++    r = sd_bus_send(mgr->bus, resp, NULL);<br>> ++    if (r < 0)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error sending reply messgage");<br>> ++<br>> ++    return sd_bus_reply_method_return(m, "s", "Adding IP address...");<br>> ++}<br>> ++<br>> ++static int method_del_address (sd_bus_message *m, void* userdata, sd_bus_error *error)<br>> ++{<br>> ++    _cleanup_bus_message_unref_ sd_bus_message*         resp    = NULL;<br>> ++    _cleanup_netlink_unref_ sd_netlink*                 rtnl    = NULL;<br>> ++    _cleanup_netlink_message_unref_ sd_netlink_message* req     = NULL;<br>> ++    _cleanup_netlink_message_unref_ sd_netlink_message* reply   = NULL;<br>> ++    _cleanup_address_free_ Address *addr                        = NULL;<br>> ++    _cleanup_route_free_ Route *rt                              = NULL;<br>> ++    Manager *mgr                                                = userdata;<br>> ++    Link*               link               = NULL;<br>> ++    struct udev*        udev               = NULL;<br>> ++    struct udev_device* udev_eth           = NULL;<br>> ++<br>> ++    const char*         device             = NULL;<br>> ++    const char*         ipaddr             = NULL;<br>> ++    const char*         netmask            = NULL;<br>> ++    const char*         gateway            = NULL;<br>> ++    char                devpath [32]       = "/sys/class/net/"; <br>> ++<br>> ++    unsigned char       family;<br>> ++    unsigned char       prefixlen;<br>> ++    unsigned char       flags;<br>> ++    unsigned char       scope;<br>> ++    unsigned char       ifindex;<br>> ++<br>> ++    struct in_addr      nm;<br>> ++    struct in_addr      ip;<br>> ++    struct in_addr      gw;<br>> ++    int r;<br>> ++<br>> ++    assert(m);<br>> ++    assert(mgr);<br>> ++<br>> ++    r = sd_bus_message_read (m, "sssyyys", &device, &ipaddr, &netmask, &family, &flags, &scope, &gateway);<br>> ++    if (r < 0)<br>> ++        return r;<br>> ++<br>> ++    if (isempty (device))<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");<br>> ++<br>> ++    if (isempty (ipaddr))<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Address.");<br>> ++<br>> ++    if (isempty (netmask))<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IP Netmask.");<br>> ++<br>> ++    assert(family == AF_INET || family == AF_INET6);<br>> ++<br>> ++    udev = udev_new();<br>> ++    udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));<br>> ++    if (!udev_eth)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");<br>> ++<br>> ++    ifindex = udev_device_get_ifindex(udev_eth);<br>> ++<br>> ++    inet_aton (netmask, &nm);<br>> ++    inet_aton (ipaddr, &ip);<br>> ++    if (!isempty (gateway)) inet_aton (gateway, &gw);<br>> ++<br>> ++    prefixlen = in_addr_netmask_to_prefixlen(&nm);<br>> ++    assert(prefixlen > 0);<br>> ++<br>> ++    r = address_new_dynamic(&addr);<br>> ++    if (r < 0)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating new address");<br>> ++<br>> ++    r = sd_netlink_open(&rtnl);<br>> ++    if (r < 0)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_IO_ERROR, "Failed to connect to netlink");<br>> ++<br>> ++    link = new0(Link, 1);<br>> ++    if (!link)<br>> ++            return -ENOMEM;<br>> ++<br>> ++    link->network = new0(Network, 1);<br>> ++    if (!link->network)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Could not alloc memory for Network");<br>> ++<br>> ++    link->n_ref                 = 1;<br>> ++    link->manager               = mgr;<br>> ++    link->manager->rtnl         = rtnl;<br>> ++    link->state                 = LINK_STATE_PENDING;<br>> ++    link->rtnl_extended_attrs   = true;<br>> ++    link->ifindex               = ifindex;<br>> ++    link->ifname                = strdup(device);<br>> ++    if (!link->ifname)<br>> ++            return -ENOMEM;<br>> ++<br>> ++    addr->family                = family;<br>> ++    addr->in_addr.in.s_addr     = ip.s_addr;<br>> ++    addr->prefixlen             = prefixlen;<br>> ++    addr->broadcast.s_addr      = ip.s_addr | ~nm.s_addr;<br>> ++<br>> ++    if (!isempty (gateway))<br>> ++    {<br>> ++        r = route_new_dynamic(&rt, RTPROT_STATIC);<br>> ++        if (r < 0)<br>> ++            return r;<br>> ++<br>> ++        rt->network         = link->network;<br>> ++        rt->family          = family;<br>> ++        rt->scope           = RT_SCOPE_LINK;            /* FIXME: */<br>> ++        rt->dst_prefixlen   = 32;                       /* FIXME: AF_INET assumed */<br>> ++        rt->dst_addr.in     = gw;<br>> ++<br>> ++        /*LIST_PREPEND(routes, link->network->static_routes, rt);*/<br>> ++        /* Drop the Gateway */<br>> ++        route_drop (rt, link, link_route_drop_handler);<br>> ++    }<br>> ++<br>> ++    /* send an nlmsg to delete address from address list */<br>> ++    r = address_drop(addr, link, link_address_drop_handler);<br>> ++    if (r < 0)<br>> ++        return r;<br>> ++<br>> ++    r = sd_bus_message_new_method_return(m, &resp);<br>> ++    if (r < 0)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");<br>> ++<br>> ++    r = sd_bus_message_append(resp, "x", 0);<br>> ++    if (r < 0)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");<br>> ++<br>> ++    r = sd_bus_send(mgr->bus, resp, NULL);<br>> ++    if (r < 0)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error sending reply messgage");<br>> ++<br>> ++    return sd_bus_reply_method_return(m, "s", "Deleted IP address...");<br>> ++}<br>> ++<br>> ++static int method_get_address (sd_bus_message *m, void* userdata, sd_bus_error *error)<br>> ++{<br>> ++    _cleanup_netlink_unref_ sd_netlink  *rtnl   = NULL;<br>> ++    _cleanup_address_free_ Address      *addr   = NULL;<br>> ++    _cleanup_route_free_ Route          *rt     = NULL;<br>> ++    Manager                             *mgr    = userdata;<br>> ++#if 0 /* fixme: */<br>> ++    Link*               link               = NULL;<br>> ++#endif<br>> ++    struct udev*        udev               = NULL;<br>> ++    struct udev_device* udev_eth           = NULL;<br>> ++<br>> ++    const char*         device             = NULL;<br>> ++#if 0 /* fixme: */<br>> ++    const char*         ipaddr             = NULL;<br>> ++    const char*         netmask            = NULL;<br>> ++    const char*         gateway            = NULL;<br>> ++#endif<br>> ++    char                devpath [32]       = "/sys/class/net/"; <br>> ++<br>> ++#if 0 /* fixme: */<br>> ++    unsigned char       family;<br>> ++    unsigned char       prefixlen;<br>> ++    unsigned char       flags;<br>> ++    unsigned char       scope;<br>> ++#endif<br>> ++    unsigned char       ifindex;<br>> ++<br>> ++#if 0 /* fixme: */<br>> ++    struct in_addr      nm;<br>> ++    struct in_addr      ip;<br>> ++    struct in_addr      gw;<br>> ++#endif<br>> ++    int                 r;<br>> ++<br>> ++    sd_netlink_message* maddr;<br>> ++<br>> ++    _cleanup_netlink_message_unref_ sd_netlink_message  *req    = NULL;<br>> ++    _cleanup_netlink_message_unref_ sd_netlink_message  *reply    = NULL;<br>> ++    _cleanup_bus_message_unref_ sd_bus_message  *resp   = NULL;<br>> ++    _cleanup_address_free_ Address              *address = NULL;<br>> ++    _cleanup_free_ struct local_address         *local   = NULL;<br>> ++    _cleanup_free_ char                         *ipr     = NULL;<br>> ++    _cleanup_free_ char                         *gwr     = NULL;<br>> ++    int                 n;<br>> ++    int                 i;<br>> ++<br>> ++    assert(m);<br>> ++    assert(mgr);<br>> ++<br>> ++    r = sd_bus_message_read (m, "s", &device);<br>> ++    if (r < 0)<br>> ++        return r;<br>> ++<br>> ++    if (isempty (device))<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Device Name.");<br>> ++<br>> ++    udev = udev_new();<br>> ++    udev_eth = udev_device_new_from_syspath(udev, strcat (devpath, device));<br>> ++    if (!udev_eth)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not find udev device");<br>> ++<br>> ++    ifindex = udev_device_get_ifindex(udev_eth);<br>> ++<br>> ++    r = sd_netlink_open(&rtnl);<br>> ++    if (r < 0)<br>> ++            return log_error_errno(r, "Failed to connect to netlink:"); /* fixme */<br>> ++<br>> ++    r = sd_rtnl_message_new_addr(rtnl, &req, RTM_GETADDR, 0, 0);
<br>> ++    if (r < 0)<br>> ++            return r;<br>> ++<br>> ++    r = sd_netlink_message_request_dump(req, true);<br>> ++    if (r < 0)<br>> ++            return r;<br>> ++<br>> ++    r = sd_netlink_call(rtnl, req, 0, &reply); /* fixme */<br>> ++    if (r < 0)<br>> ++            return r;<br>> ++<br>> ++    r = sd_bus_message_new_method_return(m, &resp);<br>> ++    if (r < 0)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error allocating reply messgage");<br>> ++<br>> ++    r = sd_bus_message_open_container(resp, 'a', "iyyus"); /*family,prefixlen,scope,flags,addr*/<br>> ++    if (r < 0)<br>> ++        return sd_bus_error_setf(error, SD_BUS_ERROR_NO_MEMORY, "Error opening a container for reply message");<br>> ++<br>> ++    for (maddr = reply; maddr; maddr = sd_netlink_message_next(maddr)) {<br>> ++            int k;<br>> ++<br>> ++            r = address_new_dynamic(&address);<br>> ++            if (r < 0)<br>> ++                    return r;<br>> ++<br>> ++            k = network_rtnl_process_address(rtnl, maddr, mgr, address);<br>> ++            if (k) {<br>> ++                r = sd_bus_message_append(resp, "i", address->family);<br>> ++                if (r < 0)<br>> ++                        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");<br>> ++<br>> ++                r = sd_bus_message_append(resp, "y", address->prefixlen);<br>> ++                if (r < 0)<br>> ++                        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");<br>> ++<br>> ++                r = sd_bus_message_append(resp, "y", address->scope);<br>> ++                if (r < 0)<br>> ++                        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");<br>> ++<br>> ++                r = sd_bus_message_append(resp, "u", address->flags);<br>> ++                if (r < 0)<br>> ++                        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");<br>> ++<br>> ++                r = in_addr_to_string(address->family, &address->in_addr, &ipr); /* fixme */<br>> ++                if (r < 0)<br>> ++                        return r;</tt><br><tt>> ++<br>> ++                r = sd_bus_message_append(resp, "s", ipr);<br>> ++                if (r < 0)<br>> ++                        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");<br>> ++            }<br>> ++    }<br>> ++<br>> ++    r = sd_bus_message_close_container(resp);<br>> ++    if (r < 0)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error closing reply container");<br>> ++<br>> ++    n = local_gateways(rtnl, ifindex, AF_UNSPEC, &local);<br>> ++    if (n < 0)<br>> ++            return n;<br>> ++<br>> ++    for (i = 0; i < n; i++) {<br>> ++<br>> ++            r = in_addr_to_string(local[i].family, &local[i].address, &gwr);<br>> ++            if (r < 0)<br>> ++                    return r;<br>> ++    }<br>> ++<br>> ++    r = sd_bus_message_append(resp, "s", gwr);<br>> ++    if (r < 0)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error appending to reply messgage");<br>> ++<br>> ++    r = sd_bus_send(mgr->bus, resp, NULL);<br>> ++    if (r < 0)<br>> ++            return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Error sending reply messgage");<br>> ++<br>> ++    return sd_bus_reply_method_return(m, "s", "Getting IP configuration...");<br>> ++}<br>> ++<br>> ++<br>> ++int network_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message, void *userdata, Address* address) {<br>> ++        Manager*        m       = (Manager*) userdata; /* fixme */<br>> ++#if 0 /* fixme */<br>> ++        Link*           link    = NULL;<br>> ++#endif<br>> ++        uint16_t        type;<br>> ++        unsigned char   flags;<br>> ++#if 0 /* fixme */<br>> ++        Address*        existing;<br>> ++#endif<br>> ++        char            buf[INET6_ADDRSTRLEN]; <br>> ++#if 0 /* fixme */<br>> ++        char            valid_buf[FORMAT_TIMESPAN_MAX];<br>> ++        const char*     valid_str = NULL;<br>> ++#endif<br>> ++        int             ifindex;<br>> ++        int             r; <br>> ++        /*_cleanup_address_free_ Address *address = NULL;*/<br>> ++        sd_bus_error err    = SD_BUS_ERROR_NULL; /* fixme */<br>> ++        sd_bus_error* error = &err;             /* fixme */<br>> ++<br>> ++        assert(rtnl);<br>> ++        assert(message);<br>> ++        assert(m);<br>> ++        assert(address);<br>> ++<br>> ++        if (sd_netlink_message_is_error(message)) {<br>> ++                r = sd_netlink_message_get_errno(message);<br>> ++                if (r < 0)<br>> ++                        sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: failed to receive address: ");<br>> ++<br>> ++                return 0;<br>> ++        }<br>> ++<br>> ++        r = sd_netlink_message_get_type(message, &type);<br>> ++        if (r < 0) {<br>> ++                sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: could not get message type: ");<br>> ++                return 0;<br>> ++        } else if (type != RTM_NEWADDR && type != RTM_DELADDR) {<br>> ++                sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received unexpected message type when processing address");<br>> ++                return 0;<br>> ++        }<br>> ++<br>> ++        r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);<br>> ++        if (r < 0) {<br>> ++                sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: could not get ifindex from address: %m");<br>> ++                return 0;<br>> ++        } else if (ifindex <= 0) {<br>> ++                sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address message with invalid ifindex: %d", ifindex);<br>> ++                return 0;<br>> ++        } <br>> ++<br>> ++        r = sd_rtnl_message_addr_get_family(message, &address->family); /* int : i*/<br>> ++        if (r < 0 || !IN_SET(address->family, AF_INET, AF_INET6)) {<br>> ++                sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid family, ignoring.");<br>> ++                return 0;<br>> ++        }<br>> ++<br>> ++        r = sd_rtnl_message_addr_get_prefixlen(message, &address->prefixlen); /* uchar : byte : y */<br>> ++        if (r < 0) {<br>> ++                sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid prefixlen, ignoring: ");<br>> ++                return 0;<br>> ++        }<br>> ++<br>> ++        r = sd_rtnl_message_addr_get_scope(message, &address->scope); /* uchar : byte : y*/<br>> ++        if (r < 0) {<br>> ++                sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid scope, ignoring: ");<br>> ++                return 0;<br>> ++        }<br>> ++<br>> ++        r = sd_rtnl_message_addr_get_flags(message, &flags); /* uint32 : u*/<br>> ++        if (r < 0) {<br>> ++                sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address with invalid flags, ignoring: ");<br>> ++                return 0;<br>> ++        }<br>> ++        address->flags = flags;<br>> ++<br>> ++        switch (address->family) {<br>> ++        case AF_INET:<br>> ++                r = sd_netlink_message_read_in_addr(message, IFA_LOCAL, &address->in_addr.in); /* ulong : uint64 : t */<br>> ++                if (r < 0) {<br>> ++                        sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address without valid address, ignoring: ");<br>> ++                        return 0;<br>> ++                }<br>> ++<br>> ++                break;<br>> ++<br>> ++        case AF_INET6:<br>> ++                r = sd_netlink_message_read_in6_addr(message, IFA_ADDRESS, &address->in_addr.in6); /* ulong : uint64 : t */<br>> ++                if (r < 0) {<br>> ++                        sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "rtnl: received address without valid address, ignoring: ");<br>> ++                        return 0;<br>> ++                }<br>> ++<br>> ++                break;<br>> ++<br>> ++        default:<br>> ++                assert_not_reached("invalid address family");<br>> ++        }<br>> ++<br>> ++        if (!inet_ntop(address->family, &address->in_addr, buf, INET6_ADDRSTRLEN)) { /* string : s */<br>> ++                sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Could not print address");<br>> ++                return 0;<br>> ++        }<br>> ++<br>> ++        return 1;<br>> ++}<br>> ++#endif<br>> +diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c<br>> +index 6587ea9..2616c5b 100644<br>> +--- a/src/network/networkd-network.c<br>> ++++ b/src/network/networkd-network.c<br>> +@@ -32,6 +32,14 @@<br>> + #include "network-internal.h"<br>> + #include "dns-domain.h"<br>> + <br>> ++#define SYSTEMD_NETWORKD_DBUS 1<br>> ++<br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++int network_address_added_handler (sd_netlink* rtnl, sd_netlink_message* m, void* userdata);<br>> ++int network_set_gateway (Link* link);<br>> ++static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);<br>> ++#endif<br>> ++<br>> + static int network_load_one(Manager *manager, const char *filename) {<br>> +         _cleanup_network_free_ Network *network = NULL;<br>> +         _cleanup_fclose_ FILE *file = NULL;<br>> +@@ -850,3 +858,76 @@ int config_parse_hostname(const char *unit,<br>> + <br>> +         return 0;<br>> + }<br>> ++<br>> ++#ifdef SYSTEMD_NETWORKD_DBUS<br>> ++int network_address_added_handler (sd_netlink* rtnl, sd_netlink_message* m, void* userdata)<br>> ++{<br>> ++        _cleanup_link_unref_ Link *link = userdata;<br>> ++        int r;<br>> ++<br>> ++        assert(link);<br>> ++<br>> ++        r = sd_netlink_message_get_errno(m);<br>> ++        if (r < 0 && r != -EEXIST) {<br>> ++                log_debug("Error in set IP address!");<br>> ++                link_enter_failed(link);<br>> ++        } else if (r >= 0)<br>> ++                link_rtnl_process_address(rtnl, m, link->manager);<br>> ++<br>> ++                 network_set_gateway (link);<br>> ++<br>> ++                 return 1;<br>> ++}<br>> ++<br>> ++/* link_enter_set_routes */<br>> ++int network_set_gateway (Link* link)<br>> ++{<br>> ++        Route *rt;<br>> ++        int r;<br>> ++<br>> ++        assert(link);<br>> ++        assert(link->network);<br>> ++        assert(link->state == LINK_STATE_SETTING_ADDRESSES);<br>> ++<br>> ++        link->state = LINK_STATE_SETTING_ROUTES;<br>> ++<br>> ++        LIST_FOREACH(routes, rt, link->network->static_routes) {<br>> ++                r = route_configure(rt, link, &route_handler);<br>> ++                if (r < 0) {<br>> ++                        log_debug ("Could not set Gateway!");<br>> ++                        link_enter_failed(link);<br>> ++                        return r;<br>> ++                }<br>> ++<br>> ++                link->link_messages ++;<br>> ++        }<br>> ++<br>> ++        if (link->link_messages == 0) {<br>> ++                link->static_configured = true;<br>> ++<br>> ++                /*link_enter_configured (link);*/<br>> ++                log_link_info(link, "Configured");<br>> ++                link->state = LINK_STATE_CONFIGURED;<br>> ++                link_save(link);<br>> ++        } else<br>> ++                log_debug("Setting Gateway");<br>> ++<br>> ++        return 0;<br>> ++}<br>> ++<br>> ++static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {<br>> ++        _cleanup_link_unref_ Link *link = userdata;<br>> ++        int r;<br>> ++<br>> ++        assert(link);<br>> ++<br>> ++        r = sd_netlink_message_get_errno(m);<br>> ++        if (r < 0 && r != -EEXIST) {<br>> ++                log_debug ("Could not set route! ");<br>> ++                link_enter_failed(link);<br>> ++        }<br>> ++<br>> ++        return 1;<br>> ++}<br>> ++<br>> ++#endif<br>> +diff --git a/src/network/org.freedesktop.network1.conf b/src/network/org.freedesktop.network1.conf<br>> +index 52dad33..f424b88 100644<br>> +--- a/src/network/org.freedesktop.network1.conf<br>> ++++ b/src/network/org.freedesktop.network1.conf<br>> +@@ -36,6 +36,23 @@<br>> +                        send_interface="org.freedesktop.DBus.Properties"<br>> +                        send_member="GetAll"/><br>> + <br>> ++                <allow send_destination="org.freedesktop.network1"<br>> ++                       send_interface="org.freedesktop.network1.Network"<br>> ++                       send_member="AddAddress"/><br>> ++<br>> ++                <allow send_destination="org.freedesktop.network1"<br>> ++                       send_interface="org.freedesktop.network1.Network"<br>> ++                       send_member="DelAddress"/><br>> ++<br>> ++                <allow send_destination="org.freedesktop.network1"<br>> ++                       send_interface="org.freedesktop.network1.Network"<br>> ++                       send_member="GetAddress"/><br>> ++<br>> ++                <allow send_destination="org.freedesktop.network1"<br>> ++                       send_interface="org.freedesktop.network1.Link"<br>> ++                       send_member="GetAddress"/><br>> ++<br>> ++<br>> +                 <allow receive_sender="org.freedesktop.network1"/><br>> +         </policy><br>> + <br>> +-- <br>> +1.8.2.2<br>> +<br>> diff --git a/yocto-poky/meta/recipes-core/systemd/systemd_225.bb b/yocto-poky/meta/recipes-core/systemd/systemd_225.bb<br>> index f7d4c7d..e3d55ec 100644<br>> --- a/yocto-poky/meta/recipes-core/systemd/systemd_225.bb<br>> +++ b/yocto-poky/meta/recipes-core/systemd/systemd_225.bb<br>> @@ -41,6 +41,7 @@ SRC_URI = "git://github.com/systemd/systemd.git;protocol=git \<br>>             </tt><tt><a href="file://0012-implment-systemd-sysv-install-for-OE.patch">file://0012-implment-systemd-sysv-install-for-OE.patch</a></tt><tt> \<br>>             </tt><tt><a href="file://0014-Revert-rules-remove-firmware-loading-rules.patch">file://0014-Revert-rules-remove-firmware-loading-rules.patch</a></tt><tt> \<br>>             </tt><tt><a href="file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch">file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch</a></tt><tt> \<br>> +           </tt><tt><a href="file://0100-systemd_networkd_dbus_setaddress.patch">file://0100-systemd_networkd_dbus_setaddress.patch</a></tt><tt> \<br>>             </tt><tt><a href="file://touchscreen.rules">file://touchscreen.rules</a></tt><tt> \<br>>             </tt><tt><a href="file://00-create-volatile.conf">file://00-create-volatile.conf</a></tt><tt> \<br>>             </tt><tt>file://init</tt><tt> \<br><br>_______________________________________________<br>openbmc mailing list<br>openbmc@lists.ozlabs.org<br></tt><tt><a href="https://lists.ozlabs.org/listinfo/openbmc">https://lists.ozlabs.org/listinfo/openbmc</a></tt><tt><br></tt><br><BR>
</body></html>