
路由系统
文章平均质量分 71
redwingz
这个作者很懒,什么都没留下…
展开
-
接口状态与策略路由表
在策略路由表10中,添加默认网关192.168.0.40。查看可见出接口为ens33。如下删除接口ens33接口上的IP地址,路由规则还在,但是路由表10中的ens33相关表项已经被清除,导致策略路由失效。或者将出接口ens33设置为down状态,也将清除路由表10中的路由表项。这导致在接口UP/DOWN,或者修改接口地址时,要重新下发策略路由表中的表项。...原创 2022-08-13 22:22:14 · 500 阅读 · 0 评论 -
策略路由下发
在文件iproute2-5.12.0/ip/iprule.c中,策略路由指定的路由表ID,有两种下发方式。在路由器ID小于256时,使用fib_rule_hdr结构成员table下发;在大于等于256时,使用netlink消息的属性FRA_TABLE下发,此时将fib_rule_hdr结构成员table的值设置为RT_TABLE_UNSPEC。...原创 2022-07-30 23:09:55 · 865 阅读 · 0 评论 -
IPv4路由trie调整
IPv4路由trie的调整包括Collapse、Inflate和Halve。首先看一下涉及到的节点的pos和bits的含义,以父节点tp和子节点n为例。_________________________________________________________________| i | i | i | i | i | i | i | N | N | N | S | S | S | S | S | C |-----------------------------------------------原创 2021-12-12 21:39:13 · 795 阅读 · 3 评论 -
IPv4路由查找
路由查询函数fib_table_lookup,参数中指定了查询操作需要的路由表tb,流信息flp,以及标志位fib_flags,返回结果res。其中流结构flp成员目的地址daddr为查询所需的主key值。fib_flags支持两个lookup标志:FIB_LOOKUP_NOREF和FIB_LOOKUP_IGNORE_LINKSTATE。首先,取得trie的首节点pn,接下来由其第一个子节点n(其cindex=0)开始遍历trie树。/* should be called with rcu_read_l原创 2021-12-05 21:37:50 · 2496 阅读 · 0 评论 -
IPv4路由exception缓存
当前设备的接口ens32的ip地址为192.168.1.109,当前的默认路由为192.168.1.1。# ip address2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:a0:c2:ff brd ff:ff:ff:ff:ff:ff inet 192.168.1.109/24 br原创 2021-11-27 21:22:19 · 3612 阅读 · 0 评论 -
IPv4添加路由表项
IPv4添加路由表项如下IP命令添加路由表项,默认情况下路由添加在main路由表中:# ip route add 19.1.0.0/16 via 192.168.9.1## ip route show table main 19.1.0.0/16 via 192.168.9.1 dev ens34 内核函数inet_rtm_newroute处理路由的添加。函数rtm_to_fib_config将netlink数据转换为内核结构fib_config,fib_table_insert根据fib_c原创 2021-11-19 23:54:53 · 4676 阅读 · 0 评论 -
FIB统计信息文件fib_triestat
如下fib_triestat文件的内容。# cat /proc/net/fib_triestat Basic info: size of leaf: 48 bytes, size of tnode: 40 bytes.Id 10: Aver depth: 1.66 Max depth: 2 Leaves: 3 Prefixes: 3 Internal nodes: 2原创 2021-11-12 22:56:28 · 995 阅读 · 0 评论 -
IPv4路由信息查看fib_trie
创建路由表10,并在其中添加三条路由项:# sudo ip route add 1.1.1.0/24 via 192.168.2.2 table 10 # sudo ip route add 1.1.0.0/16 via 192.168.2.3 table 10 # sudo ip route add 1.0.0.0/8 via 192.168.2.4 table 10 # # ip -d route show table 10unicast 1.0.0.0/8 via 192.16原创 2021-11-09 22:04:53 · 1309 阅读 · 0 评论 -
IPv4路由表
如下IP命令添加路由表项,默认情况下路由添加在main路由表中:# ip route add 192.2.0.0/16 via 192.168.1.106## ip route show table main 192.2.0.0/16 via 192.168.1.106 dev ens32也可指定路由表,如下在local/default表中添加相同目的网络,但是网关不同的路由项:# ip route add 192.2.0.0/16 via 192.168.1.1 table local#原创 2021-11-06 21:02:17 · 2234 阅读 · 0 评论 -
IPv4路由别名fib_alias
fib_alias用于连接tries树节点和基础的fib_info结构。在新增路由表项时,如果没有合适的fib_alias可用,可用表示新增表项和已有fib_alias的tos,priority,以及type,scope相同,并且使用相同的fib_info,则需要创建新的fib_alias结构。添加fib_alias如果在tries树中没有找到可插入fib_alias的叶子节点,即节点l为空,使用函数fib_insert_node添加节点以及相关联的新的fib_alias结构(参见 IPv4路由tri原创 2021-10-31 23:09:19 · 503 阅读 · 0 评论 -
IPv4路由tries树节点添加与查找
在添加路由表项时,首先创建fib_info结构保存路由信息,如果不存在fib_info对应的fib_alias结构,创建新的fib_alias结构,由fib_insert_node函数插入到tries树中,并创建相关的节点。增加trie节点如下插入节点函数fib_insert_node,首先分配一个新的叶子节点。之后,从匹配的父节点(参数tp)中找到对应的子节点n,由于此插入函数是在没有找到相同的节点时调用,所以如果子节点n存在的话,一定是key值没有完全匹配,这里分配一个新的tnode节点。新分配的原创 2021-10-27 21:15:52 · 1590 阅读 · 1 评论 -
IPv6路由下一跳合法性检测
函数fib_check_nh_v6_gw处理IPv6下一跳检查,以下可见主要功能由fib6_nh_init指针指向函数完成。static int fib_check_nh_v6_gw(struct net *net, struct fib_nh *nh, u32 table, struct netlink_ext_ack *extack){ struct fib6_config cfg = { .fc_table = table, .fc_flags = nh-&原创 2021-10-24 20:21:10 · 2003 阅读 · 0 评论 -
IPv4路由下一跳合法性检测
函数fib_check_nh检测下一跳的合法性。int fib_check_nh(struct net *net, struct fib_nh *nh, u32 table, u8 scope, struct netlink_ext_ack *extack){ int err; if (nh->fib_nh_gw_family == AF_INET) err = fib_check_nh_v4_gw(net, nh, table, scope, extack);原创 2021-10-20 21:41:50 · 6596 阅读 · 0 评论 -
IPv4创建路由fib_info结构
内核维护了两个fib_info结构的哈希桶,其中fib_info_hash以fib_info结构中关键几个成员计数的哈希值为哈希桶的索引;而fib_info_laddrhash仅以本地地址来计数哈希桶的索引值。另外,fib_info_cnt表示系统中当前fib_info结构的数量,fib_info_hash_size表示系统中fib_info哈希桶的大小。另外,全局哈希桶fib_info_devhash,大小为256,其中链表链接的为fib_info中的内嵌下一跳结构,此哈希桶以设备ID为哈希值,在设备状原创 2021-10-12 22:09:05 · 729 阅读 · 1 评论 -
IPv6清除路由源地址
在删除接口的IPv6地址时,需要清除使用此地址作为源地址的路由信息中的记录。static void ipv6_del_addr(struct inet6_ifaddr *ifp){ /* clean up prefsrc entries */ rt6_remove_prefsrc(ifp);out: in6_ifa_put(ifp);}如下fib6_clean_all遍历命名空间中的路由树,对于每条路由信息,由函数fib6_remove_prefsrc进行处理,参数为a原创 2021-09-08 23:14:57 · 901 阅读 · 0 评论 -
IPv6下一跳路由器转变为主机
在邻居发现协议处理中,对于NA(Neighbour Advertisement)报文,如果其通过的地址已经存在于邻居表中,但是此次通过没有了NTF_ROUTER标志,表明发送NA报文的设备由路由转换为主机模式,其不在转发报文。因此,需要删除其之前通告的路由。static void ndisc_recv_na(struct sk_buff *skb){ neigh = neigh_lookup(&nd_tbl, &msg->target, dev); if (nei原创 2021-09-07 23:32:32 · 536 阅读 · 0 评论 -
IPv6路由回收
网络命名空间初始化函数fib6_net_init中,初始化定时器ip6_fib_timer,处理函数设置为fib6_gc_timer_cb,用于路由表的清理。static int __net_init fib6_net_init(struct net *net){ size_t size = sizeof(struct hlist_head) * FIB6_TABLE_HASHSZ; err = fib6_notifier_init(net); if (err)原创 2021-09-04 23:18:09 · 866 阅读 · 0 评论 -
IPv6路由树遍历处理函数
在接口down,或者注销等情况下,清除其相关路由。这里的事件有两种:NETDEV_UNREGISTER 和 NETDEV_DOWN。void rt6_disable_ip(struct net_device *dev, unsigned long event){ rt6_sync_down_dev(dev, event); rt6_uncached_list_flush_dev(dev_net(dev), dev); neigh_ifdown(&nd_tbl, dev);原创 2021-09-03 23:19:47 · 439 阅读 · 0 评论 -
PROC文件查看IPv6路由
在命名空间初始化时,函数ip6_route_net_init_late创建文件ipv6_route,用于查看IPv6路由信息,注册的处理结构为ipv6_route_seq_ops。static int __net_init ip6_route_net_init_late(struct net *net){#ifdef CONFIG_PROC_FS proc_create_net("ipv6_route", 0, net->proc_net, &ipv6_route_seq_ops原创 2021-09-02 23:52:38 · 1159 阅读 · 0 评论 -
IPv6获取全部路由
fib6初始化时,注册了路由获取处理函数inet6_dump_fib。int __init fib6_init(void){ ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib, 0); if (ret) goto out_unregister_subsys;如下inet6_dump_fib函数,在第一次获取路由原创 2021-08-27 23:00:48 · 542 阅读 · 0 评论 -
IPv6路由遍历通知链处理
网络命名空间初始化时,初始化walkers链表和使用的读写锁。static int __net_init fib6_net_init(struct net *net){ rwlock_init(&net->ipv6.fib6_walker_lock); INIT_LIST_HEAD(&net->ipv6.fib6_walkers);函数fib6_walker_link和fib6_walker_unlink分别负责向命名空间walkers链表添加walke原创 2021-08-26 22:29:07 · 297 阅读 · 0 评论 -
IPv6路由FIB通知链
在网络命名空间初始化时,初始化fib通知链操作链表。此函数位于文件net/core/fib_notifier.c中,也就是IPv4和IPv6共用。static int __net_init fib_notifier_net_init(struct net *net){ struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id); INIT_LIST_HEAD(&fn_net->fib_no原创 2021-08-25 22:20:58 · 761 阅读 · 0 评论 -
IPv6邻居发现协议添加默认路由
在接收到邻居发现协议的RA(Router Advertisement)报文之后,由ndisc_router_discovery处理。首先,以此报文的源地址查找是否存在默认的路由器(rt6_get_dflt_router),并检测是否存在可达的邻居表项,释放此路由信息。如果RA通告的路由时长为零,并且本机中存在以其为默认路由的路由信息,表明要删除此默认路由信息。static void ndisc_router_discovery(struct sk_buff *skb){ struct fib6原创 2021-08-17 21:42:28 · 3064 阅读 · 0 评论 -
IPv6路由信息的序号
IPv6路由信息序号保存在网络命名空间结构成员fib6_sernum中,其为递增的原子变量,到最大值时,再次由初始值1开始。static int fib6_new_sernum(struct net *net){ int new, old; do { old = atomic_read(&net->ipv6.fib6_sernum); new = old < INT_MAX ? old + 1 : 1; } while (at原创 2021-08-14 00:01:41 · 451 阅读 · 0 评论 -
IPv6每处理器PCPU路由缓存
如下路由查找函数ip6_pol_route,在找到路由之后,首先查找对应的exception缓存,在PMTU改变或者重定向发生时,会创建路由exception缓存,其具有高优先级。struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, int oif, struct flowi6 *fl6, const struct sk_buff *skb, int flags){原创 2021-08-11 21:38:21 · 489 阅读 · 0 评论 -
IPv6路由树修复
以下两种情况需要对路由树进行修复。首先,在添加路由信息失败时,如果fn有值,并且其为中间节点,即其不是包含路由信息的节点(RTN_RTINFO),也不是根节点(RTN_ROOT);或者,fn为根节点,这里在添加第一条路由信息时失败了(根节点的叶子节点为空)。需要对路由树进行修复。int fib6_add(struct fib6_node *root, struct fib6_info *rt, struct nl_info *info, struct netlink_ext_ack *extack){原创 2021-08-10 21:57:10 · 335 阅读 · 0 评论 -
IPv6路由缓存删除
用户层应用ip命令删除IPv6路由缓存:# ip -6 route3001::/64 dev ens33 proto kernel metric 256 pref medium3ffe::/64 via 3001::10 dev ens33 metric 1024 pref medium# # sudo ip -6 route flush exact 3ffe::0/64 via 3001::10 cloned# # ip -6 route3001::/64 dev ens33 proto原创 2021-08-09 22:46:53 · 1390 阅读 · 0 评论 -
IPv6路由删除
用户层应用ip命令删除IPv6路由:# ip -6 -d route unicast 3001::/64 dev ens33 proto kernel scope global metric 256 pref mediumunicast 3ffe::/64 via 3001::10 dev ens33 proto boot scope global metric 1024 pref medium## ip -6 route del 3ffe::0/64 via 3001::10内核函数inet原创 2021-08-07 21:48:31 · 5457 阅读 · 0 评论 -
IPv6路由定位
函数fib6_locate处理用户层面涉及到的路由项查找,如在路由删除时,用了查找对应的路由节点。其与数据处理路径中的路由查找函数fib6_node_lookup不同,比如后者在查询路由时没有目的地址的前缀长度信息。static int ip6_route_del(struct fib6_config *cfg, struct netlink_ext_ack *extack){ struct fib6_table *table; struct fib6_info *rt; str原创 2021-08-05 22:27:25 · 1139 阅读 · 0 评论 -
IPv6路由节点查找
路由表查找函数首先调用fib6_node_lookup查找路由节点,由指定路由表的根节点开始,根据数据流的目的和源地址进行。int fib6_table_lookup(struct net *net, struct fib6_table *table, int oif, struct flowi6 *fl6, struct fib6_result *res, int strict){ struct fib6_node *fn, *saved_fn原创 2021-08-03 22:45:01 · 1227 阅读 · 0 评论 -
IPv6多径路由添加
如下ip命令添加多径路由:# ip -6 route add 3ff0::/64 nexthop via 20::1 weight 10 nexthop via 30::1 weight 30内核函数inet6_rtm_newroute处理ip route命令,对于多径路由由子函数ip6_route_multipath_add负责进行添加操作。static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,原创 2021-07-30 23:29:51 · 1948 阅读 · 0 评论 -
IPv6路由项添加
如下路由添加命令:# ip route add 3ffe::/64 via 3001::1路由添加路由项添加函数__ip6_ins_rt,调用核心函数fib6_add,第一个参数为要插入的路由表的根节点。static int __ip6_ins_rt(struct fib6_info *rt, struct nl_info *info, struct netlink_ext_ack *extack){ int err; struct fib6_原创 2021-07-29 23:42:00 · 3360 阅读 · 0 评论 -
IPv6多路径路由选择
IPv6路径选择主要由函数fib6_select_path完成,如下介绍。如果路由查询结果项中fib6_info没有配置nexthop属性路由,并且siblings的数量为0,不存在多个内置路由路径,则当前路由即为选择的路由。或者siblings的数量不为0,但是此次查询结果已经匹配了指定的出接口,也认为其为合适的路由。跳转到最后out,将路由下一跳赋值给结果fib6_result结构的成员nh(res->nh)。随后将会介绍通用路由查找,其中将先行调用rt6_device_match进行了出接口原创 2021-07-28 20:35:41 · 1305 阅读 · 0 评论 -
IPv6 throw路由
throw路由与unreachable路由大体一致,参考 IPv6 unreachable路由 。如下添加IPv6路由,对于目的地址属于3302::/64的报文,将报文丢弃,回复ICMPV6_DEST_UNREACH类型ICMPv6消息。# sudo ip -6 route add throw 3302::/64 # # ip -6 route::1 dev lo proto kernel metric 256 pref mediumunreachable 3301::/64 dev lo met原创 2021-07-24 22:45:54 · 396 阅读 · 0 评论 -
IPv6 unreachable路由
如下添加IPv6路由,对于目的地址属于3301::/64的报文,将报文丢弃,回复ICMPV6_DEST_UNREACH类型ICMPv6消息。# ip -6 route add unreachable 3301::/64# # ip -6 route::1 dev lo proto kernel metric 256 pref mediumunreachable 3301::/64 dev lo metric 1024 pref medium参考 IPv6-unreachable策略路由 中的介原创 2021-07-24 04:52:15 · 3292 阅读 · 0 评论 -
IPv6 Unreachable策略路由
IPv6全局定义了一个unreachable路由缓存项的模板ip6_null_entry_template,每个网络命名空间将据此生成一个路由缓存项ip6_prohibit_entry。static const struct rt6_info ip6_null_entry_template = { .dst = { .__refcnt = ATOMIC_INIT(1), .__use = 1, .obsolete = DST_OBS原创 2021-07-22 22:35:47 · 1056 阅读 · 0 评论 -
路由nexthop下一跳blackhole属性
以下添加blackhole属性的nexthop及相关路由。# ip -6 nexthop add id 1 blackhole# # ip nexthopid 1 blackhole ## ip -6 nexthop add id 2 blackhole## ip nexthop add id 3 group 1# # ip nexthop id 1 blackhole id 2 blackhole id 3 group 1 # # ip -6 route add 3ffe原创 2021-07-21 22:44:49 · 2310 阅读 · 1 评论 -
IPv6 Blackhole路由
如下添加IPv6路由,对于目的地址属于3301::/64的报文,将报文丢弃。# ip -6 route add blackhole 3301::/64# # ip -6 route::1 dev lo proto kernel metric 256 pref mediumblackhole 3301::/64 dev lo metric 1024 pref medium参考 IPv6-Prohibit路由 中的介绍,此处介绍两者不同的地方。Blackhole路由添加IP命令下发到内核的Bl原创 2021-07-17 22:38:01 · 636 阅读 · 0 评论 -
IPv6 Blackhole策略路由
IPv6全局定义了一个blackhole路由缓存项的模板ip6_blk_hole_entry_template,每个网络命名空间将据此生成一个路由缓存项ip6_blk_hole_entry。static const struct rt6_info ip6_blk_hole_entry_template = { .dst = { .__refcnt = ATOMIC_INIT(1), .__use = 1, .obsolete = D原创 2021-07-17 00:06:51 · 625 阅读 · 0 评论 -
IPv6 Prohibit路由
如下命令添加Prohibit路由项,禁止路由到3301::/64网络的流量。# ip -6 route add prohibit 3301::/64## ip -6 route::1 dev lo proto kernel metric 256 pref mediumprohibit 3301::/64 dev lo metric 1024 pref mediumProhibit路由添加IP命令下发到内核的Prohibit路由项,指定类型rtm_type为RTN_PROHIBIT,内核中将其原创 2021-07-15 22:20:23 · 684 阅读 · 1 评论