int set_tun_default_route_v6() { /* * Assign route to ::/1 and 8000::/1 via tun interface */ lisp_addr_t dest; lisp_addr_t *src = NULL; uint32_t prefix_len = 0; uint32_t metric = 0; prefix_len = 1; metric = 512; if (router_mode == TRUE){ if (default_out_iface_v6 != NULL){ src = default_out_iface_v6->ipv6_address; } } get_lisp_addr_from_char("::",&dest); if (add_route(AF_INET6, tun_ifindex, &dest, src, NULL, prefix_len, metric, RT_TABLE_MAIN) != GOOD){ return (BAD); } get_lisp_addr_from_char("8000::",&dest); if (add_route(AF_INET6, tun_ifindex, &dest, src, NULL, prefix_len, metric, RT_TABLE_MAIN) != GOOD){ return (BAD); } return(GOOD); }
int set_tun_default_route_v6() { /* * Assign route to ::/1 and 8000::/1 via tun interface */ lisp_addr_t dest; lisp_addr_t *src = NULL; lisp_addr_t gw; uint32_t prefix_len = 0; uint32_t metric = 0; prefix_len = 1; metric = 512; get_lisp_addr_from_char("::",&gw); #ifdef ROUTER if (default_out_iface_v6 != NULL){ src = default_out_iface_v6->ipv6_address; } #endif get_lisp_addr_from_char("::",&dest); add_route(AF_INET6, tun_ifindex, &dest, src, NULL, prefix_len, metric, RT_TABLE_MAIN); get_lisp_addr_from_char("8000::",&dest); add_route(AF_INET6, tun_ifindex, &dest, src, NULL, prefix_len, metric, RT_TABLE_MAIN); return(GOOD); }
int get_lisp_addr_and_mask_from_char ( char *address, lisp_addr_t *lisp_addr, int *mask) { char *token; if ((token = strtok(address, "/")) == NULL) { lispd_log_msg(LISP_LOG_DEBUG_1, "get_lisp_addr_and_mask_from_char: Prefix not of the form prefix/length: %s",address); return (BAD); } if (get_lisp_addr_from_char(token,lisp_addr)==BAD) return (BAD); if ((token = strtok(NULL,"/")) == NULL) { lispd_log_msg(LISP_LOG_DEBUG_1,"get_lisp_addr_and_mask_from_char: strtok: %s", strerror(errno)); return (BAD); } *mask = atoi(token); if (lisp_addr->afi == AF_INET) { if (*mask < 1 || *mask > 32) return (BAD); }else { if (*mask < 1 || *mask > 128) return (BAD); } return (GOOD); }
int del_tun_default_route_v6() { /* * Assign route to ::/1 and 8000::/1 via tun interface */ lisp_addr_t dest; lisp_addr_t *src = NULL; lisp_addr_t gw; uint32_t prefix_len = 0; uint32_t metric = 0; prefix_len = 1; metric = 512; get_lisp_addr_from_char("::",&gw); get_lisp_addr_from_char("::",&dest); if (del_route(AF_INET6, tun_ifindex, &dest, src, NULL, prefix_len, metric, RT_TABLE_MAIN) != GOOD){ return (BAD); } get_lisp_addr_from_char("8000::",&dest); if (del_route(AF_INET6, tun_ifindex, &dest, src, NULL, prefix_len, metric, RT_TABLE_MAIN) != GOOD){ return (BAD); } return(GOOD); }
lispd_locator_elt *new_static_rmt_locator ( char *rloc_addr, uint8_t state, /* UP , DOWN */ uint8_t priority, uint8_t weight, uint8_t mpriority, uint8_t mweight) { lispd_locator_elt *locator = NULL; if ((locator = malloc(sizeof(lispd_locator_elt))) == NULL) { LISPD_LOG(LISP_LOG_WARNING, "Unable to allocate memory for lispd_locator_elt: %s", strerror(errno)); return(NULL); } if((locator->locator_addr = malloc(sizeof(lisp_addr_t))) == NULL){ LISPD_LOG(LISP_LOG_WARNING,"Unable to allocate memory for lisp_addr_t: %s", strerror(errno)); free (locator); return (NULL); } if((locator->state = malloc(sizeof(uint8_t))) == NULL){ LISPD_LOG(LISP_LOG_WARNING,"Unable to allocate memory for uint8_t: %s", strerror(errno)); free (locator->locator_addr); free (locator); return (NULL); } if (get_lisp_addr_from_char(rloc_addr,locator->locator_addr) == BAD){ LISPD_LOG(LISP_LOG_ERR, "Error parsing RLOC address ... Ignoring static map cache entry"); free (locator->locator_addr); free (locator->state); free (locator); return (NULL); } locator->extended_info = (void *)new_rmt_locator_extended_info(); if (locator->extended_info == NULL){ free (locator->locator_addr); free (locator->state); free (locator); return (NULL); } *(locator->state) = state; locator->locator_type = STATIC_LOCATOR; locator->priority = priority; locator->weight = weight; locator->mpriority = mpriority; locator->mweight = mweight; locator->data_packets_in = 0; locator->data_packets_out = 0; return (locator); }
int set_tun_default_route_v4() { /* * Assign route to 0.0.0.0/1 and 128.0.0.0/1 via tun interface */ lisp_addr_t dest; uint32_t prefix_len = 0; uint32_t metric = 0; prefix_len = 1; metric = 0; get_lisp_addr_from_char("0.0.0.0",&dest); if (add_route(AF_INET, tun_ifindex, &dest, NULL, NULL, prefix_len, metric, RT_TABLE_MAIN) != GOOD){ return (BAD); } get_lisp_addr_from_char("128.0.0.0",&dest); if (add_route(AF_INET, tun_ifindex, &dest, NULL, NULL, prefix_len, metric, RT_TABLE_MAIN)!=GOOD){ return (BAD); } return(GOOD); }
int main(int argc, char **argv) { lisp_addr_t *tun_v4_addr = NULL; lisp_addr_t *tun_v6_addr = NULL; char *tun_dev_name = TUN_IFACE_NAME; uint32_t iseed = 0; /* initial random number generator */ pid_t pid = 0; /* child pid */ pid_t sid = 0; #ifdef OPENWRT lispd_log_msg(LISP_LOG_INFO,"LISPmob %s compiled for openWRT\n", LISPD_VERSION); #else #ifdef ANDROID open_log_file(); lispd_log_msg(LISP_LOG_INFO,"LISPmob %s compiled for Android\n", LISPD_VERSION); #else lispd_log_msg(LISP_LOG_INFO,"LISPmob %s compiled for Linux\n", LISPD_VERSION); #endif #endif init_globales(); #ifndef ANDROID /* * Check for required capabilities and drop unnecssary privileges */ if(check_capabilities() != GOOD) { exit_cleanup(); } #else /* * Check for superuser privileges */ if (geteuid() != 0) { lispd_log_msg(LISP_LOG_INFO,"Running %s requires superuser privileges! Exiting...\n", LISPD); exit_cleanup(); } #endif /* * Initialize the random number generator */ iseed = (unsigned int) time (NULL); srandom(iseed); /* * Set up signal handlers */ signal(SIGHUP, signal_handler); signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); /* * set up databases */ db_init(); map_cache_init(); init_referral_cache(); /* * Parse command line options */ handle_lispd_command_line(argc, argv); /* * see if we need to daemonize, and if so, do it */ if (daemonize) { lispd_log_msg(LISP_LOG_DEBUG_1, "Starting the daemonizing process1"); if ((pid = fork()) < 0) { exit_cleanup(); } umask(0); if (pid > 0){ exit(EXIT_SUCCESS); } if ((sid = setsid()) < 0){ exit_cleanup(); } if ((chdir("/")) < 0){ exit_cleanup(); } } /* * create timers */ if (build_timers_event_socket(&timers_fd) == 0) { lispd_log_msg(LISP_LOG_CRIT, " Error programing the timer signal. Exiting..."); exit_cleanup(); } init_timers(); /* * Parse config file. Format of the file depends on the node: Linux Box or OpenWRT router */ #ifdef OPENWRT if (config_file == NULL){ config_file = "/etc/config/lispd"; } err = handle_uci_lispd_config_file(config_file); #else if (config_file == NULL){ config_file = "/etc/lispd.conf"; } err = handle_lispd_config_file(config_file); #endif if (err != GOOD){ lispd_log_msg(LISP_LOG_CRIT,"Wrong configuration."); exit_cleanup(); } if (ddt_client == FALSE){ drop_referral_cache(); } /* * Select the default rlocs for output data packets and output control packets */ set_default_output_ifaces(); set_default_ctrl_ifaces(); /* * Create tun interface */ create_tun(tun_dev_name, TUN_RECEIVE_SIZE, TUN_MTU, &tun_receive_fd, &tun_ifindex, &tun_receive_buf); /* * Assign address to the tun interface * Assign route to 0.0.0.0/1 and 128.0.0.0/1 via tun interface * ::/1 and 8000::/1 */ if (router_mode == TRUE){ tun_v4_addr = get_main_eid(AF_INET); if (tun_v4_addr != NULL){ tun_v4_addr = (lisp_addr_t *)malloc(sizeof(lisp_addr_t)); get_lisp_addr_from_char(TUN_LOCAL_V4_ADDR,tun_v4_addr); } tun_v6_addr = get_main_eid(AF_INET6); if (tun_v6_addr != NULL){ tun_v6_addr = (lisp_addr_t *)malloc(sizeof(lisp_addr_t)); get_lisp_addr_from_char(TUN_LOCAL_V6_ADDR,tun_v6_addr); } }else{ tun_v4_addr = get_main_eid(AF_INET); tun_v6_addr = get_main_eid(AF_INET6); } tun_bring_up_iface(tun_dev_name); if (tun_v4_addr != NULL){ tun_add_eid_to_iface(*tun_v4_addr,tun_dev_name); set_tun_default_route_v4(); } if (tun_v6_addr != NULL){ tun_add_eid_to_iface(*tun_v6_addr,tun_dev_name); set_tun_default_route_v6(); } if (router_mode == TRUE){ if (tun_v4_addr != NULL){ free(tun_v4_addr); } if (tun_v6_addr != NULL){ free(tun_v6_addr); } } /* * Generate receive sockets for control (4342) and data port (4341) */ if (default_rloc_afi == AF_UNSPEC || default_rloc_afi == AF_INET){ ipv4_control_input_fd = open_control_input_socket(AF_INET); ipv4_data_input_fd = open_data_input_socket(AF_INET); } if (default_rloc_afi == AF_UNSPEC || default_rloc_afi == AF_INET6){ ipv6_control_input_fd = open_control_input_socket(AF_INET6); ipv6_data_input_fd = open_data_input_socket(AF_INET6); } /* * Create net_link socket to receive notifications of changes of RLOC status. */ netlink_fd = opent_netlink_socket(); lispd_log_msg(LISP_LOG_INFO,"LISPmob (%s): 'lispd' started...", LISPD_VERSION); if (router_mode == TRUE){ lispd_log_msg(LISP_LOG_INFO,"Running as an xTR router"); }else{ lispd_log_msg(LISP_LOG_INFO,"Running as a LISP mobile node"); } /* * Request to dump the routing tables to obtain the gatways when processing the netlink messages */ request_route_table(RT_TABLE_MAIN, AF_INET); process_netlink_msg(netlink_fd); request_route_table(RT_TABLE_MAIN, AF_INET6); process_netlink_msg(netlink_fd); /* * Register to the Map-Server(s) */ map_register (NULL,NULL); /* * SMR proxy-ITRs list to be updated with new mappings */ init_smr(NULL,NULL); /* * RLOC Probing proxy ETRs */ programming_petr_rloc_probing(); event_loop(); lispd_log_msg(LISP_LOG_INFO, "Exiting..."); /* event_loop returned bad */ closelog(); return(0); }
int main(int argc, char **argv) { lisp_addr_t *tun_v4_addr; lisp_addr_t *tun_v6_addr; char *tun_dev_name = TUN_IFACE_NAME; #ifdef ROUTER #ifdef OPENWRT lispd_log_msg(LISP_LOG_INFO,"LISPmob compiled for openWRT xTR\n"); #else lispd_log_msg(LISP_LOG_INFO,"LISPmob compiled for linux xTR\n"); #endif #else lispd_log_msg(LISP_LOG_INFO,"LISPmob compiled for mobile node\n"); #endif /* * Check for superuser privileges */ if (geteuid()) { lispd_log_msg(LISP_LOG_INFO,"Running %s requires superuser privileges! Exiting...\n", LISPD); exit_cleanup(); } /* * Initialize the random number generator */ iseed = (unsigned int) time (NULL); srandom(iseed); /* * Set up signal handlers */ signal(SIGHUP, signal_handler); signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); /* * set up databases */ db_init(); map_cache_init(); /* * Parse command line options */ handle_lispd_command_line(argc, argv); /* * see if we need to daemonize, and if so, do it */ if (daemonize) { lispd_log_msg(LISP_LOG_DEBUG_1, "Starting the daemonizing process"); if ((pid = fork()) < 0) { exit_cleanup(); } umask(0); if (pid > 0) exit_cleanup(); if ((sid = setsid()) < 0) exit_cleanup(); if ((chdir("/")) < 0) exit_cleanup(); close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); } /* * create timers */ if (build_timers_event_socket(&timers_fd) == 0) { lispd_log_msg(LISP_LOG_CRIT, " Error programing the timer signal. Exiting..."); exit_cleanup(); } init_timers(); /* * Parse config file. Format of the file depends on the node: Linux Box or OpenWRT router */ #ifdef OPENWRT if (config_file == NULL){ config_file = "/etc/config/lispd"; } handle_uci_lispd_config_file(config_file); #else if (config_file == NULL){ config_file = "/etc/lispd.conf"; } handle_lispd_config_file(config_file); #endif if (map_servers == NULL){ lispd_log_msg(LISP_LOG_CRIT, "No Map Server configured. Exiting..."); exit_cleanup(); } if (map_resolvers == NULL){ lispd_log_msg(LISP_LOG_CRIT, "No Map Resolver configured. Exiting..."); exit_cleanup(); } if (proxy_etrs == NULL){ lispd_log_msg(LISP_LOG_WARNING, "No Proxy-ETR defined. Packets to non-LISP destinations will be " "forwarded natively (no LISP encapsulation). This may prevent mobility in some scenarios."); sleep(3); }else{ calculate_balancing_vectors ( proxy_etrs->mapping, &(((rmt_mapping_extended_info *)(proxy_etrs->mapping->extended_info))->rmt_balancing_locators_vecs)); } /* * Select the default rlocs for output data packets and output control packets */ set_default_output_ifaces(); set_default_ctrl_ifaces(); /* * Create tun interface */ create_tun(tun_dev_name, TUN_RECEIVE_SIZE, TUN_MTU, &tun_receive_fd, &tun_ifindex, &tun_receive_buf); /* * Assign address to the tun interface * Assign route to 0.0.0.0/1 and 128.0.0.0/1 via tun interface * ::/1 and 8000::/1 */ #ifdef ROUTER tun_v4_addr = get_main_eid(AF_INET); if (tun_v4_addr != NULL){ tun_v4_addr = (lisp_addr_t *)malloc(sizeof(lisp_addr_t)); get_lisp_addr_from_char(TUN_LOCAL_V4_ADDR,tun_v4_addr); } tun_v6_addr = get_main_eid(AF_INET6); if (tun_v6_addr != NULL){ tun_v6_addr = (lisp_addr_t *)malloc(sizeof(lisp_addr_t)); get_lisp_addr_from_char(TUN_LOCAL_V6_ADDR,tun_v6_addr); } #else tun_v4_addr = get_main_eid(AF_INET); tun_v6_addr = get_main_eid(AF_INET6); #endif tun_bring_up_iface(tun_dev_name); if (tun_v4_addr != NULL){ tun_add_eid_to_iface(*tun_v4_addr,tun_dev_name); set_tun_default_route_v4(); } if (tun_v6_addr != NULL){ tun_add_eid_to_iface(*tun_v6_addr,tun_dev_name); set_tun_default_route_v6(); } #ifdef ROUTER if (tun_v4_addr != NULL){ free(tun_v4_addr); } if (tun_v6_addr != NULL){ free(tun_v6_addr); } #endif /* * Generate receive sockets for control (4342) and data port (4341) */ if (default_rloc_afi == -1 || default_rloc_afi == AF_INET){ ipv4_control_input_fd = open_control_input_socket(AF_INET); ipv4_data_input_fd = open_data_input_socket(AF_INET); } if (default_rloc_afi == -1 || default_rloc_afi == AF_INET6){ ipv6_control_input_fd = open_control_input_socket(AF_INET6); ipv6_data_input_fd = open_data_input_socket(AF_INET6); } /* * Create net_link socket to receive notifications of changes of RLOC status. */ netlink_fd = opent_netlink_socket(); lispd_log_msg(LISP_LOG_INFO,"LISPmob (0.3.3): 'lispd' started..."); /* * Request to dump the routing tables to obtain the gatways when processing the netlink messages */ request_route_table(RT_TABLE_MAIN, AF_INET); process_netlink_msg(netlink_fd); request_route_table(RT_TABLE_MAIN, AF_INET6); process_netlink_msg(netlink_fd); /* * Register to the Map-Server(s) */ map_register (NULL,NULL); /* * SMR proxy-ITRs list to be updated with new mappings */ init_smr(NULL,NULL); /* * RLOC Probing proxy ETRs */ programming_petr_rloc_probing(); event_loop(); lispd_log_msg(LISP_LOG_INFO, "Exiting..."); /* event_loop returned bad */ closelog(); return(0); }