📄 aironet4500_proc.c
字号:
save_flags(flags); cli(); awc_readrid(dev,rid,rid_dir->buff + rid->offset); restore_flags(flags); }; if (rid->array > 1 || rid->bits > 32){ if (write){ retv = proc_dostring(ctl, write, filp, buffer, lenp); if (retv) goto final; retv = awc_proc_format_array(write, awc_proc_buff, lenp, rid_dir, rid); if (retv) goto final; } else { retv = awc_proc_format_array(write, awc_proc_buff, lenp, rid_dir, rid); if (retv) goto final; retv = proc_dostring(ctl, write, filp, buffer, lenp); if (retv) goto final; } } else { if (write){ retv = proc_dointvec(ctl, write, filp, buffer, lenp); if (retv) goto final; retv = awc_proc_format_bits(write, &awc_int_buff, lenp, rid_dir, rid); if (retv) goto final; } else { retv = awc_proc_format_bits(write, &awc_int_buff, lenp,rid_dir, rid); if (retv) goto final; retv = proc_dointvec(ctl, write, filp, buffer, lenp); if (retv) goto final; } } if (write) { save_flags(flags); cli(); if (rid->selector->MAC_Disable_at_write){ awc_disable_MAC(dev); }; awc_writerid(dev,rid,rid_dir->buff + rid->offset); if (rid->selector->MAC_Disable_at_write){ awc_enable_MAC(dev); }; restore_flags(flags); }; DEBUG(0x20000,"awc proc ret %x \n",retv); DEBUG(0x20000,"awc proc lenp %x \n",*lenp); MOD_DEC_USE_COUNT; return retv; final: AWC_ENTRY_EXIT_DEBUG("exit"); MOD_DEC_USE_COUNT; return -1 ;}char conf_reset_result[200];ctl_table awc_exdev_table[] = { {0, NULL, NULL,0, 0400, NULL}, {0}};ctl_table awc_exroot_table[] = { {254, "aironet4500", NULL, 0, 0555, NULL}, {0}};ctl_table awc_driver_proc_table[] = { {1, "debug" , &awc_debug, sizeof(awc_debug), 0600,NULL, proc_dointvec}, {2, "bap_sleep" , &bap_sleep, sizeof(bap_sleep), 0600,NULL, proc_dointvec}, {3, "bap_sleep_after_setup" , &bap_sleep_after_setup, sizeof(bap_sleep_after_setup), 0600,NULL, proc_dointvec}, {4, "sleep_before_command" , &sleep_before_command, sizeof(sleep_before_command), 0600,NULL, proc_dointvec}, {5, "bap_sleep_before_write" , &bap_sleep_before_write, sizeof(bap_sleep_before_write), 0600,NULL, proc_dointvec}, {6, "sleep_in_command" , &sleep_in_command , sizeof(sleep_in_command), 0600,NULL, proc_dointvec}, {7, "both_bap_lock" , &both_bap_lock , sizeof(both_bap_lock), 0600,NULL, proc_dointvec}, {8, "bap_setup_spinlock" , &bap_setup_spinlock , sizeof(bap_setup_spinlock), 0600,NULL, proc_dointvec}, {0}};ctl_table awc_driver_level_ctable[] = { {1, "force_rts_on_shorter" , NULL, sizeof(int), 0600,NULL, proc_dointvec}, {2, "force_tx_rate" , NULL, sizeof(int), 0600,NULL, proc_dointvec}, {3, "ip_tos_reliability_rts" , NULL, sizeof(int), 0600,NULL, proc_dointvec}, {4, "ip_tos_troughput_no_retries", NULL, sizeof(int), 0600,NULL, proc_dointvec}, {5, "debug" , NULL, sizeof(int), 0600,NULL, proc_dointvec}, {6, "simple_bridge" , NULL, sizeof(int), 0600,NULL, proc_dointvec}, {7, "p802_11_send" , NULL, sizeof(int), 0600,NULL, proc_dointvec}, {8, "full_stats" , NULL, sizeof(int), 0600,NULL, proc_dointvec}, {0}};ctl_table awc_root_table[] = { {254, "aironet4500", NULL, 0, 0555, awc_driver_proc_table}, {0}};struct ctl_table_header * awc_driver_sysctl_header = NULL;const char awc_procname[]= "awc5";int awc_proc_set_device(int device_number){ int group =0; int rid = 0; struct awc_private * priv; ctl_table * tmp_table_ptr; AWC_ENTRY_EXIT_DEBUG("awc_proc_set_device"); if (!aironet4500_devices[device_number] || (awc_nof_rids <=0 )) return -1 ; priv = (struct awc_private * )aironet4500_devices[device_number]->priv; awc_rids_setup(aironet4500_devices[device_number]); memcpy(&(awc_proc_priv[device_number].proc_table_sys_root[0]), awc_exroot_table,sizeof(struct ctl_table)*2); awc_proc_priv[device_number].proc_table_sys_root[0].ctl_name = 254 - device_number; memcpy(awc_proc_priv[device_number].proc_table_device_root, awc_exdev_table,sizeof(awc_exdev_table) ); awc_proc_priv[device_number].proc_table_device_root[0].ctl_name = device_number+1; awc_proc_priv[device_number].proc_table_sys_root->child = awc_proc_priv[device_number].proc_table_device_root; memcpy(awc_proc_priv[device_number].proc_name,(struct NET_DEVICE * )aironet4500_devices[device_number]->name,5); awc_proc_priv[device_number].proc_name[4]=0; // awc_proc_priv[device_number].proc_name[3]=48+device_number; awc_proc_priv[device_number].proc_table_device_root[0].procname = &(awc_proc_priv[device_number].proc_name[0]); awc_proc_priv[device_number].proc_table = kmalloc(sizeof(struct ctl_table) * (awc_nof_rids+2),GFP_KERNEL); if (!awc_proc_priv[device_number].proc_table){ printk(KERN_CRIT "Out of memory on aironet4500_proc huge table alloc \n"); return -1; } awc_proc_priv[device_number].proc_table_device_root[0].child=awc_proc_priv[device_number].proc_table; if (awc_debug) printk("device %d of %d proc interface setup ",device_number, awc_nof_rids); while (awc_rids[group].selector && group < awc_nof_rids){ if (awc_debug & 0x20000) printk(KERN_CRIT "ridgroup %s size %d \n", awc_rids[group].selector->name,awc_rids[group].size); awc_proc_priv[device_number].proc_table[group].ctl_name = group +1; awc_proc_priv[device_number].proc_table[group+1].ctl_name = 0; awc_proc_priv[device_number].proc_table[group].procname = awc_rids[group].selector->name; awc_proc_priv[device_number].proc_table[group].data = awc_proc_buff; awc_proc_priv[device_number].proc_table[group].maxlen = sizeof(awc_proc_buff) -1; awc_proc_priv[device_number].proc_table[group].mode = 0600; awc_proc_priv[device_number].proc_table[group].child = kmalloc(sizeof(struct ctl_table) * (awc_rids[group].size +2), GFP_KERNEL); awc_proc_priv[device_number].proc_table[group].proc_handler = NULL; awc_proc_priv[device_number].proc_table[group].strategy = NULL; awc_proc_priv[device_number].proc_table[group].de = NULL; awc_proc_priv[device_number].proc_table[group].extra1 = NULL; awc_proc_priv[device_number].proc_table[group].extra2 = NULL; if (!awc_proc_priv[device_number].proc_table[group].child) { awc_proc_priv[device_number].proc_table[group].ctl_name = 0; printk(KERN_CRIT "Out of memory on aironet4500_proc huge table alloc \n"); return 0; } rid=0; while (awc_rids[group].rids[rid].selector && (rid < awc_rids[group].size -1)){// DEBUG(0x20000,"rid %s \n", awc_rids[group].rids[rid].name); awc_proc_priv[device_number].proc_table[group].child[rid].ctl_name = rid +1; awc_proc_priv[device_number].proc_table[group].child[rid+1].ctl_name = 0; awc_proc_priv[device_number].proc_table[group].child[rid].procname = awc_rids[group].rids[rid].name; if (awc_rids[group].rids[rid].array > 1 || awc_rids[group].rids[rid].bits > 32 ){ awc_proc_priv[device_number].proc_table[group].child[rid].data = awc_proc_buff; awc_proc_priv[device_number].proc_table[group].child[rid].maxlen = sizeof(awc_proc_buff) -1; } else { awc_proc_priv[device_number].proc_table[group].child[rid].data = &awc_int_buff; awc_proc_priv[device_number].proc_table[group].child[rid].maxlen = sizeof(awc_int_buff); } if ( awc_rids[group].rids[rid].read_only || awc_rids[group].rids[rid].selector->read_only ) awc_proc_priv[device_number].proc_table[group].child[rid].mode = 0400; else awc_proc_priv[device_number].proc_table[group].child[rid].mode = 0600; awc_proc_priv[device_number].proc_table[group].child[rid].child = NULL; awc_proc_priv[device_number].proc_table[group].child[rid].proc_handler = awc_proc_fun; awc_proc_priv[device_number].proc_table[group].child[rid].strategy = NULL; awc_proc_priv[device_number].proc_table[group].child[rid].de = NULL; awc_proc_priv[device_number].proc_table[group].child[rid].extra1 = (void *) &(((struct awc_private* )aironet4500_devices[device_number]->priv)->rid_dir[group]); awc_proc_priv[device_number].proc_table[group].child[rid].extra2 = (void *) &(awc_rids[group].rids[rid]); rid++; } group++; };// here are driver-level params dir awc_proc_priv[device_number].proc_table[group].ctl_name = group +1; awc_proc_priv[device_number].proc_table[group+1].ctl_name = 0; awc_proc_priv[device_number].proc_table[group].procname = "driver-level"; awc_proc_priv[device_number].proc_table[group].data = awc_proc_buff; awc_proc_priv[device_number].proc_table[group].maxlen = sizeof(awc_proc_buff) -1; awc_proc_priv[device_number].proc_table[group].mode = 0600; awc_proc_priv[device_number].proc_table[group].child = kmalloc(sizeof(awc_driver_level_ctable) , GFP_KERNEL); awc_proc_priv[device_number].proc_table[group].proc_handler = NULL; awc_proc_priv[device_number].proc_table[group].strategy = NULL; awc_proc_priv[device_number].proc_table[group].de = NULL; awc_proc_priv[device_number].proc_table[group].extra1 = NULL; awc_proc_priv[device_number].proc_table[group].extra2 = NULL; if (!awc_proc_priv[device_number].proc_table[group].child) { awc_proc_priv[device_number].proc_table[group].ctl_name = 0; printk(KERN_CRIT "Out of memory on aironet4500_proc huge table alloc \n"); return 0; } tmp_table_ptr = awc_proc_priv[device_number].proc_table[group].child; memcpy(tmp_table_ptr,awc_driver_level_ctable,sizeof(awc_driver_level_ctable)); tmp_table_ptr[0].data = &(priv->force_rts_on_shorter); tmp_table_ptr[1].data = &priv->force_tx_rate; tmp_table_ptr[2].data = (void *) &priv->ip_tos_reliability_rts; tmp_table_ptr[3].data = (void *) &priv->ip_tos_troughput_no_retries; tmp_table_ptr[4].data = (void *) &priv->debug; tmp_table_ptr[5].data = (void *) &priv->simple_bridge; tmp_table_ptr[6].data = (void *) &priv->p802_11_send; tmp_table_ptr[7].data = (void *) &priv->full_stats; awc_proc_priv[device_number].sysctl_header = register_sysctl_table(awc_proc_priv[device_number].proc_table_sys_root,0); AWC_ENTRY_EXIT_DEBUG("exit"); if (awc_proc_priv[device_number].sysctl_header) return 0; return 1; };int awc_proc_unset_device(int device_number){ int k; AWC_ENTRY_EXIT_DEBUG("awc_proc_unset_device"); if (awc_proc_priv[device_number].sysctl_header){ unregister_sysctl_table(awc_proc_priv[device_number].sysctl_header); awc_proc_priv[device_number].sysctl_header = NULL; } if (awc_proc_priv[device_number].proc_table){ for (k=0; awc_proc_priv[device_number].proc_table[k].ctl_name ; k++ ){ if (awc_proc_priv[device_number].proc_table[k].child) kfree(awc_proc_priv[device_number].proc_table[k].child); } kfree(awc_proc_priv[device_number].proc_table); awc_proc_priv[device_number].proc_table = NULL; } if (awc_proc_priv[device_number].proc_table_device_root[0].ctl_name) awc_proc_priv[device_number].proc_table_device_root[0].ctl_name = 0; if (awc_proc_priv[device_number].proc_table_sys_root[0].ctl_name) awc_proc_priv[device_number].proc_table_sys_root[0].ctl_name = 0; AWC_ENTRY_EXIT_DEBUG("exit"); return 0;};static int aironet_proc_init(void) { int i=0; AWC_ENTRY_EXIT_DEBUG("init_module"); for (i=0; i < MAX_AWCS; i++){ awc_proc_set_device(i); } awc_register_proc(awc_proc_set_device, awc_proc_unset_device); awc_driver_sysctl_header = register_sysctl_table(awc_root_table,0); AWC_ENTRY_EXIT_DEBUG("exit"); return 0;};static void aironet_proc_exit(void){ int i=0; AWC_ENTRY_EXIT_DEBUG("cleanup_module"); awc_unregister_proc(); for (i=0; i < MAX_AWCS; i++){ awc_proc_unset_device(i); } if (awc_driver_sysctl_header) unregister_sysctl_table(awc_driver_sysctl_header); AWC_ENTRY_EXIT_DEBUG("exit");};module_init(aironet_proc_init);module_exit(aironet_proc_exit);#endif // whole proc system styff
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -