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()处理来自内核的异步消息


未完待续...

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值