/* ****************************************************************************** * INTERPEAK SOURCE FILE * * Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipnet_cmd_ip_xfrm.c,v $ $Revision: 1.2.16.3 $ * $Source: /home/interpeak/CVSRoot/ipnet2/src/ipnet_cmd_ip_xfrm.c,v $ * $Author: hxie $ * $State: Exp $ $Locker: $ * * INTERPEAK_COPYRIGHT_STRING * Design and implementation by Joel Hortelius ****************************************************************************** */ /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ #ifdef IPCOM_KERNEL #undef IPCOM_KERNEL #endif #include "ipnet_config.h" /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #define IPCOM_USE_CLIB_PROTO #include #include #include #include #include #include #include "ipnet.h" #include "ipnet_cmd.h" #include "ipnet_ctrl.h" #include "ipnet_h.h" #include "ipnet_sysctl.h" #include "ipnet_cmd_ip.h" #ifdef IPNET_USE_NETLINK /* **************************************************************************** * 4 DEFINES **************************************************************************** */ enum { IPNET_IP_XFRM_MAIN_STATE, IPNET_IP_XFRM_MAIN_POLICY, IPNET_IP_XFRM_MAIN_MAX, IPNET_IP_XFRM_MAIN_MONITOR, IPNET_IP_XFRM_MAIN_HELP, IPNET_IP_XFRM_MAIN_ALL }; enum { IPNET_IP_XFRM_STATE_HELP, IPNET_IP_XFRM_STATE_LIST, IPNET_IP_XFRM_STATE_ADD, IPNET_IP_XFRM_STATE_UPDATE, IPNET_IP_XFRM_STATE_DEL, IPNET_IP_XFRM_STATE_GET, IPNET_IP_XFRM_STATE_DELALL, IPNET_IP_XFRM_STATE_FLUSH, IPNET_IP_XFRM_STATE_MONITOR }; enum { IPNET_IP_XFRM_STATE_ATTRIBUTE_SRC, IPNET_IP_XFRM_STATE_ATTRIBUTE_DST, IPNET_IP_XFRM_STATE_ATTRIBUTE_SPI, IPNET_IP_XFRM_STATE_ATTRIBUTE_REQID, IPNET_IP_XFRM_STATE_ATTRIBUTE_PROTO, IPNET_IP_XFRM_STATE_ATTRIBUTE_MODE, IPNET_IP_XFRM_STATE_ATTRIBUTE_ENC, IPNET_IP_XFRM_STATE_ATTRIBUTE_AUTH, IPNET_IP_XFRM_STATE_ATTRIBUTE_REPLAY_WINDOW, IPNET_IP_XFRM_STATE_ATTRIBUTE_SEQUENCE, IPNET_IP_XFRM_STATE_ATTRIBUTE_LIMIT, IPNET_IP_XFRM_STATE_ATTRIBUTE_ENCAP }; enum { IPNET_IP_XFRM_POLICY_ATTRIBUTE_LIMIT, IPNET_IP_XFRM_POLICY_ATTRIBUTE_INDEX, IPNET_IP_XFRM_POLICY_ATTRIBUTE_PRIO, IPNET_IP_XFRM_POLICY_ATTRIBUTE_PTYPE, IPNET_IP_XFRM_POLICY_ATTRIBUTE_DIR, IPNET_IP_XFRM_POLICY_ATTRIBUTE_ACTION }; enum { IPNET_IP_XFRM_ATTRIBUTE_LIMIT_TIME_SOFT = 32, IPNET_IP_XFRM_ATTRIBUTE_LIMIT_TIME_HARD, IPNET_IP_XFRM_ATTRIBUTE_LIMIT_TIME_USE_SOFT, IPNET_IP_XFRM_ATTRIBUTE_LIMIT_TIME_USE_HARD, IPNET_IP_XFRM_ATTRIBUTE_LIMIT_BYTE_SOFT, IPNET_IP_XFRM_ATTRIBUTE_LIMIT_BYTE_HARD, IPNET_IP_XFRM_ATTRIBUTE_SELECTOR_SRC, IPNET_IP_XFRM_ATTRIBUTE_SELECTOR_DST, IPNET_IP_XFRM_ATTRIBUTE_SELECTOR_DEV, IPNET_IP_XFRM_ATTRIBUTE_SELECTOR_PROTO, IPNET_IP_XFRM_ATTRIBUTE_SELECTOR_SPORT, IPNET_IP_XFRM_ATTRIBUTE_SELECTOR_DPORT, IPNET_IP_XFRM_ATTRIBUTE_SELECTOR_TYPE, IPNET_IP_XFRM_ATTRIBUTE_SELECTOR_CODE }; /* **************************************************************************** * 5 TYPES **************************************************************************** */ typedef struct Ipnet_cmd_ip_module_xfrm_state_filter_struct { Ip_u64 mask; Ip_u32 proto; Ip_u32 mode; Ip_u32 reqid; Ip_u32 spi; Ipnet_ip_prefix_t src; Ipnet_ip_prefix_t dst; } Ipnet_cmd_ip_module_xfrm_state_filter_t; /* **************************************************************************** * 6 EXTERN PROTOTYPES **************************************************************************** */ /* **************************************************************************** * 7 LOCAL PROTOTYPES **************************************************************************** */ IP_STATIC Ip_ssize_t ipnet_cmd_ip_module_xfrm_monitor_modules(Ipnet_ip_config_t *cfg, Ip_u32 modules); /* **************************************************************************** * 8 DATA **************************************************************************** */ static Ipcom_cmd_int_str_map ipnet_ip_xfrm_main[] = { { IPNET_IP_XFRM_MAIN_HELP, "help" }, { IPNET_IP_XFRM_MAIN_STATE, "state" }, { IPNET_IP_XFRM_MAIN_POLICY, "policy" }, { IPNET_IP_XFRM_MAIN_MONITOR, "monitor" }, { IPNET_IP_XFRM_MAIN_ALL, "all" }, { -1, IP_NULL }, }; static Ipcom_cmd_int_str_map ipnet_ip_xfrm_state[] = { { IPNET_IP_XFRM_STATE_HELP, "help" }, { IPNET_IP_XFRM_STATE_LIST, "show" }, { IPNET_IP_XFRM_STATE_LIST, "list" }, { IPNET_IP_XFRM_STATE_LIST, "lst" }, { IPNET_IP_XFRM_STATE_ADD, "add" }, { IPNET_IP_XFRM_STATE_UPDATE, "update" }, { IPNET_IP_XFRM_STATE_GET, "get" }, { IPNET_IP_XFRM_STATE_DEL, "del" }, { IPNET_IP_XFRM_STATE_DEL, "delete" }, { IPNET_IP_XFRM_STATE_DELALL, "delall" }, { IPNET_IP_XFRM_STATE_DELALL, "deleteall" }, { IPNET_IP_XFRM_STATE_FLUSH, "flush" }, { IPNET_IP_XFRM_STATE_MONITOR, "monitor" }, { -1, IP_NULL }, }; static Ipcom_cmd_int_str_map ipnet_ip_xfrm_state_attributes[] = { { IPNET_IP_XFRM_STATE_ATTRIBUTE_SRC, "src" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_DST, "dst" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_SPI, "spi" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_REQID, "reqid" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_PROTO, "proto" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_MODE, "mode" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_ENC, "enc" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_AUTH, "auth" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_ENCAP, "encap" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_SEQUENCE, "seq" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_REPLAY_WINDOW, "replay-window" }, { IPNET_IP_XFRM_STATE_ATTRIBUTE_LIMIT, "limit" }, { -1, IP_NULL }, }; static Ipcom_cmd_int_str_map ipnet_ip_xfrm_limit_attributes[] = { { IPNET_IP_XFRM_ATTRIBUTE_LIMIT_TIME_SOFT, "time-soft" }, { IPNET_IP_XFRM_ATTRIBUTE_LIMIT_TIME_HARD, "time-hard" }, { IPNET_IP_XFRM_ATTRIBUTE_LIMIT_TIME_USE_SOFT, "time-use-soft" }, { IPNET_IP_XFRM_ATTRIBUTE_LIMIT_TIME_USE_HARD, "time-use-hard" }, { IPNET_IP_XFRM_ATTRIBUTE_LIMIT_BYTE_SOFT, "byte-soft" }, { IPNET_IP_XFRM_ATTRIBUTE_LIMIT_BYTE_HARD, "byte-hard" }, { -1, IP_NULL }, }; Ipcom_cmd_int_str_map ipnet_ip_xfrm_proto[] = { { IP_IPPROTO_ESP, "esp" }, { IP_IPPROTO_AH, "ah" }, { -1, IP_NULL }, }; Ipcom_cmd_int_str_map ipnet_ip_xfrm_mode[] = { { IP_XFRM_MODE_TRANSPORT, "transport" }, { IP_XFRM_MODE_TUNNEL, "tunnel" }, { -1, IP_NULL }, }; #define IP_XFRM_ENCAP_ESPINUDP_NONIKE 1 #define IP_XFRM_ENCAP_ESPINUDP 2 Ipcom_cmd_int_str_map ipnet_ip_xfrm_encap_type[] = { { IP_XFRM_ENCAP_ESPINUDP_NONIKE, "espinudp-nonike" }, { IP_XFRM_ENCAP_ESPINUDP, "espinudp" }, { -1, IP_NULL }, }; Ipcom_cmd_int_str_map ipnet_ip_xfrm_policy_dir[] = { { IP_XFRM_POLICY_IN, "in" }, { IP_XFRM_POLICY_OUT, "out" }, { IP_XFRM_POLICY_FWD, "fwd" }, { -1, IP_NULL }, }; Ipcom_cmd_int_str_map ipnet_ip_xfrm_policy_ptype[] = { { IP_XFRM_POLICY_TYPE_MAIN, "main" }, { IP_XFRM_POLICY_TYPE_SUB, "sub" }, { -1, IP_NULL }, }; Ipcom_cmd_int_str_map ipnet_ip_xfrm_policy_action[] = { { IP_XFRM_POLICY_ALLOW, "allow" }, { IP_XFRM_POLICY_BLOCK, "block" }, { -1, IP_NULL }, }; /* **************************************************************************** * 9 STATIC FUNCTIONS **************************************************************************** */ /** COMMON FUNCTIONS **/ IP_STATIC void ipnet_cmd_ip_module_xfrm_init_lft(struct Ip_xfrm_lifetime_cfg *lft) { lft->hard_byte_limit = IP_XFRM_INF; lft->hard_packet_limit = IP_XFRM_INF; lft->soft_byte_limit = IP_XFRM_INF; lft->soft_packet_limit = IP_XFRM_INF; } IP_STATIC int ipnet_cmd_ip_module_xfrm_parse_lft(Ipnet_ip_config_t *cfg, struct Ip_xfrm_lifetime_cfg *lft) { char *sarg; int arg; Ip_u64 uarg64; if (IP_TRUE != ipnet_ip_cmd_param_str(&sarg, cfg)) return ipnet_cmd_ip_requires_argument(cfg, "limit "); if (IP_FALSE == ipnet_ip_str_to_key(&arg, ipnet_ip_xfrm_limit_attributes, sarg)) return ipnet_cmd_ip_unknown_keyword(cfg, sarg); switch (arg) { case IPNET_IP_XFRM_ATTRIBUTE_LIMIT_TIME_SOFT: if (IP_TRUE != ipnet_cmd_ip_check_mask(cfg, "limit time-soft