卷2 第19章 选路请求和选路消息

19.1 引言

内核与进程通过选路消息交换路由信息。

19.2 rtalloc和rtalloc1函数

rtalloc

  • 查找路由
  • 使用高速缓存

rtalloc1

  1. 调用rn_match
  2. 克隆路由(RTF_CLONING)
  3. 处理RTF_XRESOLVE
  4. 递增引用计数

19.3 RTFREE宏和rtfree函数

  • 递减引用计数
  • 引用计数为0时释放

19.4 rtrequest函数

命令

命令说明
RTM_ADD添加路由
RTM_DELETE删除路由
RTM_RESOLVE解析克隆

RTM_DELETE处理

  1. 从树中删除
  2. 释放网关引用
  3. 调用接口请求函数

RTM_RESOLVE处理

  • 克隆现有路由
  • 复制度量和标志

RTM_ADD处理

  1. 分配rtentry
  2. 复制地址
  3. 添加到树
  4. 保存接口指针

19.5 rt_setgate函数

  • 分配并复制网关地址
  • 更新路由

19.6 rtinit函数

  • 添加/删除接口路由
  • 调用rtrequest

19.7 rtredirect函数

  • 处理ICMP重定向
  • 创建/修改主机路由

19.8 选路消息的结构

rt_msghdr结构

成员说明
rtm_msglen消息长度
rtm_version版本
rtm_type消息类型
rtm_flags标志
rtm_addrs地址掩码

消息类型

类型说明
RTM_ADD添加路由
RTM_DELETE删除路由
RTM_CHANGE改变路由
RTM_GET获取路由
RTM_LOSING路由丢失
RTM_REDIRECT重定向
RTM_MISS查找失败
RTM_IFINFO接口信息
RTM_NEWADDR新地址
RTM_DELADDR删除地址

19.9 rt_missmsg函数

  • 生成RTM_MISS消息
  • 调用raw_input

19.10 rt_ifmsg函数

  • 接口状态变化时调用
  • 生成RTM_IFINFO

19.11 rt_newaddrmsg函数

  • 添加/删除地址时调用
  • 生成RTM_NEWADDR/RTM_DELADDR

19.12 rt_msg1函数

  • 构造选路消息
  • 复制地址结构到mbuf

19.13 rt_msg2函数

  • 构造选路消息到缓存
  • 支持sysctl导出

19.14 sysctl_rtable函数

  • 导出路由表
  • NET_RT_DUMP、NET_RT_FLAGS、NET_RT_IFLIST

19.15 sysctl_dumpentry函数

  • 处理单个路由表项
  • 调用rt_msg2

19.16 sysctl_iflist函数

  • 导出接口列表
  • 生成RTM_IFINFO和RTM_NEWADDR

19.17 小结

选路消息提供内核与进程间的路由信息交换。sysctl可导出路由表。