35
35
#include <sys/types.h>
36
36
#include <pthread.h>
37
37
#include <sched.h>
38
- #include <sys/un.h>
39
38
#include <errno.h>
40
39
41
40
#include "lispd.h"
48
47
#include "lispd_syslog.h"
49
48
#include "lispd_map_register.h"
50
49
#include "lispd_timers.h"
50
+ #include "lispd_ipc.h"
51
51
#include "tables.h"
52
52
#include "version.h"
53
53
@@ -86,6 +86,7 @@ void init(void) {
86
86
lispd_config .instance_id = 0 ;
87
87
lispd_config .use_instance_id = FALSE;
88
88
lispd_config .use_location = FALSE;
89
+ lispd_config .tun_mtu = 0 ;
89
90
}
90
91
91
92
void dump_fatal_error (void ) {
@@ -227,130 +228,6 @@ void die(int exitcode)
227
228
exit (exitcode );
228
229
}
229
230
230
- #define LISP_DCACHE_PATH_MAX 100
231
- #define LISP_DCACHE_FILE "/data/data/com.le.lispmon/lispd_dcache"
232
-
233
- int make_dsock_addr (const char * dsock_name , struct sockaddr_un * dsock_addr , socklen_t * dsock_len )
234
- {
235
- int namelen = strlen (dsock_name );
236
-
237
- if ( namelen >= ( (int )sizeof (dsock_addr -> sun_path ) - 1 ) ) {
238
- log_msg (ERROR , "namelen greater than allowed" );
239
- return -1 ;
240
- }
241
-
242
- strcpy (dsock_addr -> sun_path , dsock_name );
243
-
244
- dsock_addr -> sun_family = AF_LOCAL ;
245
- dsock_len = strlen (dsock_addr -> sun_path ) + sizeof (dsock_addr -> sun_family );
246
-
247
- return 0 ;
248
- }
249
-
250
- #define MAX_IPC_COMMAND_LEN 128
251
- void * handle_dcache_requests (void * arg )
252
- {
253
- struct sockaddr_un dsock_addr ;
254
- socklen_t dsock_len ;
255
- int dsock_fd , dclient_fd ;
256
- char * nonce , addr_buf [128 ], * msg = NULL , prefix_len [10 ], cmd [MAX_IPC_COMMAND_LEN ];
257
- int msize ;
258
-
259
- unlink (LISP_DCACHE_FILE );
260
-
261
- memset ((char * )& dsock_addr , 0 ,sizeof (struct sockaddr_un ));
262
-
263
- if ( make_dsock_addr (LISP_DCACHE_FILE , & dsock_addr , & dsock_len ) < 0 ) {
264
- log_msg (ERROR , "make_dsock failed" );
265
- return NULL ;
266
- }
267
-
268
- if ( (dsock_fd = socket (AF_UNIX , SOCK_STREAM , 0 ) ) < 0 ) {
269
- log_msg (ERROR , "socket creation failed %s" , strerror (errno ));
270
- return NULL ;
271
- }
272
-
273
- if ( ( bind (dsock_fd , (struct sockaddr * )& dsock_addr , sizeof (struct sockaddr_un )) ) != 0 ) {
274
- log_msg (ERROR , "bind call failed %s" , strerror (errno ));
275
- return NULL ;
276
- }
277
-
278
- if ( listen (dsock_fd , 1 ) != 0 ) {
279
- log_msg (ERROR , "listen failed %s" , strerror (errno ));
280
- return NULL ;
281
- }
282
-
283
- log_msg (INFO , "Listening on domain socket" );
284
-
285
- while (1 ) {
286
-
287
- if ( ( dclient_fd = accept (dsock_fd , (struct sockaddr * )& dsock_addr , & dsock_len ) ) == -1 ) {
288
- log_msg (ERROR , "accept call failed %s" , strerror (errno ));
289
- return NULL ;
290
- }
291
-
292
- if ( recv (dclient_fd , cmd , MAX_IPC_COMMAND_LEN , 0 ) < 0 ) {
293
- log_msg (INFO , "recv call failed, %s" , strerror (errno ));
294
- return NULL ;
295
- }
296
-
297
- log_msg (INFO , "Received command %s" , cmd );
298
-
299
- if ( strcmp (cmd , "DCACHE" ) == 0 ) {
300
-
301
- log_msg (INFO , "Got connection request for dcache." );
302
-
303
- datacache_elt_t * elt , * prev ;
304
-
305
- elt = datacache -> head ;
306
- while (elt ) {
307
- nonce = lisp_print_nonce (elt -> nonce );
308
- inet_ntop (elt -> eid_prefix .afi , & (elt -> eid_prefix .address ), addr_buf , sizeof (addr_buf ));
309
- sprintf (prefix_len , "%d" , elt -> prefix_length );
310
- if (msg )
311
- free (msg );
312
- msize = sizeof (addr_buf ) + strlen (nonce ) + strlen (prefix_len ) + 1 ;
313
- msg = (char * )malloc (sizeof (char )* msize );
314
- sprintf (msg , "%s#%s#%s" , addr_buf , prefix_len , nonce );
315
- log_msg (INFO , "dcache entry: %s" , msg );
316
- if ( ( send (dclient_fd , msg , 200 , 0 ) ) < 0 ) {
317
- log_msg (ERROR , "send error %s" , strerror (errno ));
318
- return NULL ;
319
- }
320
- elt = elt -> next ;
321
- }
322
-
323
- close (dclient_fd );
324
- }
325
- else if ( strcmp (cmd , "CCACHE" ) == 0 ) {
326
-
327
- log_msg (INFO , "Got connection request for clear_cache" );
328
- log_msg (INFO , "Clearing the Map Cache" );
329
- clear_map_cache ();
330
-
331
- close (dclient_fd );
332
- }
333
- else if ( strstr (cmd , "LOCATION" ) ) {
334
-
335
- log_msg (INFO , "Got location information update" );
336
- close (dclient_fd );
337
- }
338
- }
339
-
340
- return 0 ;
341
- }
342
-
343
- void listen_on_well_known_port ()
344
- {
345
- pthread_t dcache_t ;
346
-
347
- if ( pthread_create (& dcache_t , NULL , handle_dcache_requests , NULL ) != 0 ) {
348
- log_msg (ERROR , "thread creation failed %s" , strerror (errno ));
349
- return ;
350
- }
351
- pthread_detach (dcache_t );
352
- }
353
-
354
231
355
232
int main (int argc , char * * argv )
356
233
{
@@ -447,11 +324,6 @@ int main(int argc, char **argv)
447
324
448
325
create_tables ();
449
326
450
- if (create_tun () < 0 ) {
451
- log_msg (FATAL , " exiting..." );
452
- exit (EXIT_FAILURE );
453
- }
454
-
455
327
if (build_event_socket () == 0 )
456
328
{
457
329
log_msg (FATAL , " exiting..." );
@@ -468,6 +340,11 @@ int main(int argc, char **argv)
468
340
die (EXIT_FAILURE );
469
341
}
470
342
343
+ if (tuntap_create_tun () < 0 ) {
344
+ log_msg (FATAL , " exiting..." );
345
+ die (EXIT_FAILURE );
346
+ }
347
+
471
348
/*
472
349
* set up syslog now, checking to see if we're daemonizing...
473
350
*/
@@ -491,7 +368,7 @@ int main(int argc, char **argv)
491
368
492
369
clear_map_cache ();
493
370
494
- // listen_on_well_known_port();
371
+ listen_on_well_known_port ();
495
372
496
373
dump_info_file ();
497
374
event_loop ();
0 commit comments