添加proc文件,控制sctp的debug输出
通过打开 kernel 的 menuconfig 的SCTP_DBG_MSG
选项可以输出sctp的debug日志。
但是debug消息输出较多,如果没有不需要定位sctp问题时最好能关闭debug日志。现有一需求,能在不更换kernel的情况下控制sctp debug是否开启。
记录下在/proc/sys/net/sctp下添加一配置文件以实现配置日志是否输出的功能。
首先看下SCTP_DBG_MSG
是如何控制日志是否输出的:
kernel\include\net\sctp\sctp.h
/* Print debugging messages. */
#if SCTP_DEBUG
extern int sctp_debug_flag;
#define SCTP_DEBUG_PRINTK(fmt, args...) \
do { \if (sctp_debug_flag) \printk(KERN_DEBUG pr_fmt(fmt), ##args); \
} while (0)
#define SCTP_DEBUG_PRINTK_CONT(fmt, args...) \
do { \if (sctp_debug_flag) \pr_cont(fmt, ##args); \
} while (0)
#define SCTP_DEBUG_PRINTK_IPADDR(fmt_lead, fmt_trail, \args_lead, addr, args_trail...) \
do { \const union sctp_addr *_addr = (addr); \if (sctp_debug_flag) { \if (_addr->sa.sa_family == AF_INET6) { \printk(KERN_DEBUG \pr_fmt(fmt_lead "%pI6" fmt_trail), \args_lead, \&_addr->v6.sin6_addr, \args_trail); \} else { \printk(KERN_DEBUG \pr_fmt(fmt_lead "%pI4" fmt_trail), \args_lead, \&_addr->v4.sin_addr.s_addr, \args_trail); \} \} \
} while (0)
#define SCTP_ENABLE_DEBUG { sctp_debug_flag = 1; }
#define SCTP_DISABLE_DEBUG { sctp_debug_flag = 0; }#define SCTP_ASSERT(expr, str, func) \if (!(expr)) { \SCTP_DEBUG_PRINTK("Assertion Failed: %s(%s) at %s:%s:%d\n", \str, (#expr), __FILE__, __func__, __LINE__); \func; \}#else /* SCTP_DEBUG */#define SCTP_DEBUG_PRINTK(whatever...)
#define SCTP_DEBUG_PRINTK_CONT(fmt, args...)
#define SCTP_DEBUG_PRINTK_IPADDR(whatever...)
#define SCTP_ENABLE_DEBUG
#define SCTP_DISABLE_DEBUG
#define SCTP_ASSERT(expr, str, func)#endif /* SCTP_DEBUG */
可以看出如果SCTP_DEBUG
宏的值不为0的话就会将输出函数替换为printk
,如果为0的话则这些函数为空。
值得注意的是将输出函数替换为printk
时会先判断一下变量sctp_debug_flag
。
if (sctp_debug_flag) printk(KERN_DEBUG pr_fmt(fmt), ##args);
这个变量会在定义时赋值为1
kernel\net\sctp\debug.c
#if SCTP_DEBUG
int sctp_debug_flag = 1; /* Initially enable DEBUG */
#endif /* SCTP_DEBUG */
那么如果只要将修改sctp_debug_flag
的值就可实现开关debug日志的输出。
我们知道,内核和用户空间之间是隔离的,而常见的交互方法是通过/proc /sys等vfs。搜了一下,发现sctp在/proc/sys/net/sctp/下有专门的目录,里面已经放了一些配置选项了,而且有些配置和我们的需求很像,都是通过一个文件配置一个变量。
这些配置文件的实现方法:
LINUX\opensource\kernel\net\sctp\sysctl.c
static ctl_table sctp_net_table[] = {{.procname = "rto_initial",.data = &init_net.sctp.rto_initial,.maxlen = sizeof(unsigned int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &one,.extra2 = &timer_max},{.procname = "rto_min",.data = &init_net.sctp.rto_min,.maxlen = sizeof(unsigned int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &one,.extra2 = &timer_max},{.procname = "rto_max",.data = &init_net.sctp.rto_max,.maxlen = sizeof(unsigned int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &one,.extra2 = &timer_max},{.procname = "rto_alpha_exp_divisor",.data = &init_net.sctp.rto_alpha,.maxlen = sizeof(int),.mode = 0444,.proc_handler = proc_dointvec,},{.procname = "rto_beta_exp_divisor",.data = &init_net.sctp.rto_beta,.maxlen = sizeof(int),.mode = 0444,.proc_handler = proc_dointvec,},{.procname = "max_burst",.data = &init_net.sctp.max_burst,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &zero,.extra2 = &int_max},{.procname = "cookie_preserve_enable",.data = &init_net.sctp.cookie_preserve_enable,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec,},{.procname = "cookie_hmac_alg",.maxlen = 8,.mode = 0644,.proc_handler = proc_sctp_do_hmac_alg,},{.procname = "valid_cookie_life",.data = &init_net.sctp.valid_cookie_life,.maxlen = sizeof(unsigned int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &one,.extra2 = &timer_max},{.procname = "sack_timeout",.data = &init_net.sctp.sack_timeout,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &sack_timer_min,.extra2 = &sack_timer_max,},{.procname = "hb_interval",.data = &init_net.sctp.hb_interval,.maxlen = sizeof(unsigned int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &one,.extra2 = &timer_max},{.procname = "association_max_retrans",.data = &init_net.sctp.max_retrans_association,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &one,.extra2 = &int_max},{.procname = "path_max_retrans",.data = &init_net.sctp.max_retrans_path,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &one,.extra2 = &int_max},{.procname = "max_init_retransmits",.data = &init_net.sctp.max_retrans_init,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &one,.extra2 = &int_max},{.procname = "pf_retrans",.data = &init_net.sctp.pf_retrans,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &zero,.extra2 = &int_max},{.procname = "sndbuf_policy",.data = &init_net.sctp.sndbuf_policy,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec,},{.procname = "rcvbuf_policy",.data = &init_net.sctp.rcvbuf_policy,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec,},{.procname = "default_auto_asconf",.data = &init_net.sctp.default_auto_asconf,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec,},{.procname = "addip_enable",.data = &init_net.sctp.addip_enable,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec,},{.procname = "addip_noauth_enable",.data = &init_net.sctp.addip_noauth,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec,},{.procname = "prsctp_enable",.data = &init_net.sctp.prsctp_enable,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec,},{.procname = "auth_enable",.data = &init_net.sctp.auth_enable,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_sctp_do_auth,},{.procname = "addr_scope_policy",.data = &init_net.sctp.scope_policy,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec_minmax,.extra1 = &zero,.extra2 = &addr_scope_max,},{.procname = "rwnd_update_shift",.data = &init_net.sctp.rwnd_upd_shift,.maxlen = sizeof(int),.mode = 0644,.proc_handler = &proc_dointvec_minmax,.extra1 = &one,.extra2 = &rwnd_scale_max,},{.procname = "max_autoclose",.data = &init_net.sctp.max_autoclose,.maxlen = sizeof(unsigned long),.mode = 0644,.proc_handler = &proc_doulongvec_minmax,.extra1 = &max_autoclose_min,.extra2 = &max_autoclose_max,},{ /* sentinel */ }
};
以prsctp_enable
为例
.procname 文件名
.data 要修改的变量
.maxlen 变量大小
.mode 文件权限
.proc_handler 接口函数
仿照这个格式,添加我们自己的结构:
{.procname = "sctp_debug_print_enable",.data = &sctp_debug_flag,.maxlen = sizeof(int),.mode = 0644,.proc_handler = proc_dointvec,},
编译运行后果然生成了 /proc/sys/net/sctp/sctp_debug_print_enable 文件
使用方法
打开debug输出 echo 0 > /proc/sys/net/sctp/sctp_debug_print_enable
关闭debug输出 echo 1 > /proc/sys/net/sctp/sctp_debug_print_enable
查看debug状态 cat /proc/sys/net/sctp/sctp_debug_print_enable
添加proc文件,控制sctp的debug输出相关推荐
- linux实验报告哈工大,哈工大操作系统实验---lab8:proc文件的实现
文章目录 实验目的 掌握虚拟文件系统的实现原理 实践文件.目录.文件系统等概念 实验内容 在Linux0.11上实现procfs(proc文件系统)内的psinfo节点,当读取此节点的内容的时候,可得 ...
- qt添加资源文件后编译失败,提示Qt:Error:No rule to make target ’ … /…/??.png’,needed by ‘debug/qrc_qrc.cpp’ stop
提要 项目本来编译没有问题,资源文件忘记添加了,于是添加资源文件后,编译没有通过,提示错误:Qt:Error:No rule to make target ' - /-/??.png',needed ...
- linux的根文件系统中的proc文件夹详解
什么是proc文件系统 |linux /proc目录介绍|proc中文手册 proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接 ...
- 一文搞懂linux的proc文件
目录 proc文件夹是干嘛用? proc下都有什么系统信息? /proc/bus /proc/buddyinfo /proc/cgroups /proc/cmdline /proc/consoles ...
- 获取系统信息3——proc文件系统介绍和使用
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.proc文件系统介绍 1.操作系统级别的调试 简单程序,可以单步调试:(多线程不行,linux内核不行) 复杂 ...
- ASP.NET在主题中添加CSS文件
ASP.NET在主题中添加CSS文件 在ASP.NET中,可以使用CSS来控制页面上HTML元素和ASP.NET控件的皮肤.如果在主题文件夹中添加了CSS文件,则在页面应用主题时也会自动应用CSS. ...
- (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql
http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...
- Linux内核开发:创建proc文件并与用户空间接口
目录 Proc文件系统 创建一个新的Proc文件 实现读取处理程序 与用户空间交换数据 实现写处理程序 用户空间应用 在第一篇文章中,我们构建了一个具有初始化和退出功能的简单内核模块 ,并介绍了内核编 ...
- HTML添加css文件和js文件
HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 控制了网页的行为 一.链接三个文件: 1.HTML文件 <html><head><link r ...
- JAVA如何添加日志文件
[SSM配置Log4j打印日志,打印SQL语句](https://blog.csdn.net/qq_42651904/article/details/88981997) JAVA添加日志文件:首先导入 ...
最新文章
- 学号 20175223 《Java程序设计》第4周学习总结
- 《系统集成项目管理工程师》必背100个知识点-64采购文件
- 分布式文件系统研究-测试-上传文件测试
- KNN算法与Kd树(转载+代码详细解释)
- (52)FPGA条件选择(casex)
- 「05」回归的诱惑:一文读懂线性回归
- python多进程编程实例_Python多进程并发(multiprocessing)用法实例详解
- html 怎么调用js中函数返回值,JavaScript 函数
- 八数码问题BFS算法
- MLO/uboot-spl.bin和uboot.img/uboot.bin
- torch.randn()用法
- C#控件篇 - 图表控件chart - 添加辅助边界线条
- NO.2 微信第三方平台(小程序)授权流程技术说明
- Shiro权限控制(二)
- 截至2017 年 2 月全球桌面操作系统市场份额:Linux 占 2.05%...
- Prometheus组件详解
- Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了
- 林夕歌词分析数据报告
- skimage的简介
- 电脑格式化后需要重装系统吗_你知道重装系统对电脑的好处及坏处吗?重装系统的影响都在这里了...
热门文章
- 在使用renderTo中遇到的Uncaught TypeError: Cannot read property 'insertAdjacentHTML' of null
- confluence挖矿病毒(kdevtmpfsi 、solrd)解决
- 变色龙配置文件功能介绍
- c 语言 字符串 替换,将字符串中的字符替换成指定字符c
- MFC API——》ModifyStyle
- 数据备份与恢复、系统备份与恢复
- 同步软件ActiveSync连接问题
- 2014全国计算机二级visual foxpro,全国计算机等级考试二级_VisualFoxPro语言程序设计_全.pdf...
- 飞桨2.0高层api教程——使用BERT实现自动写诗
- 2、杂项:Bootloader升级方式---擦、写flash在RAM中运行