summaryrefslogtreecommitdiff
path: root/src/network/networkd-link.c
diff options
context:
space:
mode:
authorSusant Sahani <ssahani@users.noreply.github.com>2016-09-14 21:45:16 +0530
committerMartin Pitt <martin.pitt@ubuntu.com>2016-09-14 18:15:16 +0200
commit92c918b06d970cd4ce2e7e529e6093ffc46a9cfa (patch)
treed5ab7b55f7f247cd14ec6a992bf5657e466f71d3 /src/network/networkd-link.c
parent2d88def9593b9809c71039bee67bea150ddd3598 (diff)
networkd: add support to configure virtual CAN device (#4139)
1. add support for kind vcan 2. fixup indention netlink-types.c, networkd-netdev.c
Diffstat (limited to 'src/network/networkd-link.c')
-rw-r--r--src/network/networkd-link.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index aab40a0eb1..1687d9bf31 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -1787,6 +1787,31 @@ static int link_down(Link *link) {
return 0;
}
+static int link_up_can(Link *link) {
+ _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+ int r;
+
+ assert(link);
+
+ log_link_debug(link, "Bringing CAN link up");
+
+ r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
+
+ r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not set link flags: %m");
+
+ r = sd_netlink_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
+
+ link_ref(link);
+
+ return 0;
+}
+
static int link_handle_bound_to_list(Link *link) {
Link *l;
Iterator i;
@@ -2431,6 +2456,19 @@ static int link_configure(Link *link) {
assert(link->network);
assert(link->state == LINK_STATE_PENDING);
+ if (streq_ptr(link->kind, "vcan")) {
+
+ if (!(link->flags & IFF_UP)) {
+ r = link_up_can(link);
+ if (r < 0) {
+ link_enter_failed(link);
+ return r;
+ }
+ }
+
+ return 0;
+ }
+
/* Drop foreign config, but ignore loopback or critical devices.
* We do not want to remove loopback address or addresses used for root NFS. */
if (!(link->flags & IFF_LOOPBACK) && !(link->network->dhcp_critical)) {