15
15
#include "imp.h"
16
16
#include "wire.h"
17
17
18
+ #define RFNM_TIMEOUT 10
19
+ #define RRP_TIMEOUT 20
20
+ #define ERP_TIMEOUT 20
21
+
18
22
#define IMP_REGULAR 0
19
23
#define IMP_LEADER_ERROR 1
20
24
#define IMP_DOWN 2
@@ -71,6 +75,7 @@ static int fd;
71
75
static struct sockaddr_un server ;
72
76
static struct sockaddr_un client ;
73
77
static socklen_t len ;
78
+ static unsigned long time_tick ;
74
79
75
80
typedef struct
76
81
{
@@ -87,8 +92,10 @@ struct
87
92
struct { int link , size ; uint32_t lsock , rsock ; } rcv , snd ;
88
93
void (* rrp_callback ) (int );
89
94
void (* rrp_timeout ) (int );
95
+ unsigned long rrp_time ;
90
96
void (* rfnm_callback ) (int );
91
97
void (* rfnm_timeout ) (int );
98
+ unsigned long rfnm_time ;
92
99
} connection [CONNECTIONS ];
93
100
94
101
struct
@@ -104,6 +111,7 @@ static struct
104
111
#define HOST_ALIVE 0001
105
112
106
113
client_t echo ;
114
+ unsigned long erp_time ;
107
115
int outstanding_rfnm ;
108
116
} hosts [256 ];
109
117
@@ -132,6 +140,7 @@ static void when_rrp (int i, void (*cb) (int), void (*to) (int))
132
140
{
133
141
connection [i ].rrp_callback = cb ;
134
142
connection [i ].rrp_timeout = to ;
143
+ connection [i ].rrp_time = time_tick + RRP_TIMEOUT ;
135
144
}
136
145
137
146
static void check_rrp (int host )
@@ -154,6 +163,7 @@ static void when_rfnm (int i, void (*cb) (int), void (*to) (int))
154
163
{
155
164
connection [i ].rfnm_callback = cb ;
156
165
connection [i ].rfnm_timeout = to ;
166
+ connection [i ].rfnm_time = time_tick + RFNM_TIMEOUT ;
157
167
}
158
168
159
169
static void check_rfnm (int host )
@@ -314,6 +324,8 @@ static int make_open (int host,
314
324
connection [i ].snd .lsock = snd_lsock ;
315
325
connection [i ].snd .rsock = snd_rsock ;
316
326
connection [i ].flags = 0 ;
327
+ connection [i ].rrp_time = time_tick - 1 ;
328
+ connection [i ].rfnm_time = time_tick - 1 ;
317
329
318
330
return i ;
319
331
}
@@ -1272,6 +1284,7 @@ static void app_echo (void)
1272
1284
1273
1285
memcpy (& hosts [host ].echo .addr , & client , len );
1274
1286
hosts [host ].echo .len = len ;
1287
+ hosts [host ].erp_time = time_tick + ERP_TIMEOUT ;
1275
1288
ncp_eco (host , app [2 ]);
1276
1289
}
1277
1290
@@ -1422,6 +1435,37 @@ static void application (void)
1422
1435
}
1423
1436
}
1424
1437
1438
+ static void tick (void )
1439
+ {
1440
+ void (* to ) (int );
1441
+ int i ;
1442
+ time_tick ++ ;
1443
+ for (i = 0 ; i < CONNECTIONS ; i ++ ) {
1444
+ to = connection [i ].rrp_timeout ;
1445
+ if (to != NULL && connection [i ].rrp_time == time_tick ) {
1446
+ connection [i ].rrp_callback = NULL ;
1447
+ connection [i ].rrp_timeout = NULL ;
1448
+ connection [i ].rrp_time = time_tick - 1 ;
1449
+ to (i );
1450
+ }
1451
+ to = connection [i ].rfnm_timeout ;
1452
+ if (to != NULL && connection [i ].rfnm_time == time_tick ) {
1453
+ connection [i ].rfnm_callback = NULL ;
1454
+ connection [i ].rfnm_timeout = NULL ;
1455
+ connection [i ].rrp_time = time_tick - 1 ;
1456
+ to (i );
1457
+ }
1458
+ }
1459
+ for (i = 0 ; i < 256 ; i ++ ) {
1460
+ if (hosts [i ].echo .len == 0 )
1461
+ continue ;
1462
+ if (hosts [i ].erp_time != time_tick )
1463
+ continue ;
1464
+ reply_echo (i , 0 , 0x20 );
1465
+ hosts [i ].echo .len = 0 ;
1466
+ }
1467
+ }
1468
+
1425
1469
static void cleanup (void )
1426
1470
{
1427
1471
unlink (server .sun_path );
@@ -1449,6 +1493,7 @@ void ncp_init (void)
1449
1493
signal (SIGQUIT , sigcleanup );
1450
1494
signal (SIGTERM , sigcleanup );
1451
1495
atexit (cleanup );
1496
+ time_tick = 0 ;
1452
1497
}
1453
1498
1454
1499
int main (int argc , char * * argv )
@@ -1461,13 +1506,20 @@ int main (int argc, char **argv)
1461
1506
for (;;) {
1462
1507
int n ;
1463
1508
fd_set rfds ;
1509
+ struct timeval tv ;
1464
1510
FD_ZERO (& rfds );
1465
1511
FD_SET (fd , & rfds );
1466
1512
imp_fd_set (& rfds );
1467
- n = select (33 , & rfds , NULL , NULL , NULL );
1513
+ tv .tv_sec = 1 ;
1514
+ tv .tv_usec = 0 ;
1515
+ n = select (33 , & rfds , NULL , NULL , & tv );
1468
1516
if (n == -1 )
1469
1517
fprintf (stderr , "NCP: select error.\n" );
1470
- else if (n > 0 ) {
1518
+ else if (n == 0 ) {
1519
+ tick ();
1520
+ tv .tv_sec = 1 ;
1521
+ tv .tv_usec = 0 ;
1522
+ } else {
1471
1523
if (imp_fd_isset (& rfds )) {
1472
1524
memset (packet , 0 , sizeof packet );
1473
1525
imp_receive_message (packet , & n );
0 commit comments