openswan pluto代碼分析--(1)pluto簡介

                                                                                             pluto簡介

pluto是一個openswan中的守護進程,提供IKEv1服務

Pluto通信消息:網卡數據報文消息;whack命令的消息;內核通信消息

接下來分別介紹上面三種通信消息

1. 網卡數據報文消息

打開UDP5004500端口監聽網卡數據----什麼時機可以創建這個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將映射信息存入plutostatetable

   ->select()檢查是否消息,如果返回值爲-1, 則循環檢查,否則跳出循環進行後續消息處理

   ->pfkey_event() 處理select獲取pfkeyfd的可讀消息,

       ->read()讀取消息

       ->pfkey_async()處理來自內核的異步消息


未完待續...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章