linux加载模块失败,linux 第二次加载netlink模块时,内核创建sock失败
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最近在学习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失败相关推荐
- 邮件发送失败原因服务器连接超时,我在发送邮件时经常出现发送失败或是连接超时的情况?...
主要可能的原因是 你发送的由于包含了过大的附件 超过了对方邮箱服务器的限制大小 这种情况尤其是在给国外地址发送时容易出现 我也遇到过 给一土耳其的地址发送时就失败过 他们的服务器限制大小不能超过 ...
- 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )
文章目录 一.动态加载 二.第一代加壳技术 ( DEX 整体加固 ) 三.第二代加壳技术 ( 函数抽取 ) 四.第三代加壳技术 ( Java 函数 -> Native 函数 ) 五.so 动态库 ...
- 2021-01-11小米随身wifi网络创建总是失败是什么问题?
小米随身wifi网络创建总是失败是什么问题? 小米wifi在win10下创建网络失败,一通搜索后解决办法是手工安装一个驱动并zhuan重启机器即可, 把 C:\Program Files (x86)\ ...
- linux ipv6模块,有关Linux ipv6模块加载失败的问题
有关Linux ipv6模块加载失败的问题 同事一个SUSE11sp3环境配置ipv6地址失败,提示不支持IPv6,请求帮助,第一反应是应该ipv6相关内核模块没有加载. 主要检查内容: ipv6地址 ...
- linux modprobe自动加载,Linux运维知识之Linux modprobe自动处理可载入模块命令详解
本文主要向大家介绍了Linux运维知识之Linux modprobe自动处理可载入模块命令详解,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. modprobe(module p ...
- linux判断网卡是否挂载,检查网卡是否加载 - Linux服务器网卡驱动安装及故障排除_服务器应用_Linux公社-Linux系统门户网站...
2.检查网卡是否加载: 驱动硬件是操作系统最基本的功能,操作系统通过各种驱动程序来驾驭硬件设备,和Windows系统不同Linux内核目前采用可加载的模块化设计(LKMs Loadable Kerne ...
- Linux编译mplayer播放badapple及编译fbv加载图片(基于V3S预告板子要开源了)
Linux编译mplayer播放badapple及编译fbv加载图片(基于V3S预告板子要开源了) 1.编译前准备: 1.linux5.10内核 2.2018.02bulidroot 3.v3s板子 ...
- Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)
Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...
- linux 服务器加装硬盘流程及sda sdb加载顺序
使用中服务器容量不够了,于是准备加装硬盘,步骤如下 环境: Linux ubuntu 4.11.0-15-generic 以下是步骤: 1.安装硬盘到服务器中 2.查看硬盘情况 可以看到 sdb 是 ...
最新文章
- kali linux samba,Kali Linux 渗透测试:SMB、SMTP扫描工具(14)
- nav 鼠标移入当前高亮显示,其他消失
- mysql数据库扫描_使用nmap对mysql 数据库进行扫描
- linux c 获取网关ip,linux sh 如何根据出口网关来获取本机出口ip
- Ubuntu装机后的基础应用
- python 桌面歌词_GitHub - Python-Z/musicbox: 网易云音乐命令行版本
- BZOJ3324 : [Scoi2013]火柴棍数字
- internal server error怎么解决_解决redis连接错误:MISCONF Redis is configured to save RDB
- Zend Studio IDE使用yii framework框架无代码提示的解决方法
- wxpython列表控件listctrl设置某行颜色_改变ListCtrl某行的背景色或者字体颜色
- 金蝶云星空即时库存查询SQL语句SQLServer
- 如何删除word页眉的横线
- D-Link DIR505路由器溢出漏洞实战
- uniapp 无法获取动态dom节点,解决方案
- Hadoop之MapReduce02【自定义wordcount案例】
- xposed android 4.4.2,xposed新版54
- KubeEdge Node not ready
- Blender学习笔记-印花(decal)贴图
- 测试人的Java之编程那点事
- c语言巡线程序,小车巡线程序
热门文章
- Rust(9):枚举类型
- 计算机连接宽带还需要登陆用户,每次电脑启动都需要手动连接宽带怎么办? 爱问知识人...
- html内容整体放大缩小,html元素放大缩小的示例-javaScript示例
- 手机屏分几种?什么叫水滴屏、刘海屏、瀑布屏、全面屏?
- Atom汉化之Atom-Simplified-Chinese-Menu
- 基于python和Opencv将多张图片结合为一张图片的办法
- Java多线程案例之线程池
- ECshop 数据库表结构字段说明
- 如何检测本计算机耗电量,如何查看我的电脑到底费不费电?
- vue中使用电子签名