// only ralink solution can reload it dynamically void reinit_hwnat() { // only happened when hwnat=1 // only loaded when unloaded, and unloaded when loaded // in restart_firewall for fw_pt_l2tp/fw_pt_ipsec // in restart_qos for qos_enable // in restart_wireless for wlx_mrate_x if (nvram_get_int("hwnat")) { if (is_nat_enabled() && !nvram_get_int("qos_enable") /*&&*/ /* TODO: consider RTCONFIG_DUALWAN case */ // !nvram_match("wan0_proto", "l2tp") && // !nvram_match("wan0_proto", "pptp") && /*(nvram_match("wl0_radio", "0") || !nvram_get_int("wl0_mrate_x")) && (nvram_match("wl1_radio", "0") || !nvram_get_int("wl1_mrate_x"))*/) { if (!is_module_loaded("hw_nat")) { #if 0 system("echo 2 > /proc/sys/net/ipv4/conf/default/force_igmp_version"); system("echo 2 > /proc/sys/net/ipv4/conf/all/force_igmp_version"); #endif modprobe("hw_nat"); sleep(1); } } else if (is_module_loaded("hw_nat")) { modprobe_r("hw_nat"); sleep(1); #if 0 system("echo 0 > /proc/sys/net/ipv4/conf/default/force_igmp_version"); system("echo 0 > /proc/sys/net/ipv4/conf/all/force_igmp_version"); #endif } } }
void init_wl(void) { if (!is_module_loaded("rt2860v2_ap")) modprobe("rt2860v2_ap"); #if defined (RTCONFIG_WLMODULE_RT3090_AP) if (!is_module_loaded("RTPCI_ap")) { modprobe("RTPCI_ap"); } #endif #if defined (RTCONFIG_WLMODULE_RT3352_INIC_MII) if (!is_module_loaded("iNIC_mii")) modprobe("iNIC_mii", "mode=ap", "bridge=1", "miimaster=eth2", "syncmiimac=0"); // set iNIC mac address from eeprom need insmod with "syncmiimac=0" #endif sleep(1); }
void fini_wl(void) { if (is_module_loaded("hw_nat")) modprobe_r("hw_nat"); #if defined (RTCONFIG_WLMODULE_RT3352_INIC_MII) if (is_module_loaded("iNIC_mii")) modprobe_r("iNIC_mii"); #endif #if defined (RTCONFIG_WLMODULE_RT3090_AP) if (is_module_loaded("RTPCI_ap")) { modprobe_r("RTPCI_ap"); } #endif if (is_module_loaded("rt2860v2_ap")) modprobe_r("rt2860v2_ap"); }
/* * Load a module file in /Extra/modules/ */ int load_module(char* module) { int retVal = 1; void (*module_start)(void) = NULL; char modString[128]; int fh = -1; // Check to see if the module has already been loaded if(is_module_loaded(module)) { DBG("Module '%s' already loaded.\n", module); return 1; } snprintf(modString, sizeof(modString), MODULE_PATH "%s", module); fh = open(modString, 0); if(fh < 0) { DBG("[WARNING!] Unable to locate module '%s'. Not loaded.\n", modString); DBGPAUSE(); return 0; } unsigned int moduleSize = file_size(fh); if(moduleSize == 0) { DBG("[WARNING!] The module '%s' has a file size=%d. Not loading.\n", modString, moduleSize); return 0; } char* module_base = (char*) malloc(moduleSize); if (moduleSize && read(fh, module_base, moduleSize) == moduleSize) { // Module loaded into memory, parse it module_start = parse_mach(module_base, &load_module, &add_symbol, NULL); if(module_start && module_start != (void*)0xFFFFFFFF) { // Notify the system that it was laoded module_loaded(module, module_start, NULL, NULL, 0, 0 /*moduleName, NULL, moduleVersion, moduleCompat*/); (*module_start)(); // Start the module DBG("Module %s Loaded.\n", module); DBGPAUSE(); } #if CONFIG_MODULE_DEBUG else // The module does not have a valid start function. This may be a library. { printf("[WARNING!] Unable to start module '%s'.\n", module); getchar(); } #else else msglog("[WARNING!] Unable to start module '%s'.\n", module);
// used for various testing static int rctest_main(int argc, char *argv[]) { int on; if (argc < 3) { _dprintf("test what?\n"); } else if (strcmp(argv[1], "rc_service")==0) { notify_rc(argv[2]); } else if(strcmp(argv[1], "get_phy_status")==0) { int mask; mask = atoi(argv[2]); TRACE_PT("debug for phy_status %x\n", get_phy_status(mask)); } else if(strcmp(argv[1], "get_phy_speed")==0) { int mask; mask = atoi(argv[2]); TRACE_PT("debug for phy_speed %x\n", get_phy_speed(mask)); } else if(strcmp(argv[1], "set_phy_ctrl")==0) { int mask, ctrl; mask = atoi(argv[2]); ctrl = atoi(argv[3]); TRACE_PT("debug for phy_speed %x\n", set_phy_ctrl(mask, ctrl)); } else if(strcmp(argv[1], "handle_notifications")==0) { handle_notifications(); } else if(strcmp(argv[1], "check_action")==0) { _dprintf("check: %d\n", check_action()); } else if(strcmp(argv[1], "nvramhex")==0) { int i; char *nv; nv = nvram_safe_get(argv[2]); _dprintf("nvram %s(%d): ", nv, strlen(nv)); for(i=0;i<strlen(nv);i++) { _dprintf(" %x", (unsigned char)*(nv+i)); } _dprintf("\n"); } else { on = atoi(argv[2]); _dprintf("%s %d\n", argv[1], on); if (strcmp(argv[1], "vlan") == 0) { if(on) start_vlan(); else stop_vlan(); } else if (strcmp(argv[1], "lan") == 0) { if(on) start_lan(); else stop_lan(); } else if (strcmp(argv[1], "wl") == 0) { if(on) { start_wl(); lanaccess_wl(); } } else if (strcmp(argv[1], "wan") == 0) { if(on) start_wan(); else stop_wan(); } else if (strcmp(argv[1], "firewall") == 0) { //if(on) start_firewall(); //else stop_firewall(); } else if (strcmp(argv[1], "watchdog") == 0) { if(on) start_watchdog(); else stop_watchdog(); } #ifdef RTCONFIG_FANCTRL else if (strcmp(argv[1], "phy_tempsense") == 0) { if(on) start_phy_tempsense(); else stop_phy_tempsense(); } #endif #ifdef RTCONFIG_BCMWL6 #ifdef RTCONFIG_PROXYSTA else if (strcmp(argv[1], "psta_monitor") == 0) { if(on) start_psta_monitor(); else stop_psta_monitor(); } #endif #endif else if (strcmp(argv[1], "qos") == 0) {//qos test if(on){ #ifdef RTCONFIG_RALINK if (is_module_loaded("hw_nat")) { modprobe_r("hw_nat"); sleep(1); #if 0 system("echo 0 > /proc/sys/net/ipv4/conf/default/force_igmp_version"); system("echo 0 > /proc/sys/net/ipv4/conf/all/force_igmp_version"); #endif } #endif add_iQosRules(get_wan_ifname(0)); start_iQos(); } else { #ifdef RTCONFIG_RALINK if (nvram_get_int("hwnat") && // !((nvram_get_int("fw_pt_l2tp") || nvram_get_int("fw_pt_ipsec") || nvram_get_int("wl0_mrate_x") || nvram_get_int("wl1_mrate_x"))) && !is_module_loaded("hw_nat")) { #if 0 system("echo 2 > /proc/sys/net/ipv4/conf/default/force_igmp_version"); system("echo 2 > /proc/sys/net/ipv4/conf/all/force_igmp_version"); #endif modprobe("hw_nat"); sleep(1); } #endif del_iQosRules(); stop_iQos(); } } #ifdef RTCONFIG_WEBDAV else if (strcmp(argv[1], "webdav") == 0) { if(on) start_webdav(); } #endif else if (strcmp(argv[1], "gpiow") == 0) { if(argc>=4) set_gpio(atoi(argv[2]), atoi(argv[3])); } else if (strcmp(argv[1], "gpior") == 0) { _dprintf("%d\n", get_gpio(atoi(argv[2]))); } else if (strcmp(argv[1], "init_switch") == 0) { init_switch(on); } else if (strcmp(argv[1], "set_action") == 0) { set_action(on); } else { printf("what?\n"); } } return 0; }
static int create_global_segment() { int retval = 0; int globalkey = OS_KEY(GLOBAL_KEY, rtapi_instance); int rtapikey = OS_KEY(RTAPI_KEY, rtapi_instance); int halkey = OS_KEY(HAL_KEY, rtapi_instance); int global_exists = shm_common_exists(globalkey); int hal_exists = shm_common_exists(halkey); int rtapi_exists = shm_common_exists(rtapikey); if (global_exists || rtapi_exists || hal_exists) { // hm, something is wrong here pid_t msgd_pid = pid_of("msgd:%d", rtapi_instance); if (rtapi_instance == kernel_instance_id()) { // collision with a running kernel instance - not good. int shmdrv_loaded = is_module_loaded("shmdrv"); int rtapi_loaded = is_module_loaded("rtapi"); int hal_loaded = is_module_loaded("hal_lib"); fprintf(stderr, "ERROR: found existing kernel " "instance with the same instance id (%d)\n", rtapi_instance); fprintf(stderr,"kernel modules loaded: %s%s%s\n", shmdrv_loaded ? "shmdrv " : "", rtapi_loaded ? "rtapi " : "", hal_loaded ? "hal_lib " : ""); if (msgd_pid > 0) fprintf(stderr,"the msgd process msgd:%d is " "already running, pid: %d\n", rtapi_instance, msgd_pid); else fprintf(stderr,"msgd:%d not running!\n", rtapi_instance); return -EEXIST; } // running userthreads instance? pid_t app_pid = pid_of("rtapi:%d", rtapi_instance); if ((msgd_pid > -1) || (app_pid > -1)) { fprintf(stderr, "ERROR: found existing user RT " "instance with the same instance id (%d)\n", rtapi_instance); if (msgd_pid > 0) fprintf(stderr,"the msgd process msgd:%d is " "already running, pid: %d\n", rtapi_instance, msgd_pid); else fprintf(stderr,"msgd:%d not running!\n", rtapi_instance); if (app_pid > 0) fprintf(stderr,"the RT process rtapi:%d is " "already running, pid: %d\n", rtapi_instance, app_pid); else fprintf(stderr,"the RT process rtapi:%d not running!\n", rtapi_instance); // TBD: might check for other user HAL processes still // around. This might work with fuser on the HAL segment // but might be tricky wit shmdrv. return -EEXIST; } // leftover shared memory segments were around, but no using // entities (user process or kernel modules). // Remove and keep going: if (shmdrv_loaded) { // since neiter rtapi.ko nor hal_lib.ko is loaded // cause a garbage collect in shmdrv shmdrv_gc(); } else { // Posix shm case. char segment_name[LINELEN]; if (hal_exists) { sprintf(segment_name, SHM_FMT, rtapi_instance, halkey); fprintf(stderr,"warning: removing unused HAL shm segment %s\n", segment_name); if (shm_unlink(segment_name)) perror(segment_name); } if (rtapi_exists) { sprintf(segment_name, SHM_FMT, rtapi_instance, rtapikey); fprintf(stderr,"warning: removing unused RTAPI" " shm segment %s\n", segment_name); if (shm_unlink(segment_name)) perror(segment_name); } if (global_exists) { sprintf(segment_name, SHM_FMT, rtapi_instance, globalkey); fprintf(stderr,"warning: removing unused global" " shm segment %s\n", segment_name); if (shm_unlink(segment_name)) perror(segment_name); } } } // now try again: if (shm_common_exists(globalkey)) { fprintf(stderr, "MSGD:%d ERROR: found existing global segment key=0x%x\n", rtapi_instance, globalkey); return -EEXIST; } int size = sizeof(global_data_t); retval = shm_common_new(globalkey, &size, rtapi_instance, (void **) &global_data, 1); if (retval < 0) { fprintf(stderr, "MSGD:%d ERROR: cannot create global segment key=0x%x %s\n", rtapi_instance, globalkey, strerror(-retval)); } if (size != sizeof(global_data_t)) { fprintf(stderr, "MSGD:%d ERROR: global segment size mismatch: expect %d got %d\n", rtapi_instance, sizeof(global_data_t), size); return -EINVAL; } return retval; }