static void loop_detect_run(void * param) { char *ifname[6] = {"lan1","lan2", "lan3", "lan4", "lan5", "lan6"}; if(init_epoll() !=0 ){ ERROR(DEFAULT_GROUP, "init_epoll faild\n"); } if(packet_sock_init() != 0){ ERROR(DEFAULT_GROUP, "packet sock init faild\n"); } if(netsock_init() != 0){ ERROR(DEFAULT_GROUP, "net sock init faild\n"); } // add port to loop detect module struct LoopDetectDriver lpdDriver; lpdDriver.globalEn = false; lpdDriver.set_port_state = set_port_state; lpdDriver.set_port_shutdown = set_port_shutdown; lpdDriver.set_port_no_shutdown = set_port_no_shutdown; lpdDriver.set_port_no_learn = set_port_no_learn; lpdDriver.set_port_learn = set_port_learn; lpdDriver.alert_push = alert_push; LOOP_INIT(&lpdDriver); //PTN 705 for(int i=0; i< 6; i++){ port_t *prt = malloc(sizeof(port_t)); prt->if_index = get_index(ifname[i], "port"); get_hwaddr(ifname[i], prt->macaddr); strcpy(prt->name, ifname[i]); LOOP_IN_add_port(prt, i); } INFO(DEFAULT_GROUP, "loop detect ready\n"); epoll_main_loop(); pthread_exit(0); }
int main(int argc, char *argv[]) { int c; int _argc = 0; unsigned long packet_cnt = 0; char *_argv[3]; pid_t pid; static User_Linker *usrinfo = NULL; while ((c = getopt(argc, argv, "dDv:")) != -1) { switch (c) { case 'd': become_daemon = 0; break; case 'D': execed = 1; break; default: return -1; } } if (become_daemon) { if (!execed) { if ((pid = vfork()) < 0) { fprintf(stderr, "vfork failed\n"); exit(1); } else if (pid != 0) { exit(0); //parent progress exit } _argv[_argc++] = argv[0]; _argv[_argc++] = "-D"; _argv[_argc++] = NULL; execv(_argv[0], _argv); /* Not reached */ fprintf(stderr, "Couldn't exec\n"); _exit(1); } else { setsid(); chdir("/"); umask(0); close(0); close(1); close(2); } FILE *f = fopen("/var/run/lldpd.pid", "w"); if (!f) { ERROR("can't open /var/run/lldpd.pid"); return -1; } } INFO("lldp start"); /*Create epoll*/ TST(init_epoll()==0,-1); /*Initialize client control socket*/ //TST(ctlserver_socket_init()==0,-1); TST(packet_socket_init(SVR_PORT_SD, &packet_handler_1, &usrinfo)==0, -1); TST(packet_socket_init(SVR_PORT_FT, &packet_handler_2, &usrinfo)==0, -1); epoll_main_loop(usrinfo, &packet_cnt); //ctlserver_socket_cleanup(); packet_socket_cleanup(&packet_handler_1); packet_socket_cleanup(&packet_handler_2); free_user_link_linker(usrinfo); return 0; }
static void mstpd_run(void * param) { int i; struct stpDriver stpDrv = { .stp_set_state = do_set_stp_state, .stp_create_msti = do_create_stp_msti, .stp_delete_msti = do_delete_stp_msti, .stp_flush_all_fids = do_flush_all_fids_of_port, .alert_push = alert_push, .get_ifflags = do_get_flags, .if_shutdown = do_if_shutdown, .get_speed_duplex = do_get_speed_duplex, .get_hwaddr = do_get_hwaddr, .get_bridge_portno = do_get_bridge_portno, #ifdef KERNEL_BRIDGE_TURN_ON .br_set_state = br_set_state, .br_set_ageing_time = br_set_ageing_time, .br_flush_port = br_flush_port, #endif .if_index_to_name = do_if_index_to_name, .if_name_to_index = do_if_name_to_index, }; init_stp_driver(&stpDrv); usleep(500000); /* wait for ubus stable*/ if(init_epoll() != 0){ goto run_mstp_faild; } if(packet_sock_init() != 0){ goto run_mstp_faild; } /* 初始网络套接字,用于获取网络接口信息*/ if(netsock_init() != 0){ goto run_mstp_faild; } #ifdef KERNEL_BRIDGE_TURN_ON /* 初始化桥操作入口,用于监视桥状态和相关操作 */ if(init_bridge_ops() != 0){ goto run_mstp_faild; } #endif for(i=1; i< MAX_MSTID; i++) msti_new_flag[i] = 1; #ifndef KERNEL_BRIDGE_TURN_ON //内核开启Bridge 支持 char ifname[10]; for(i=1; i<6; i++){ sprintf(ifname, "lan%d", i); ifname[4] = 0; set_if_to_promisc(ifname); } #endif join_bridge_to_mstp(); epoll_main_loop(); goto over_mstpd; run_mstp_faild: ERROR(GLOBAL_OUT_GROUP, "initination run MSTP faild.\n"); over_mstpd: pthread_exit(0); }