
路由系统
redwingz
这个作者很懒,什么都没留下…
-
原创 多径路由选择
以函数ip_route_input_slow为例,在fib查询之后,由函数ip_mkroute_input创建路由缓存项。static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, u8 tos, struct net_device *dev, struct fib_result *res){ err = fib_lookup(net, &fl4,2021-01-05 22:05:2438
0
-
原创 rtnetlink组数量与设置
在文件include/uapi/linux/netlink.h中定义了,目前共有32个组,除去第一个RTNLGRP_NONE,即31个组。/* RTnetlink multicast groups */enum rtnetlink_groups { RTNLGRP_NONE,#define RTNLGRP_NONE RTNLGRP_NONE RTNLGRP_LINK,#define RTNLGRP_LINK RTNLGRP_LINK... RTN2020-12-24 22:24:0043
0
-
原创 rtnetlink的portid选择
在iproute2-5.9.0的文件lib/libnetlink.c中,创建netlink套接口时,地址结构sockaddr_nl,即rth->local没有对其成员nl_pid赋值,仅赋值了nl_family和nl_groups,由内核完成nl_pid的选取。int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions, int protocol){ memset(rth,2020-12-20 20:40:2946
0
-
原创 忽略设置linkdown标志的路由表项
遇到一个路由转发问题,如下路由表,在ens40网卡链路断开的时候,目的地址为192.168.3.0/24网段的报文,还是走ens40网卡,而不是默认路由,导致报文被丢弃。$ ip routedefault via 192.168.9.1 dev ens39 192.168.3.0/24 dev ens40 proto kernel scope link src 192.168.3.248 192.168.9.0/24 dev ens39 proto kernel scope link src 1922020-05-17 22:32:40403
0
-
原创 路由表项中的proto字段
如下的ip命令显示的两条路由,proto的值分别为21和kernel。/ # ip -d routeunicast default via 192.168.1.1 dev ens33 proto 21 scope global unicast 192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.118 / # p...2019-08-13 21:10:273585
0
-
原创 基于MP-BGP的L3 MPLS配置
配置设备华为三层交换机:S5720-32X-EI-AC。拓扑图如下。MPLS 隧道绑定在PE1的VLAN 20接口和PE2的VLAN 40接口上。CE1与CE2之间的流量进入MPLS 通道。 lsr-id 1.1.1.9 lsr-id 2.2.2.9 ...2019-09-02 11:38:541512
0
-
原创 TCP之QUICKACK
当TCP套接口的ACK策略处于QUICKACK模式时,意味着TCP套接口将尝试立即回复对端ACK确认报文。配置用户层可通过setsockopt系统调用的选项TCP_QUICKACK开启QUICKACK模式,但是这不是永久生效的,内核根据之后的报文处理,可能退出此模式。在QUICKACK模式开启之后,如果套接口存在需要调度的ACK,调用tcp_cleanup_rbuf函数进一步检查ACK是...2019-05-10 23:46:422237
0
-
原创 OSPF报文交互流程
使用如下的拓扑结构: |---------------------| |----------------------| | | 172.1.1.1 | | |P1 R1 ...2019-05-15 21:22:223047
0
-
原创 BGP报文流程简介
拓扑结构如下: Local AS:65410 Local AS: 100 |--------------| |------------------| | | 10.1.1.1 | | 10...2019-05-15 21:00:421184
0
-
原创 Linux MPLS功能详解
使用mpls功能,首先需要加载mpls相关的模块:$ sudo modprobe mpls_gso$ sudo modprobe mpls_iptunnel$ sudo modprobe mpls_router 使能mpls的接收和设置labels表项的数量,默认情况下内核不接收mpls报文,如果不使能此项,在如下使用ip命令配置本机环回lo接口接收mpls数据包时就会失败。labels...2018-09-28 10:25:122093
0
-
原创 SKB中缓存的路由类型
skb结构体中的成员_skb_refdst用于暂时缓存路由,避免在skb生存期内的重复路由查找。不同于sock结构体中有两个成员缓存路由:sk_rx_dst缓存入口路由,sk_dst_cache缓存出口路由。skb结构体中的_skb_refdst在特定时刻仅缓存一种路由。路由缓存引用计数如下设置缓存的两个函数,skb_dst_set需要在调用前增加引用计数(dst_clone);而skb_dst_...2018-05-08 16:03:401357
0
-
原创 路由策略
路由策略处理相关的内核代码集中在的net/ipv4/fib_rules.c和net/core/fib_rules.c两个文件内。路由策略的配置独立的ip rule策略配置,可指定源地址、目的地址、入接口、出接口等,或者与iptables配合使用的策略rule。ip rule add from 192.168.1.123 table 5ip rule add to 192.168.1.1 ...2018-05-17 18:13:06960
0
-
原创 路由下一跳中的变数exception
内核通过查询转发信息表(fib_lookup),得到下一跳(fib_nh),从而得到了关于此条路由的相关信息,其中重要的包括下一跳设备nh_dev,下一跳网关nh_gw等。然而,关于此条路由可能存在两个变数exception,其一是这条路由相关的路径MTU(PMTU)发生改变;其二是收到了关于此条路由的ICMP重定向报文。由于此两种改变并不是永久的,内核将他们保存在下一跳fib_nh的except...2018-05-10 15:25:38465
0
-
原创 sock结构体中的出口路由缓存
基于节省路由查找时间的考虑,内核在sock结构体成员sk_dst_cache中缓存了出口路由表项。DATAGRAM出口路由在UDP发包函数中,如果路由缓存rt为空,并且此sock状态为TCP_ESTABLISHED,更新出口路由缓存(sk_dst_set)。TCP_ESTABLISHED为借用了TCP的状态,表明此UDP套接口使用了connect系统调用,建立了一个类似TCP的端到端连接,此时,缓...2018-04-25 12:01:35406
0
-
原创 SKB路由缓存与SOCK路由缓存交互
skb结构体中的成员_skb_refdst与sock结构体中成员sk_rx_dst(缓存入口路由)和sk_dst_cache(缓存出口路由)成员之间的交互操作。SOCK入口路由与SKB路由缓存内核在接收流程中,调用early_demux函数提前在IP层做established状态的sock查找,并负责将sock结构体成员sk_rx_dst的路由缓存赋值给skb成员_skb_refdst,对于UDP...2018-05-09 15:30:15527
0
-
原创 sock结构体中的入口路由缓存
在sock结构体成员sk_rx_dst中缓存入口路由,目的主要用于early_demux功能,执行一次查找即可找到数据包所属的sock和缓存的路由。入口路由缓存之TCPa)作为服务端,三次握手完成时,在函数tcp_v4_syn_recv_sock中创建子sock时赋值;b)作为客户端在函数tcp_finish_connect;c)在函数tcp_rcv_established中sock处于estab...2018-04-24 16:44:32359
0