[ipsec][strongswan] strongswan源碼分析-- (三) xfrm與strongswan內核接口分析


strongwan sa分析(三)

xfrm與strongswan內核接口分析

1. strongswan的實現

如下圖,業務場景可以分為兩類:

  1. 下發類的交互主要由包觸發或用戶配置動作觸發。
  2. 消息類的交互主要由watcher監聽socket,然后觸發。

netlink_plugin.png

2. 交互機制

2.1 下發消息

消息名 功能定義
XFRM_MSG_ALLOCSPI 獲取SPI
XFRM_MSG_NEWSA 新建SA
XFRM_MSG_UPDSA 更新SA
XFRM_MSG_GETSA 獲取SA
XFRM_MSG_DELSA 刪除SA
XFRM_MSG_FLUSHSA 清空SA
XFRM_MSG_GETSPDINFO 獲取SPD信息
XFRM_MSG_NEWPOLICY 新建安全策略
XFRM_MSG_UPDPOLICY 更新安全策略
XFRM_MSG_GETPOLICY 獲取安全策略
XFRM_MSG_DELPOLICY 刪除安全策略
XFRM_MSG_FLUSHPOLICY 清空安全策略

2.2 接收消息

消息名 功能定義
XFRM_MSG_ACQUIRE ???
XFRM_MSG_EXPIRE CHILD_SA超時
XFRM_MSG_MIGRATE CHILD_SA熱遷移
XFRM_MSG_MAPPING NAT端口關系改變

POLICY也有與CHILD_SA同樣的超時機制,strongswa那種沒有處理這個消息。
消息類型為:XFRM_MSG_POLEXPIRE。同樣分HARD和SOFT。

4. xfrm的消息通信的實現

着重分析兩個消息過程:EXPIRE,ACQUIRE。

4.1 EXPIRE

源碼文件:

linux.git/net/xfrm/xfrm_user.c

消息處理的關鍵函數

static struct xfrm_mgr netlink_mgr = {
	.id		= "netlink",
	.notify		= xfrm_send_state_notify,
	.acquire	= xfrm_send_acquire,
	.compile_policy	= xfrm_compile_policy,
	.notify_policy	= xfrm_send_policy_notify,
	.report		= xfrm_send_report,
	.migrate	= xfrm_send_migrate,
	.new_mapping	= xfrm_send_mapping,
};

policy的超時由timer觸發:

xfrm_policy.c::xfrm_policy_timer()

SA的超時

1. timer觸發

分為hard和soft兩個觸發邏輯

xfrm_state.c::xfrm_timer_handler()
2. 包與字節數觸發

同樣分為hard和soft兩個觸發邏輯。
實現邏輯的代碼:

xfrm_state.c::xfrm_state_check_expire()

在數據包的input和output兩個地方進行檢查:

xfrm_input.c::xfrm_input()
xfrm_output.c::xfrm_output_one()

4.2 ACQUIRE

目前還沒搞懂,到底是干嘛的。

xfrm_state.c::xfrm_state_find()
xfrm_state.c::km_query()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM