From: Tom Gundersen Date: Fri, 6 Dec 2013 17:16:16 +0000 (+0100) Subject: rtnl: simplify link_new() X-Git-Tag: v209~904 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=fc25d7f8050f262fa6cafeb2a1032e6eb3e7b412 rtnl: simplify link_new() Drop most of the arguments and instead introduce link_set_{flags,type}. --- diff --git a/src/core/loopback-setup.c b/src/core/loopback-setup.c index 5172a6984..7bb20ecab 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 870fdcdf2..8a3aa63ba 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 4e7661bb7..264b72ec3 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 6c34a8537..409a0fa7b 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 1704f65ee..b764b7d59 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 8c7b0fc1e..16255f922 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 0a63b28a1..066d778ce 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);