[Feature] add GA346 baseline version
Change-Id: Ic62933698569507dcf98240cdf5d9931ae34348f
diff --git a/src/extended/hw_nat/util.c b/src/extended/hw_nat/util.c
new file mode 100644
index 0000000..921b3a4
--- /dev/null
+++ b/src/extended/hw_nat/util.c
@@ -0,0 +1,105 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <linux/fs.h>
+#include <sys/ioctl.h>
+
+int
+getnext (
+ char * src,
+ int separator,
+ char * dest
+ )
+{
+ char * c;
+ int len;
+
+ if ( (src == NULL) || (dest == NULL) ) {
+ return -1;
+ }
+
+ c = strchr(src, separator);
+ if (c == NULL) {
+ return -1;
+ }
+ len = c - src;
+ strncpy(dest, src, len);
+ dest[len] = '\0';
+ return len + 1;
+}
+
+int
+str_to_mac (
+ unsigned char * mac,
+ char * str
+ )
+{
+ int len;
+ char * ptr = str;
+ char buf[128];
+ int i;
+
+ for (i = 0; i < 5; i++) {
+ if ((len = getnext(ptr, ':', buf)) == -1) {
+ return 1; /* parse error */
+ }
+ mac[i] = strtol(buf, NULL, 16);
+ ptr += len;
+ }
+ mac[5] = strtol(ptr, NULL, 16);
+
+ return 0;
+}
+
+int
+str_to_ip (
+ unsigned int * ip,
+ char * str
+ )
+{
+ int len;
+ char * ptr = str;
+ char buf[128];
+ unsigned char c[4];
+ int i;
+
+ for (i = 0; i < 3; ++i) {
+ if ((len = getnext(ptr, '.', buf)) == -1) {
+ return 1; /* parse error */
+ }
+ c[i] = atoi(buf);
+ ptr += len;
+ }
+ c[3] = atoi(ptr);
+ *ip = (c[0]<<24) + (c[1]<<16) + (c[2]<<8) + c[3];
+ return 0;
+}
+
+int
+str_to_ipv6 (
+ unsigned int * ipv6,
+ char * str,
+ unsigned int byte)
+{
+ int len;
+ char * ptr = str;
+ char buf[128];
+ unsigned short c[8];
+ int i;
+ for (i = 0; i < 7; i++) {
+
+ if ((len = getnext(ptr, ':', buf)) == -1) {
+ return 1; /* parse error */
+ }
+ c[i] = strtoul(buf, NULL, 16);
+ ptr += len;
+ //printf("len=%d, c[%d]=%x\n",len, i, c[i]);
+
+ }
+ c[7] = atoi(ptr);
+ *ipv6 = (c[2*byte] <<16) + (c[2*byte + 1]);
+ return 0;
+}
+