该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

最近在学习netlink,用来实现用户层和内核的通信,在写内核部分代码时,遇到一个奇怪的问题:

每次卸载完模块后,必须修改协议号(NETLINK_TEST),netlink_kernel_create(&init_net,NETLINK_TEST,&cfg);才能成功,不修改协议号,一直创建内核sock失败,

哪位大佬帮帮忙!!!所用平台Ubuntu16.04+linux内核4.15.0-46-generic内核代码如下

[code=c]#include

#include

#include

#include#define MAX_MSG_LEN 1024

//#define USER_PID 66666

#define NETLINK_TEST 21 //proto number

static struct sock* g_sk_nl_k = NULL;

static struct nlmsghdr *g_nlh = NULL; //will contain user's pid,data and so on//static int g_nlmsg_pid = USER_PID;//static void revFromApp(struct sk_buff* skb);//send msg to app

int sendToApp(char *pmsg){

struct nlmsghdr *nlh = NULL;

struct sk_buff *nl_skb_out = NULL;

int ret;

ret= -1; if(!pmsg){

printk("Msg is null,send msg failed!\n");

return -1;

} if(!g_sk_nl_k){

printk("User's pid is'n known,send msg failed!\n");

return -1;

}

nl_skb_out = nlmsg_new(MAX_MSG_LEN,0);//Allocate a new skb to send a new netlink message to nl_APP

//nl_skb_out = alloc_skb(NLMSG_SPACE(MAX_MSG_LEN), GFP_ATOMIC);

if(!nl_skb_out){

printk("Allocate new skb failed,send msg failed!\n");

return -1;

}

nlh = nlmsg_put(nl_skb_out,0,0,0,MAX_MSG_LEN,0);

if(nlh == NULL){

printk("nlmsg_put failaure!\n");

nlmsg_free(nl_skb_out);

return -1;

} NETLINK_CB(nl_skb_out).creds.pid = 0;

//NETLINK_CB(nl_skb_out).dst_group = 0;

memcpy(NLMSG_DATA(nlh), pmsg, strlen(pmsg));

//ret = nlmsg;

ret = netlink_unicast(g_sk_nl_k, nl_skb_out,g_nlh->nlmsg_pid, MSG_DONTWAIT);//USER_PID

if(ret < 0){

printk("nlmsg_unicast failaure!\n");

nlmsg_free(nl_skb_out);

return -1;

}

nlmsg_free(nl_skb_out);

return 0;

}//receive msg from app(only run one time if no loop)

static void revFromApp(struct sk_buff* skb){

char * msgFromApp = NULL;

char * str0 = "msg from kernel";

//struct nlmsghdr *nlh; turn to gloabe

g_nlh=(struct nlmsghdr*)(skb->data); //nlh message from shb's data...(sk_buff:unsigned char *data)

//nlh = nlmsg_hdr(skb);

msgFromApp = nlmsg_data(g_nlh);//get data from struct nlmsghdr *nlh;

//test

printk("msg:%s\n",msgFromApp);

sendToApp(str0);

}struct netlink_kernel_cfg cfg = {

.input=revFromApp,

};//create socket

int netlinkCreate(void){

g_sk_nl_k = netlink_kernel_create(&init_net,NETLINK_TEST,&cfg);

if(!g_sk_nl_k){

printk("Error creating socket!\n");

return -1;

}

return 0;

}//close socket

void netlinkClose(struct sock* sk_nl_k){

if(!sk_nl_k){

//sock_release(sk_nl_k->sk_socket);

netlink_kernel_release(sk_nl_k);

//sk_nl_k = NULL;

}

}//netlink open

static int __init netlink_init(void){

int ret = -1;

ret = netlinkCreate();//get struct sock* g_sk_nl_k

if(ret < 0){

printk("Netlink open failed!\n");

return -1;

}

printk("Netlink open !\n");

return 0;

}//netlink close

static void __exit netlink_exit(void){

//netlink_kernel_release(g_sk_nl_k);

//printk("Netlink close0!\n");

netlinkClose(g_sk_nl_k);

printk("Netlink close1!\n");

}module_init(netlink_init);

