chiark / gitweb /
sd-icmp6-nd: Add function to stop ongoing ICMPv6 discovery
authorPatrik Flykt <patrik.flykt@linux.intel.com>
Wed, 25 Jun 2014 09:33:48 +0000 (12:33 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Thu, 26 Jun 2014 13:09:40 +0000 (16:09 +0300)
In some use cases stopping an ongoing ICMPv6 discovery is more
useful than always unreferencing the whole structure.

src/libsystemd-network/sd-icmp6-nd.c
src/libsystemd-network/test-icmp6-rs.c
src/systemd/sd-icmp6-nd.h

index 10c5e5e..80915c3 100644 (file)
@@ -282,6 +282,19 @@ static int icmp6_router_solicitation_timeout(sd_event_source *s, uint64_t usec,
         return 0;
 }
 
         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;
 
 int sd_icmp6_router_solicitation_start(sd_icmp6_nd *nd) {
         int r;
 
index cd5c476..b81211f 100644 (file)
@@ -127,6 +127,10 @@ static void test_rs(sd_event *e) {
                                  time_now + 2 *USEC_PER_SEC, 0,
                                  test_rs_hangcheck, NULL) >= 0);
 
                                  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);
         assert(sd_icmp6_router_solicitation_start(nd) >= 0);
 
         sd_event_loop(e);
index 5e9dc0a..73f91aa 100644 (file)
@@ -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);
 
 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
 int sd_icmp6_router_solicitation_start(sd_icmp6_nd *nd);
 
 #endif