路由下一跳中的变数exception

2023-12-19 10:58
文章标签 路由 exception 变数

本文主要是介绍路由下一跳中的变数exception,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内核通过查询转发信息表(fib_lookup),得到下一跳(fib_nh),从而得到了关于此条路由的相关信息,其中重要的包括下一跳设备nh_dev,下一跳网关nh_gw等。然而,关于此条路由可能存在两个变数exception,其一是这条路由相关的路径MTU(PMTU)发生改变;其二是收到了关于此条路由的ICMP重定向报文。由于此两种改变并不是永久的,内核将他们保存在下一跳fib_nh的exception中。


路径MTU改变

内核接收到目的地址不可达(ICMP_DEST_UNREACH)类型的ICMP消息,判断其code为ICMP_FRAG_NEEDED,需要更新pmtu。此时,内核会创建一个下一跳exception(fnhe)保存新的mtu值:

static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
{if (fib_lookup(dev_net(dst->dev), fl4, &res, 0) == 0) {struct fib_nh *nh = &FIB_RES_NH(res);update_or_create_fnhe(nh, fl4->daddr, 0, mtu,jiffies + ip_rt_mtu_expires);}
}


路由重定向

内核接收到重定向(ICMP_REDIRECT)类型的ICMP消息,调用update_or_create_fnhe函数创建或者更新路由下一跳exception,设置新的网关地址new_gw。

static void __ip_do_redirect(struct rtable *rt, struct sk_buff *skb, struct flowi4 *fl4, bool kill_route)
{//ICMP头中给出了重定向的新网关IP地址。__be32 new_gw = icmp_hdr(skb)->un.gateway;//发送此ICMP消息的设备为旧网关,saddr为其IP地址__be32 old_gw = ip_hdr(skb)->saddr;struct neighbour *n;n = __ipv4_neigh_lookup(rt->dst.dev, new_gw);if (!n)n = neigh_create(&arp_tbl, &new_gw, rt->dst.dev);if (!IS_ERR(n)) {if (fib_lookup(net, fl4, &res, 0) == 0) {struct fib_nh *nh = &FIB_RES_NH(res);update_or_create_fnhe(nh, fl4->daddr, new_gw,0, jiffies + ip_rt_gc_timeout);}}
}


路由exception查询


查询操作会跳过下一跳(fib_nh->nh_gw下一跳中的nh_gw的值可能已不是最新),首先查询是否存在exception,如果存在,rtable使用exception保存的相关值,包括fnhe_pmtu、fnhe_gw等。

static void fill_route_from_fnhe(struct rtable *rt, struct fib_nh_exception *fnhe)
{rt->rt_pmtu = fnhe->fnhe_pmtu;rt->dst.expires = fnhe->fnhe_expires;if (fnhe->fnhe_gw) {rt->rt_flags |= RTCF_REDIRECTED;rt->rt_gateway = fnhe->fnhe_gw;rt->rt_uses_gateway = 1;}
}

内核版本

linux-4.14.4


这篇关于路由下一跳中的变数exception的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【vue3|第28期】 Vue3 + Vue Router:探索路由重定向的使用与作用

日期:2024年9月8日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083;0.98365 = 0.0006 说

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置

myEclipse失去焦点时报错Unhandled event loop exception的解决方案

一句话:百度杀毒惹的祸。。。。果断卸载后问题解决。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArra

这个错误说的是一个不可变数组负值给了一个可变的数组。有可能你前面定义的数组是一个可变数组,但是在你其他方法里面用他的时候,他就是一个不可变数组,因为在可变数组拿到别的地方用的时候,他会默认为不可变的,可能这只是一个类里面你只是简单的声明了他吧,并没有进行对他初始化,或者分配什么内存,所以他只是一个不可变的数组,当你在其他地方用他的时候,他就默认为不可变的数组,他可能因为你的没分配内存,而变回不可变

Exception in plugin Android ButterKnife zelezny

所在页面的布局文件命名id有问题,不能有两个下划线,,如tv__name

深入拆解 Java 虚拟机 】Exception异常笔记

【深入拆解 Java 虚拟机 】Exception异常笔记 try-with-resource语法糖finally try-with-resource语法糖 try后对象的close方法都会被运行。 package com.exception.demo;public class Foo implements AutoCloseable {private final Strin

微信小程序路由跳转之间的区别

navigateTo: 功能描述: navigateTo用于保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。 页面栈变化: 当使用navigateTo进行页面跳转时,当前页面会被推入页面栈中,但不会被销毁,新页面则显示在屏幕上。因此,页面栈中的元素数量会增加。 注意:一般定制返回时候不要用navigateTo,用navigateBack,否则会导致页面栈过多。 nav

如何为 DigitalOcean 静态路由操作员设置故障转移

静态路由操作器的主要目的是提供更大的灵活性,并在 Kubernetes 环境中控制网络流量。它使你能够根据应用程序的需求自定义路由配置,从而优化网络性能。该操作器作为 DaemonSet 部署,因此将在你的 DigitalOcean Managed Kubernetes 集群的每个节点上运行。 在本教程中,你将学习如何根据 CRD 规范管理每个工作节点的路由表,并设置故障转移网关。

若依框架登录鉴权详解(动态路由)

若依框架登录鉴权:1.获取token(过期在响应拦截器中实现),2.基于RBAC模型获取用户、角色和权限信息(在路由前置守卫),3.根据用户权限动态生成(从字符串->组件,根据permission添加动态路由信息)和添加路由addRoutes(在路由前置守卫) 若依框架(Ruoyi)后端的登录权限身份认证流程是一个复杂但高效的过程,它确保了系统的安全性和数据的保护。以下是一个典型的若依

Vue - 关于Router路由跳转时显示的animate.css动画

Vue - 关于Router路由跳转时显示的animate.css动画 在Vue中,操作路由跳转时页面是闪白的,没有动画效果,我们可以通过在router-view中设置transition,并搭配animate丰富的动画效果来美化路由跳转时的显示效果. 1.安装animate npm i -S animate.css 2.在main中引入animate.css import 'anim