int main() { int i, c, pID = 0, handle, sizeQShm; struct barrier_d b; spscq_d_t q[NUM_PROC]; long long cnt, enqueue_fails, dequeue_fails; unsigned long long t1, t2, dt, t_min, t_max, t_sum; int qIDenq, qIDdeq; struct message msg; #ifdef ARCH_X86 /* change previledge level */ iopl(3); #endif #ifdef ARCH_ARM apm_init(); #endif /* get rtipc handle */ handle = rtipc_create_handle(); sizeQShm = sizeof(spscq_head_t) + NUM_SLOTS * SLOT_SIZE; /* set up childs */ for (i = 0; i < NUM_PROC - 1; i++) { if ((c = fork()) == 0) { pID = i + 1; break; } } /* determine, which queue to enqueue and which to dequeue*/ qIDenq = pID; qIDdeq = (pID + 1) % NUM_PROC; /* prevent swapping */ osfunctions_mLockAll(); if (osfunctions_movetocpu(pID) == -1) printf("Proc %d: cannot move to cpu %d\n", pID, pID); if (osfunctions_setMaxPriority() == -1) printf("Proc %d: cannot set priority\n", pID); /* init librtipc */ if (rtipc_initialize(handle) == -1) { printf("Proc %d: rtipc_initialize() failed\n", pID); return 0; } /* get barrier */ if (barrier_get(&b, SHMID_BARRIER, NUM_PROC) == -1) { printf("Proc %d: barrier_get() failed\n", pID); return 0; } /* connect to the queue to enqueue */ if (spscq_get(&(q[qIDenq]), SHMID_BARRIER + 1 + qIDenq, SLOT_SIZE, NUM_SLOTS) == -1) { printf("Proc %d: spscq_get() failed\n", pID); return 0; } /* connect to the queue to dequeue from */ if (spscq_get(&(q[qIDdeq]), SHMID_BARRIER + 1 + qIDdeq, SLOT_SIZE, NUM_SLOTS) == -1) { printf("Proc %d: spscq_get() failed\n", pID); return 0; } printf("Proc %d: running\n", pID); barrier_wait(&b); hwfunctions_cli(); enqueue_fails = 0; dequeue_fails = 0; t_max = 0; t_min = 0xffffffffffffffff; t_sum = 0; for (i = 0; i < NUM_ITERATION; i++) { #ifdef ARCH_ARM apm_stopCCNTR(); if (apm_fetchCCNTRovfl() == 1) { printf("cycle counter overflow\n"); apm_resetCCNTRovfl(); } apm_resetCCNTR(); apm_startCCNTR(); #endif cnt = 0; while (cnt < NUM_MESSAGES) { if (pID == 0) { msg.cnt = cnt; /* printf("send %d (%d)\n", msg.cnt, qIDenq);*/ #ifdef ARCH_X86 t1 = read_tsc(); #endif #ifdef ARCH_ARM t1 = apm_fetchCCNTR(); #endif while (spscq_enqueue(&(q[qIDenq]), &msg) != 0) enqueue_fails++; msg.cnt = -1; while (spscq_dequeue(&(q[qIDdeq]), &msg) != 0) dequeue_fails++; #ifdef ARCH_X86 t2 = read_tsc(); #endif #ifdef ARCH_ARM t2 = apm_fetchCCNTR(); #endif if (msg.cnt != cnt) printf("ERROR: received wrong message %lld (expected %lld)\n", msg.cnt, cnt); /* printf("received %d (%d)\n", msg.cnt, qIDdeq);*/ if (pID == 0) { if (i > 0) { dt = t2 - t1; if (dt > t_max) t_max = dt; if (dt < t_min) t_min = dt; t_sum += dt; } } } else { msg.cnt = -1; while(spscq_dequeue(&(q[qIDdeq]), &msg) != 0) dequeue_fails++; /* printf("send %d (%d->%d)\n", msg.cnt, qIDdeq, qIDenq);*/ while(spscq_enqueue(&(q[qIDenq]), &msg) != 0) enqueue_fails++; } cnt++; } } hwfunctions_sti(); #ifdef ARCH_ARM apm_stopCCNTR(); #endif if (pID == 0) { printf("t_min: %lld\nt_max: %lld\naverage: %lld\n\n", t_min, t_max, (long long)((float)t_sum / ((NUM_ITERATION - 1) * NUM_MESSAGES ))); } barrier_wait(&b); barrier_release(&b); spscq_release(&q[qIDenq]); spscq_release(&q[qIDdeq]); if (pID == 0) rtipc_finalize(); printf("Proc %d: finished\n", pID); return 0; }
int main(int argc, char *argv[]) { struct if_config_options *default_ifcnf; char conf_file_name[FILENAME_MAX]; struct ipaddr_str buf; bool loadedConfig = false; int i; #ifdef __linux__ struct interface *ifn; #endif /* __linux__ */ #ifdef _WIN32 WSADATA WsaData; size_t len; #endif /* __linux__ */ /* paranoia checks */ assert(sizeof(uint8_t) == 1); assert(sizeof(uint16_t) == 2); assert(sizeof(uint32_t) == 4); assert(sizeof(int8_t) == 1); assert(sizeof(int16_t) == 2); assert(sizeof(int32_t) == 4); printf("\n *** %s ***\n Build date: %s on %s\n http://www.olsr.org\n\n", olsrd_version, build_date, build_host); if (argc == 2) { if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "/?") == 0) { print_usage(false); exit(0); } if (strcmp(argv[1], "-v") == 0) { exit(0); } } debug_handle = stdout; #ifndef _WIN32 olsr_argv = argv; #endif /* _WIN32 */ setbuf(stdout, NULL); setbuf(stderr, NULL); #ifndef _WIN32 /* Check if user is root */ if (geteuid()) { fprintf(stderr, "You must be root(uid = 0) to run olsrd!\nExiting\n\n"); exit(EXIT_FAILURE); } #else /* _WIN32 */ DisableIcmpRedirects(); if (WSAStartup(0x0202, &WsaData)) { fprintf(stderr, "Could not initialize WinSock.\n"); olsr_exit(__func__, EXIT_FAILURE); } #endif /* _WIN32 */ /* Open syslog */ olsr_openlog("olsrd"); /* setup random seed */ initRandom(); /* Init widely used statics */ memset(&all_zero, 0, sizeof(union olsr_ip_addr)); /* * Set configfile name and * check if a configfile name was given as parameter */ #ifdef _WIN32 #ifndef WINCE GetWindowsDirectory(conf_file_name, FILENAME_MAX - 11); #else /* WINCE */ conf_file_name[0] = 0; #endif /* WINCE */ len = strlen(conf_file_name); if (len == 0 || conf_file_name[len - 1] != '\\') conf_file_name[len++] = '\\'; strscpy(conf_file_name + len, "olsrd.conf", sizeof(conf_file_name) - len); #else /* _WIN32 */ strscpy(conf_file_name, OLSRD_GLOBAL_CONF_FILE, sizeof(conf_file_name)); #endif /* _WIN32 */ olsr_cnf = olsrd_get_default_cnf(); for (i=1; i < argc-1;) { if (strcmp(argv[i], "-f") == 0) { loadedConfig = true; if (olsrmain_load_config(argv[i+1]) < 0) { exit(EXIT_FAILURE); } if (i+2 < argc) { memmove(&argv[i], &argv[i+2], sizeof(*argv) * (argc-i-1)); } argc -= 2; } else { i++; } } /* * set up configuration prior to processing commandline options */ if (!loadedConfig && olsrmain_load_config(conf_file_name) == 0) { loadedConfig = true; } if (!loadedConfig) { olsrd_free_cnf(olsr_cnf); olsr_cnf = olsrd_get_default_cnf(); } default_ifcnf = get_default_if_config(); if (default_ifcnf == NULL) { fprintf(stderr, "No default ifconfig found!\n"); exit(EXIT_FAILURE); } /* Initialize timers */ olsr_init_timers(); /* * Process olsrd options. */ if (olsr_process_arguments(argc, argv, olsr_cnf, default_ifcnf) < 0) { print_usage(true); olsr_exit(__func__, EXIT_FAILURE); } /* * Set configuration for command-line specified interfaces */ set_default_ifcnfs(olsr_cnf->interfaces, default_ifcnf); /* free the default ifcnf */ free(default_ifcnf); /* Sanity check configuration */ if (olsrd_sanity_check_cnf(olsr_cnf) < 0) { fprintf(stderr, "Bad configuration!\n"); olsr_exit(__func__, EXIT_FAILURE); } /* * Establish file lock to prevent multiple instances */ if (olsr_cnf->lock_file) { strscpy(lock_file_name, olsr_cnf->lock_file, sizeof(lock_file_name)); } else { size_t l; #ifdef DEFAULT_LOCKFILE_PREFIX strscpy(lock_file_name, DEFAULT_LOCKFILE_PREFIX, sizeof(lock_file_name)); #else /* DEFAULT_LOCKFILE_PREFIX */ strscpy(lock_file_name, conf_file_name, sizeof(lock_file_name)); #endif /* DEFAULT_LOCKFILE_PREFIX */ l = strlen(lock_file_name); snprintf(&lock_file_name[l], sizeof(lock_file_name) - l, "-ipv%d.lock", olsr_cnf->ip_version == AF_INET ? 4 : 6); } def_timer_ci = olsr_alloc_cookie("Default Timer Cookie", OLSR_COOKIE_TYPE_TIMER); /* * socket for ioctl calls */ olsr_cnf->ioctl_s = socket(olsr_cnf->ip_version, SOCK_DGRAM, 0); if (olsr_cnf->ioctl_s < 0) { #ifndef _WIN32 olsr_syslog(OLSR_LOG_ERR, "ioctl socket: %m"); #endif /* _WIN32 */ olsr_exit(__func__, 0); } #ifdef __linux__ olsr_cnf->rtnl_s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE); if (olsr_cnf->rtnl_s < 0) { olsr_syslog(OLSR_LOG_ERR, "rtnetlink socket: %m"); olsr_exit(__func__, 0); } if (fcntl(olsr_cnf->rtnl_s, F_SETFL, O_NONBLOCK)) { olsr_syslog(OLSR_LOG_INFO, "rtnetlink could not be set to nonblocking"); } if ((olsr_cnf->rt_monitor_socket = rtnetlink_register_socket(RTMGRP_LINK)) < 0) { olsr_syslog(OLSR_LOG_ERR, "rtmonitor socket: %m"); olsr_exit(__func__, 0); } #endif /* __linux__ */ /* * create routing socket */ #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ olsr_cnf->rts = socket(PF_ROUTE, SOCK_RAW, 0); if (olsr_cnf->rts < 0) { olsr_syslog(OLSR_LOG_ERR, "routing socket: %m"); olsr_exit(__func__, 0); } #endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */ #ifdef __linux__ /* initialize gateway system */ if (olsr_cnf->smart_gw_active) { if (olsr_init_gateways()) { olsr_exit("Cannot initialize gateway tunnels", 1); } } /* initialize niit if index */ if (olsr_cnf->use_niit) { olsr_init_niit(); } #endif /* __linux__ */ /* Init empty TC timer */ set_empty_tc_timer(GET_TIMESTAMP(0)); /* enable ip forwarding on host */ /* Disable redirects globally (not for WIN32) */ net_os_set_global_ifoptions(); /* Initialize parser */ olsr_init_parser(); /* Initialize route-exporter */ olsr_init_export_route(); /* Initialize message sequencnumber */ init_msg_seqno(); /* Initialize dynamic willingness calculation */ olsr_init_willingness(); /* *Set up willingness/APM */ if (olsr_cnf->willingness_auto) { if (apm_init() < 0) { OLSR_PRINTF(1, "Could not read APM info - setting default willingness(%d)\n", WILL_DEFAULT); olsr_syslog(OLSR_LOG_ERR, "Could not read APM info - setting default willingness(%d)\n", WILL_DEFAULT); olsr_cnf->willingness_auto = 0; olsr_cnf->willingness = WILL_DEFAULT; } else { olsr_cnf->willingness = olsr_calculate_willingness(); OLSR_PRINTF(1, "Willingness set to %d - next update in %.1f secs\n", olsr_cnf->willingness, (double)olsr_cnf->will_int); } } /* Initialize net */ init_net(); /* Initializing networkinterfaces */ if (!olsr_init_interfacedb()) { if (olsr_cnf->allow_no_interfaces) { fprintf( stderr, "No interfaces detected! This might be intentional, but it also might mean that your configuration is fubar.\nI will continue after 5 seconds...\n"); olsr_startup_sleep(5); } else { fprintf(stderr, "No interfaces detected!\nBailing out!\n"); olsr_exit(__func__, EXIT_FAILURE); } } olsr_do_startup_sleep(); /* Print heartbeat to stdout */ #if !defined WINCE if (olsr_cnf->debug_level > 0 && isatty(STDOUT_FILENO)) { olsr_start_timer(STDOUT_PULSE_INT, 0, OLSR_TIMER_PERIODIC, &generate_stdout_pulse, NULL, 0); } #endif /* !defined WINCE */ /* Initialize the IPC socket */ if (olsr_cnf->ipc_connections > 0) { if (ipc_init()) { olsr_exit("ipc_init failure", 1); } } /* Initialisation of different tables to be used. */ olsr_init_tables(); /* daemon mode */ #ifndef _WIN32 if (olsr_cnf->debug_level == 0 && !olsr_cnf->no_fork) { printf("%s detaching from the current process...\n", olsrd_version); if (daemon(0, 0) < 0) { printf("daemon(3) failed: %s\n", strerror(errno)); exit(EXIT_FAILURE); } } #endif /* _WIN32 */ writePidFile(); /* * Create locking file for olsrd, will be cleared after olsrd exits */ for (i=5; i>=0; i--) { OLSR_PRINTF(3, "Trying to get olsrd lock...\n"); if (!olsr_cnf->host_emul && olsr_create_lock_file(i > 0) == 0) { /* lock sucessfully created */ break; } sleep (1); } /* Load plugins */ olsr_load_plugins(); OLSR_PRINTF(1, "Main address: %s\n\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); #ifdef __linux__ /* create policy routing rules with priorities if necessary */ if (DEF_RT_NONE != olsr_cnf->rt_table_pri) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, true); } if (DEF_RT_NONE != olsr_cnf->rt_table_tunnel_pri) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_tunnel, olsr_cnf->rt_table_tunnel_pri, NULL, true); } if (DEF_RT_NONE != olsr_cnf->rt_table_default_pri) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default, olsr_cnf->rt_table_default_pri, NULL, true); } /* rule to default table on all olsrd interfaces */ if (DEF_RT_NONE != olsr_cnf->rt_table_defaultolsr_pri) { for (ifn = ifnet; ifn; ifn = ifn->int_next) { olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default, olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, true); } } /* trigger gateway selection */ if (olsr_cnf->smart_gw_active) { olsr_trigger_inetgw_startup(); } /* trigger niit static route setup */ if (olsr_cnf->use_niit) { olsr_setup_niit_routes(); } /* create lo:olsr interface */ if (olsr_cnf->use_src_ip_routes) { olsr_os_localhost_if(&olsr_cnf->main_addr, true); } #endif /* __linux__ */ /* Start syslog entry */ olsr_syslog(OLSR_LOG_INFO, "%s successfully started", olsrd_version); /* *signal-handlers */ /* ctrl-C and friends */ #ifdef _WIN32 #ifndef WINCE SetConsoleCtrlHandler(SignalHandler, true); #endif /* WINCE */ #else /* _WIN32 */ signal(SIGHUP, olsr_reconfigure); signal(SIGINT, olsr_shutdown); signal(SIGQUIT, olsr_shutdown); signal(SIGILL, olsr_shutdown); signal(SIGABRT, olsr_shutdown); // signal(SIGSEGV, olsr_shutdown); signal(SIGTERM, olsr_shutdown); signal(SIGPIPE, SIG_IGN); // Ignoring SIGUSR1 and SIGUSR1 by default to be able to use them in plugins signal(SIGUSR1, SIG_IGN); signal(SIGUSR2, SIG_IGN); #endif /* _WIN32 */ link_changes = false; /* Starting scheduler */ olsr_scheduler(); /* Like we're ever going to reach this ;-) */ return 1; } /* main */