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中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删