]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd-radv: Helper function for Router Advertisement initialization
authorPatrik Flykt <patrik.flykt@linux.intel.com>
Fri, 12 May 2017 13:48:32 +0000 (16:48 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Mon, 15 May 2017 11:49:50 +0000 (14:49 +0300)
Add a helper function for configuring Router Advertisement on a
specific network link. Add the prefixes that are going to be advertised.

Makefile.am
src/network/networkd-link.h
src/network/networkd-radv.c [new file with mode: 0644]
src/network/networkd-radv.h [new file with mode: 0644]

index 29fa71df0dfe50188adf56949ce6e1b7b9d15414..ad79ccde76e2dffeeeac51e8f6ffc95a47566da0 100644 (file)
@@ -5860,6 +5860,8 @@ libnetworkd_core_la_SOURCES = \
        src/network/networkd-dhcp4.c \
        src/network/networkd-dhcp6.c \
        src/network/networkd-ndisc.h \
+       src/network/networkd-radv.c \
+       src/network/networkd-radv.h \
        src/network/networkd-ndisc.c \
        src/network/networkd-network.h \
        src/network/networkd-network.c \
index 4e53298cb49795ab08ba3f1b706632a1f89768a6..6479f4a2e54f9908b2864a1dc360e1c28d31c52a 100644 (file)
@@ -118,6 +118,8 @@ typedef struct Link {
         Set *ndisc_rdnss;
         Set *ndisc_dnssl;
 
+        sd_radv *radv;
+
         sd_dhcp6_client *dhcp6_client;
         bool rtnl_extended_attrs;
 
diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c
new file mode 100644 (file)
index 0000000..e5be145
--- /dev/null
@@ -0,0 +1,77 @@
+/***
+  This file is part of systemd.
+
+  Copyright (C) 2017 Intel Corporation. All rights reserved.
+
+  systemd is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  systemd is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include <netinet/icmp6.h>
+#include <arpa/inet.h>
+
+#include "networkd-address.h"
+#include "networkd-radv.h"
+#include "sd-radv.h"
+
+int radv_configure(Link *link) {
+        int r;
+        Prefix *p;
+
+        assert(link);
+        assert(link->network);
+
+        r = sd_radv_new(&link->radv);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_attach_event(link->radv, NULL, 0);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_set_mac(link->radv, &link->mac);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_set_ifindex(link->radv, link->ifindex);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_set_managed_information(link->radv, link->network->router_managed);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_set_other_information(link->radv, link->network->router_other_information);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_set_router_lifetime(link->radv,
+                                        link->network->router_lifetime_usec);
+        if (r < 0)
+                return r;
+
+        if (link->network->router_lifetime_usec > 0) {
+                r = sd_radv_set_preference(link->radv,
+                                           link->network->router_preference);
+                if (r < 0)
+                        return r;
+        }
+
+        LIST_FOREACH(prefixes, p, link->network->static_prefixes) {
+                r = sd_radv_add_prefix(link->radv, p->radv_prefix);
+                if (r != -EEXIST && r < 0)
+                        return r;
+        }
+
+        return 0;
+}
diff --git a/src/network/networkd-radv.h b/src/network/networkd-radv.h
new file mode 100644 (file)
index 0000000..a186b11
--- /dev/null
@@ -0,0 +1,24 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Intel Corporation. All rights reserved.
+
+  systemd is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  systemd is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "networkd-link.h"
+
+int radv_configure(Link *link);