@@ -11,6 +11,7 @@ namespace net {
11
11
12
12
ConnectivityStatus::ConnectivityStatus ()
13
13
: logger_(new dht::Logger)
14
+ , bye(nlmsg_alloc_simple(NLMSG_NOOP, NLM_F_ECHO), &nlmsg_free)
14
15
, nlsk(nlsk_init())
15
16
{
16
17
nlsk_setup (nlsk.get ());
@@ -20,7 +21,31 @@ ConnectivityStatus::ConnectivityStatus()
20
21
21
22
ConnectivityStatus::~ConnectivityStatus ()
22
23
{
23
- nlsk.reset ();
24
+ stop = true ;
25
+
26
+ nl_socket_modify_cb (nlsk.get (), NL_CB_VALID, NL_CB_CUSTOM, [](nl_msg* msg, void * data) -> int {
27
+ OPENDHT_UNUSED_ARG (msg);
28
+ if (((ConnectivityStatus*)data)->logger_ )
29
+ ((ConnectivityStatus*)data)->logger_ ->w (" stopping msg processing\n " );
30
+ return (((ConnectivityStatus*)data)->stop ) ? NL_OK : NL_STOP;
31
+ }, (void *)this );
32
+
33
+ nl_socket_modify_cb (nlsk.get (), NL_CB_MSG_IN, NL_CB_CUSTOM, [](nl_msg* msg, void * data) -> int {
34
+ OPENDHT_UNUSED_ARG (msg);
35
+ if (((ConnectivityStatus*)data)->logger_ )
36
+ ((ConnectivityStatus*)data)->logger_ ->w (" got incoming msg\n " );
37
+ return (((ConnectivityStatus*)data)->stop ) ? NL_OK : NL_STOP;
38
+ }, (void *)this );
39
+
40
+ nl_socket_modify_cb (nlsk.get (), NL_CB_ACK, NL_CB_CUSTOM, [](nl_msg* msg, void * data) -> int {
41
+ OPENDHT_UNUSED_ARG (msg);
42
+ if (((ConnectivityStatus*)data)->logger_ )
43
+ ((ConnectivityStatus*)data)->logger_ ->w (" taking care of ACK\n " );
44
+ return (((ConnectivityStatus*)data)->stop ) ? NL_OK : NL_STOP;
45
+ }, (void *)this );
46
+
47
+
48
+ nl_send_auto (nlsk.get (), bye.get ());
24
49
25
50
if (thrd_.joinable ())
26
51
thrd_.join ();
@@ -51,9 +76,9 @@ ConnectivityStatus::removeEventListener(Event event)
51
76
event_cbs.erase (event);
52
77
switch (event) {
53
78
case Event::NEWADDR:
54
- nl_socket_drop_memberships (nlsk.get (), RTNLGRP_IPV6_IFADDR, RTNLGRP_NONE);
55
- break ;
56
79
case Event::DELADDR:
80
+ case Event::ADDR:
81
+ nl_socket_drop_memberships (nlsk.get (), RTNLGRP_IPV6_IFADDR, RTNLGRP_NONE);
57
82
nl_socket_drop_memberships (nlsk.get (), RTNLGRP_IPV4_IFADDR, RTNLGRP_NONE);
58
83
break ;
59
84
default :
74
99
ConnectivityStatus::nlsk_setup (nl_sock* nlsk)
75
100
{
76
101
nl_socket_disable_seq_check (nlsk);
102
+ nl_socket_set_nonblocking (nlsk);
77
103
78
104
nl_socket_modify_cb (nlsk, NL_CB_VALID, NL_CB_CUSTOM, [](nl_msg* msg, void * data) -> int {
79
- return ((ConnectivityStatus*)data)->nl_event_cb (msg);
105
+ return ((ConnectivityStatus*)data)->nl_event_cb (msg);
80
106
}, (void *)this );
81
107
82
108
nl_connect (nlsk, NETLINK_ROUTE);
@@ -88,9 +114,8 @@ ConnectivityStatus::nlsk_init(void)
88
114
NlPtr ret (nl_socket_alloc (), &nl_socket_free);
89
115
if (not ret.get ())
90
116
throw std::runtime_error (" couldn't allocate netlink socket!\n " );
91
-
92
-
93
- return ret;
117
+ else
118
+ return ret;
94
119
}
95
120
96
121
void
@@ -140,9 +165,9 @@ ConnectivityStatus::nl_event_cb(struct nl_msg* msg)
140
165
void
141
166
ConnectivityStatus::nl_event_loop_thrd (nl_sock *nlsk)
142
167
{
143
- int status = NL_OK ;
144
- while ((status = nl_recvmsgs_default (nlsk)) >= 0 )
145
- logger_-> w ( " still looping! \n " ) ;
168
+ int status;
169
+ while (!stop && (status = nl_recvmsgs_report (nlsk, nl_socket_get_cb (nlsk))) > 0 )
170
+ ;
146
171
}
147
172
148
173
} /* namespace net */
0 commit comments