diff options
-rw-r--r-- | src/libsystemd-network/sd-icmp6-nd.c | 13 | ||||
-rw-r--r-- | src/libsystemd-network/test-icmp6-rs.c | 4 | ||||
-rw-r--r-- | src/systemd/sd-icmp6-nd.h | 1 |
3 files changed, 18 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); diff --git a/src/systemd/sd-icmp6-nd.h b/src/systemd/sd-icmp6-nd.h index 5e9dc0aa26..73f91aad1b 100644 --- a/src/systemd/sd-icmp6-nd.h +++ b/src/systemd/sd-icmp6-nd.h @@ -51,6 +51,7 @@ sd_icmp6_nd *sd_icmp6_nd_ref(sd_icmp6_nd *nd); sd_icmp6_nd *sd_icmp6_nd_unref(sd_icmp6_nd *nd); int sd_icmp6_nd_new(sd_icmp6_nd **ret); +int sd_icmp6_nd_stop(sd_icmp6_nd *nd); int sd_icmp6_router_solicitation_start(sd_icmp6_nd *nd); #endif |