summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/loopback-setup.c6
-rw-r--r--src/libsystemd-rtnl/rtnl-message.c24
-rw-r--r--src/libsystemd-rtnl/rtnl-util.c4
-rw-r--r--src/libsystemd-rtnl/test-rtnl.c16
-rw-r--r--src/network/networkd-bridge.c4
-rw-r--r--src/network/networkd-link.c10
-rw-r--r--src/systemd/sd-rtnl.h5
7 files changed, 49 insertions, 20 deletions
diff --git a/src/core/loopback-setup.c b/src/core/loopback-setup.c
index 5172a6984b..7bb20ecabe 100644
--- a/src/core/loopback-setup.c
+++ b/src/core/loopback-setup.c
@@ -89,7 +89,11 @@ static int start_interface(sd_rtnl *rtnl, int if_loopback, uint32_t ipv4_address
_cleanup_sd_rtnl_message_unref_ sd_rtnl_message *req = NULL;
int r;
- r = sd_rtnl_message_link_new(RTM_NEWLINK, if_loopback, 0, IFF_UP, &req);
+ r = sd_rtnl_message_link_new(RTM_NEWLINK, if_loopback, &req);
+ if (r < 0)
+ return r;
+
+ r = sd_rtnl_message_link_set_flags(req, IFF_UP);
if (r < 0)
return r;
diff --git a/src/libsystemd-rtnl/rtnl-message.c b/src/libsystemd-rtnl/rtnl-message.c
index 870fdcdf2e..8a3aa63baf 100644
--- a/src/libsystemd-rtnl/rtnl-message.c
+++ b/src/libsystemd-rtnl/rtnl-message.c
@@ -160,7 +160,27 @@ int sd_rtnl_message_route_new(uint16_t nlmsg_type, unsigned char rtm_family,
return 0;
}
-int sd_rtnl_message_link_new(uint16_t nlmsg_type, int index, unsigned type, unsigned flags, sd_rtnl_message **ret) {
+int sd_rtnl_message_link_set_flags(sd_rtnl_message *m, unsigned flags) {
+ struct ifinfomsg *ifi;
+
+ ifi = NLMSG_DATA(m->hdr);
+
+ ifi->ifi_flags = flags;
+
+ return 0;
+}
+
+int sd_rtnl_message_link_set_type(sd_rtnl_message *m, unsigned type) {
+ struct ifinfomsg *ifi;
+
+ ifi = NLMSG_DATA(m->hdr);
+
+ ifi->ifi_type = type;
+
+ return 0;
+}
+
+int sd_rtnl_message_link_new(uint16_t nlmsg_type, int index, sd_rtnl_message **ret) {
struct ifinfomsg *ifi;
int r;
@@ -181,8 +201,6 @@ int sd_rtnl_message_link_new(uint16_t nlmsg_type, int index, unsigned type, unsi
ifi->ifi_family = AF_UNSPEC;
ifi->ifi_index = index;
- ifi->ifi_type = type;
- ifi->ifi_flags = flags;
ifi->ifi_change = 0xffffffff;
return 0;
diff --git a/src/libsystemd-rtnl/rtnl-util.c b/src/libsystemd-rtnl/rtnl-util.c
index 4e7661bb77..264b72ec37 100644
--- a/src/libsystemd-rtnl/rtnl-util.c
+++ b/src/libsystemd-rtnl/rtnl-util.c
@@ -34,7 +34,7 @@ int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex, const char *name) {
assert(ifindex > 0);
assert(name);
- r = sd_rtnl_message_link_new(RTM_SETLINK, ifindex, 0, 0, &message);
+ r = sd_rtnl_message_link_new(RTM_SETLINK, ifindex, &message);
if (r < 0)
return r;
@@ -61,7 +61,7 @@ int rtnl_set_link_properties(sd_rtnl *rtnl, int ifindex, const char *alias,
if (!alias && !mac && mtu == 0)
return 0;
- r = sd_rtnl_message_link_new(RTM_SETLINK, ifindex, 0, 0, &message);
+ r = sd_rtnl_message_link_new(RTM_SETLINK, ifindex, &message);
if (r < 0)
return r;
diff --git a/src/libsystemd-rtnl/test-rtnl.c b/src/libsystemd-rtnl/test-rtnl.c
index 6c34a8537f..409a0fa7b2 100644
--- a/src/libsystemd-rtnl/test-rtnl.c
+++ b/src/libsystemd-rtnl/test-rtnl.c
@@ -37,7 +37,7 @@ static void test_link_configure(sd_rtnl *rtnl, int ifindex) {
void *data;
/* we'd really like to test NEWLINK, but let's not mess with the running kernel */
- assert(sd_rtnl_message_link_new(RTM_GETLINK, ifindex, 0, 0, &message) >= 0);
+ assert(sd_rtnl_message_link_new(RTM_GETLINK, ifindex, &message) >= 0);
assert(sd_rtnl_message_append(message, IFLA_IFNAME, name) >= 0);
assert(sd_rtnl_message_append(message, IFLA_ADDRESS, ether_aton(mac)) >= 0);
assert(sd_rtnl_message_append(message, IFLA_MTU, &mtu) >= 0);
@@ -142,7 +142,7 @@ static void test_event_loop(int ifindex) {
assert(ifname);
assert(sd_rtnl_open(0, &rtnl) >= 0);
- assert(sd_rtnl_message_link_new(RTM_GETLINK, ifindex, 0, 0, &m) >= 0);
+ assert(sd_rtnl_message_link_new(RTM_GETLINK, ifindex, &m) >= 0);
assert(sd_rtnl_call_async(rtnl, m, &link_handler, ifname, 0, NULL) >= 0);
@@ -176,7 +176,7 @@ static void test_async(int ifindex) {
assert(sd_rtnl_open(0, &rtnl) >= 0);
- assert(sd_rtnl_message_link_new(RTM_GETLINK, ifindex, 0, 0, &m) >= 0);
+ assert(sd_rtnl_message_link_new(RTM_GETLINK, ifindex, &m) >= 0);
assert(sd_rtnl_call_async(rtnl, m, &link_handler, ifname, 0, &serial) >= 0);
@@ -191,8 +191,8 @@ static void test_pipe(int ifindex) {
assert(sd_rtnl_open(0, &rtnl) >= 0);
- assert(sd_rtnl_message_link_new(RTM_GETLINK, ifindex, 0, 0, &m1) >= 0);
- assert(sd_rtnl_message_link_new(RTM_GETLINK, ifindex, 0, 0, &m2) >= 0);
+ assert(sd_rtnl_message_link_new(RTM_GETLINK, ifindex, &m1) >= 0);
+ assert(sd_rtnl_message_link_new(RTM_GETLINK, ifindex, &m2) >= 0);
counter ++;
assert(sd_rtnl_call_async(rtnl, m1, &pipe_handler, &counter, 0, NULL) >= 0);
@@ -211,7 +211,7 @@ static void test_container(void) {
uint16_t type;
void *data;
- assert(sd_rtnl_message_link_new(RTM_NEWLINK, 0, 0, 0, &m) >= 0);
+ assert(sd_rtnl_message_link_new(RTM_NEWLINK, 0, &m) >= 0);
assert(sd_rtnl_message_open_container(m, IFLA_LINKINFO) >= 0);
assert(sd_rtnl_message_open_container(m, IFLA_LINKINFO) == -EINVAL);
@@ -275,7 +275,7 @@ int main(void) {
test_link_configure(rtnl, if_loopback);
- assert(sd_rtnl_message_link_new(RTM_GETLINK, if_loopback, 0, 0, &m) >= 0);
+ assert(sd_rtnl_message_link_new(RTM_GETLINK, if_loopback, &m) >= 0);
assert(m);
assert(sd_rtnl_message_get_type(m, &type) >= 0);
@@ -294,7 +294,7 @@ int main(void) {
assert((m = sd_rtnl_message_unref(m)) == NULL);
assert((r = sd_rtnl_message_unref(r)) == NULL);
- assert(sd_rtnl_message_link_new(RTM_GETLINK, if_loopback, 0, 0, &m) >= 0);
+ assert(sd_rtnl_message_link_new(RTM_GETLINK, if_loopback, &m) >= 0);
assert(m);
assert(sd_rtnl_message_append(m, IFLA_MTU, &mtu) >= 0);
diff --git a/src/network/networkd-bridge.c b/src/network/networkd-bridge.c
index 1704f65ee6..b764b7d593 100644
--- a/src/network/networkd-bridge.c
+++ b/src/network/networkd-bridge.c
@@ -84,7 +84,7 @@ static int bridge_join_ready(Bridge *bridge, Link* link, sd_rtnl_message_handler
assert(link);
assert(callback);
- r = sd_rtnl_message_link_new(RTM_SETLINK, link->ifindex, 0, 0, &req);
+ r = sd_rtnl_message_link_new(RTM_SETLINK, link->ifindex, &req);
if (r < 0) {
log_error("Could not allocate RTM_SETLINK message: %s",
strerror(-r));
@@ -155,7 +155,7 @@ static int bridge_create(Bridge *bridge) {
assert(bridge->manager);
assert(bridge->manager->rtnl);
- r = sd_rtnl_message_link_new(RTM_NEWLINK, 0, 0, 0, &req);
+ r = sd_rtnl_message_link_new(RTM_NEWLINK, 0, &req);
if (r < 0) {
log_error("Could not allocate RTM_NEWLINK message: %s",
strerror(-r));
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 8c7b0fc1ee..16255f9227 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -264,7 +264,7 @@ static int link_get(Link *link) {
assert(link->manager);
assert(link->manager->rtnl);
- r = sd_rtnl_message_link_new(RTM_GETLINK, link->ifindex, 0, 0, &req);
+ r = sd_rtnl_message_link_new(RTM_GETLINK, link->ifindex, &req);
if (r < 0) {
log_error("Could not allocate RTM_GETLINK message");
return r;
@@ -301,12 +301,18 @@ static int link_up(Link *link) {
assert(link->manager);
assert(link->manager->rtnl);
- r = sd_rtnl_message_link_new(RTM_NEWLINK, link->ifindex, 0, IFF_UP, &req);
+ r = sd_rtnl_message_link_new(RTM_NEWLINK, link->ifindex, &req);
if (r < 0) {
log_error("Could not allocate RTM_NEWLINK message");
return r;
}
+ r = sd_rtnl_message_link_set_flags(req, IFF_UP);
+ if (r < 0) {
+ log_error("Could not set link flags");
+ return r;
+ }
+
r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL);
if (r < 0) {
log_error("Could not send rtnetlink message: %s", strerror(-r));
diff --git a/src/systemd/sd-rtnl.h b/src/systemd/sd-rtnl.h
index 0a63b28a19..066d778ce1 100644
--- a/src/systemd/sd-rtnl.h
+++ b/src/systemd/sd-rtnl.h
@@ -64,8 +64,7 @@ int sd_rtnl_attach_event(sd_rtnl *nl, sd_event *e, int priority);
int sd_rtnl_detach_event(sd_rtnl *nl);
/* messages */
-int sd_rtnl_message_link_new(uint16_t msg_type, int index, unsigned int type,
- unsigned int flags, sd_rtnl_message **ret);
+int sd_rtnl_message_link_new(uint16_t msg_type, int index, sd_rtnl_message **ret);
int sd_rtnl_message_addr_new(uint16_t msg_type, int index, unsigned char family,
unsigned char prefixlen, unsigned char flags,
unsigned char scope, sd_rtnl_message **ret);
@@ -80,6 +79,8 @@ sd_rtnl_message *sd_rtnl_message_unref(sd_rtnl_message *m);
int sd_rtnl_message_get_errno(sd_rtnl_message *m);
int sd_rtnl_message_get_type(sd_rtnl_message *m, uint16_t *type);
+int sd_rtnl_message_link_set_flags(sd_rtnl_message *m, unsigned flags);
+int sd_rtnl_message_link_set_type(sd_rtnl_message *m, unsigned type);
int sd_rtnl_message_link_get_ifindex(sd_rtnl_message *m, int *ifindex);
int sd_rtnl_message_link_get_flags(sd_rtnl_message *m, unsigned *flags);