Netlink实例----用户态内核态全包含

Linux 内核态 Socket 编程--更正 Server端代码: #include #include #include #include #include #include int myserver(void){ struct socket *sock,*client_sock; struct sockaddr_in s_addr; unsigned short portnum=0x8870; int ret=0; m 阅读详情
/*
 * netlink_kernel.c
 */

#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include <linux/types.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/mutex.h>
#include <linux/netfilter_ipv4.h>
#include <linux/ip.h>
#include <net/netlink.h>
#include <linux/netlink.h>
#include <linux/spinlock.h>
#include <net/sock.h>

#include "netlink.h"

static struct sock  *nl_sock = NULL;
static struct
{
    __u32 pid;
    rwlock_t lock;
}user_proc;
static DEFINE_MUTEX(nl_mutex);
static void netlink_kernel_rcv(struct sk_buff *skb)
{
    struct nlmsghdr *nlh = NULL;
    if(skb->len >= nlmsg_total_size(0)){ //sizeof(struct nlmsghdr)
        nlh = nlmsg_hdr(skb);
        if( (nlh->nlmsg_len >= sizeof(struct nlmsghdr))
            && (skb->len >= nlh->nlmsg_len)){
            if(nlh->nlmsg_type == NETLINK_TEST_U_PID){
                write_lock_bh(&user_proc.lock);
                user_proc.pid = nlh->nlmsg_pid; //record pid
                printk("NETLINK_TEST_U_PID: user_proc.pid = %d\n",user_proc.pid);
                write_unlock_bh(&user_proc.lock);
            }
         }
    }
 }
static int send_to_user(struct packet_info *info)
{
    int size,ret;
    unsigned char *old_tail;
    struct sk_buff *skb;
    struct nlmsghdr *nlh;
    struct packet_info *pk_info;
    size = NLMSG_SPACE(sizeof(*info));
    skb = alloc_skb(size,GFP_ATOMIC);
    if(!skb){
        printk("alloc skb failed\n");
        return -1;
    }
    old_tail = skb->tail;
    nlh = NLMSG_PUT(skb,0,0,NETLINK_TEST_K_MSG,size - sizeof(*nlh));
    pk_info = NLMSG_DATA(nlh);
    memset(pk_info,0,sizeof(struct packet_info));
    pk_info->src = info->src;
    pk_info->dest = info->dest;
    nlh->nlmsg_len = skb->tail - old_tail;
    NETLINK_CB(skb).pid = 0;
    NETLINK_CB(skb).dst_group = 0;
    read_lock_bh(&user_proc.lock);
    ret = netlink_unicast(nl_sock,skb,user_proc.pid,MSG_DONTWAIT);
    read_unlock_bh(&user_proc.lock);
nlmsg_failure:
    return ret;
}
static unsigned int get_icmp_info(unsigned int hook,
                                  struct sk_buff *skb,
                                  const struct net_device *in,
                                  const struct net_device *out,
                                  int (*okfn)(struct sk_buff *))
{
    struct iphdr *iph = ip_hdr(skb);
    struct packet_info info;
    if(iph->protocol == IPPROTO_ICMP)
    {
        read_lock_bh(&user_proc.lock);
        if(user_proc.pid != 0)
        {
            read_unlock_bh(&user_proc.lock);
            info.src = iph->saddr;
            info.dest = iph->daddr;
            send_to_user(&info);
        }
        else
        {
            read_unlock_bh(&user_proc.lock);
        }
    }
    return NF_ACCEPT;
}
static struct nf_hook_ops netlink_test_ops =
{
    .hook = get_icmp_info,
    .owner = THIS_MODULE,
    .pf = PF_INET,
    .hooknum = NF_INET_PRE_ROUTING,
    .priority = NF_IP_PRI_FILTER - 1,
};
static int netlink_kernel_init(void)
{
    rwlock_init(&user_proc.lock);
    nl_sock = netlink_kernel_create(&init_net,NETLINK_TEST,0,netlink_kernel_rcv,&nl_mutex,THIS_MODULE);
    if(!nl_sock){
        printk("create netlink kernel sock error\n");
        return -1;
    }
    printk("netlink_kernel_init()\n");
    return nf_register_hook(&netlink_test_ops);
}
static void netlink_kernel_exit(void)
{
    if(nl_sock){
        sock_release(nl_sock->sk_socket);
    }
    nf_unregister_hook(&netlink_test_ops);
    printk("netlink_kernel_exit()\n");
}
module_init(netlink_kernel_init);
module_exit(netlink_kernel_exit);

MODULE_LICENSE("GPL");



/*
 *      netlink_user.c
 */
#include <unistd.h>
#include <stdio.h>
#include <linux/types.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <asm/types.h>
#include <linux/netlink.h>
#include <signal.h>
#include "netlink.h"
struct msg_to_kernel
{
    struct nlmsghdr hdr;
};
struct u_packet_info
{
    struct nlmsghdr hdr;
    struct packet_info icmp_info;
};
static int sock_fd = -1;
 
int main()
{
    struct sockaddr_nl local; //local {user space}
    struct sockaddr_nl kpeer; //peer {kernel space}
    struct msg_to_kernel message;
    struct u_packet_info info;
    int k_peer_len,rcv_len;
    struct in_addr addr;

    //create netlink socket
    sock_fd = socket(AF_NETLINK,SOCK_RAW,NETLINK_TEST);
    if(!sock_fd)
    {
        perror("create netlink socket error\n");
        return -1;
    }
    memset(&local,0,sizeof(local));
    local.nl_family = AF_NETLINK;
    local.nl_pid = getpid();
    local.nl_groups = 0;
    if(bind(sock_fd,(struct sockaddr *)&local,sizeof(local)) != 0)
    {
        perror("bind error\n");
        return -1;
    }
 
    memset(&kpeer,0,sizeof(kpeer));
    kpeer.nl_family = AF_NETLINK;
    kpeer.nl_pid = 0;
    kpeer.nl_groups = 0; //not in multicast
 
    memset(&message,0,sizeof(message));
    message.hdr.nlmsg_len = NLMSG_LENGTH(0);
    message.hdr.nlmsg_flags = 0;
    message.hdr.nlmsg_type = NETLINK_TEST_U_PID;
    message.hdr.nlmsg_pid = local.nl_pid;
 
    //send to kernel
    sendto(sock_fd,&message,message.hdr.nlmsg_len,0,(struct sockaddr *)  &kpeer,sizeof(kpeer));
    while(1)
    {
        k_peer_len = sizeof(struct sockaddr_nl);
        rcv_len = recvfrom(sock_fd,&info,sizeof(struct u_packet_info),0,(struct sockaddr *)&kpeer,(socklen_t *)&k_peer_len);
        addr.s_addr = info.icmp_info.src;
        printf("src: %s,",inet_ntoa(addr));
        addr.s_addr = info.icmp_info.dest;
        printf("dst: %s\n",inet_ntoa(addr));
    }
    return 0;

}



[Android][Linux][Netlink]内核态和用户态使用netlink方法总结 一、Netlink概述 二、用户态如何使用netlink 三、内核态如何使用netlink 四、内核态和用户态之间使用netlink实例(NETD) 五、内核态和用户态之间使用netlink实例(SYN FIREWALL) 一、Netlink概述 (本段摘抄自网络) Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket A 阅读详情

相关推荐

Linux netlink socket使用总结

一、netlink机制的引入Linux提供了多种机制来完成内核空间与用户空间之间的数据交换,分别有内核启动参数、模块参数、sysfs、sysctl、系统调用、procfs、seq_file、debugfs、relayfs。其中,模块参数、sysfs、sysctl、procfs、seq_file、debugfs、relayfs是基于文件系统的通信机制,用于内核空间向用户空间输出信息;sysctl、系统

sprintwind的专栏 1万+

netlink机制和udev实例

http://blog.youkuaiyun.com/smartmz/article/details/6036554 LINUX netlink机制     用户空间的程序与设备通信的方法,主要有以下几种方式:   1 通过ioperm获取操作IO端口的权限,然后用inb/inw/ inl/ outb/outw/outl等函数,避开设备驱动程序,直接去操作IO端口。(没有用过)

heyustudent的专栏 1016

【代码模板】如何通过netlink从内核态主动发送消息到用户态?(netlink_kernel_create、nlmsg_new、nlmsg_put、netlink_unicast)

本文通过一个简单的例子介绍了Netlink机制的使用,展示了内核态与用户态之间的异步通信。主要流程包括:内核态驱动注册Netlink用户自定义消息组,用户态程序通过写入字符设备将PID发送给内核态驱动,内核态使用Netlink单播或广播机制通知对应的PID,用户态收到消息后打印出来自内核的信息。内核态程序通过netlink_kernel_create创建Netlink套接字,并通过字符设备接收用户态的PID。用户态程序通过socket创建Netlink套接字,并通过ioctl触发内核态发送消息。最终,用户态

技术札记 1237

编译keepalived netlink-kernel.h:193:2: 错误:未知的类型名‘__u32’ __u32 group;

In file included from global_parser.c:56:0: ../../keepalived/include/namespaces.h:42:49: 警告:‘struct nl_sock’在形参表内部声明 [默认启用] extern int nl_ipvs_connect(const char *, struct nl_sock *); ^ ../../keepalived/in.

qq_34884729的博客 3339

netlink内核态和用户态使用

vold进程: 1.管理和控制Android平台外部存储设备,包括SD插拨、挂载、卸载、格式化 2.3G 4G 模块支持 G3Dev.cpp ----- usb_modeswitch -W -I … netlink Netlink是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的socketAPI就可以使用netlink提供的强大功能,内核态需要使用专门的内核A...

gbmaotai的博客 862

Netlink基本使用

Netlink基本使用 1. 什么是Netlink 什么是Netlink?Netlink是linux提供的用于内核和用户态进程之间的通信方式。但是注意虽然Netlink主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式,一般不用Netlink。除非需要用到Netlink的广播特性时。 那么Netlink有什么优势呢?一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。而前两种都是单向的,但是Netlink可以实现双工通信。 Ne

MinoC0的博客 2993

从特征匹配到意图识别:自定义编译型后门检测实战指南

在网络安全领域,恶意软件检测正从传统的特征匹配向更高级的意图与模式识别演进。其核心原理在于,通过多层次、多维度的关联分析技术,构建对程序本质和攻击者行为的深度理解。这种技术价值在于能够有效应对高度定制化、无固定特征的自定义威胁,例如那些经过源代码级别混淆和加密的编译型后门。在实际应用场景中,这要求安全系统结合静态分析、动态行为监控、内存取证等多维度数据,建立基于权重的可疑模式规则库,并利用关联分析引擎还原攻击链。本文聚焦于自定义编译型后门的检测艺术,深入探讨了如何从攻击者视角构建检测体系,并分享了从数据采集

weixin_33804582的博客 566

FMEA-MSR步骤三:功能分析

目的 FMEA-MSR功能分析的主要目标: ● 功能及各功能之间的关系的可视化 ● 功能树/网络或等效功能矩阵参数图(P图) ● 顾客(外部和内部)功能与相关要求的关联 ● 要求或特性与功能的关联 ● 工程团队(系统、安全和组件)之间的协作 ● 失效分析步骤的基础 (点击链接进入官网领取软件试用) 在监视及系统响应的补充FMEA中,对失效探测和失效响应的监视视为其具有的功能。硬件和软件功能可能包括监视控制状态的功能。 故障/失效的监视和探测功能可能包括超出范围的探测、循环冗余校验、真实性检查和序列计数器检查

Infomass的博客 2391

linux配置内核支持netlink,Linux:编译安装keepalive:/usr/include/netlink/netlink-kernel.h:193:2: error: unknown t...

[root@mysql2 keepalived-2.1.5]# make过多的输出,...main.c:917:8: warning: assuming signed overflow does not occur when simplifying conditional to constant [-Wstrict-overflow]while (wait_count) {^CC da...

weixin_35879114的博客 1008

易灵思Trion FPGA实战:5分钟搞定MIPI硬核配置(附Interface Designer避坑指南)

本文详细介绍了易灵思Trion FPGA中MIPI硬核的快速配置方法,通过Interface Designer工具实现从时钟配置到数据收发的全流程实战。特别针对初次接触Trion系列的设计师,提供了六个关键配置陷阱及解决方案,帮助开发者高效完成嵌入式视觉和高速数据传输项目。

eee77的博客 791

【智能机器人开发全流程:硬件选型、软件架构与ROS实战,打造高效机器人系统】

通过模块化设计与ROS框架的灵活扩展,可快速搭建适应不同场景的机器人系统。实际开发中需重点关注。

dally2的博客 6038

netlink实现与使用方法详解(用户态/内核态)

一、什么是netlink Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。 在Linux 内核中,使用netlink 进行应用与内核通信的应用有很多,如 路由 daemon(NETLINK_ROUTE) 用户态 socket 协议(NETLINK_USERSOCK) 防火墙(NETLINK_FIREWALL) netfilter 子系统(NETLINK_NETFILTER) 内核事件向用户态通知(NETLINK_KOBJECT

weixin_42238049的博客 1万+

Ansys Lumerical 启动时出现 Error: Could not connect to Ansys license server specified at 1055@ 的另一种解决办法

昨天在关闭了中之后 就能正常打开 FDTD 了,结果今天想开启出现了同样的报错:我猜测昨天能启动的原因在于关闭之后要重启电脑,并且在重启之后我第一时间打开 lumerical 测试因此端口没有被占用,今天是在电脑启动之后一段时间才打开所以又遇到了端口占用的问题。

qq_51404184的博客 9549

内核态与用户态进程之间的通信netlink

Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用netlink。3.使用 netlink 的内核部分可以采用模块的方式实现,使用 netlink 的应用部分和内核部分没有编译时依赖,但系统调用就有依赖,而且新的系统调用的实现必须静态地连接到内核中,它无法在模块中实现,使用新系统调用的应用在编译时需要依赖内核。–内核态与用户态进程之间的通信netlink。

xmm6988的博客 1370

第1讲|AI产品经理全景图谱:不是“会用AI工具”,而是能对AI产品结果负责

本文从岗位本质出发,系统拆解 AI 产品经理的职责、岗位类型与能力模型,帮助读者理解 AI PM 与传统 PM 的核心差异,明确自己适合的转型方向,并建立“对 AI 产品结果负责”的产品认知。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1016

④ Django创建用户中心应用users,扩展用户信息

本章配套视频教程 Django创建用户中心应用users,扩展用户数据 在settings.py文件中配置项目 1、语言配置:LANGUAGE_CODE = 'zh-hans’ 2、时区配置:TIME_ZONE = 'Asia\Shanghai’ 3、模板路径配置:‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)], 并创建templates文件

轻编程的博客 672

linux 用户态和内核态通信之netlink机制介绍与实例

0、前言 由于开发需要,用户态要时刻监视内核态状态,以便检测上层应用知道磁盘插拔状态,以便动态管理磁盘。我们可以通过各种各样的用户态和内核态的IPC(interprocess communication)机制来实现。比如系统调用,ioctl接口,proc文件系统以及netlink socket来获取内核态状态信息。本文主要是netlink socket有关知识。 1、net...

阿Sir问道 849

小黄鸭机器人技术全解-第 07 章 关节自由度与行程参数

—鸭子歪着头转头时,转的平面是斜的,这正是它"灵动"感的来源。仿真里这是自动的(轴定义在父刚体系),复刻时不需要做任何事——

yolo模型训练找我,AI游戏合作找我 67

netlink通信——用户态与内核态通信具体实现

这篇文章主要讲解通过netlink通信机制,具体实现用户态与内核态的数据传送。我们的内核环境是2.6.35.6版本。 在文件里包含了Netlink协议簇已经定义好的一些预定义协议: #define NETLINK_ROUTE 0 /* Routing/device hook */ #define NETLINK_

hustfoxy的专栏 2464

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

使用netlink完成用户态跟用户态的通信以及用户态跟内核态的通信

使用netlink机制跟指定进程通信netlink通信编码目标编码实现1、内核态代码2、使用netlink进行通信示例 netlink通信 我们知道,使用netlink可以完成用户跟内核态双向通信,实际使用时,我们需要对netlink进行封装统一的接口,在和指定进程进行通信时,只需要调用指定接口就可以轻松完成用户态到内核态的netlink通信编码。此外,我们上层用户态进程除了需要和内核进行通信外,还需要和其他用户态进程进行通信,因此需要封装统一的接口同时支持netlink用户态到用户态的通信以及用户态到内核

煮酒论英雄 1306

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux netlink实现用户态和内核态数据交互

/ 获取发送者的 PID。// 目标为用户空间。运行insmod hello.ko。// 接收内核的回复。

陌上花开缓缓归以的博客 819

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Linux 网络之netlink 简介

Linux 网络之netlink 简介以及一个简单使用demo

小立仔 1万+

Linux用户态/内核态通信方式汇总

用户态和内核态之间的通信方式主要有以下几种:系统调用(System Call):这是最常见的方式,用户态程序通过系统调用接口(如open、read、write、fork等)请求内核执行特定的动作。系统调用是用户态和内核态之间进行交互的桥梁,它允许用户态程序请求内核提供服务。中断(Interrupts):中断包括软中断和硬中断。当中断到来时,CPU会暂停当前执行的用户态代码,切换到内核态来处理中断。中断机制允许内核在适当的时候介入用户态程序的执行,处理一些紧急或特殊的情况。

zhengyuchao_的博客 2591
上一篇: C调试方法之--------Gprofile
下一篇: 使用find和xargs完成查找任务
kernel_learner
博客等级 码龄15年 60粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值