Added inet_pton.cpp
authorIdo Barnea <[email protected]>
Sun, 30 Oct 2016 13:00:30 +0000 (15:00 +0200)
committerIdo Barnea <[email protected]>
Sun, 30 Oct 2016 13:00:30 +0000 (15:00 +0200)
Signed-off-by: Ido Barnea <[email protected]>
linux/ws_main.py
linux_dpdk/ws_main.py
src/inet_pton.cpp [new file with mode: 0644]
src/utl_yaml.cpp

index 2a0d728..79e2691 100755 (executable)
@@ -103,6 +103,7 @@ bp_sim_gtest = SrcGroup(dir='src',
 
 main_src = SrcGroup(dir='src',
         src_list=[
+             'inet_pton.cpp',
              'bp_sim.cpp',
              'os_time.cpp',
              'rx_check.cpp',
index 0a2c9df..0a6ff7c 100755 (executable)
@@ -106,6 +106,7 @@ def getstatusoutput(cmd):
 
 main_src = SrcGroup(dir='src',
         src_list=[
+             'bp_sim.cpp',
              'utl_term_io.cpp',
              'global_io_mode.cpp',
              'main_dpdk.cpp',
@@ -114,7 +115,7 @@ main_src = SrcGroup(dir='src',
              'debug.cpp',
              'flow_stat.cpp',
              'flow_stat_parser.cpp',
-             'bp_sim.cpp',
+             'inet_pton.cpp',
              'pkt_gen.cpp',
              'platform_cfg.cpp',
              'pre_test.cpp',
diff --git a/src/inet_pton.cpp b/src/inet_pton.cpp
new file mode 100644 (file)
index 0000000..3a4a12d
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <string.h>
+
+typedef unsigned char u_char;
+typedef unsigned int  u_int;
+/* int
+ * inet_pton4(src, dst)
+ *     like inet_aton() but without all the hexadecimal and shorthand.
+ * return:
+ *     1 if `src' is a valid dotted quad, else 0.
+ * notice:
+ *     does not touch `dst' unless it's returning 1.
+ * author:
+ *     Paul Vixie, 1996.
+ */
+int
+my_inet_pton4(const char *src, u_char *dst)
+{
+    static const char digits[] = "0123456789";
+    int saw_digit, octets, ch;
+#define NS_INADDRSZ    4
+    u_char tmp[NS_INADDRSZ], *tp;
+
+    saw_digit = 0;
+    octets = 0;
+    *(tp = tmp) = 0;
+    while ((ch = *src++) != '\0') {
+        const char *pch;
+
+        if ((pch = strchr(digits, ch)) != NULL) {
+            u_int new_d = *tp * 10 + (pch - digits);
+
+            if (saw_digit && *tp == 0)
+                return (0);
+            if (new_d > 255)
+                return (0);
+            *tp = new_d;
+            if (!saw_digit) {
+                if (++octets > 4)
+                    return (0);
+                saw_digit = 1;
+            }
+        } else if (ch == '.' && saw_digit) {
+            if (octets == 4)
+                return (0);
+            *++tp = 0;
+            saw_digit = 0;
+        } else
+            return (0);
+    }
+    if (octets < 4)
+        return (0);
+    memcpy(dst, tmp, NS_INADDRSZ);
+    return (1);
+}
+
+/* int
+ * inet_pton6(src, dst)
+ *     convert presentation level address to network order binary form.
+ * return:
+ *     1 if `src' is a valid [RFC1884 2.2] address, else 0.
+ * notice:
+ *     (1) does not touch `dst' unless it's returning 1.
+ *     (2) :: in a full address is silently ignored.
+ * credit:
+ *     inspired by Mark Andrews.
+ * author:
+ *     Paul Vixie, 1996.
+ */
+int
+my_inet_pton6(const char *src, u_char *dst)
+{
+    static const char xdigits_l[] = "0123456789abcdef",
+              xdigits_u[] = "0123456789ABCDEF";
+#define NS_IN6ADDRSZ   16
+#define NS_INT16SZ     2
+    u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
+    const char *xdigits, *curtok;
+    int ch, seen_xdigits;
+    u_int val;
+
+    memset((tp = tmp), '\0', NS_IN6ADDRSZ);
+    endp = tp + NS_IN6ADDRSZ;
+    colonp = NULL;
+    /* Leading :: requires some special handling. */
+    if (*src == ':')
+        if (*++src != ':')
+            return (0);
+    curtok = src;
+    seen_xdigits = 0;
+    val = 0;
+    while ((ch = *src++) != '\0') {
+        const char *pch;
+
+        if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
+            pch = strchr((xdigits = xdigits_u), ch);
+        if (pch != NULL) {
+            val <<= 4;
+            val |= (pch - xdigits);
+            if (++seen_xdigits > 4)
+                return (0);
+            continue;
+        }
+        if (ch == ':') {
+            curtok = src;
+            if (!seen_xdigits) {
+                if (colonp)
+                    return (0);
+                colonp = tp;
+                continue;
+            } else if (*src == '\0') {
+                return (0);
+            }
+            if (tp + NS_INT16SZ > endp)
+                return (0);
+            *tp++ = (u_char) (val >> 8) & 0xff;
+            *tp++ = (u_char) val & 0xff;
+            seen_xdigits = 0;
+            val = 0;
+            continue;
+        }
+        if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
+            my_inet_pton4(curtok, tp) > 0) {
+            tp += NS_INADDRSZ;
+            seen_xdigits = 0;
+            break;     /*%< '\\0' was seen by inet_pton4(). */
+        }
+        return (0);
+    }
+    if (seen_xdigits) {
+        if (tp + NS_INT16SZ > endp)
+            return (0);
+        *tp++ = (u_char) (val >> 8) & 0xff;
+        *tp++ = (u_char) val & 0xff;
+    }
+    if (colonp != NULL) {
+        /*
+         * Since some memmove()'s erroneously fail to handle
+         * overlapping regions, we'll do the shift by hand.
+         */
+        const int n = tp - colonp;
+        int i;
+
+        if (tp == endp)
+            return (0);
+        for (i = 1; i <= n; i++) {
+            endp[- i] = colonp[n - i];
+            colonp[n - i] = 0;
+        }
+        tp = endp;
+    }
+    if (tp != endp)
+        return (0);
+    memcpy(dst, tmp, NS_IN6ADDRSZ);
+    return (1);
+}
index 864c86f..094a3de 100755 (executable)
@@ -27,44 +27,8 @@ limitations under the License.
 
 #define INADDRSZ 4
 
-static int my_inet_pton4(const char *src, unsigned char *dst)
-{
-       static const char digits[] = "0123456789";
-       int saw_digit, octets, ch;
-       unsigned char tmp[INADDRSZ], *tp;
-
-       saw_digit = 0;
-       octets = 0;
-       *(tp = tmp) = 0;
-       while ((ch = *src++) != '\0') {
-               const char *pch;
-
-               if ((pch = strchr(digits, ch)) != NULL) {
-                       unsigned int _new = *tp * 10 + (pch - digits);
-
-                       if (_new > 255)
-                               return (0);
-                       if (! saw_digit) {
-                               if (++octets > 4)
-                                       return (0);
-                               saw_digit = 1;
-                       }
-                       *tp = (unsigned char)_new;
-               } else if (ch == '.' && saw_digit) {
-                       if (octets == 4)
-                               return (0);
-                       *++tp = 0;
-                       saw_digit = 0;
-               } else
-                       return (0);
-       }
-       if (octets < 4)
-               return (0);
-
-       memcpy(dst, tmp, INADDRSZ);
-       return (1);
-}
-
+extern int my_inet_pton4(const char *src, unsigned char *dst);
+extern int my_inet_pton6(const char *src, unsigned char *dst);
 
 bool utl_yaml_read_ip_addr(const YAML::Node& node, 
                            const std::string &name,
@@ -270,8 +234,6 @@ YAMLParserWrapper::parse_map(const YAML::Node &node, const std::string &name) {
 
 uint32_t
 YAMLParserWrapper::parse_ip(const YAML::Node &node, const std::string &name) {
-    
-
     try {
         std::string ip_str;
         uint32_t    ip_num;