pluto是一个openswan中的守护进程,提供IKEv1服务
Pluto通信消息:网卡数据报文消息;whack命令的消息;内核通信消息
接下来分别介绍上面三种通信消息
1. 网卡数据报文消息
打开UDP500和4500端口监听网卡数据----什么时机可以创建这个socket还没看出来
call_server中遍历所有网卡检查是否可读
代码:
call_server()中遍历所有网卡检查是否可读
-> comm_handle (const structiface_port *ifp)
-> read_packet(structmsg_digest *md) 读取socket的报文数据
-> process_packet (struct msg_digest **mdp)处理报文
2.whack命令的消息
在pluto的主函数中创建UNIX域套接口ctl_fd,接下来在call_server函数监听ctl_fd读取
whack的输入;whack是控制程序,通过UNIX域套接口和pluto通信
代码:
call_server()检查ctl_fd是否可读
->whack_handle(int whackctlfd)处理whack命令入口
->whack_process(int whackfd, structwhack_message msg)处理whack消息
3. 内核通信消息
和内核进行PFKEY/netlink通信
call_server监听PFKEY对应的socket
call_server()监听和内核通信socket pfkeyfd
->pfkey_dequeue()
->pfkey_async()进行异步消息处理,遍历pfkey_iq_head链表中消息进行处理
->pfkey_msg_parse()消息解析,如果解析失败不进行后续处理
->消息类型检查buf->msg.sadb_msg_type
K_SADB_REGISTER调用klips_pfkey_register向内核注册协议
K_SADB_ACQUIRE调用process_pfkey_acquire
K_SADB_X_NAT_T_NEW_MAPPING调用process_pfkey_nat_t_new_mapping将映射信息存入pluto的statetable中
->select()检查是否消息,如果返回值为-1, 则循环检查,否则跳出循环进行后续消息处理
->pfkey_event() 处理select获取pfkeyfd的可读消息,
->read()读取消息
->pfkey_async()处理来自内核的异步消息
未完待续...