[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/connectivity/libipsecims/setkey_xfrm_parse.c b/src/connectivity/libipsecims/setkey_xfrm_parse.c
new file mode 100644
index 0000000..44e1aeb
--- /dev/null
+++ b/src/connectivity/libipsecims/setkey_xfrm_parse.c
@@ -0,0 +1,272 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <errno.h>
+#include <netdb.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <time.h>
+#include <linux/capability.h>
+#include <sys/capability.h>
+#include <cutils/properties.h>
+#include "setkey_fileio.h"
+#include "utils_xfrm.h"
+#include "setkey_xfrm_parse.h"
+#define LOG_TAG "setkey"
+#include <log/log.h>
+#include <cutils/log.h>
+
+
+const struct typeent xfrmproto_types[]= {
+	{ "esp", IPPROTO_ESP }, { "ah", IPPROTO_AH }, { "comp", IPPROTO_COMP },
+	{ "route2", IPPROTO_ROUTING }, { "hao", IPPROTO_DSTOPTS },
+	{ "ipsec-any", IPSEC_PROTO_ANY },
+	{ NULL, -1 }
+};
+
+
+int xfrm_xfrmproto_getbyname(char *name)
+{
+	int i;
+
+	for (i = 0; ; i++) {
+		const struct typeent *t = &xfrmproto_types[i];
+		if (!t->t_name || t->t_type == -1)
+			break;
+
+		if (strcmp(t->t_name, name) == 0)
+			return t->t_type;
+	}
+
+	return -1;
+}
+
+
+int xfrm_id_parse(xfrm_address_t *saddr_xfrm, struct xfrm_id *id, __u16 *family,
+		 char * src,char * dst,char * ipsec_type)
+{
+
+	inet_prefix dst_prefix;
+	inet_prefix src_prefix;
+
+	memset(&dst_prefix, 0, sizeof(dst_prefix));
+	memset(&src_prefix, 0, sizeof(src_prefix));
+
+	get_prefix(&src_prefix, src, AF_UNSPEC);
+	if (family)
+		*family = src_prefix.family;
+	memcpy(saddr_xfrm, &src_prefix.data, sizeof(*saddr_xfrm));
+	get_prefix(&dst_prefix, dst, AF_UNSPEC);
+	memcpy(&id->daddr, &dst_prefix.data, sizeof(id->daddr));
+
+	int ret = xfrm_xfrmproto_getbyname(ipsec_type);
+	if(ret<0)
+	{
+		ALOGD("xfrm_id_parse %s is wrong\n",ipsec_type);
+		return -1;
+	}
+	id->proto = (__u8)ret;
+
+
+	return 0;
+}
+
+void xfrm_encry_algo_parse(char * encry_src, char *name)
+{
+	if(encry_src == NULL)
+		memcpy(name,"ecb(cipher_null)",strlen("ecb(cipher_null)"));
+	else 	if(strcmp(encry_src,"des-cbc")==0)
+		memcpy(name,"cbc(des)",strlen("cbc(des)"));
+	else 	if(strcmp(encry_src,"des-ede3-cbc")==0)
+		memcpy(name,"cbc(des3_ede)",strlen("cbc(des3_ede)"));
+	else 	if(strcmp(encry_src,"3des-cbc")==0)
+		memcpy(name,"cbc(des3_ede)",strlen("cbc(des3_ede)"));
+	else 	if(strcmp(encry_src,"cast5-cbc")==0)
+		memcpy(name,"cbc(cast5)",strlen("cbc(cast5)"));
+	else 	if(strcmp(encry_src,"blowfish-cbc")==0)
+		memcpy(name,"cbc(blowfish)",strlen("cbc(blowfish)"));
+	else 	if(strcmp(encry_src,"aes-cbc")==0)
+		memcpy(name,"cbc(aes)",strlen("cbc(aes)"));
+	else 	if(strcmp(encry_src,"serpent-cbc")==0)
+		memcpy(name,"cbc(serpent)",strlen("cbc(serpent)"));
+	else 	if(strcmp(encry_src,"camellia-cbc")==0)
+		memcpy(name,"cbc(camellia)",strlen("cbc(camellia)"));
+	else 	if(strcmp(encry_src,"twofish-cbc")==0)
+		memcpy(name,"cbc(twofish)",strlen("cbc(twofish)"));
+	else 	if(strcmp(encry_src,"aes-ctr-rfc3686")==0)
+		memcpy(name,"rfc3686(ctr(aes))",strlen("rfc3686(ctr(aes))"));
+	else    if(strcmp(encry_src,"null")==0)
+		memcpy(name,"ecb(cipher_null)",strlen("ecb(cipher_null)"));
+	else
+	{
+		memcpy(name,"not-supported",strlen("not-supported"));
+		ALOGD("xfrm_encry_algo_parse not supported algorithm--%s\n",encry_src);
+	}
+}
+
+void xfrm_interg_algo_parse(char * interg_src, char *name)
+{
+	if(interg_src == NULL)
+		memcpy(name,"digest_null",strlen("digest_null"));
+	else 	if(strcmp(interg_src,"hmac-md5")==0)
+		memcpy(name,"hmac(md5)",strlen("hmac(md5)"));
+	else 	if(strcmp(interg_src,"hmac-sha1")==0)
+		memcpy(name,"hmac(sha1)",strlen("hmac(sha1)"));
+	else 	if(strcmp(interg_src,"hmac-sha256")==0)
+		memcpy(name,"hmac(sha256)",strlen("hmac(sha256)"));
+	else 	if(strcmp(interg_src,"hmac-sha384)")==0)
+		memcpy(name,"hmac(sha384)",strlen("hmac(sha384)"));
+	else 	if(strcmp(interg_src,"hmac-sha512")==0)
+		memcpy(name,"hmac(sha512)",strlen("hmac(sha512)"));
+	else 	if(strcmp(interg_src,"hmac-rmd160")==0)
+		memcpy(name,"hmac(rmd160)",strlen("hmac(rmd160)"));
+	else 	if(strcmp(interg_src,"aes-xcbc")==0)
+		memcpy(name,"xcbc(aes)",strlen("xcbc(aes)"));
+	else 	if(strcmp(interg_src,"cmac(aes)")==0)
+		memcpy(name,"aes-cmac",strlen("aes-cmac"));
+	else 	if(strcmp(interg_src,"null")==0)
+		memcpy(name,"digest_null",strlen("digest_null"));
+	else
+	{
+		memcpy(name,"not-supported",strlen("not-supported"));
+		ALOGD("xfrm_interg_algo_parse not supported algorithm--%s\n",interg_src);
+	}
+}
+
+
+int xfrm_algo_parse(struct xfrm_algo *alg, char *name, char *key, char *buf, int max)
+{
+	int len;
+	int slen = strlen(key);
+
+	strncpy(alg->alg_name, name, sizeof(alg->alg_name));
+
+	if (slen > 2 && strncmp(key, "0x", 2) == 0) {
+		/* split two chars "0x" from the top */
+		char *p = key + 2;
+		int plen = slen - 2;
+		int i;
+		int j;
+
+		/* Converting hexadecimal numbered string into real key;
+		 * Convert each two chars into one char(value). If number
+		 * of the length is odd, add zero on the top for rounding.
+		 */
+
+		/* calculate length of the converted values(real key) */
+		len = (plen + 1) / 2;
+		if (len > max)
+		{
+			ALOGD("xfrm_algo_parse key(len:%d) makes buffer overflow\n",len);
+			return -1;
+		}
+
+		for (i = - (plen % 2), j = 0; j < len; i += 2, j++) {
+			char vbuf[3];
+			__u8 val;
+
+			vbuf[0] = i >= 0 ? p[i] : '0';
+			vbuf[1] = p[i + 1];
+			vbuf[2] = '\0';
+
+			if (get_u8(&val, vbuf, 16))
+			{
+				ALOGD("xfrm_algo_parse key(len:%s) is invalid\n",key);
+				return -1;
+			}
+			buf[j] = val;
+		}
+	} else {
+		len = slen;
+		if (len > 0) {
+			if (len > max)
+			{
+				ALOGD("xfrm_algo_parse key(len:%d) makes buffer overflow\n",len);
+				return -1;
+			}
+
+			strncpy(buf, key, len);
+		}
+	}
+
+	alg->alg_key_len = len * 8;
+
+	return 0;
+}
+
+__u8 xfrm_dir_parse(char * dir_str)
+{
+	__u8 dir;
+	if(strcmp(dir_str,"out")==0)
+		dir = XFRM_POLICY_OUT;
+	else if(strcmp(dir_str,"in")==0)
+		dir = XFRM_POLICY_IN;
+	else if(strcmp(dir_str,"fwd")==0)
+		dir = XFRM_POLICY_FWD;
+	else
+		dir = XFRM_POLICY_ERROR;
+	return dir;
+}
+
+int xfrm_mode_parse(__u8 *mode, char * mode_str)
+{
+
+
+	if (strcmp(mode_str, "transport") == 0)
+		*mode = XFRM_MODE_TRANSPORT;
+	else if (strcmp(mode_str, "tunnel") == 0)
+		*mode = XFRM_MODE_TUNNEL;
+	else if (strcmp(mode_str, "ro") == 0)
+		*mode = XFRM_MODE_ROUTEOPTIMIZATION;
+	else if (strcmp(mode_str, "in_trigger") == 0)
+		*mode = XFRM_MODE_IN_TRIGGER;
+	else if (strcmp(mode_str, "beet") == 0)
+		*mode = XFRM_MODE_BEET;
+	else
+		return -1;
+
+
+	return 0;
+}
+
+void xfrm_selector_parse(struct xfrm_selector *sel, char * src,char * dst,enum PROTOCOL_TYPE protocol,char * src_port,char * dst_port)
+{
+
+	inet_prefix dst_prefix;
+	inet_prefix src_prefix;
+
+	memset(&dst_prefix, 0, sizeof(dst_prefix));
+	memset(&src_prefix, 0, sizeof(src_prefix));
+
+
+	get_prefix(&src_prefix, src, AF_UNSPEC);
+	memcpy(&sel->saddr, &src_prefix.data, sizeof(sel->saddr));
+	sel->prefixlen_s = src_prefix.bitlen;
+
+	get_prefix(&dst_prefix, dst, AF_UNSPEC);
+	memcpy(&sel->daddr, &dst_prefix.data, sizeof(sel->daddr));
+	sel->prefixlen_d = dst_prefix.bitlen;
+
+	sel->family = dst_prefix.family;
+
+	sel->sport = htons(atoi(src_port));
+	sel->dport = htons(atoi(dst_port));
+	sel->dport_mask = ~((__u16)0);
+	sel->sport_mask = ~((__u16)0);
+
+	sel->user = getpid();
+
+	sel->proto = protocol;
+#ifdef INIT_ENG_BUILD
+	if(sel->family == AF_INET)
+	ALOGD("xfrm_selector_parse family:%u,prefix_d:%u,prefix_s:%u,daddr:0x%x,saddr:0x%x,sel->sport:%d,sel->dport:%d,proto:%u,user:%u\n",sel->family,sel->prefixlen_d,sel->prefixlen_s,sel->daddr.a4,sel->daddr.a4,sel->sport,sel->dport,sel->proto,sel->user);
+	else
+	ALOGD("xfrm_selector_parse family:%u,prefix_d:%u,prefix_s:%u,daddr:0x%x %x %x %x,saddr:0x%x %x %x %x ,sel->sport:%d,sel->dport:%d,proto:%u,user:%u\n",sel->family,sel->prefixlen_d,sel->prefixlen_s,sel->daddr.a6[0],sel->daddr.a6[1],sel->daddr.a6[2],sel->daddr.a6[3],sel->saddr.a6[0],sel->saddr.a6[1],sel->saddr.a6[2],sel->saddr.a6[3],sel->sport,sel->dport,sel->proto,sel->user);
+#endif
+}
+
+
+