return 0;
fail:
- sd_radv_stop(ra);
+ sd_radv_stop(ra, true);
return 0;
}
-_public_ int sd_radv_stop(sd_radv *ra) {
+_public_ int sd_radv_stop(sd_radv *ra, bool zero_router_lifetime) {
int r;
assert_return(ra, -EINVAL);
log_radv("Stopping IPv6 Router Advertisement daemon");
- /* RFC 4861, Section 6.2.5, send at least one Router Advertisement
- with zero lifetime */
- r = radv_send(ra, NULL, 0);
- if (r < 0)
- log_radv_errno(r, "Unable to send last Router Advertisement with router lifetime set to zero: %m");
+ if (zero_router_lifetime) {
+ /* RFC 4861, Section 6.2.5, send at least one Router Advertisement
+ with zero lifetime */
+ r = radv_send(ra, NULL, 0);
+ if (r < 0)
+ log_radv_errno(r, "Unable to send last Router Advertisement with router lifetime set to zero: %m");
+ else
+ log_radv("Sent last Router Advertisement with router lifetime set to zero");
+ }
radv_reset(ra);
ra->fd = safe_close(ra->fd);
}
if (link->radv) {
- k = sd_radv_stop(link->radv);
+ k = sd_radv_stop(link->radv, true);
if (k < 0)
r = log_link_warning_errno(link, k, "Could not stop IPv6 Router Advertisement: %m");
}
#include <inttypes.h>
#include <net/ethernet.h>
#include <netinet/in.h>
+#include <stdbool.h>
#include <sys/types.h>
#include "_sd-common.h"
sd_event *sd_radv_get_event(sd_radv *ra);
int sd_radv_start(sd_radv *ra);
-int sd_radv_stop(sd_radv *ra);
+int sd_radv_stop(sd_radv *ra, bool zero_router_lifetime);
int sd_radv_set_ifindex(sd_radv *ra, int interface_index);
int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr);