linux 路由表 fib,linux内核 路由fib表之创建

2023-10-10 00:50

本文主要是介绍linux 路由表 fib,linux内核 路由fib表之创建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2.2.2 路由创建

当通过netlink,操作类型为RTM_NEWROUTE时,调用inet_rtm_newroute函数添加路由。

功能:

a)、将用户空间配置内容传过来

b)、路由表的创建

c)、路由表项的添加

流程:

cd8aeb3ffceb45e51f122f22b61ae3b9.png

代码:

static int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)

//其中nlh为配置路由的参数,有目的地址、掩码长度、路由表table_id、网关地址等。

{

struct net *net = sock_net(skb->sk);

struct fib_config cfg;

struct fib_table *tb;

int err;

err = rtm_to_fib_config(net, skb, nlh, &cfg); //将netlink传递的消息nlh赋值给fib_config cfg

if (err < 0)

goto errout;

tb = fib_new_table(net, cfg.fc_table); //根据给定路由表ID,获取路由表

if (tb == NULL) {

err = -ENOBUFS;

goto errout;

}

err = tb->tb_insert(tb, &cfg); //获取路由表后,通过insert创建路由表项并添到该路由表

errout:

return err;

}

2.2.2.1 接收用户空间消息

rtm_to_fib_config(net, skb, nlh, &cfg)用于将nlh内容,传递到cfg中。

static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,

struct nlmsghdr *nlh, struct fib_config *cfg)

{

struct nlattr *attr;

int err, remaining;

struct rtmsg *rtm;

err=nlmsg_validate(nlh, sizeof(*rtm), RTA_MAX, rtm_ipv4_policy);

if (err < 0)

goto errout;

memset(cfg, 0, sizeof(*cfg));

//跳过nlh的硬件头部,让rtm指向nlh的内容,即将nlh赋值给rtm

rtm= nlmsg_data(nlh);

//将rtm的内容,赋值给cfg

cfg->fc_dst_len = rtm->rtm_dst_len; //掩码长度

cfg->fc_tos = rtm->rtm_tos; //好像是默认为0

cfg->fc_table = rtm->rtm_table; //路由表id: connected为0;kernel route为255 //如果id为0,kernel会将id设为254

cfg->fc_protocol = rtm->rtm_protocol; //协议类型:connected和kernel route都为11

cfg->fc_scope = rtm->rtm_scope; //范围:connected为253;kernel route为254

cfg->fc_type = rtm->rtm_type; //类型:connected为1;kernel route为2

cfg->fc_flags = rtm->rtm_flags; //connected和kernel route都为1024

cfg->fc_nlflags = nlh->nlmsg_flags;

cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid;

cfg->fc_nlinfo.nlh = nlh;

cfg->fc_nlinfo.nl_net = net;

if (cfg->fc_type > RTN_MAX) {

err = -EINVAL;

goto errout;

}

nlmsg_for_each_attr(attr, nlh, sizeof(struct rtmsg), remaining) {

switch (nla_type(attr)) {

case RTA_DST:

cfg->fc_dst = nla_get_be32(attr);

break;

case RTA_OIF:

cfg->fc_oif = nla_get_u32(attr);

break;

case RTA_GATEWAY:

cfg->fc_gw =nla_get_be32(attr);

break;

case RTA_PRIORITY:

cfg->fc_priority = nla_get_u32(attr);

break;

case RTA_PREFSRC:

cfg->fc_prefsrc = nla_get_be32(attr);

break;

case RTA_METRICS:

cfg->fc_mx = nla_data(attr);

cfg->fc_mx_len = nla_len(attr);

break;

case RTA_MULTIPATH:

cfg->fc_mp = nla_data(attr);

cfg->fc_mp_len = nla_len(attr);

break;

case RTA_FLOW:

cfg->fc_flow = nla_get_u32(attr);

break;

case RTA_TABLE:

cfg->fc_table = nla_get_u32(attr);

break;

}

}

return 0;<

这篇关于linux 路由表 fib,linux内核 路由fib表之创建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/176764

相关文章

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon