[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/connectivity/libipsecims/utils_xfrm.c b/src/connectivity/libipsecims/utils_xfrm.c
new file mode 100644
index 0000000..178a19b
--- /dev/null
+++ b/src/connectivity/libipsecims/utils_xfrm.c
@@ -0,0 +1,230 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <string.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+#include <resolv.h>
+#include <asm/types.h>
+#include <linux/pkt_sched.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+#include "utils_xfrm.h"
+#define LOG_TAG "setkey"
+#include <log/log.h>
+#include <cutils/log.h>
+
+
+int mask2bits(__u32 netmask_xfrm)
+{
+	unsigned bits_xfrm = 0;
+	__u32 mask_xfrm = ntohl(netmask_xfrm);
+	__u32 host_xfrm = ~mask_xfrm;
+
+	/* a valid netmask must be 2^n - 1 */
+	if ((host_xfrm & (host_xfrm + 1)) != 0)
+		return -1;
+
+	for (; mask_xfrm; mask_xfrm <<= 1)
+		++bits_xfrm;
+	return bits_xfrm;
+}
+
+int get_netmask(unsigned *val_xfrm, const char *arg_xfrm, int base_xfrm)
+{
+	inet_prefix addr_xfrm;
+
+	if (!get_unsigned(val_xfrm, arg_xfrm, base_xfrm))
+		return 0;
+
+	/* try coverting dotted quad to CIDR */
+	if (!get_addr_1(&addr_xfrm, arg_xfrm, AF_INET) && addr_xfrm.family == AF_INET) {
+		int b_xfrm = mask2bits(addr_xfrm.data[0]);
+
+		if (b_xfrm >= 0) {
+			*val_xfrm = b_xfrm;
+			return 0;
+		}
+	}
+
+	return -1;
+}
+
+int get_unsigned(unsigned *val_xfrm, const char *arg_xfrm, int base_xfrm)
+{
+	unsigned long res_xfrm = 0;
+	char *ptr_xfrm = NULL;
+
+	if (!arg_xfrm || !*arg_xfrm)
+		return -1;
+	res_xfrm = strtoul(arg_xfrm, &ptr_xfrm, base_xfrm);
+	if (!ptr_xfrm || ptr_xfrm == arg_xfrm || *ptr_xfrm || res_xfrm > UINT_MAX)
+		return -1;
+	*val_xfrm = res_xfrm;
+	return 0;
+}
+
+
+int get_u32(__u32 *val_xfrm, const char *arg_xfrm, int base_xfrm)
+{
+	unsigned long res_xfrm = 0;
+	char *ptr_xfrm = NULL;
+
+	if (!arg_xfrm || !*arg_xfrm)
+		return -1;
+	res_xfrm = strtoul(arg_xfrm, &ptr_xfrm, base_xfrm);
+	if (!ptr_xfrm || ptr_xfrm == arg_xfrm || *ptr_xfrm || res_xfrm > 0xFFFFFFFFUL)
+		return -1;
+	*val_xfrm = res_xfrm;
+	return 0;
+}
+
+
+int get_u8(__u8 *val_xfrm, const char *arg_xfrm, int base_xfrm)
+{
+	unsigned long res_xfrm = 0;
+	char *ptr_xfrm = NULL;
+
+	if (!arg_xfrm || !*arg_xfrm)
+		return -1;
+	res_xfrm = strtoul(arg_xfrm, &ptr_xfrm, base_xfrm);
+	if (!ptr_xfrm || ptr_xfrm == arg_xfrm || *ptr_xfrm || res_xfrm > 0xFF)
+		return -1;
+	*val_xfrm = res_xfrm;
+	return 0;
+}
+
+
+
+/* This uses a non-standard parsing (ie not inet_aton, or inet_pton)
+ * because of legacy choice to parse 10.8 as 10.8.0.0 not 10.0.0.8
+ */
+int get_addr_ipv4(__u8 *ap_xfrm, const char *cp_xfrm)
+{
+	int i_xfrm = 0;
+
+	for (i_xfrm = 0; i_xfrm < 4; i_xfrm++) {
+		unsigned long n_xfrm = 0;
+		char *endp_xfrm = NULL;
+
+		n_xfrm = strtoul(cp_xfrm, &endp_xfrm, 0);
+		if (n_xfrm > 255)
+			return -1;	/* bogus network value */
+
+		if (endp_xfrm == cp_xfrm) /* no digits */
+			return -1;
+
+		ap_xfrm[i_xfrm] = n_xfrm;
+
+		if (*endp_xfrm == '\0')
+			break;
+
+		if (i_xfrm == 3 || *endp_xfrm != '.')
+			return -1; 	/* extra characters */
+		cp_xfrm = endp_xfrm + 1;
+	}
+
+	return 1;
+}
+
+int get_addr_1(inet_prefix *addr_xfrm, const char *name_xfrm, int family)
+{
+	memset(addr_xfrm, 0, sizeof(*addr_xfrm));
+
+	if (strcmp(name_xfrm, "default") == 0 ||
+	    strcmp(name_xfrm, "all") == 0 ||
+	    strcmp(name_xfrm, "any") == 0) {
+		if (family == AF_DECnet)
+			return -1;
+		addr_xfrm->family = family;
+		addr_xfrm->bytelen = (family == AF_INET6 ? 16 : 4);
+		addr_xfrm->bitlen = -1;
+		return 0;
+	}
+
+	if (strchr(name_xfrm, ':')) {
+		addr_xfrm->family = AF_INET6;
+		if (family != AF_UNSPEC && family != AF_INET6)
+			return -1;
+		if (inet_pton(AF_INET6, name_xfrm, addr_xfrm->data) <= 0)
+			return -1;
+		addr_xfrm->bytelen = 16;
+		addr_xfrm->bitlen = -1;
+		return 0;
+	}
+
+
+	addr_xfrm->family = AF_INET;
+	if (family != AF_UNSPEC && family != AF_INET)
+		return -1;
+
+	if (get_addr_ipv4((__u8 *)addr_xfrm->data, name_xfrm) <= 0)
+		return -1;
+
+	addr_xfrm->bytelen = 4;
+	addr_xfrm->bitlen = -1;
+	return 0;
+}
+
+int get_prefix(inet_prefix *dst_xfrm, char *arg_xfrm, int family)
+{
+	int err = 0 ;
+	unsigned plen  = 0;
+	char *slash = NULL;
+
+	memset(dst_xfrm, 0, sizeof(*dst_xfrm));
+
+	if (strcmp(arg_xfrm, "default") == 0 ||
+	    strcmp(arg_xfrm, "any") == 0 ||
+	    strcmp(arg_xfrm, "all") == 0) {
+		if (family == AF_DECnet)
+			return -1;
+		dst_xfrm->family = family;
+		dst_xfrm->bytelen = 0;
+		dst_xfrm->bitlen = 0;
+		return 0;
+	}
+
+	slash = strchr(arg_xfrm, '/');
+	if (slash)
+		*slash = 0;
+
+	err = get_addr_1(dst_xfrm, arg_xfrm, family);
+	if (err == 0) {
+		switch(dst_xfrm->family) {
+			case AF_INET6:
+				dst_xfrm->bitlen = 128;
+				break;
+			case AF_DECnet:
+				dst_xfrm->bitlen = 16;
+				break;
+			default:
+			case AF_INET:
+				dst_xfrm->bitlen = 32;
+		}
+		if (slash) {
+			if (get_netmask(&plen, slash+1, 0)
+					|| plen > dst_xfrm->bitlen) {
+				err = -1;
+				goto done;
+			}
+			dst_xfrm->flags |= PREFIXLEN_SPECIFIED;
+			dst_xfrm->bitlen = plen;
+		}
+	}
+done:
+	if (slash)
+		*slash = '/';
+	return err;
+}
+
+
+
+
+