- Author : 叨陪鲤
- Email : vip_13031075266@163.com
- Date : 2020.11.30
- Copyright : 未经同意不得转载!!!
- Version : openswan-2.6.51.5
- Reference:https://download.openswan.org/openswan/
目录
1. ipsec封装状态机:
ipsec封装状态机是一个很经典有限状态机实现:(当前状态,执行动作,下一个状态),同时它的核心调度流程也是比较简单:如果当前状态执行成功,则跳转至下一状态。此外在ipsec状态机中,可以通过实际参数配置(如ESP封装、IP隧道封装、AH封装等)来自动选择下一状态,这个是在ipsec_xmit_cont()函数中实现的。
我们直接来看状态机和核心调度流程:
struct { enum ipsec_xmit_value (*action)(struct ipsec_xmit_state *ixs); int next_state; } xmit_state_table[] = { [IPSEC_XSM_INIT1] = {ipsec_xmit_init1, IPSEC_XSM_INIT2 }, [IPSEC_XSM_INIT2] = {ipsec_xmit_init2, IPSEC_XSM_ENCAP_INIT }, [IPSEC_XSM_ENCAP_INIT] = {ipsec_xmit_encap_init, IPSEC_XSM_ENCAP_SELECT }, [IPSEC_XSM_ENCAP_SELECT] = {ipsec_xmit_encap_select, IPSEC_XSM_DONE }, [IPSEC_XSM_ESP] = {ipsec_xmit_esp, IPSEC_XSM_ESP_AH }, [IPSEC_XSM_ESP_AH] = {ipsec_xmit_esp_ah, IPSEC_XSM_CONT }, [IPSEC_XSM_AH] = {ipsec_xmit_ah, IPSEC_XSM_CONT }, [IPSEC_XSM_IPIP] = {ipsec_xmit_ipip, IPSEC_XSM_CONT }, [IPSEC_XSM_IPCOMP] = {ipsec_xmit_ipcomp, IPSEC_XSM_CONT }, [IPSEC_XSM_CONT] = {ipsec_xmit_cont, IPSEC_XSM_DONE }, [IPSEC_XSM_DONE] = {NULL, IPSEC_XSM_DONE}, }; |
ipsec_xsm(struct ipsec_xmit_state *ixs) { enum ipsec_xmit_value stat = IPSEC_XMIT_ENCAPFAIL; unsigned more_allowed;
more_allowed = 1000; while (ixs->state != IPSEC_XSM_DONE && --more_allowed) { |