卷2 第20章 选路插口

20.1 引言

选路插口(PF_ROUTE)用于进程与内核交换选路消息。

20.2 routedomain和protosw结构

routedomain

  • 域:PF_ROUTE
  • 名称:“route”
  • protosw:routsw

routsw

  • 类型:SOCK_RAW
  • 输入:raw_input
  • 输出:route_output
  • 用户请求:route_usrreq

20.3 选路控制块

rawcb结构

成员说明
rcb_next/prev链表指针
rcb_socket回指socket
rcb_proto协议
rcb_faddr远端地址

20.4 raw_init函数

  • 初始化rawcb链表

20.5 route_output函数

处理命令

  1. RTM_ADD:rtrequest
  2. RTM_DELETE:rtrequest
  3. RTM_CHANGE:修改路由
  4. RTM_GET:返回路由信息
  5. RTM_LOCK:锁定度量

响应处理

  • 构造响应消息
  • 调用raw_input发送

20.6 rt_xaddrs函数

  • 从消息中提取地址指针
  • 填充rt_addrinfo结构

20.7 rt_setmetrics函数

  • 设置路由度量
  • 检查锁定标志

20.8 raw_input函数

  • 选择接收进程
  • 复制消息到接收缓存

20.9 route_usrreq函数

  • PRU_ATTACH:分配rawcb
  • PRU_DETACH:释放rawcb
  • 设置SO_USELOOPBACK

20.10 raw_usrreq函数

请求处理

  • PRU_ATTACH:raw_attach
  • PRU_DETACH:raw_detach
  • PRU_SEND:route_output
  • PRU_SOCKADDR:返回本地地址
  • PRU_PEERADDR:返回远端地址

20.11 raw_attach/detach/disconnect

  • raw_attach:插入链表
  • raw_detach:从链表删除
  • raw_disconnect:断开连接

20.12 小结

选路插口提供进程访问内核路由表的接口。rawcb管理选路控制块。