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()處理來自內核的異步消息
未完待續...