网站大量收购独家精品文档,联系QQ:2885784924

路由过程分析.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
路由过程分析

重要数据结构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*处理中,已经通过路由查找设置fl.oif = net-loopback_dev -ifindex,并且在__mkroute_output函数中又如下代码if (flags RTCF_LOCAL) { rth-u.dst.input = 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 [@drivers/net/loopback.c]-netif_rx- enqueue_to_backlog- 将报文加入输入队列__skb_queue_tail(queue-input_pkt_queue, skb)- 发起软件中断__raise_softirq_irqoff(NET_RX_SOFTIRQ)早已经注册了此中断处理函数open_softirq(NET_RX_SOFTIRQ, net_rx_action)net_rx_action- 调用[n-poll] = process_backlogprocess_backlog- 将报文从输入队列中取出__skb_dequeue(sd-input_pkt_queue)- __netif_receive_skb重新进入本机的协议栈__netif_receive_skb- 调用ptype_base列表中相应网络协议deliver_skb早在[@net/ipv4/af_inet.c] dev_add_pack(ip_packet_type)中已经将ip_rcv 函数添加到ptype_base列表中最终到达本机网络三层ip_rcv- skb_dst(skb)!=NULL,故不再经过ip_route_input*函数- ip_rcv_finish- dst_input = [skb_dst(skb)-input] = ip_local_d

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档