summaryrefslogtreecommitdiff
path: root/src/libsystemd-network
diff options
context:
space:
mode:
authorPatrik Flykt <patrik.flykt@linux.intel.com>2014-06-25 12:33:48 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2014-06-26 16:09:40 +0300
commit836cf0905c4a8fe3358d6b0e005192d5ee51d3e2 (patch)
treea8fea7a6611f89ce1c3e9c9b6c3447a31a021a04 /src/libsystemd-network
parent3f0c075f8ef3344da5a6bda524540201f9204e61 (diff)
downloadsystemd-836cf0905c4a8fe3358d6b0e005192d5ee51d3e2.tar.gz
sd-icmp6-nd: Add function to stop ongoing ICMPv6 discovery
In some use cases stopping an ongoing ICMPv6 discovery is more useful than always unreferencing the whole structure.
Diffstat (limited to 'src/libsystemd-network')
-rw-r--r--src/libsystemd-network/sd-icmp6-nd.c13
-rw-r--r--src/libsystemd-network/test-icmp6-rs.c4
2 files changed, 17 insertions, 0 deletions
diff --git a/src/libsystemd-network/sd-icmp6-nd.c b/src/libsystemd-network/sd-icmp6-nd.c
index 10c5e5e87e..80915c34d6 100644
--- a/src/libsystemd-network/sd-icmp6-nd.c
+++ b/src/libsystemd-network/sd-icmp6-nd.c
@@ -282,6 +282,19 @@ static int icmp6_router_solicitation_timeout(sd_event_source *s, uint64_t usec,
return 0;
}
+int sd_icmp6_nd_stop(sd_icmp6_nd *nd) {
+ assert_return(nd, -EINVAL);
+ assert_return(nd->event, -EINVAL);
+
+ log_icmp6_nd(client, "Stop ICMPv6");
+
+ icmp6_nd_init(nd);
+
+ nd->state = ICMP6_NEIGHBOR_DISCOVERY_IDLE;
+
+ return 0;
+}
+
int sd_icmp6_router_solicitation_start(sd_icmp6_nd *nd) {
int r;
diff --git a/src/libsystemd-network/test-icmp6-rs.c b/src/libsystemd-network/test-icmp6-rs.c
index cd5c4764e3..b81211f6bc 100644
--- a/src/libsystemd-network/test-icmp6-rs.c
+++ b/src/libsystemd-network/test-icmp6-rs.c
@@ -127,6 +127,10 @@ static void test_rs(sd_event *e) {
time_now + 2 *USEC_PER_SEC, 0,
test_rs_hangcheck, NULL) >= 0);
+ assert(sd_icmp6_nd_stop(nd) >= 0);
+ assert(sd_icmp6_router_solicitation_start(nd) >= 0);
+ assert(sd_icmp6_nd_stop(nd) >= 0);
+
assert(sd_icmp6_router_solicitation_start(nd) >= 0);
sd_event_loop(e);