#include <netinet/in.h>
#include <linux/if.h>
#include <linux/if_arp.h>
-#include "sd-radv.h"
#include "sd-dhcp6-client.h"
#include "networkd-dhcp6.h"
#include "networkd-link.h"
#include "networkd-manager.h"
+#include "networkd-radv.h"
#include "siphash24.h"
#include "string-table.h"
#include "string-util.h"
uint8_t prefix_len,
uint32_t lifetime_preferred,
uint32_t lifetime_valid) {
- sd_radv *radv = link->radv;
int r;
- _cleanup_(sd_radv_prefix_unrefp) sd_radv_prefix *p = NULL;
- r = sd_radv_prefix_new(&p);
+ r = radv_add_prefix(link, prefix, prefix_len, lifetime_preferred, lifetime_valid);
if (r < 0)
return r;
- r = sd_radv_prefix_set_prefix(p, prefix, prefix_len);
- if (r < 0)
- return r;
-
- r = sd_radv_prefix_set_preferred_lifetime(p, lifetime_preferred);
- if (r < 0)
- return r;
-
- r = sd_radv_prefix_set_valid_lifetime(p, lifetime_valid);
- if (r < 0)
- return r;
-
- r = sd_radv_stop(radv);
- if (r < 0)
- return r;
-
- r = sd_radv_add_prefix(radv, p, true);
- if (r < 0 && r != -EEXIST)
- return r;
-
r = dhcp6_prefix_add(link->manager, prefix, link);
if (r < 0)
return r;
return r;
}
- return sd_radv_start(radv);
+ return 0;
}
static int dhcp6_route_remove_handler(sd_netlink *nl, sd_netlink_message *m, Link *link) {
return 0;
}
+int radv_add_prefix(Link *link, struct in6_addr *prefix, uint8_t prefix_len,
+ uint32_t lifetime_preferred, uint32_t lifetime_valid) {
+ _cleanup_(sd_radv_prefix_unrefp) sd_radv_prefix *p = NULL;
+ int r;
+
+ assert(link);
+ assert(link->radv);
+
+ r = sd_radv_prefix_new(&p);
+ if (r < 0)
+ return r;
+
+ r = sd_radv_prefix_set_prefix(p, prefix, prefix_len);
+ if (r < 0)
+ return r;
+
+ r = sd_radv_prefix_set_preferred_lifetime(p, lifetime_preferred);
+ if (r < 0)
+ return r;
+
+ r = sd_radv_prefix_set_valid_lifetime(p, lifetime_valid);
+ if (r < 0)
+ return r;
+
+ r = sd_radv_add_prefix(link->radv, p, true);
+ if (r < 0 && r != -EEXIST)
+ return r;
+
+ return 0;
+}
+
int config_parse_radv_dns(
const char *unit,
const char *filename,
int radv_emit_dns(Link *link);
int radv_configure(Link *link);
+int radv_add_prefix(Link *link, struct in6_addr *prefix, uint8_t prefix_len,
+ uint32_t lifetime_preferred, uint32_t lifetime_valid);
const char* radv_prefix_delegation_to_string(RADVPrefixDelegation i) _const_;
RADVPrefixDelegation radv_prefix_delegation_from_string(const char *s) _pure_;