module_exit(netlink_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("ysx"); [/code]makefile如下

[code=c]

ifneq ($(KERNELRELEASE),)obj-m :=nldrv.o

#obj-m += hello.oelseKDIR :=/lib/modules/$(shell uname -r)/buildall:

make -C $(KDIR) M=$(PWD) modules

clean:

rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.orderendif

[/code]

linux加载模块失败,linux 第二次加载netlink模块时,内核创建sock失败相关推荐

  1. 邮件发送失败原因服务器连接超时,我在发送邮件时经常出现发送失败或是连接超时的情况?...

    主要可能的原因是 你发送的由于包含了过大的附件 超过了对方邮箱服务器的限制大小 这种情况尤其是在给国外地址发送时容易出现  我也遇到过  给一土耳其的地址发送时就失败过  他们的服务器限制大小不能超过 ...

  2. 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )

    文章目录 一.动态加载 二.第一代加壳技术 ( DEX 整体加固 ) 三.第二代加壳技术 ( 函数抽取 ) 四.第三代加壳技术 ( Java 函数 -> Native 函数 ) 五.so 动态库 ...

  3. 2021-01-11小米随身wifi网络创建总是失败是什么问题?

    小米随身wifi网络创建总是失败是什么问题? 小米wifi在win10下创建网络失败,一通搜索后解决办法是手工安装一个驱动并zhuan重启机器即可, 把 C:\Program Files (x86)\ ...

  4. linux ipv6模块,有关Linux ipv6模块加载失败的问题

    有关Linux ipv6模块加载失败的问题 同事一个SUSE11sp3环境配置ipv6地址失败,提示不支持IPv6,请求帮助,第一反应是应该ipv6相关内核模块没有加载. 主要检查内容: ipv6地址 ...

  5. linux modprobe自动加载,Linux运维知识之Linux modprobe自动处理可载入模块命令详解

    本文主要向大家介绍了Linux运维知识之Linux modprobe自动处理可载入模块命令详解,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. modprobe(module p ...

  6. linux判断网卡是否挂载,检查网卡是否加载 - Linux服务器网卡驱动安装及故障排除_服务器应用_Linux公社-Linux系统门户网站...

    2.检查网卡是否加载: 驱动硬件是操作系统最基本的功能,操作系统通过各种驱动程序来驾驭硬件设备,和Windows系统不同Linux内核目前采用可加载的模块化设计(LKMs Loadable Kerne ...

  7. Linux编译mplayer播放badapple及编译fbv加载图片(基于V3S预告板子要开源了)

    Linux编译mplayer播放badapple及编译fbv加载图片(基于V3S预告板子要开源了) 1.编译前准备: 1.linux5.10内核 2.2018.02bulidroot 3.v3s板子 ...

  8. Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

    Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...

  9. linux 服务器加装硬盘流程及sda sdb加载顺序

    使用中服务器容量不够了,于是准备加装硬盘,步骤如下 环境:  Linux ubuntu 4.11.0-15-generic 以下是步骤: 1.安装硬盘到服务器中 2.查看硬盘情况 可以看到 sdb 是 ...

最新文章

  1. kali linux samba,Kali Linux 渗透测试:SMB、SMTP扫描工具(14)
  2. nav 鼠标移入当前高亮显示,其他消失
  3. mysql数据库扫描_使用nmap对mysql 数据库进行扫描
  4. linux c 获取网关ip,linux sh 如何根据出口网关来获取本机出口ip
  5. Ubuntu装机后的基础应用
  6. python 桌面歌词_GitHub - Python-Z/musicbox: 网易云音乐命令行版本
  7. BZOJ3324 : [Scoi2013]火柴棍数字
  8. internal server error怎么解决_解决redis连接错误:MISCONF Redis is configured to save RDB
  9. Zend Studio IDE使用yii framework框架无代码提示的解决方法
  10. wxpython列表控件listctrl设置某行颜色_改变ListCtrl某行的背景色或者字体颜色
  11. 金蝶云星空即时库存查询SQL语句SQLServer
  12. 如何删除word页眉的横线
  13. D-Link DIR505路由器溢出漏洞实战
  14. uniapp 无法获取动态dom节点,解决方案
  15. Hadoop之MapReduce02【自定义wordcount案例】
  16. xposed android 4.4.2,xposed新版54
  17. KubeEdge Node not ready
  18. Blender学习笔记-印花(decal)贴图
  19. 测试人的Java之编程那点事
  20. c语言巡线程序,小车巡线程序

热门文章

  1. Rust(9):枚举类型
  2. 计算机连接宽带还需要登陆用户,每次电脑启动都需要手动连接宽带怎么办? 爱问知识人...
  3. html内容整体放大缩小,html元素放大缩小的示例-javaScript示例
  4. 手机屏分几种?什么叫水滴屏、刘海屏、瀑布屏、全面屏?
  5. Atom汉化之Atom-Simplified-Chinese-Menu
  6. 基于python和Opencv将多张图片结合为一张图片的办法
  7. Java多线程案例之线程池
  8. ECshop 数据库表结构字段说明
  9. 如何检测本计算机耗电量,如何查看我的电脑到底费不费电?
  10. vue中使用电子签名