/** * @brief linkstatd -- monitor interface status * * @param link_up [in] callback when link up * @param link_down [in] callback when link down * * @return 0, if succ; -1, if failed */ int linkstatd(void (*link_up)(const char *ifname), void (*link_down)(const char *ifname)) { int fd = -1; char ifname[64] = {0}; char msg[1024] = {0}; struct sockaddr_nl sa = {0}; struct ifinfomsg *ifi = NLMSG_DATA(msg); sa.nl_family = AF_NETLINK; sa.nl_groups = RTMGRP_LINK; if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0) perror("linkstatd socket create"); socket_bind(fd, (struct sockaddr *)&sa); while (read(fd, msg, sizeof(msg))) { if_indextoname(ifi->ifi_index, ifname); if (ifi->ifi_flags & IFF_RUNNING) { if (link_up != NULL) link_up(ifname); } else { if (link_up != NULL) link_down(ifname); } } return 0; }
// process any channel timeouts based on the current/given time link_t link_process(link_t link, uint32_t now) { if(!link || !now) return LOG("bad args"); link->chans = link_process_chan(link->chans, now); if(link->csid) return link; // flagged to remove, do that now link_down(link); link_free(link); return NULL; }
void handle_input(char *input, char *itc_file , int node_id) { int quit_len; char *inp_ptr; pthread_t thread; int srv_len = strlen("start_service"); int exit_len = strlen("exit"); int stop_srv_len = strlen("stop_service"); int connect_len = strlen("connect"); int download_len = strlen("download"); int dump_len = strlen("route_table"); int set_gar_len = strlen("set_garbler"); int link_up_len = strlen("link_up"); int link_down_len = strlen("link_down"); char file_name[NAME_MAX]; int max_connections; char *app_buffer= (char *)malloc(APP_HEADER_SIZE); int code; int dest_node; int window_size; quit_len = strlen("quit"); inp_ptr = input; srand(time(NULL)); if ( strncmp(input,"quit",quit_len) == 0 ) { printf("\n Quiting ... \n"); exit(EXIT_SUCCESS); } if ( strncmp(input,"exit",exit_len) == 0 ) { printf("\n Quiting ... \n"); exit(EXIT_SUCCESS); } if ( strncmp(input,"start_service",srv_len) == 0 ) { printf("\n Starting Server Thread : SID = %d \n" , rand()% 10000 ); inp_ptr += srv_len ; sscanf(inp_ptr,"%d", &max_connections); printf("\n Max connections = %d \n" , max_connections ); init_state(&__max_connections); set_state(&__max_connections,max_connections); handle_start_server(itc_file , node_id , inp_ptr , &thread); } if ( strncmp(input,"stop_service",stop_srv_len) == 0 ) { printf("\n stoping the serivce ... \n"); pthread_cancel(thread); } if ( strncmp(input,"connect",connect_len) == 0) { inp_ptr += connect_len; sscanf(inp_ptr,"%d",&dest_node); sscanf(inp_ptr,"%d",&window_size); nfd_send_buffer_transport("Donkey!" ,8,2); } if ( strncmp(input,"route_table",dump_len) == 0) { dump_route_table(); printf("\n Route table dumped to file \n"); } if ( strncmp(input,"link_up",link_up_len) == 0) { inp_ptr+=link_up_len; sscanf(inp_ptr,"%d",&dest_node); link_up(dest_node); printf("\n Link upped :) \n"); } if ( strncmp(input,"link_down",link_down_len) == 0) { inp_ptr += link_down_len; sscanf(inp_ptr,"%d",&dest_node); link_down(dest_node); printf("\n Link downed!\n"); } if ( strncmp(input,"download",download_len) == 0 ) { inp_ptr += download_len; sscanf(inp_ptr , "%d%s" , &dest_node , file_name); code = CODE_GET ; pack_into_packet(app_buffer, CODE_OFFSET , &code , CODE_SIZE); pack_into_packet(app_buffer ,FILENAME_OFFSET , file_name , strlen(file_name) +1 ); printf("\n Currnet node = %d " , __current_node ); pack_into_packet(app_buffer , SRC_ID_OFFSET , &__current_node , SRC_ID_SIZE); nfd_send_buffer_transport(app_buffer,APP_HEADER_SIZE,dest_node); } if ( strncmp(input,"set_garbler",set_gar_len) == 0) { inp_ptr += connect_len; sscanf(inp_ptr,"%d%d",&__loss_frac , &__corr_fact); fprintf(stderr ,"\n garbler charecteristics set ... \n"); } }