重要数据结构
struct fib_config {
u8 fc_dst_len; //目的地址的掩码
u8 fc_tos;
u8 fc_protocol; //路由协议,其实更像是指该条路由是从何而来,参见RTPROT_STATIC等宏; RTPROT_STATIC表示该route为管理员添加的静态路由,RTPROT_ZEBRA为由zebra添加的路由
u8 fc_scope; //参见rt_scope_t的定义
u8 fc_type; //类型如RTN_UNICAST:直连路由,参见类似的定义
/* 3 bytes unused */
u32 fc_table; //指示哪个路由表,如RT6_TABLE_MAIN
__be32 fc_dst; //目的地址
__be32 fc_gw; //网关
int fc_oif; //出口的网卡
u32 fc_flags; //路由标志
u32 fc_priority; //优先级
__be32 fc_prefsrc; //prefer 源地址,暂不知道用途
struct nlattr *fc_mx;
struct rtnexthop *fc_mp;
int fc_mx_len;
int fc_mp_len;
u32 fc_flow;
u32 fc_nlflags;
struct nl_info fc_nlinfo;
};
路由流程
路由部分在TCP/IP协议的第三层,从网卡接收到IP报文后,要通过路由查找,决定是本地处理还是转发。本机发出IP报文之前,也要通过路由查找,决定是发往本机Loop设备还是真正发送出去
本机发往本机(比较复杂)
应用层将数据发往网络三层(IP层)
ip_queue_xmit
-> ip_route_output*
-> ip_local_out
-> ip_output
-> ip_finish_output
-> [dst->neighour->output] = neigh_resolve_output
其中在ip_route_output*处理中, = net->loopback_dev ->ifindex,并且在__mkroute_output函数中又如下代码
if (flags & RTCF_LOCAL) {
rth-> = ip_local_deliver;
rth->rt_spec_dst = fl->fl4_dst;
}
为之后重新进入本机做好了准备
网络二层neigh处理
neigh_resolve_output
-> [neigh->ops->queue_xmit] = dev_queue_xmit
-> __dev_xmit_skb
-> sch_direct_xmit
-> dev_hard_start_xmit
-> [dev->netdev_ops->ndo_start_xmit] = loopback_xmit
(虚拟)硬件网卡接收到数据
loopback_xmit [@/]
-> netif_rx
-> enqueue_to_backlog
-
路由过程分析 来自淘豆网m.daumloan.com转载请标明出处.