通过打开 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输出相关推荐

  1. linux实验报告哈工大,哈工大操作系统实验---lab8:proc文件的实现

    文章目录 实验目的 掌握虚拟文件系统的实现原理 实践文件.目录.文件系统等概念 实验内容 在Linux0.11上实现procfs(proc文件系统)内的psinfo节点,当读取此节点的内容的时候,可得 ...

  2. 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 ...

  3. linux的根文件系统中的proc文件夹详解

    什么是proc文件系统    |linux /proc目录介绍|proc中文手册 proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接 ...

  4. 一文搞懂linux的proc文件

    目录 proc文件夹是干嘛用? proc下都有什么系统信息? /proc/bus /proc/buddyinfo /proc/cgroups /proc/cmdline /proc/consoles ...

  5. 获取系统信息3——proc文件系统介绍和使用

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.proc文件系统介绍 1.操作系统级别的调试 简单程序,可以单步调试:(多线程不行,linux内核不行) 复杂 ...

  6. ASP.NET在主题中添加CSS文件

    ASP.NET在主题中添加CSS文件 在ASP.NET中,可以使用CSS来控制页面上HTML元素和ASP.NET控件的皮肤.如果在主题文件夹中添加了CSS文件,则在页面应用主题时也会自动应用CSS. ...

  7. (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql

    http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...

  8. Linux内核开发:创建proc文件并与用户空间接口

    目录 Proc文件系统 创建一个新的Proc文件 实现读取处理程序 与用户空间交换数据 实现写处理程序 用户空间应用 在第一篇文章中,我们构建了一个具有初始化和退出功能的简单内核模块 ,并介绍了内核编 ...

  9. HTML添加css文件和js文件

    HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 控制了网页的行为 一.链接三个文件: 1.HTML文件 <html><head><link r ...

  10. JAVA如何添加日志文件

    [SSM配置Log4j打印日志,打印SQL语句](https://blog.csdn.net/qq_42651904/article/details/88981997) JAVA添加日志文件:首先导入 ...

最新文章

  1. 学号 20175223 《Java程序设计》第4周学习总结
  2. 《系统集成项目管理工程师》必背100个知识点-64采购文件
  3. 分布式文件系统研究-测试-上传文件测试
  4. KNN算法与Kd树(转载+代码详细解释)
  5. (52)FPGA条件选择(casex)
  6. 「05」回归的诱惑:一文读懂线性回归
  7. python多进程编程实例_Python多进程并发(multiprocessing)用法实例详解
  8. html 怎么调用js中函数返回值,JavaScript 函数
  9. 八数码问题BFS算法
  10. MLO/uboot-spl.bin和uboot.img/uboot.bin
  11. torch.randn()用法
  12. C#控件篇 - 图表控件chart - 添加辅助边界线条
  13. NO.2 微信第三方平台(小程序)授权流程技术说明
  14. Shiro权限控制(二)
  15. 截至2017 年 2 月全球桌面操作系统市场份额:Linux 占 2.05%...
  16. Prometheus组件详解
  17. Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了
  18. 林夕歌词分析数据报告
  19. skimage的简介
  20. 电脑格式化后需要重装系统吗_你知道重装系统对电脑的好处及坏处吗?重装系统的影响都在这里了...

热门文章

  1. 在使用renderTo中遇到的Uncaught TypeError: Cannot read property 'insertAdjacentHTML' of null
  2. confluence挖矿病毒(kdevtmpfsi 、solrd)解决
  3. 变色龙配置文件功能介绍
  4. c 语言 字符串 替换,将字符串中的字符替换成指定字符c
  5. MFC API——》ModifyStyle
  6. 数据备份与恢复、系统备份与恢复
  7. 同步软件ActiveSync连接问题
  8. 2014全国计算机二级visual foxpro,全国计算机等级考试二级_VisualFoxPro语言程序设计_全.pdf...
  9. 飞桨2.0高层api教程——使用BERT实现自动写诗
  10. 2、杂项:Bootloader升级方式---擦、写flash在RAM中运行